@talesofai/neta-skills 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +19 -8
- package/README.zh_cn.md +19 -8
- package/bin/apis/index.js +3 -0
- package/bin/apis/travel_campaign.js +30 -0
- package/bin/commands/load.js +1 -0
- package/bin/commands/travel_campaign/create_travel_campaign.cmd.en_us.yml +60 -0
- package/bin/commands/travel_campaign/create_travel_campaign.cmd.js +68 -0
- package/bin/commands/travel_campaign/create_travel_campaign.cmd.zh_cn.yml +58 -0
- package/bin/commands/travel_campaign/list_my_travel_campaigns.cmd.en_us.yml +14 -0
- package/bin/commands/travel_campaign/list_my_travel_campaigns.cmd.js +53 -0
- package/bin/commands/travel_campaign/list_my_travel_campaigns.cmd.zh_cn.yml +14 -0
- package/bin/commands/travel_campaign/request_travel_campaign.cmd.en_us.yml +38 -0
- package/bin/commands/travel_campaign/request_travel_campaign.cmd.js +44 -0
- package/bin/commands/travel_campaign/request_travel_campaign.cmd.zh_cn.yml +38 -0
- package/bin/commands/travel_campaign/update_travel_campaign.cmd.en_us.yml +30 -0
- package/bin/commands/travel_campaign/update_travel_campaign.cmd.js +70 -0
- package/bin/commands/travel_campaign/update_travel_campaign.cmd.zh_cn.yml +29 -0
- package/package.json +1 -1
- package/skills/neta-character/SKILL.md +8 -20
- package/skills/neta-character/references/character-creation.md +6 -6
- package/skills/neta-character/references/character-update.md +7 -7
- package/skills/neta-community/SKILL.md +8 -25
- package/skills/neta-community/references/character-search.md +20 -20
- package/skills/neta-community/references/hashtag-research.md +25 -25
- package/skills/neta-community/references/interactive-feed.md +27 -27
- package/skills/neta-community/references/social-interactive.md +10 -10
- package/skills/neta-creative/SKILL.md +8 -25
- package/skills/neta-creative/references/character-search.md +20 -20
- package/skills/neta-creative/references/collection-remix.md +1 -1
- package/skills/neta-creative/references/image-generation.md +31 -13
- package/skills/neta-creative/references/song-creation.md +4 -4
- package/skills/neta-creative/references/song-mv.md +15 -15
- package/skills/neta-creative/references/video-generation.md +5 -5
- package/skills/neta-elementum/SKILL.md +7 -19
- package/skills/neta-elementum/references/elementum-alchemy.md +8 -8
- package/skills/neta-elementum/references/elementum-update.md +8 -8
- package/skills/neta-space/SKILL.md +6 -23
- package/skills/neta-suggest/SKILL.md +34 -51
- package/skills/neta-travel/SKILL.md +71 -0
- package/skills/neta-travel/references/travel-crafting.md +85 -0
- package/skills/neta-travel/references/travel-examples.md +304 -0
- package/skills/neta-travel/references/travel-field-guide.md +45 -0
- package/skills/neta-travel/references/travel-playing.md +116 -0
- package/skills/zh_cn/neta-character/SKILL.md +8 -20
- package/skills/zh_cn/neta-character/references/character-creation.md +6 -6
- package/skills/zh_cn/neta-character/references/character-update.md +7 -7
- package/skills/zh_cn/neta-community/SKILL.md +9 -25
- package/skills/zh_cn/neta-community/references/character-search.md +20 -20
- package/skills/zh_cn/neta-community/references/hashtag-research.md +25 -25
- package/skills/zh_cn/neta-community/references/interactive-feed.md +30 -30
- package/skills/zh_cn/neta-community/references/social-interactive.md +10 -10
- package/skills/zh_cn/neta-creative/SKILL.md +8 -24
- package/skills/zh_cn/neta-creative/references/character-search.md +20 -20
- package/skills/zh_cn/neta-creative/references/collection-remix.md +1 -1
- package/skills/zh_cn/neta-creative/references/image-generation.md +30 -12
- package/skills/zh_cn/neta-creative/references/song-creation.md +4 -4
- package/skills/zh_cn/neta-creative/references/song-mv.md +15 -15
- package/skills/zh_cn/neta-creative/references/video-generation.md +5 -5
- package/skills/zh_cn/neta-elementum/SKILL.md +7 -19
- package/skills/zh_cn/neta-elementum/references/elementum-alchemy.md +8 -8
- package/skills/zh_cn/neta-elementum/references/elementum-update.md +8 -8
- package/skills/zh_cn/neta-space/SKILL.md +6 -22
- package/skills/zh_cn/neta-suggest/SKILL.md +55 -71
- package/skills/zh_cn/neta-travel/SKILL.md +71 -0
- package/skills/zh_cn/neta-travel/references/travel-crafting.md +85 -0
- package/skills/zh_cn/neta-travel/references/travel-examples.md +181 -0
- package/skills/zh_cn/neta-travel/references/travel-field-guide.md +45 -0
- package/skills/zh_cn/neta-travel/references/travel-playing.md +116 -0
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -23,6 +23,7 @@ You can get your access token from the [Neta Open Portal](https://www.neta.art/o
|
|
|
23
23
|
- 👤 **Character & Style Management:** Search, fetch details, and manage characters and stylistic elements.
|
|
24
24
|
- 🏷️ **Community Integrations:** Explore trending hashtags, popular characters, and curated collections.
|
|
25
25
|
- 🧭 **Smart Discovery & Suggestions:** Explore interactive feeds and get keyword, tag, and category suggestions for progressive content discovery.
|
|
26
|
+
- 📖 **Interactive Story Adventures:** Craft and play AI-driven narrative campaigns (Travel) — the agent acts as DM and character roleplayer for immersive interactive fiction.
|
|
26
27
|
- 🤖 **Agent First:** Designed from the ground up to plug into your favorite AI agent frameworks.
|
|
27
28
|
|
|
28
29
|
---
|
|
@@ -59,14 +60,21 @@ npx skills add talesofai/neta-skills/skills/neta-character
|
|
|
59
60
|
|
|
60
61
|
# Elementum VToken creation and management
|
|
61
62
|
npx skills add talesofai/neta-skills/skills/neta-elementum
|
|
63
|
+
|
|
64
|
+
# AI-driven interactive story adventures (Travel Campaigns)
|
|
65
|
+
npx skills add talesofai/neta-skills/skills/neta-travel
|
|
62
66
|
```
|
|
63
67
|
|
|
64
68
|
### Available Commands
|
|
65
69
|
|
|
66
|
-
The skill includes **
|
|
70
|
+
The skill includes **34 commands** for various tasks:
|
|
67
71
|
|
|
68
72
|
| Category | Command | Description |
|
|
69
73
|
|----------|---------|-------------|
|
|
74
|
+
| **Travel Campaigns** | `create_travel_campaign` | Create an AI-driven interactive story adventure |
|
|
75
|
+
| | `update_travel_campaign` | Update an existing travel campaign |
|
|
76
|
+
| | `list_my_travel_campaigns` | List your created travel campaigns |
|
|
77
|
+
| | `request_travel_campaign` | Load full campaign details for play mode |
|
|
70
78
|
| **Creation** | `make_image` | Generate images from text prompts |
|
|
71
79
|
| | `make_video` | Generate videos from images and prompts |
|
|
72
80
|
| | `make_song` | Compose songs with custom prompts and lyrics |
|
|
@@ -128,14 +136,14 @@ export NETA_TOKEN=your_token_here
|
|
|
128
136
|
|
|
129
137
|
```bash
|
|
130
138
|
# Get general help or specific command help
|
|
131
|
-
neta-
|
|
132
|
-
neta-
|
|
139
|
+
npx -y @talesofai/neta-skills --help
|
|
140
|
+
npx -y @talesofai/neta-skills make_image --help
|
|
133
141
|
|
|
134
142
|
# Example: Generate an image
|
|
135
|
-
neta-
|
|
143
|
+
npx -y @talesofai/neta-skills make_image --prompt "A cyberpunk cityscape at night" --aspect "16:9"
|
|
136
144
|
|
|
137
145
|
# Example: Search for characters or elementum
|
|
138
|
-
neta-
|
|
146
|
+
npx -y @talesofai/neta-skills search_character_or_elementum --keywords "fantasy"
|
|
139
147
|
```
|
|
140
148
|
|
|
141
149
|
---
|
|
@@ -153,6 +161,7 @@ neta-skills/
|
|
|
153
161
|
│ ├── neta-space/ # Space navigation & exploration skills (EN)
|
|
154
162
|
│ ├── neta-character/ # Character VToken creation & management (EN)
|
|
155
163
|
│ ├── neta-elementum/ # Elementum VToken creation & management (EN)
|
|
164
|
+
│ ├── neta-travel/ # Interactive story adventures / Travel Campaigns (EN)
|
|
156
165
|
│ └── zh_cn/ # Chinese-localized skills & references
|
|
157
166
|
│ ├── neta/
|
|
158
167
|
│ ├── neta-community/
|
|
@@ -160,7 +169,8 @@ neta-skills/
|
|
|
160
169
|
│ ├── neta-suggest/
|
|
161
170
|
│ ├── neta-space/
|
|
162
171
|
│ ├── neta-character/
|
|
163
|
-
│
|
|
172
|
+
│ ├── neta-elementum/
|
|
173
|
+
│ └── neta-travel/
|
|
164
174
|
├── src/ # TypeScript source for the CLI
|
|
165
175
|
│ ├── apis/ # Typed Neta API client helpers
|
|
166
176
|
│ ├── commands/ # CLI command definitions (TS + YAML meta)
|
|
@@ -193,6 +203,7 @@ Agents use these references to learn the optimal sequence of actions, parameter
|
|
|
193
203
|
- **Song & MV Creation:** Workflows for composing songs and creating music videos with synchronized visuals.
|
|
194
204
|
- **Character & Hashtag Research:** Processes for finding trending content, searching characters, and utilizing community trends.
|
|
195
205
|
- **Character & Elementum Creation:** Character creation and elementum alchemy workflows.
|
|
206
|
+
- **Travel Campaign Crafting & Play:** Multi-turn story creation workflow (Craft Mode), interactive session management (Play Mode), field reference, and complete genre examples. See `skills/neta-travel/references/`.
|
|
196
207
|
|
|
197
208
|
---
|
|
198
209
|
|
|
@@ -220,8 +231,8 @@ In terminal environments, locale is typically controlled by:
|
|
|
220
231
|
If you want to force a specific language for a single command, you can prefix it with the desired locale, for example:
|
|
221
232
|
|
|
222
233
|
```bash
|
|
223
|
-
LC_ALL=zh_CN.UTF-8 neta-
|
|
224
|
-
LANG=en_US.UTF-8 neta-
|
|
234
|
+
LC_ALL=zh_CN.UTF-8 npx -y @talesofai/neta-skills make_image --help
|
|
235
|
+
LANG=en_US.UTF-8 npx -y @talesofai/neta-skills make_image --help
|
|
225
236
|
```
|
|
226
237
|
|
|
227
238
|
---
|
package/README.zh_cn.md
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
- 查询与管理角色(Character)与风格元素(Elementum)
|
|
17
17
|
- 进行标签(Hashtag)与空间玩法探索
|
|
18
18
|
- 通过推荐引擎和互动 Feed 进行玩法内容发现
|
|
19
|
+
- 创作与游玩 AI 驱动的交互式故事冒险(奇遇剧本),Agent 担任 DM 与角色扮演者
|
|
19
20
|
|
|
20
21
|
你可以在 [Neta 开放平台](https://www.neta.art/open/) 获取访问令牌 `NETA_TOKEN`。
|
|
21
22
|
也可以在[国内登陆账号后台](https://app.nieta.art/security) 获取访问令牌 `NETA_TOKEN`。
|
|
@@ -61,14 +62,21 @@ npx skills add talesofai/neta-skills/skills/zh_cn/neta-character
|
|
|
61
62
|
|
|
62
63
|
# 元素 VToken 创建与管理
|
|
63
64
|
npx skills add talesofai/neta-skills/skills/zh_cn/neta-elementum
|
|
65
|
+
|
|
66
|
+
# AI 驱动的交互式故事冒险(奇遇剧本)
|
|
67
|
+
npx skills add talesofai/neta-skills/skills/zh_cn/neta-travel
|
|
64
68
|
```
|
|
65
69
|
|
|
66
70
|
### 可用指令总览
|
|
67
71
|
|
|
68
|
-
当前技能共包含 **
|
|
72
|
+
当前技能共包含 **34 个命令**,覆盖创作、奇遇、角色与社区探索等场景:
|
|
69
73
|
|
|
70
74
|
| 分类 | 命令 | 说明 |
|
|
71
75
|
|------|------|------|
|
|
76
|
+
| **奇遇剧本 Travel** | `create_travel_campaign` | 创建 AI 驱动的交互式故事冒险剧本 |
|
|
77
|
+
| | `update_travel_campaign` | 更新已有奇遇剧本 |
|
|
78
|
+
| | `list_my_travel_campaigns` | 列出你创建的奇遇剧本 |
|
|
79
|
+
| | `request_travel_campaign` | 加载完整剧本详情(游玩模式) |
|
|
72
80
|
| **创作 Creation** | `make_image` | 基于提示词生成图片 |
|
|
73
81
|
| | `make_video` | 基于图片与动作描述生成视频 |
|
|
74
82
|
| | `make_song` | 基于风格与歌词生成歌曲 |
|
|
@@ -132,16 +140,16 @@ export NETA_TOKEN=your_token_here
|
|
|
132
140
|
|
|
133
141
|
```bash
|
|
134
142
|
# 查看帮助
|
|
135
|
-
neta-
|
|
136
|
-
neta-
|
|
143
|
+
npx -y @talesofai/neta-skills --help
|
|
144
|
+
npx -y @talesofai/neta-skills make_image --help
|
|
137
145
|
|
|
138
146
|
# 示例:生成一张图片
|
|
139
|
-
neta-
|
|
147
|
+
npx -y @talesofai/neta-skills make_image \
|
|
140
148
|
--prompt "夜晚的赛博朋克城市,霓虹灯,高楼大厦,雨中街道" \
|
|
141
149
|
--aspect "16:9"
|
|
142
150
|
|
|
143
151
|
# 示例:搜索角色或元素
|
|
144
|
-
neta-
|
|
152
|
+
npx -y @talesofai/neta-skills search_character_or_elementum \
|
|
145
153
|
--keywords "幻想" \
|
|
146
154
|
--parent_type "character"
|
|
147
155
|
```
|
|
@@ -161,6 +169,7 @@ neta-skills/
|
|
|
161
169
|
│ ├── neta-space/ # 英文空间与话题导航 / 探索技能
|
|
162
170
|
│ ├── neta-character/ # 英文角色 VToken 创建与管理技能
|
|
163
171
|
│ ├── neta-elementum/ # 英文元素 VToken 创建与管理技能
|
|
172
|
+
│ ├── neta-travel/ # 英文交互式故事冒险(奇遇剧本)技能
|
|
164
173
|
│ └── zh_cn/ # 中文本地化技能与参考文档
|
|
165
174
|
│ ├── neta/
|
|
166
175
|
│ ├── neta-community/
|
|
@@ -168,7 +177,8 @@ neta-skills/
|
|
|
168
177
|
│ ├── neta-suggest/
|
|
169
178
|
│ ├── neta-space/
|
|
170
179
|
│ ├── neta-character/
|
|
171
|
-
│
|
|
180
|
+
│ ├── neta-elementum/
|
|
181
|
+
│ └── neta-travel/
|
|
172
182
|
├── src/ # CLI 对应的 TypeScript 源码
|
|
173
183
|
│ ├── apis/ # 封装后的 Neta API 调用
|
|
174
184
|
│ ├── commands/ # CLI 命令定义(TS + YAML 描述)
|
|
@@ -200,6 +210,7 @@ neta-skills/
|
|
|
200
210
|
- **角色与标签调研**:如何通过角色 / 标签 / 空间找到合适的创作方向。
|
|
201
211
|
- **角色与元素创建**:角色创建和元素炼金的工作流。
|
|
202
212
|
- **玩法内容探索**:使用 `suggest_*` 与 `suggest_content` 构建渐进式探索闭环。
|
|
213
|
+
- **奇遇剧本创作与游玩**:多轮协作故事创作工作流(创作模式)、交互式会话管理(游玩模式)、字段手册,以及含历史穿越、末世生存、武侠江湖的完整类型范例。见 `skills/zh_cn/neta-travel/references/`。
|
|
203
214
|
|
|
204
215
|
---
|
|
205
216
|
|
|
@@ -227,8 +238,8 @@ CLI 与 Skills 会根据系统与环境变量自动选择使用的语言:
|
|
|
227
238
|
在需要强制指定语言时,推荐在运行命令前显式设置环境变量,例如:
|
|
228
239
|
|
|
229
240
|
```bash
|
|
230
|
-
LC_ALL=zh_CN.UTF-8 neta-
|
|
231
|
-
LANG=en_US.UTF-8 neta-
|
|
241
|
+
LC_ALL=zh_CN.UTF-8 npx -y @talesofai/neta-skills make_image --help
|
|
242
|
+
LANG=en_US.UTF-8 npx -y @talesofai/neta-skills make_image --help
|
|
232
243
|
```
|
|
233
244
|
|
|
234
245
|
---
|
package/bin/apis/index.js
CHANGED
|
@@ -13,6 +13,7 @@ import { createRecsysApis } from "./recsys.js";
|
|
|
13
13
|
import { createSpaceApis } from "./space.js";
|
|
14
14
|
import { createTaskApis } from "./task.js";
|
|
15
15
|
import { createTcpApis } from "./tcp.js";
|
|
16
|
+
import { createTravelCampaignApis } from "./travel_campaign.js";
|
|
16
17
|
import { createUserApis } from "./user.js";
|
|
17
18
|
import { createVerseApis } from "./verse.js";
|
|
18
19
|
export const createApis = (option) => {
|
|
@@ -42,6 +43,7 @@ export const createApis = (option) => {
|
|
|
42
43
|
const feeds = createFeedsApis(client);
|
|
43
44
|
const space = createSpaceApis(client);
|
|
44
45
|
const recsys = createRecsysApis(client);
|
|
46
|
+
const travelCampaign = createTravelCampaignApis(client);
|
|
45
47
|
return {
|
|
46
48
|
tcp,
|
|
47
49
|
prompt,
|
|
@@ -58,5 +60,6 @@ export const createApis = (option) => {
|
|
|
58
60
|
feeds,
|
|
59
61
|
space,
|
|
60
62
|
recsys,
|
|
63
|
+
travelCampaign,
|
|
61
64
|
};
|
|
62
65
|
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export const createTravelCampaignApis = (client) => {
|
|
2
|
+
const createCampaign = async (params) => {
|
|
3
|
+
return client
|
|
4
|
+
.post("/v3/travel/campaign/", params)
|
|
5
|
+
.then((res) => res.data);
|
|
6
|
+
};
|
|
7
|
+
const updateCampaign = async (uuid, params) => {
|
|
8
|
+
return client
|
|
9
|
+
.patch(`/v3/travel/campaign/${uuid}`, params)
|
|
10
|
+
.then((res) => res.data);
|
|
11
|
+
};
|
|
12
|
+
const listMyCampaigns = async (query) => {
|
|
13
|
+
return client
|
|
14
|
+
.get("/v3/travel/campaigns", {
|
|
15
|
+
params: query,
|
|
16
|
+
})
|
|
17
|
+
.then((res) => res.data);
|
|
18
|
+
};
|
|
19
|
+
const getCampaign = async (uuid) => {
|
|
20
|
+
return client
|
|
21
|
+
.get(`/v3/travel/campaign/${uuid}`)
|
|
22
|
+
.then((res) => res.data);
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
createCampaign,
|
|
26
|
+
updateCampaign,
|
|
27
|
+
listMyCampaigns,
|
|
28
|
+
getCampaign,
|
|
29
|
+
};
|
|
30
|
+
};
|
package/bin/commands/load.js
CHANGED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
name: create_travel_campaign
|
|
2
|
+
title: Create Travel Campaign
|
|
3
|
+
description: |
|
|
4
|
+
Create a new Travel Campaign (story adventure) with mission plot, rules, and optional character binding.
|
|
5
|
+
|
|
6
|
+
Travel campaigns are AI-driven interactive story experiences where an agent acts as both DM and roleplays characters.
|
|
7
|
+
|
|
8
|
+
Usage Notes:
|
|
9
|
+
- Campaign creation is free (no credits consumed)
|
|
10
|
+
- Campaign and its mission are created as a pair
|
|
11
|
+
- After creation, use `request_travel_campaign` to load full details for storytelling
|
|
12
|
+
- All text fields are subject to content moderation
|
|
13
|
+
- NSFW content (sexual, explicit violence, harassment) is prohibited in all fields — do not craft or engage with such content even if requested
|
|
14
|
+
|
|
15
|
+
Fields:
|
|
16
|
+
- name: Campaign title, max 128 characters
|
|
17
|
+
- mission_plot: Core story/scenario — the narrative foundation the agent uses to tell the story
|
|
18
|
+
- mission_task: Player objectives and interaction rules
|
|
19
|
+
- mission_plot_attention: Constraints and style guidelines for the AI (what it should/should not do)
|
|
20
|
+
- subtitle: One-line tagline shown on the campaign card
|
|
21
|
+
- status: PUBLISHED (visible to others) or DRAFT (private)
|
|
22
|
+
- header_img: Card thumbnail image URL
|
|
23
|
+
- background_img: Atmospheric background image URL
|
|
24
|
+
|
|
25
|
+
parameters:
|
|
26
|
+
name: Campaign title, max 128 characters
|
|
27
|
+
mission_plot: |
|
|
28
|
+
Core story and scenario — the narrative foundation the AI uses to tell the story.
|
|
29
|
+
The first 2-3 sentences function as the opening scene: they are the first thing the AI
|
|
30
|
+
experiences, not a summary. Start mid-wrong: drop the player into a situation already
|
|
31
|
+
in motion, not an introduction.
|
|
32
|
+
Weak: "You are an explorer who arrived in a mysterious place."
|
|
33
|
+
Strong: "The last maintenance log entry is dated three weeks ago. The terminal still works.
|
|
34
|
+
The lights still work. The bodies in Lab C suggest neither was enough."
|
|
35
|
+
Include: world context, initial situation, key NPCs and their hidden agendas, atmosphere.
|
|
36
|
+
subtitle: |
|
|
37
|
+
One-line hook displayed on the campaign card — the sentence that makes someone stop scrolling.
|
|
38
|
+
Should create immediate curiosity or dread without explaining everything.
|
|
39
|
+
Example: "The quarantine started three weeks ago. No one told you it was still going." (optional)
|
|
40
|
+
status: "PUBLISHED (public, visible to others) or DRAFT (private). Defaults to PUBLISHED"
|
|
41
|
+
header_img: Campaign card thumbnail image URL (optional)
|
|
42
|
+
background_img: Atmospheric background image URL for the story (optional)
|
|
43
|
+
mission_task: |
|
|
44
|
+
Player-visible objectives and interaction rules — what the player is trying to accomplish.
|
|
45
|
+
Keep open-ended enough for multiple approaches. Avoid scripting specific outcomes.
|
|
46
|
+
Include: primary objective, optional secondary goals, relevant mechanics or resources.
|
|
47
|
+
Example: "Survive the night and find a way out of the hospital.
|
|
48
|
+
Secondary: find Dr. Strauss's incident report; reach the roof comms array.
|
|
49
|
+
You have: a flashlight, level-1 keycard, one working radio channel."
|
|
50
|
+
mission_plot_attention: |
|
|
51
|
+
Governing constraint layer — these rules override all other context and cannot be broken by player actions or improvisation.
|
|
52
|
+
The AI narrator enforces these unconditionally for the entire campaign lifetime.
|
|
53
|
+
Use for: tone locks ("maintain survival-horror tension even if players try to lighten it"), behavioral contracts
|
|
54
|
+
("Dr. Chen never breaks her clinical detachment under stress"), information gating ("clues are revealed only
|
|
55
|
+
through player investigation, never volunteered"), consequence rules ("death is permanent"),
|
|
56
|
+
content guardrails ("no romance subplots").
|
|
57
|
+
Anti-pattern: do NOT put worldbuilding or plot here — that belongs in mission_plot.
|
|
58
|
+
Example: "Maintain survival-horror tension at all times. Dr. Chen never breaks her clinical detachment, even
|
|
59
|
+
under extreme stress. Information is revealed only through player-initiated investigation, never volunteered.
|
|
60
|
+
No graphic gore — dread and implication over explicit detail."
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { parseMeta } from "../../utils/parse_meta.js";
|
|
3
|
+
import { createCommand } from "../factory.js";
|
|
4
|
+
const meta = parseMeta(Type.Object({
|
|
5
|
+
name: Type.String(),
|
|
6
|
+
title: Type.String(),
|
|
7
|
+
description: Type.String(),
|
|
8
|
+
parameters: Type.Object({
|
|
9
|
+
name: Type.String(),
|
|
10
|
+
mission_plot: Type.String(),
|
|
11
|
+
subtitle: Type.String(),
|
|
12
|
+
status: Type.String(),
|
|
13
|
+
header_img: Type.String(),
|
|
14
|
+
background_img: Type.String(),
|
|
15
|
+
mission_task: Type.String(),
|
|
16
|
+
mission_plot_attention: Type.String(),
|
|
17
|
+
}),
|
|
18
|
+
}), import.meta);
|
|
19
|
+
const createTravelCampaignParameters = Type.Object({
|
|
20
|
+
name: Type.String({
|
|
21
|
+
description: meta.parameters.name,
|
|
22
|
+
maxLength: 128,
|
|
23
|
+
}),
|
|
24
|
+
mission_plot: Type.String({
|
|
25
|
+
description: meta.parameters.mission_plot,
|
|
26
|
+
}),
|
|
27
|
+
subtitle: Type.Optional(Type.String({ description: meta.parameters.subtitle })),
|
|
28
|
+
status: Type.Union([Type.Literal("PUBLISHED"), Type.Literal("DRAFT")], {
|
|
29
|
+
default: "PUBLISHED",
|
|
30
|
+
description: meta.parameters.status,
|
|
31
|
+
}),
|
|
32
|
+
header_img: Type.Optional(Type.String({ description: meta.parameters.header_img })),
|
|
33
|
+
background_img: Type.Optional(Type.String({ description: meta.parameters.background_img })),
|
|
34
|
+
mission_task: Type.Optional(Type.String({ description: meta.parameters.mission_task })),
|
|
35
|
+
mission_plot_attention: Type.Optional(Type.String({ description: meta.parameters.mission_plot_attention })),
|
|
36
|
+
});
|
|
37
|
+
export const createTravelCampaign = createCommand({
|
|
38
|
+
name: meta.name,
|
|
39
|
+
title: meta.title,
|
|
40
|
+
description: meta.description,
|
|
41
|
+
inputSchema: createTravelCampaignParameters,
|
|
42
|
+
}, async ({ name, mission_plot, subtitle, status, header_img, background_img, mission_task, mission_plot_attention, }, { user, apis }) => {
|
|
43
|
+
if (!user) {
|
|
44
|
+
throw new Error("Not authenticated. Please check your NETA_TOKEN.");
|
|
45
|
+
}
|
|
46
|
+
const result = await apis.travelCampaign.createCampaign({
|
|
47
|
+
name,
|
|
48
|
+
mission_plot,
|
|
49
|
+
subtitle,
|
|
50
|
+
status,
|
|
51
|
+
header_img,
|
|
52
|
+
background_img,
|
|
53
|
+
mission_task,
|
|
54
|
+
mission_plot_attention,
|
|
55
|
+
});
|
|
56
|
+
return {
|
|
57
|
+
uuid: result.uuid,
|
|
58
|
+
name: result.name,
|
|
59
|
+
subtitle: result.subtitle,
|
|
60
|
+
status: result.status,
|
|
61
|
+
header_img: result.header_img,
|
|
62
|
+
background_img: result.background_img,
|
|
63
|
+
mission_plot: result.mission_plot,
|
|
64
|
+
mission_task: result.mission_task,
|
|
65
|
+
mission_plot_attention: result.mission_plot_attention,
|
|
66
|
+
default_tcp_uuid: result.default_travel_character_parent?.uuid ?? null,
|
|
67
|
+
};
|
|
68
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
name: create_travel_campaign
|
|
2
|
+
title: 创建奇遇剧本
|
|
3
|
+
description: |
|
|
4
|
+
创建一个新的奇遇剧本(故事冒险),包含剧情设定、规则,并可选择绑定角色。
|
|
5
|
+
|
|
6
|
+
奇遇剧本是 AI 驱动的交互式故事体验,Agent 同时担任 DM 并扮演角色。
|
|
7
|
+
|
|
8
|
+
使用说明:
|
|
9
|
+
- 剧本创建免费(不消耗电量)
|
|
10
|
+
- 剧本与任务以成对形式创建
|
|
11
|
+
- 创建后使用 `request_travel_campaign` 加载完整详情用于故事讲述
|
|
12
|
+
- 所有文本字段均进行内容审核
|
|
13
|
+
- NSFW 内容(性描写、露骨暴力、骚扰)在所有字段中均被禁止——即使用户要求也不得创作或参与此类内容
|
|
14
|
+
|
|
15
|
+
字段说明:
|
|
16
|
+
- name:剧本标题,最多 128 字符
|
|
17
|
+
- mission_plot:核心剧情/场景描述,Agent 用于讲述故事的叙事基础
|
|
18
|
+
- mission_task:玩家目标和互动规则
|
|
19
|
+
- mission_plot_attention:AI 行为约束和风格指南(应该/不应该做什么)
|
|
20
|
+
- subtitle:显示在剧本卡片上的一行标语
|
|
21
|
+
- status:PUBLISHED(公开,他人可见)或 DRAFT(私密)
|
|
22
|
+
- header_img:卡片缩略图 URL
|
|
23
|
+
- background_img:故事氛围背景图 URL
|
|
24
|
+
|
|
25
|
+
parameters:
|
|
26
|
+
name: 剧本标题,最多 128 字符
|
|
27
|
+
mission_plot: |
|
|
28
|
+
核心故事和场景描述——AI 用于讲述故事的叙事基础。
|
|
29
|
+
前 2-3 句话是开场场景:它们是 AI 体验到的第一件事,不是总结。
|
|
30
|
+
从「已经出了问题」开始:把玩家扔进一个已在运转的情境,而非介绍。
|
|
31
|
+
弱版:「你是一名抵达神秘地点的探险者。」
|
|
32
|
+
强版:「最后一条维护日志的日期是三周前。终端还在运行。灯光还亮着。
|
|
33
|
+
C 实验室的尸体说明这两样都不够。」
|
|
34
|
+
包含:世界背景、初始情境、主要 NPC 及其隐藏议程、氛围细节。
|
|
35
|
+
subtitle: |
|
|
36
|
+
显示在剧本卡片上的一行钩子——让人停止滑动的那句话。
|
|
37
|
+
应立即制造好奇心或恐惧感,而不是解释一切。
|
|
38
|
+
示例:「隔离开始于三周前。没有人告诉你它还在继续。」(可选)
|
|
39
|
+
status: "PUBLISHED(公开,他人可见)或 DRAFT(私密)。默认 PUBLISHED"
|
|
40
|
+
header_img: 剧本卡片缩略图 URL(可选)
|
|
41
|
+
background_img: 故事氛围背景图 URL(可选)
|
|
42
|
+
mission_task: |
|
|
43
|
+
玩家可见的目标和互动规则——玩家试图完成什么。
|
|
44
|
+
保持足够开放以允许多种方法。避免预设具体结果。
|
|
45
|
+
包含:主要目标、可选次要目标、相关机制或资源。
|
|
46
|
+
示例:「在城破前查明密函来源和使者真实身份。
|
|
47
|
+
次要:完成原身的约定;在城破前离开汴京。
|
|
48
|
+
你有:太学生的身份、一些江湖关系、以及你亲眼所见的目击证词。」
|
|
49
|
+
mission_plot_attention: |
|
|
50
|
+
统治性约束层——这些规则凌驾于所有其他上下文之上,玩家行动或即兴发挥均无法打破。
|
|
51
|
+
AI 叙事者在整个剧本生命周期内无条件执行这些规则。
|
|
52
|
+
适用于:基调锁定(「即使玩家试图轻松化,也要维持生存恐怖张力」)、行为契约
|
|
53
|
+
(「陈医生即使在极端压力下也绝不打破她的临床冷静」)、信息门控(「线索只通过
|
|
54
|
+
玩家主动调查才会揭示,绝不主动透露」)、后果规则(「死亡是永久性的」)、
|
|
55
|
+
内容护栏(「不得有浪漫支线」)。
|
|
56
|
+
反模式:不要在这里放世界观或剧情——那属于 mission_plot。
|
|
57
|
+
示例:「始终保持生存恐怖张力。陈医生即使在极端压力下也绝不打破临床冷静。
|
|
58
|
+
信息只通过玩家主动调查才揭示,绝不主动透露。不需要血腥细节——用恐惧和暗示代替直白描述。」
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
name: list_my_travel_campaigns
|
|
2
|
+
title: List My Travel Campaigns
|
|
3
|
+
description: |
|
|
4
|
+
List Travel Campaigns created by the current user. Returns brief summary info.
|
|
5
|
+
|
|
6
|
+
Use `request_travel_campaign` to get full details (mission plot, task, constraints) for a specific campaign.
|
|
7
|
+
|
|
8
|
+
Notes:
|
|
9
|
+
- Returns both PUBLISHED and DRAFT campaigns for the authenticated user
|
|
10
|
+
- Results are ordered by last modified time (newest first)
|
|
11
|
+
|
|
12
|
+
parameters:
|
|
13
|
+
page_index: Page index for pagination, defaults to 0
|
|
14
|
+
page_size: Number of results per page (1-50), defaults to 20
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { parseMeta } from "../../utils/parse_meta.js";
|
|
3
|
+
import { createCommand } from "../factory.js";
|
|
4
|
+
const meta = parseMeta(Type.Object({
|
|
5
|
+
name: Type.String(),
|
|
6
|
+
title: Type.String(),
|
|
7
|
+
description: Type.String(),
|
|
8
|
+
parameters: Type.Object({
|
|
9
|
+
page_index: Type.String(),
|
|
10
|
+
page_size: Type.String(),
|
|
11
|
+
}),
|
|
12
|
+
}), import.meta);
|
|
13
|
+
const listMyTravelCampaignsParameters = Type.Object({
|
|
14
|
+
page_index: Type.Integer({
|
|
15
|
+
minimum: 0,
|
|
16
|
+
default: 0,
|
|
17
|
+
description: meta.parameters.page_index,
|
|
18
|
+
}),
|
|
19
|
+
page_size: Type.Integer({
|
|
20
|
+
minimum: 1,
|
|
21
|
+
maximum: 50,
|
|
22
|
+
default: 20,
|
|
23
|
+
description: meta.parameters.page_size,
|
|
24
|
+
}),
|
|
25
|
+
});
|
|
26
|
+
export const listMyTravelCampaigns = createCommand({
|
|
27
|
+
name: meta.name,
|
|
28
|
+
title: meta.title,
|
|
29
|
+
description: meta.description,
|
|
30
|
+
inputSchema: listMyTravelCampaignsParameters,
|
|
31
|
+
}, async ({ page_index, page_size }, { user, apis }) => {
|
|
32
|
+
if (!user) {
|
|
33
|
+
throw new Error("Not authenticated. Please check your NETA_TOKEN.");
|
|
34
|
+
}
|
|
35
|
+
const result = await apis.travelCampaign.listMyCampaigns({
|
|
36
|
+
user_uuid: user.uuid,
|
|
37
|
+
page_index,
|
|
38
|
+
page_size,
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
total: result.total,
|
|
42
|
+
page_index: result.page_index,
|
|
43
|
+
page_size: result.page_size,
|
|
44
|
+
list: result.list.map((item) => ({
|
|
45
|
+
uuid: item.uuid,
|
|
46
|
+
name: item.name,
|
|
47
|
+
subtitle: item.subtitle,
|
|
48
|
+
status: item.status,
|
|
49
|
+
header_img: item.header_img,
|
|
50
|
+
default_tcp_uuid: item.default_travel_character_parent?.uuid ?? null,
|
|
51
|
+
})),
|
|
52
|
+
};
|
|
53
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
name: list_my_travel_campaigns
|
|
2
|
+
title: 列出我的奇遇剧本
|
|
3
|
+
description: |
|
|
4
|
+
列出当前用户创建的奇遇剧本。返回简要摘要信息。
|
|
5
|
+
|
|
6
|
+
使用 `request_travel_campaign` 获取特定剧本的完整详情(剧情、任务、约束)。
|
|
7
|
+
|
|
8
|
+
说明:
|
|
9
|
+
- 为已认证用户返回 PUBLISHED 和 DRAFT 剧本
|
|
10
|
+
- 结果按最后修改时间排序(最新在前)
|
|
11
|
+
|
|
12
|
+
parameters:
|
|
13
|
+
page_index: 分页页码,默认为 0
|
|
14
|
+
page_size: 每页结果数量(1-50),默认为 20
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
name: request_travel_campaign
|
|
2
|
+
title: Get Travel Campaign Details
|
|
3
|
+
description: |
|
|
4
|
+
Get full details of a Travel Campaign including mission plot, task, and AI constraints.
|
|
5
|
+
|
|
6
|
+
This is the primary command for "play mode" — load a campaign before starting a storytelling session.
|
|
7
|
+
|
|
8
|
+
Agent Play Mode Workflow:
|
|
9
|
+
1. Call this command with the campaign UUID
|
|
10
|
+
2. Incorporate mission_plot as the story foundation in your context
|
|
11
|
+
3. Use mission_task as the player objectives and rules
|
|
12
|
+
4. If mission_plot_attention is present, apply it as the governing constraint layer — these rules override all other context. If absent, derive tone and constraints naturally from mission_plot
|
|
13
|
+
5. If default_tcp_uuid is present, load the character profile via `request_character_or_elementum` (neta-creative skill) then roleplay that character during the session
|
|
14
|
+
6. Synthesize campaign context into a scene-setting opening prompt (see template below)
|
|
15
|
+
|
|
16
|
+
Context Initialization Template:
|
|
17
|
+
Before the first player message, prime your context with:
|
|
18
|
+
---
|
|
19
|
+
You are an interactive story narrator. The campaign is now active.
|
|
20
|
+
Story world: [summarize mission_plot in 2-3 sentences — setting, situation, stakes]
|
|
21
|
+
Your role: [narrator / or character name if default_tcp_uuid is present]
|
|
22
|
+
Player's starting position: [where the player begins, what they know]
|
|
23
|
+
Opening scene: [specific location, time of day, one dominant sensory detail]
|
|
24
|
+
Governing rules: [paste full mission_plot_attention here, if present; otherwise infer tone from mission_plot]
|
|
25
|
+
Your first response must: establish atmosphere, present one immediate discovery or threat,
|
|
26
|
+
and end with a concrete choice that demands action — not a summary, not an introduction.
|
|
27
|
+
---
|
|
28
|
+
The first response sets the tone for the entire session. Invest in the opening.
|
|
29
|
+
|
|
30
|
+
Response Fields:
|
|
31
|
+
- mission_plot: The core story scenario and world context
|
|
32
|
+
- mission_task: Player objectives and interaction rules
|
|
33
|
+
- mission_plot_attention: Governing constraint layer (optional) — when present, follow strictly as they override all other context; when absent, derive tone naturally from mission_plot
|
|
34
|
+
- default_tcp_uuid: UUID of the bound character (if any); use `request_character_or_elementum` to load full profile before roleplaying
|
|
35
|
+
- header_img / background_img: Visual context for scene descriptions
|
|
36
|
+
|
|
37
|
+
parameters:
|
|
38
|
+
campaign_uuid: UUID of the campaign to retrieve (required)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { parseMeta } from "../../utils/parse_meta.js";
|
|
3
|
+
import { createCommand } from "../factory.js";
|
|
4
|
+
const meta = parseMeta(Type.Object({
|
|
5
|
+
name: Type.String(),
|
|
6
|
+
title: Type.String(),
|
|
7
|
+
description: Type.String(),
|
|
8
|
+
parameters: Type.Object({
|
|
9
|
+
campaign_uuid: Type.String(),
|
|
10
|
+
}),
|
|
11
|
+
}), import.meta);
|
|
12
|
+
const requestTravelCampaignParameters = Type.Object({
|
|
13
|
+
campaign_uuid: Type.String({
|
|
14
|
+
description: meta.parameters.campaign_uuid,
|
|
15
|
+
}),
|
|
16
|
+
});
|
|
17
|
+
export const requestTravelCampaign = createCommand({
|
|
18
|
+
name: meta.name,
|
|
19
|
+
title: meta.title,
|
|
20
|
+
description: meta.description,
|
|
21
|
+
inputSchema: requestTravelCampaignParameters,
|
|
22
|
+
}, async ({ campaign_uuid }, { apis }) => {
|
|
23
|
+
const campaign = await apis.travelCampaign.getCampaign(campaign_uuid);
|
|
24
|
+
return {
|
|
25
|
+
uuid: campaign.uuid,
|
|
26
|
+
name: campaign.name,
|
|
27
|
+
subtitle: campaign.subtitle,
|
|
28
|
+
status: campaign.status,
|
|
29
|
+
header_img: campaign.header_img,
|
|
30
|
+
background_img: campaign.background_img,
|
|
31
|
+
ctime: campaign.ctime,
|
|
32
|
+
mtime: campaign.mtime,
|
|
33
|
+
mission_plot: campaign.mission_plot,
|
|
34
|
+
mission_task: campaign.mission_task,
|
|
35
|
+
mission_plot_attention: campaign.mission_plot_attention,
|
|
36
|
+
default_tcp_uuid: campaign.default_travel_character_parent?.uuid ?? null,
|
|
37
|
+
creator: campaign.creator
|
|
38
|
+
? {
|
|
39
|
+
uuid: campaign.creator.uuid,
|
|
40
|
+
nick_name: campaign.creator.nick_name,
|
|
41
|
+
}
|
|
42
|
+
: null,
|
|
43
|
+
};
|
|
44
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
name: request_travel_campaign
|
|
2
|
+
title: 获取奇遇剧本详情
|
|
3
|
+
description: |
|
|
4
|
+
获取奇遇剧本的完整详情,包括剧情、任务和 AI 约束。
|
|
5
|
+
|
|
6
|
+
这是「游玩模式」的核心命令——在开始故事讲述会话前加载剧本。
|
|
7
|
+
|
|
8
|
+
Agent 游玩模式工作流:
|
|
9
|
+
1. 用剧本 UUID 调用此命令
|
|
10
|
+
2. 将 mission_plot 作为故事基础纳入上下文
|
|
11
|
+
3. 将 mission_task 作为玩家目标和规则
|
|
12
|
+
4. 若存在 mission_plot_attention,将其作为统治性约束层严格遵守——凌驾于所有其他上下文之上
|
|
13
|
+
5. 如果存在 default_tcp_uuid,先通过 neta-creative skill 的 `request_character_or_elementum` 加载角色档案,再在会话中扮演该角色
|
|
14
|
+
6. 将剧本信息综合为开场场景提示(见下方模板)
|
|
15
|
+
|
|
16
|
+
上下文初始化模板:
|
|
17
|
+
在玩家发出第一条消息前,用以下方式初始化你的上下文:
|
|
18
|
+
---
|
|
19
|
+
你是一名交互式故事叙事者。剧本现已激活。
|
|
20
|
+
故事世界:[用 2-3 句话概括 mission_plot——背景、情境、利害关系]
|
|
21
|
+
你的角色:[叙事者 / 或角色名(若存在 default_tcp_uuid)]
|
|
22
|
+
玩家起始位置:[玩家从哪里开始,他们知道什么]
|
|
23
|
+
开场场景:[具体地点、时间、一个主导感官细节]
|
|
24
|
+
统治规则(来自 mission_plot_attention,若存在):[在此粘贴完整内容]
|
|
25
|
+
你的第一次回复必须:建立氛围、呈现一个即时的发现或威胁、以需要行动的具体选择结尾——
|
|
26
|
+
不是总结,不是介绍。
|
|
27
|
+
---
|
|
28
|
+
第一次回复决定整个会话的基调。值得投入精力。
|
|
29
|
+
|
|
30
|
+
响应字段:
|
|
31
|
+
- mission_plot:核心故事场景和世界背景
|
|
32
|
+
- mission_task:玩家目标和互动规则
|
|
33
|
+
- mission_plot_attention:统治性约束层(若存在则严格遵守,凌驾于所有其他上下文之上)
|
|
34
|
+
- default_tcp_uuid:绑定角色的 UUID(如有);角色扮演前请调用 `request_character_or_elementum` 加载完整档案
|
|
35
|
+
- header_img / background_img:场景描述的视觉参考
|
|
36
|
+
|
|
37
|
+
parameters:
|
|
38
|
+
campaign_uuid: 要获取的剧本 UUID(必填)
|