@talesofai/neta-skills 0.10.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.
Files changed (78) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +19 -8
  3. package/README.zh_cn.md +19 -8
  4. package/bin/apis/index.js +3 -0
  5. package/bin/apis/travel_campaign.js +30 -0
  6. package/bin/apis/types.js +22 -6
  7. package/bin/cli.js +3 -1
  8. package/bin/commands/creative/make_image.cmd.en_us.yml +3 -1
  9. package/bin/commands/creative/make_image.cmd.js +21 -2
  10. package/bin/commands/creative/make_image.cmd.zh_cn.yml +3 -0
  11. package/bin/commands/creative/make_song.cmd.js +1 -1
  12. package/bin/commands/creative/remove_background.cmd.js +2 -2
  13. package/bin/commands/load.js +2 -1
  14. package/bin/commands/travel_campaign/create_travel_campaign.cmd.en_us.yml +60 -0
  15. package/bin/commands/travel_campaign/create_travel_campaign.cmd.js +68 -0
  16. package/bin/commands/travel_campaign/create_travel_campaign.cmd.zh_cn.yml +58 -0
  17. package/bin/commands/travel_campaign/list_my_travel_campaigns.cmd.en_us.yml +14 -0
  18. package/bin/commands/travel_campaign/list_my_travel_campaigns.cmd.js +53 -0
  19. package/bin/commands/travel_campaign/list_my_travel_campaigns.cmd.zh_cn.yml +14 -0
  20. package/bin/commands/travel_campaign/request_travel_campaign.cmd.en_us.yml +38 -0
  21. package/bin/commands/travel_campaign/request_travel_campaign.cmd.js +44 -0
  22. package/bin/commands/travel_campaign/request_travel_campaign.cmd.zh_cn.yml +38 -0
  23. package/bin/commands/travel_campaign/update_travel_campaign.cmd.en_us.yml +30 -0
  24. package/bin/commands/travel_campaign/update_travel_campaign.cmd.js +70 -0
  25. package/bin/commands/travel_campaign/update_travel_campaign.cmd.zh_cn.yml +29 -0
  26. package/package.json +1 -1
  27. package/skills/neta/SKILL.md +22 -0
  28. package/skills/neta-character/SKILL.md +8 -22
  29. package/skills/neta-character/references/character-creation.md +6 -6
  30. package/skills/neta-character/references/character-update.md +7 -7
  31. package/skills/neta-community/SKILL.md +9 -35
  32. package/skills/neta-community/references/character-search.md +20 -20
  33. package/skills/neta-community/references/hashtag-research.md +25 -25
  34. package/skills/neta-community/references/interactive-feed.md +27 -27
  35. package/skills/neta-community/references/social-interactive.md +10 -10
  36. package/skills/neta-creative/SKILL.md +8 -27
  37. package/skills/neta-creative/references/character-search.md +20 -20
  38. package/skills/neta-creative/references/collection-remix.md +1 -1
  39. package/skills/neta-creative/references/image-generation.md +106 -72
  40. package/skills/neta-creative/references/song-creation.md +4 -4
  41. package/skills/neta-creative/references/song-mv.md +15 -15
  42. package/skills/neta-creative/references/video-generation.md +5 -5
  43. package/skills/neta-elementum/SKILL.md +7 -21
  44. package/skills/neta-elementum/references/elementum-alchemy.md +8 -8
  45. package/skills/neta-elementum/references/elementum-update.md +8 -8
  46. package/skills/neta-space/SKILL.md +6 -25
  47. package/skills/neta-suggest/SKILL.md +34 -53
  48. package/skills/neta-travel/SKILL.md +71 -0
  49. package/skills/neta-travel/references/travel-crafting.md +85 -0
  50. package/skills/neta-travel/references/travel-examples.md +304 -0
  51. package/skills/neta-travel/references/travel-field-guide.md +45 -0
  52. package/skills/neta-travel/references/travel-playing.md +116 -0
  53. package/skills/zh_cn/neta/SKILL.md +20 -0
  54. package/skills/zh_cn/neta-character/SKILL.md +8 -22
  55. package/skills/zh_cn/neta-character/references/character-creation.md +6 -6
  56. package/skills/zh_cn/neta-character/references/character-update.md +7 -7
  57. package/skills/zh_cn/neta-community/SKILL.md +9 -27
  58. package/skills/zh_cn/neta-community/references/character-search.md +20 -20
  59. package/skills/zh_cn/neta-community/references/hashtag-research.md +25 -25
  60. package/skills/zh_cn/neta-community/references/interactive-feed.md +30 -30
  61. package/skills/zh_cn/neta-community/references/social-interactive.md +10 -10
  62. package/skills/zh_cn/neta-creative/SKILL.md +8 -26
  63. package/skills/zh_cn/neta-creative/references/character-search.md +20 -20
  64. package/skills/zh_cn/neta-creative/references/collection-remix.md +1 -1
  65. package/skills/zh_cn/neta-creative/references/image-generation.md +74 -30
  66. package/skills/zh_cn/neta-creative/references/song-creation.md +4 -4
  67. package/skills/zh_cn/neta-creative/references/song-mv.md +15 -15
  68. package/skills/zh_cn/neta-creative/references/video-generation.md +5 -5
  69. package/skills/zh_cn/neta-elementum/SKILL.md +7 -21
  70. package/skills/zh_cn/neta-elementum/references/elementum-alchemy.md +8 -8
  71. package/skills/zh_cn/neta-elementum/references/elementum-update.md +8 -8
  72. package/skills/zh_cn/neta-space/SKILL.md +6 -24
  73. package/skills/zh_cn/neta-suggest/SKILL.md +55 -73
  74. package/skills/zh_cn/neta-travel/SKILL.md +71 -0
  75. package/skills/zh_cn/neta-travel/references/travel-crafting.md +85 -0
  76. package/skills/zh_cn/neta-travel/references/travel-examples.md +181 -0
  77. package/skills/zh_cn/neta-travel/references/travel-field-guide.md +45 -0
  78. package/skills/zh_cn/neta-travel/references/travel-playing.md +116 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @neta/skills-neta
2
2
 
3
+ ## 0.12.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 0a03853: introduce neta-travel skill for creating and playing AI-driven interactive story adventures (travel campaigns)
8
+
9
+ ## 0.11.0
10
+
11
+ ### Minor Changes
12
+
13
+ - make image command support size params and model selection
14
+
3
15
  ## 0.10.0
4
16
 
5
17
  ### Minor Changes
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 **30 commands** for various tasks:
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-cli --help
132
- neta-cli make_image --help
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-cli make_image --prompt "A cyberpunk cityscape at night" --aspect "16:9"
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-cli search_character_or_elementum --keywords "fantasy"
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
- └── neta-elementum/
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-cli make_image --help
224
- LANG=en_US.UTF-8 neta-cli make_image --help
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
- 当前技能共包含 **30 个命令**,覆盖创作、角色与社区探索等场景:
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-cli --help
136
- neta-cli make_image --help
143
+ npx -y @talesofai/neta-skills --help
144
+ npx -y @talesofai/neta-skills make_image --help
137
145
 
138
146
  # 示例:生成一张图片
139
- neta-cli make_image \
147
+ npx -y @talesofai/neta-skills make_image \
140
148
  --prompt "夜晚的赛博朋克城市,霓虹灯,高楼大厦,雨中街道" \
141
149
  --aspect "16:9"
142
150
 
143
151
  # 示例:搜索角色或元素
144
- neta-cli search_character_or_elementum \
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
- └── neta-elementum/
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-cli make_image --help
231
- LANG=en_US.UTF-8 neta-cli make_image --help
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/apis/types.js CHANGED
@@ -26,16 +26,32 @@ export const IMAGE_GENERATE_ASPECTS = [
26
26
  },
27
27
  ];
28
28
  export const buildMakeImagePayload = (vtokens, options, inherit) => {
29
- const { make_image_aspect, advanced_translator, negative_freetext, context_model_series, entrance_uuid, manuscript_uuid, assign_key, toolcall_uuid, } = options;
30
- const imageAspect = IMAGE_GENERATE_ASPECTS.find((a) => a.aspect === make_image_aspect)?.size ?? [576, 768];
29
+ const { make_image_aspect, width, height, advanced_translator, negative_freetext, context_model_series, entrance_uuid, manuscript_uuid, assign_key, toolcall_uuid, } = options;
30
+ const size = (() => {
31
+ // use custom width and height
32
+ if (width && height) {
33
+ return [width, height];
34
+ }
35
+ const aspectSize = IMAGE_GENERATE_ASPECTS.find((a) => a.aspect === make_image_aspect)?.size ?? [576, 768];
36
+ // use custom width and fix height by aspect ratio
37
+ if (width) {
38
+ return [width, (aspectSize[1] / aspectSize[0]) * width];
39
+ }
40
+ // use custom height and fix width by aspect ratio
41
+ if (height) {
42
+ return [(aspectSize[0] / aspectSize[1]) * height, height];
43
+ }
44
+ // use aspect ratio preset size
45
+ return aspectSize;
46
+ })();
31
47
  return {
32
48
  storyId: "DO_NOT_USE",
33
49
  jobType: "universal",
34
50
  rawPrompt: vtokens,
35
- width: imageAspect[0],
36
- height: imageAspect[1],
51
+ width: size[0],
52
+ height: size[1],
37
53
  meta: {
38
- entrance: "PICTURE,VERSE",
54
+ entrance: "PICTURE,CLI",
39
55
  entrance_uuid,
40
56
  manuscript_uuid,
41
57
  assign_key,
@@ -56,7 +72,7 @@ export const buildMakeVideoPayload = (image_url, work_flow_text, work_flow_model
56
72
  work_flow_model,
57
73
  inherit_params,
58
74
  meta: {
59
- entrance: "VIDEO,VERSE",
75
+ entrance: "VIDEO,CLI",
60
76
  entrance_uuid,
61
77
  manuscript_uuid,
62
78
  assign_key,
package/bin/cli.js CHANGED
@@ -4,7 +4,9 @@ import dotenv from "dotenv-flow";
4
4
  import pkg from "../package.json" with { type: "json" };
5
5
  import { buildCommands } from "./commands/load.js";
6
6
  // Load environment variables
7
- dotenv.config();
7
+ dotenv.config({
8
+ silent: true,
9
+ });
8
10
  program
9
11
  .name("neta")
10
12
  .description("NETA CLI - Neta API Client")
@@ -17,4 +17,6 @@ parameters:
17
17
  - For image editing or image‑to‑image tasks, always include the proper reference image variables.
18
18
  - Example (character + element): @character_name, /elementum_name, ref_img-1234567890, ref_img-1234567891, keyword1, keyword2…
19
19
  aspect: Image aspect ratio
20
-
20
+ width: Image width
21
+ height: Image height
22
+ model_series: Image generation model
@@ -10,6 +10,9 @@ const meta = parseMeta(Type.Object({
10
10
  parameters: Type.Object({
11
11
  prompt: Type.String(),
12
12
  aspect: Type.String(),
13
+ width: Type.String(),
14
+ height: Type.String(),
15
+ model_series: Type.String(),
13
16
  }),
14
17
  }), import.meta);
15
18
  const makeImageV1Parameters = Type.Object({
@@ -24,18 +27,34 @@ const makeImageV1Parameters = Type.Object({
24
27
  default: "3:4",
25
28
  description: meta.parameters.aspect,
26
29
  }),
30
+ width: Type.Optional(Type.Integer({
31
+ description: meta.parameters.width,
32
+ minimum: 256,
33
+ maximum: 2048,
34
+ })),
35
+ height: Type.Optional(Type.Integer({
36
+ description: meta.parameters.height,
37
+ minimum: 256,
38
+ maximum: 2048,
39
+ })),
40
+ model_series: Type.Union([Type.Literal("8_image_edit"), Type.Literal("3_noobxl")], {
41
+ default: "8_image_edit",
42
+ description: meta.parameters.model_series,
43
+ }),
27
44
  });
28
45
  export const makeImage = createCommand({
29
46
  name: meta.name,
30
47
  title: meta.title,
31
48
  description: meta.description,
32
49
  inputSchema: makeImageV1Parameters,
33
- }, async ({ prompt, aspect }, { log, apis }) => {
50
+ }, async ({ prompt, aspect, model_series, width, height }, { log, apis }) => {
34
51
  const createTask = async () => {
35
52
  const vtokens = (await apis.prompt.parseVtokens(prompt)) ?? [];
36
53
  const payload = buildMakeImagePayload(vtokens ?? [], {
37
54
  make_image_aspect: aspect ?? "3:4",
38
- context_model_series: "8_image_edit",
55
+ width,
56
+ height,
57
+ context_model_series: model_series,
39
58
  });
40
59
  return await apis.artifact.makeImage(payload);
41
60
  };
@@ -17,3 +17,6 @@ parameters:
17
17
  - 对于修改图片等跟原图参考相关的生成,请一定引用上参考图变量
18
18
  - 示例(引用角色和元素):@奈塔#996, /漫画风格, 参考图-1234567890, 参考图-1234567891, 词组1, 词组2…
19
19
  aspect: 图片比例
20
+ width: 图片宽度
21
+ height: 图片高度
22
+ model_series: 生图模型
@@ -31,7 +31,7 @@ export const makeSong = createCommand({
31
31
  }, async ({ prompt, lyrics }, { apis, log }) => {
32
32
  const createTask = async () => {
33
33
  return apis.artifact.makeSong(prompt, lyrics, {
34
- entrance: "SONG,VERSE",
34
+ entrance: "SONG,CLI",
35
35
  });
36
36
  };
37
37
  const task_uuid = await createTask();
@@ -25,7 +25,7 @@ export const removeBackground = createCommand({
25
25
  }, async ({ input_image }, { apis, log }) => {
26
26
  const createTask = async () => {
27
27
  return apis.artifact.postProcess(input_image, "0_null/抠图SEG", {
28
- entrance: "PICTURE,PURE,VERSE",
28
+ entrance: "PICTURE,CLI",
29
29
  });
30
30
  };
31
31
  const task_uuid = await createTask();
@@ -53,7 +53,7 @@ export const removeBackgroundNoCrop = createCommand({
53
53
  }, async ({ input_image }, { apis, log }) => {
54
54
  const createTask = async () => {
55
55
  return apis.artifact.postProcess(input_image, "0_null/抠图SEG", {
56
- entrance: "PICTURE,PURE,VERSE",
56
+ entrance: "PICTURE,CLI",
57
57
  });
58
58
  };
59
59
  const task_uuid = await createTask();
@@ -44,6 +44,7 @@ export const buildCommands = async (cli) => {
44
44
  "creative",
45
45
  "community",
46
46
  "character_elementum",
47
+ "travel_campaign",
47
48
  ]);
48
49
  return commands.map((cmd) => {
49
50
  const command = cli.command(cmd.name);
@@ -56,7 +57,7 @@ export const buildCommands = async (cli) => {
56
57
  Object.entries(properties).forEach(([key, property]) => {
57
58
  if (typeof property !== "object")
58
59
  return;
59
- const option = new Option(`--${key} <${property["type"]}>`, property.description);
60
+ const option = new Option(`--${key} <${property["type"] ?? "string"}>`, property.description);
60
61
  if (property.default) {
61
62
  option.default(property.default);
62
63
  }
@@ -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