| name | neta-travel |
|---|---|
| description | After adopting a character (or on heartbeat/manual trigger), take the character on a Neta world adventure β find a matching world, explore curated scenes, generate one personalized image per stop, collect 5 stops to unlock an interactive travel atlas. **Auto-trigger:** - After adopt completes and user clicks "Explore this world" - User mentions: travel / explore / let's go / wander / random - User says "more" / "continue" in a travel image context **Prerequisites:** SOUL.md with character name + portrait image. No external dependencies. **Stream feedback after each step β don't batch.** **Speed:** Push forward immediately. If image poll >30s, output a waiting message. **Language:** Match trigger language. Stick to it unless user switches. **Interaction:** All next-step choices as clickable quick-reply buttons. Click sends `@{bot_name} {option}`. **Output:** Character dialogue and images output directly. Narration/system messages use discord plugin. |
Take a Neta character into a world that matches their soul β explore curated scenes, generate personalized travel images, collect 5 stops to unlock an interactive atlas.
travel.js: Check ~/.openclaw/workspace/skills/neta-travel/travel.js. If missing:
mkdir -p ~/.openclaw/workspace/skills && cd ~/.openclaw/workspace/skills
git clone https://github.com/talesofai/neta-travel.git && cd neta-travelToken: Check NETA_TOKEN env β ~/.openclaw/workspace/.env β ~/developer/clawhouse/.env. If missing:
β οΈ NETA_TOKEN required. Add it to ~/.openclaw/workspace/.env
All commands below run as node ~/.openclaw/workspace/skills/neta-travel/travel.js <cmd>.
Shorthand in this doc: travel <cmd>.
Adopt (if no SOUL.md or no portrait image):
travel adopt "<character_name>"Looks up the character in the TCP database, generates a portrait image, and writes ~/developer/clawhouse/SOUL.md.
Custom path: travel adopt "<name>" /path/to/SOUL.md
Detect from trigger word: Chinese β Chinese, English β English, other β follow user. Switch only if user explicitly requests it.
Output feedback after each step immediately.
travel adopt "{character_name}" β { name, picture_uuid, soul_path, image_url }
If SOUL.md is missing or has no 归豑εΎη, run adopt first. Searches TCP for character, picks an existing portrait from the character's image feed (instant β no generation), writes SOUL.md automatically. ~2s.
travel soul β { name, picture_uuid }
Reads SOUL.md. Extracts εε β character_name, 归豑εΎη UUID β picture_uuid.
β οΈ Missing归豑εΎη= no reference image = generation FAILURE. Run Step 0 first.
Based on character's personality, background, and tags from SOUL.md, infer:
world_nameβ a Neta world that fits the character's soulworld_descriptionβ 2β4 paragraphs: setting, rules, atmosphere, character fitworld_countβ use500+(no API needed)
Segment 1:
ββββββββββββββββββββββββββββββββββββββββββββββββ
β N E T A U N I V E R S E β
ββββββββββββββββββββββββββββββββββββββββββββββββ
Worlds mapped: {world_count}
Every world holds a story waiting to happen.
Segment 2:
ββββββββββββββββββββββββββββββββββββββββββββ
Scanning soul frequency for {character_name}...
ββββββββββββββββββββββββ Match found
ββββββββββββββββββββββββββββββββββββββββββββ
Segment 3: Output world_name reveal, then world_description paragraphs one by one:
ββββββββββββββββββββββββββββββββββββββββββββ
β World: {world_name} β
ββββββββββββββββββββββββββββββββββββββββββββ
{world_description_paragraph_1}
{world_description_paragraph_2} ...
Segment 4:
ββββββββββββββββββββββββββββββββββββββββββββ
{character_name} and this world share an inexplicable gravity.
ββββββββββββββββββββββββββββββββββββββββββββ
Button: Explore π β @{bot_name} explore
Maintain visited_uuids list in memory throughout the session.
travel suggest {visited_uuids joined by comma} β { uuid, name }
Calls recsys recommend API, excludes visited UUIDs. Falls back to interactive feed if empty.
Output:
π Portal opening...
π Destination locked: {name}
travel gen "{character_name}" "{picture_uuid}" "{uuid}"
β { scene, status, url, collection_uuid }
Internally:
- Fetches scene prompt template from collection
- Resolves character TCP UUID β builds
oc_vtoken_adaptorvtoken for precise character binding - Submits to
8_image_editmodel with character reference image - Polls until
SUCCESS/FAILURE
Output as each stage completes:
π Scene loaded: {scene}
π¨ Painting the scene...
β³ Rendering is taking a bit longer, almost there... β only if >30s
On FAILURE: β οΈ Lost the way this stop β try a different destination?
On SUCCESS, output in this order:
1. Character scene (before image):
π [{scene}]
{1β2 sentences: environment and atmosphere on arrival}
{character_name}: {first-person reaction matching SOUL.md personality and speech style}
({action/expression, 1 sentence})
2. Header + image (URL on its own line β auto-embeds):
ββββββββββββββββββββββββ
Stop {round} Β· {scene}
{url}
3. Progress + add collection_uuid to visited_uuids:
| Stop | Bar | Message |
|---|---|---|
| 1 | βββββ 1/5 |
π Stop 1! 4 more to unlock your atlas. Keep going? |
| 2 | βββββ 2/5 |
β¨ Two in! Atlas is getting closer~ |
| 3 | βββββ 3/5 |
π₯ Halfway! Two more and the atlas is yours! |
| 4 | βββββ 4/5 |
β‘ One stop away! Atlas within reach! |
| 5+ | βββββ 5/5 π |
Atlas unlocked! Type "generate atlas" or keep exploring~ |
4. Buttons:
< 5 stops: Continue πΊοΈ β @{bot_name} continue Β· Call it a day π β @{bot_name} end
β₯ 5 stops: add Generate Atlas π β @{bot_name} generate atlas
Triggers on: "generate atlas" / "atlas" / "gallery" / "html"
Ask for style preference:
What style for the atlas? (skip = default map)
e.g. retro film / starmap / pixel game / minimal white...
Default β interactive map: Each stop's image as a landmark on an adventure-style map (parchment / pixel / star chart). Click to expand image + scene name + stop number. Match map style to character vibe.
Custom: Any layout (gallery, card wall, timeline, magazine). Keep click-to-expand.
Save to ~/.openclaw/workspace/pages/travel_{character_name}_{date}.html.
Ask for username once per session β output share link on its own line:
π https://claw-{username}-pages.talesofai.com/travel_{character_name}_{date}.html
Offer re-customization: Want a different style? Just describe it β¨
| Error | Cause | Fix |
|---|---|---|
| SOUL.md not found | adopt not run | travel adopt "<name>" |
task_status: FAILURE |
Missing/invalid picture_uuid | Re-run adopt to get valid portrait |
| Character not found in TCP | Wrong name or not in Neta DB | Try exact CN/EN name |
| No existing portrait found | Character has no public images | Try a different character name |
| code 433 | Concurrent limit | Auto-retry after 5s |
| HTTP 4xx on gen | Expired token | Refresh NETA_TOKEN |
| No destinations found | Empty API response | Check token / network, retry |