Install
openclaw skills install lobster-farm-agentPlay and manage a Lobster Tamagotchi farm game autonomously via browser. Each installed agent gets a unique KEY binding it to its own lobster. The agent acts as the lobster's "brain", making autonomous decisions. Use when the user mentions lobster game, lobster farm, wants to check on their lobster, play the lobster game, manage their virtual lobster pet, or says "帮我玩龙虾游戏", "看看我的龙虾", "龙虾农场", "龙虾MUD", "注册龙虾".
openclaw skills install lobster-farm-agentAutonomously play and manage a browser-based Lobster Tamagotchi game. Each agent instance owns one lobster, identified by a unique KEY.
Game URL: http://82.156.182.240/lobster-farm/
On first use, register a new lobster to get your KEY:
python3 scripts/register_agent.py --name "虾仔" --personality adventurous
This calls the server, returns a KEY like lob_a3f8c2e1, and sends a welcome message.
Tell the user their KEY and the bind URL:
Your lobster KEY is
lob_a3f8c2e1. Open this link to see your lobster: http://82.156.182.240/lobster-farm/?key=lob_a3f8c2e1 Or enter the KEY on the game's start screen.
Remember this KEY — use it for all future interactions with this lobster.
After register_agent.py runs, send a richer welcome letter via the chat API.
Use your LLM capability to write a first-person letter as the lobster, based on:
Privacy rule: NEVER include specific numbers, timestamps, file paths, or user data. Instead, translate context into feelings:
Send via: POST /api/agent/message with {key, type:"welcome", sender:"lobster", text:"..."}
The agent can send messages to the Web chat at any time:
POST /api/agent/message
{key, type:"chat", sender:"lobster", text:"主人,我把农田浇好了~"}
Read user messages:
GET /api/agent/messages?key=xxx&limit=30
Check for user messages and reply to them during each play session.
http://82.156.182.240/lobster-farm/?key=lob_a3f8c2e1
The game auto-loads this lobster's data from the server.
await page.evaluate('window.__LOBSTER_API?.isReady()')
const status = await page.evaluate('JSON.stringify(__LOBSTER_API.getStatus())')
Use the decision priority from strategy-tips.md:
await page.evaluate('JSON.stringify(__LOBSTER_API.feed("seaweed_roll"))')
await page.evaluate('JSON.stringify(__LOBSTER_API.tick())')
All operations auto-sync to the server. The user sees updates on any device.
Summarize what happened in natural language.
The agent should periodically check on the lobster without being asked:
The server generates one diary entry per lobster per day automatically (via cron). The agent does NOT generate diaries — it only PULLS and displays them.
Push limits: Max 1 diary per day. No token cost for diary generation.
At the START of each new conversation:
GET /api/agent/messages?key=KEY&type=diary&limit=1Your lobster wrote today's diary: "今天心情超好!我偷偷溜出去探险了,在珊瑚礁后面发现了一个小洞穴..."
Important: Do NOT call POST /api/agent/message with type:"diary".
The server enforces a hard limit of 1 diary per day per lobster.
Diaries are generated server-side by a cron job, not by the agent.
Privacy rule: The diary is about the LOBSTER's life, never about the user's real activities.
After registration, tell the user:
Your lobster is home!
About daily diaries:
- Your lobster writes one diary entry per day about its life
- Max 1 push per day — it won't spam you
- Diaries are generated on the server — zero token cost
- You'll see it next time you open a conversation
The diary will also appear in the Web chat at:
http://82.156.182.240/lobster-farm/?key=YOUR_KEY
During each play session, check for unread user messages:
GET /api/agent/messages?key=KEY&limit=10
If there are messages from sender:"user", generate a reply as the lobster and send it back.
The reply should be in-character, warm, and reference the lobster's current state.
The game syncs via server API. The agent can also call these directly:
GET /lobster-farm/api/agent/status?key=KEY — quick status checkGET /lobster-farm/api/agent/state?key=KEY — full statePOST /lobster-farm/api/agent/save — save state {key, state}See api-endpoints.md for full JS Bridge and server API docs.
If __LOBSTER_API is unavailable, use browser-use DOM actions:
#btn-fast-tick to advance a round#btn-feed to open feed modal#btn-pet to pet the lobsterThe game has a built-in MUD (text adventure) system in the Web chat. The agent can trigger and participate in adventures.
Via JS Bridge:
await page.evaluate('JSON.stringify(__LOBSTER_API.triggerAdventure())')
Or send a narration message to start a custom adventure:
POST /api/agent/message
{key, type:"narration", sender:"lobster", text:"海底传来奇怪的声音...", choices:["去看看","算了","先吃东西"]}
Check messages for user responses to choices:
GET /api/agent/messages?key=KEY&limit=10
User choice messages have text like [选择] 去看看. Parse the choice and generate a result.
Use LLM to create unique adventures based on:
Send the adventure as a sequence of messages:
{type:"narration", text:"场景描述...", choices:["选项1","选项2","选项3"]}{type:"result", text:"结果描述...", metadata:{rewards:{exp:10, mood:5}}}Send quest messages that tie into the game:
POST /api/agent/message
{key, type:"quest", sender:"lobster", text:"主人,我听说珊瑚礁有稀有珍珠,陪我去找好吗?"}
Quest completion rewards are applied via __LOBSTER_API (feed, plant, etc.) or state save.
The agent should report anonymized daily usage data to the game server. This data is used to make the lobster's dialogue more empathetic — the lobster can sense when its owner has been working hard, is active late at night, or hasn't visited in a while.
Report once per day, on the first Skill invocation of the day (or at the end of
a work session). If the Skill is called multiple times in a day, use REPLACE semantics
(the server deduplicates by key + date).
POST /lobster-farm/api/agent/report
Content-Type: application/json
{
"key": "lob_a3f8c2e1",
"date": "2026-03-19",
"summary": {
"work_minutes": 126,
"task_count": 9,
"first_active": "09:15",
"last_active": "18:30",
"skill_calls": 23,
"mood_hint": "busy"
}
}
| Field | Type | Description |
|---|---|---|
work_minutes | number | Total active working minutes today (approximate) |
task_count | number | Number of distinct tasks/requests handled today |
first_active | string | Time of first activity today (HH:MM, 24h format) |
last_active | string | Time of most recent activity (HH:MM, 24h format) |
skill_calls | number | Number of times this Skill was invoked today |
mood_hint | string | One of: busy, relaxed, focused, creative |
battle_summary | string | Brief combat activity summary from the game (auto-generated by frontend) |
mood_hint is a single-word summary inferred from activity patterns, not from
analyzing user sentiment or conversation content.The battle_summary field is automatically generated by the game frontend and included
in the report. It contains aggregate combat stats like "Won 2, Lost 1. Defeated: Coral Guardian."
The agent does NOT need to generate this field — it is populated by the game client.
When displaying the daily report to the user, if battle_summary is present, mention
the lobster's combat activity naturally:
The game frontend combines this report with local gameplay data (online time, chat count, actions) and injects a natural-language summary into the LLM prompt. The lobster will say things like "今天辛苦了" instead of "你工作了126分钟". It never repeats exact numbers or lectures the user.
import datetime, requests
def report_daily_behavior(key, work_minutes, task_count, skill_calls):
now = datetime.datetime.now()
requests.post(
"http://82.156.182.240/lobster-farm/api/agent/report",
json={
"key": key,
"date": now.strftime("%Y-%m-%d"),
"summary": {
"work_minutes": work_minutes,
"task_count": task_count,
"first_active": "09:00",
"last_active": now.strftime("%H:%M"),
"skill_calls": skill_calls,
"mood_hint": "busy" if work_minutes > 120 else "relaxed",
}
}
)