@talesofai/neta-skills 0.7.0 → 0.10.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 +18 -0
- package/README.md +156 -130
- package/README.zh_cn.md +266 -0
- package/bin/apis/tcp.js +30 -0
- package/bin/cli.js +1 -3
- package/bin/commands/character_elementum/create_character.cmd.en_us.yml +43 -0
- package/bin/commands/character_elementum/create_character.cmd.js +72 -0
- package/bin/commands/character_elementum/create_character.cmd.zh_cn.yml +43 -0
- package/bin/commands/character_elementum/create_elementum.cmd.en_us.yml +30 -0
- package/bin/commands/character_elementum/create_elementum.cmd.js +44 -0
- package/bin/commands/character_elementum/create_elementum.cmd.zh_cn.yml +30 -0
- package/bin/commands/character_elementum/list_my_characters.cmd.en_us.yml +18 -0
- package/bin/commands/character_elementum/list_my_characters.cmd.js +45 -0
- package/bin/commands/character_elementum/list_my_characters.cmd.zh_cn.yml +18 -0
- package/bin/commands/character_elementum/list_my_elementum.cmd.en_us.yml +18 -0
- package/bin/commands/character_elementum/list_my_elementum.cmd.js +45 -0
- package/bin/commands/character_elementum/list_my_elementum.cmd.zh_cn.yml +18 -0
- package/bin/commands/character_elementum/update_character.cmd.en_us.yml +30 -0
- package/bin/commands/character_elementum/update_character.cmd.js +84 -0
- package/bin/commands/character_elementum/update_character.cmd.zh_cn.yml +30 -0
- package/bin/commands/character_elementum/update_elementum.cmd.en_us.yml +18 -0
- package/bin/commands/character_elementum/update_elementum.cmd.js +52 -0
- package/bin/commands/character_elementum/update_elementum.cmd.zh_cn.yml +18 -0
- package/bin/commands/load.js +9 -11
- package/bin/utils/tcp_mapper.js +41 -0
- package/package.json +3 -3
- package/skills/neta/SKILL.md +37 -15
- package/skills/neta-character/SKILL.md +105 -0
- package/skills/neta-character/references/character-creation.md +195 -0
- package/skills/neta-character/references/character-field-guide.md +170 -0
- package/skills/neta-character/references/character-update.md +112 -0
- package/skills/neta-community/SKILL.md +1 -1
- package/skills/neta-community/references/character-search.md +263 -0
- package/skills/neta-community/references/hashtag-research.md +311 -0
- package/skills/neta-community/references/interactive-feed.md +365 -0
- package/skills/neta-community/references/social-interactive.md +74 -0
- package/skills/neta-creative/SKILL.md +1 -1
- package/skills/neta-creative/references/character-search.md +265 -0
- package/skills/neta-creative/references/collection-remix.md +46 -0
- package/skills/neta-creative/references/image-generation.md +131 -0
- package/skills/neta-creative/references/song-creation.md +250 -0
- package/skills/neta-creative/references/song-mv.md +210 -0
- package/skills/neta-creative/references/video-generation.md +242 -0
- package/skills/neta-elementum/SKILL.md +105 -0
- package/skills/neta-elementum/references/elementum-alchemy.md +197 -0
- package/skills/neta-elementum/references/elementum-field-guide.md +157 -0
- package/skills/neta-elementum/references/elementum-update.md +113 -0
- package/skills/neta-space/SKILL.md +1 -1
- package/skills/neta-suggest/SKILL.md +1 -1
- package/skills/zh_cn/neta/SKILL.md +21 -1
- package/skills/zh_cn/neta-character/SKILL.md +105 -0
- package/skills/zh_cn/neta-character/references/character-creation.md +195 -0
- package/skills/zh_cn/neta-character/references/character-field-guide.md +170 -0
- package/skills/zh_cn/neta-character/references/character-update.md +112 -0
- package/skills/zh_cn/neta-community/SKILL.md +1 -1
- package/skills/zh_cn/neta-creative/SKILL.md +1 -1
- package/skills/zh_cn/neta-elementum/SKILL.md +105 -0
- package/skills/zh_cn/neta-elementum/references/elementum-alchemy.md +197 -0
- package/skills/zh_cn/neta-elementum/references/elementum-field-guide.md +157 -0
- package/skills/zh_cn/neta-elementum/references/elementum-update.md +113 -0
- package/skills/zh_cn/neta-space/SKILL.md +1 -1
- package/skills/zh_cn/neta-suggest/SKILL.md +1 -1
- package/README.en.md +0 -234
- package/skills/zh_cn/neta/references/character-search.md +0 -234
- package/skills/zh_cn/neta/references/collection-remix.md +0 -40
- package/skills/zh_cn/neta/references/community-exploration.md +0 -636
- package/skills/zh_cn/neta/references/hashtag-research.md +0 -295
- package/skills/zh_cn/neta/references/image-generation.md +0 -121
- package/skills/zh_cn/neta/references/interactive-feed.md +0 -377
- package/skills/zh_cn/neta/references/social-interactive.md +0 -73
- package/skills/zh_cn/neta/references/song-creation.md +0 -247
- package/skills/zh_cn/neta/references/song-mv.md +0 -198
- package/skills/zh_cn/neta/references/space.md +0 -90
- package/skills/zh_cn/neta/references/video-generation.md +0 -221
package/README.zh_cn.md
ADDED
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# NETA Skills
|
|
2
|
+
|
|
3
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
|
+
[](https://nodejs.org/)
|
|
5
|
+
[](https://www.typescriptlang.org/)
|
|
6
|
+
|
|
7
|
+
[简体中文](./README.md) · [English](./README.en.md)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 简介
|
|
12
|
+
|
|
13
|
+
**NETA Skills** 是一组基于 [Neta Art](https://www.neta.art/) API 的 AI Agent 技能与 CLI 工具集合,帮助你在 Agent 环境中一站式完成:
|
|
14
|
+
|
|
15
|
+
- 生成图片 / 视频 / 歌曲等多媒体内容
|
|
16
|
+
- 查询与管理角色(Character)与风格元素(Elementum)
|
|
17
|
+
- 进行标签(Hashtag)与空间玩法探索
|
|
18
|
+
- 通过推荐引擎和互动 Feed 进行玩法内容发现
|
|
19
|
+
|
|
20
|
+
你可以在 [Neta 开放平台](https://www.neta.art/open/) 获取访问令牌 `NETA_TOKEN`。
|
|
21
|
+
也可以在[国内登陆账号后台](https://app.nieta.art/security) 获取访问令牌 `NETA_TOKEN`。
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## ✨ 功能特性
|
|
26
|
+
|
|
27
|
+
- 🎨 **多媒体创作**:使用最新的 AI 模型生成图片、视频和歌曲。
|
|
28
|
+
- 🔧 **图像与视频处理**:支持移除背景、视频合并等常见素材处理流程。
|
|
29
|
+
- 👤 **角色与风格管理**:搜索、获取角色与风格元素详情,在创作中标准化复用。
|
|
30
|
+
- 🏷️ **社区与标签集成**:浏览热门标签、空间、玩法合集与角色。
|
|
31
|
+
- 🧭 **智能内容探索**:通过关键词建议、标签推荐、分类导航与智能内容流,渐进式发现玩法与内容。
|
|
32
|
+
- 🤖 **Agent 优先设计**:面向 AI Agent 场景设计,易于在各类 Agent 框架中集成调用。
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 🚀 在 Agent 中使用技能
|
|
37
|
+
|
|
38
|
+
在你的 Agent 环境中安装统一的 [`neta`](skills/zh_cn/neta/SKILL.md) 技能:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx skills add talesofai/neta-skills/skills/zh_cn/neta
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
如果你希望在 Agent 中按功能模块更精细地控制权限,也可以分别安装拆分后的技能:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# 社区 / 标签 / 空间探索
|
|
48
|
+
npx skills add talesofai/neta-skills/skills/zh_cn/neta-community
|
|
49
|
+
|
|
50
|
+
# 图片 / 视频 / 歌曲创作
|
|
51
|
+
npx skills add talesofai/neta-skills/skills/zh_cn/neta-creative
|
|
52
|
+
|
|
53
|
+
# 关键词 / 标签 / 分类 / 内容推荐与检索
|
|
54
|
+
npx skills add talesofai/neta-skills/skills/zh_cn/neta-suggest
|
|
55
|
+
|
|
56
|
+
# 空间导航与探索(space / topic)
|
|
57
|
+
npx skills add talesofai/neta-skills/skills/zh_cn/neta-space
|
|
58
|
+
|
|
59
|
+
# 角色 VToken 创建与管理
|
|
60
|
+
npx skills add talesofai/neta-skills/skills/zh_cn/neta-character
|
|
61
|
+
|
|
62
|
+
# 元素 VToken 创建与管理
|
|
63
|
+
npx skills add talesofai/neta-skills/skills/zh_cn/neta-elementum
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 可用指令总览
|
|
67
|
+
|
|
68
|
+
当前技能共包含 **30 个命令**,覆盖创作、角色与社区探索等场景:
|
|
69
|
+
|
|
70
|
+
| 分类 | 命令 | 说明 |
|
|
71
|
+
|------|------|------|
|
|
72
|
+
| **创作 Creation** | `make_image` | 基于提示词生成图片 |
|
|
73
|
+
| | `make_video` | 基于图片与动作描述生成视频 |
|
|
74
|
+
| | `make_song` | 基于风格与歌词生成歌曲 |
|
|
75
|
+
| | `remove_background` | 移除图片背景 |
|
|
76
|
+
| | `edit_collection` | 编辑已有玩法合集(名称、描述、标签、状态等) |
|
|
77
|
+
| | `publish_collection` | 发布或更新玩法合集内容 |
|
|
78
|
+
| | `search_character_or_elementum` | 搜索可复用的 TCP(角色 / 元素 / 玩法模块) |
|
|
79
|
+
| **VToken 管理** | `create_character` | 创建角色 VToken(消耗电量) |
|
|
80
|
+
| | `update_character` | 更新现有角色 VToken |
|
|
81
|
+
| | `list_my_characters` | 列出当前用户创建的所有角色 |
|
|
82
|
+
| | `create_elementum` | 创建元素 VToken(消耗电量) |
|
|
83
|
+
| | `update_elementum` | 更新现有元素 VToken |
|
|
84
|
+
| | `list_my_elementum` | 列出当前用户创建的所有元素 |
|
|
85
|
+
| **角色 Characters** | `request_character_or_elementum` | 通过名称或 UUID 获取角色 / 元素详情 |
|
|
86
|
+
| **社区 Community** | `get_hashtag_info` | 查询标签基础信息与 worldbuilding lore |
|
|
87
|
+
| | `get_hashtag_characters` | 获取标签下的角色列表 |
|
|
88
|
+
| | `get_hashtag_collections` | 获取标签下的玩法合集 |
|
|
89
|
+
| | `read_collection` | 读取单个玩法合集(含 Remix 模板) |
|
|
90
|
+
| | `list_spaces` | 列出可游览的空间 |
|
|
91
|
+
| | `list_space_topics` | 获取空间下的子空间(topic)信息 |
|
|
92
|
+
| | `request_interactive_feed` | 获取玩法互动 Feed(合集、空间、用户等场景) |
|
|
93
|
+
| | `suggest_keywords` | 获取搜索关键词自动补全建议 |
|
|
94
|
+
| | `suggest_tags` | 基于关键词获取相关标签建议 |
|
|
95
|
+
| | `suggest_categories` | 按层级获取玩法分类导航 |
|
|
96
|
+
| | `validate_tax_path` | 验证分类路径是否有效 |
|
|
97
|
+
| | `suggest_content` | 推荐 / 搜索 / 精确筛选三模式内容流 |
|
|
98
|
+
| | `get_fan_list` | 获取当前用户的粉丝列表 |
|
|
99
|
+
| | `get_subscribe_list` | 获取当前用户关注的创作者列表 |
|
|
100
|
+
| | `favor_collection` | 收藏 / 取消收藏玩法合集 |
|
|
101
|
+
| | `like_collection` | 点赞 / 取消点赞玩法合集 |
|
|
102
|
+
| | `subscribe_user` | 关注 / 取消关注创作者 |
|
|
103
|
+
| | `create_comment` | 对玩法合集创建评论 |
|
|
104
|
+
|
|
105
|
+
更详细的中文 CLI 示例与最佳实践,请参考 `skills/neta/SKILL.md` 以及 `skills/neta/references/` 目录下的文档。
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 🛠️ CLI 使用(`@talesofai/neta-skills`)
|
|
110
|
+
|
|
111
|
+
项目同时提供了一个独立的 CLI 包 `@talesofai/neta-skills`,适合在本地终端、脚本和 CI 中直接调用 Neta API。
|
|
112
|
+
|
|
113
|
+
### 安装 CLI
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# 全局安装(推荐)
|
|
117
|
+
npm install -g @talesofai/neta-skills
|
|
118
|
+
|
|
119
|
+
# 或者使用 npx / pnpm dlx 临时调用
|
|
120
|
+
npx @talesofai/neta-skills --help
|
|
121
|
+
pnpm dlx @talesofai/neta-skills --help
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
配置环境变量:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# 在环境中设置 NETA_TOKEN,或在你的 .env / .env.local 中配置
|
|
128
|
+
export NETA_TOKEN=your_token_here
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 运行示例
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# 查看帮助
|
|
135
|
+
neta-cli --help
|
|
136
|
+
neta-cli make_image --help
|
|
137
|
+
|
|
138
|
+
# 示例:生成一张图片
|
|
139
|
+
neta-cli make_image \
|
|
140
|
+
--prompt "夜晚的赛博朋克城市,霓虹灯,高楼大厦,雨中街道" \
|
|
141
|
+
--aspect "16:9"
|
|
142
|
+
|
|
143
|
+
# 示例:搜索角色或元素
|
|
144
|
+
neta-cli search_character_or_elementum \
|
|
145
|
+
--keywords "幻想" \
|
|
146
|
+
--parent_type "character"
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 📂 项目结构
|
|
152
|
+
|
|
153
|
+
```text
|
|
154
|
+
neta-skills/
|
|
155
|
+
├── skills/
|
|
156
|
+
│ ├── neta/ # 英文统一 Neta 技能(Agent 优先)
|
|
157
|
+
│ │ └── SKILL.md # 英文技能说明
|
|
158
|
+
│ ├── neta-community/ # 英文社区 / 标签 / 空间探索相关技能
|
|
159
|
+
│ ├── neta-creative/ # 英文图片 / 视频 / 歌曲创作相关技能
|
|
160
|
+
│ ├── neta-suggest/ # 英文推荐 / 搜索 / 分类导航技能
|
|
161
|
+
│ ├── neta-space/ # 英文空间与话题导航 / 探索技能
|
|
162
|
+
│ ├── neta-character/ # 英文角色 VToken 创建与管理技能
|
|
163
|
+
│ ├── neta-elementum/ # 英文元素 VToken 创建与管理技能
|
|
164
|
+
│ └── zh_cn/ # 中文本地化技能与参考文档
|
|
165
|
+
│ ├── neta/
|
|
166
|
+
│ ├── neta-community/
|
|
167
|
+
│ ├── neta-creative/
|
|
168
|
+
│ ├── neta-suggest/
|
|
169
|
+
│ ├── neta-space/
|
|
170
|
+
│ ├── neta-character/
|
|
171
|
+
│ └── neta-elementum/
|
|
172
|
+
├── src/ # CLI 对应的 TypeScript 源码
|
|
173
|
+
│ ├── apis/ # 封装后的 Neta API 调用
|
|
174
|
+
│ ├── commands/ # CLI 命令定义(TS + YAML 描述)
|
|
175
|
+
│ ├── utils/ # 通用工具方法
|
|
176
|
+
│ └── cli.ts # CLI 入口(TypeScript)
|
|
177
|
+
├── bin/ # 构建后的 JavaScript 产物
|
|
178
|
+
│ ├── apis/
|
|
179
|
+
│ ├── commands/
|
|
180
|
+
│ ├── utils/
|
|
181
|
+
│ └── cli.js # CLI 入口(编译后的 JS)
|
|
182
|
+
├── scripts/
|
|
183
|
+
│ └── postbuild.js # 构建 / 后处理脚本
|
|
184
|
+
├── .env.example # 环境变量示例文件
|
|
185
|
+
├── package.json # 根包配置与脚本
|
|
186
|
+
├── pnpm-lock.yaml # 依赖锁定文件
|
|
187
|
+
├── tsconfig.json # TypeScript 配置
|
|
188
|
+
├── biome.json # Biome(格式化 / Lint)配置
|
|
189
|
+
└── lint-staged.config.mjs # lint-staged 配置
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 📖 最佳实践与工作流参考
|
|
195
|
+
|
|
196
|
+
`skills/neta/references/` 目录下提供了详细的中文工作流与 SOP,适合 AI Agent 在规划调用顺序时阅读,例如:
|
|
197
|
+
|
|
198
|
+
- **图片与视频生成**:提示词结构、宽高比选择、从图到视频的完整链路。
|
|
199
|
+
- **歌曲与 MV 创作**:歌词模板、风格设计、MV 视觉规划与多场景组合。
|
|
200
|
+
- **角色与标签调研**:如何通过角色 / 标签 / 空间找到合适的创作方向。
|
|
201
|
+
- **角色与元素创建**:角色创建和元素炼金的工作流。
|
|
202
|
+
- **玩法内容探索**:使用 `suggest_*` 与 `suggest_content` 构建渐进式探索闭环。
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 📝 环境变量
|
|
207
|
+
|
|
208
|
+
无论在 Agent 还是 CLI 中使用,都需要正确配置以下环境变量:
|
|
209
|
+
|
|
210
|
+
| 变量名 | 必需 | 默认值 | 说明 |
|
|
211
|
+
|--------|------|--------|------|
|
|
212
|
+
| `NETA_TOKEN` | ✅ | - | Neta Art API 访问令牌 |
|
|
213
|
+
| `NETA_API_BASE_URL` | ❌ | default: `https://api.talesofai.com` | Neta API 网关地址 |
|
|
214
|
+
|
|
215
|
+
### 多语言与本地化(i18n)
|
|
216
|
+
|
|
217
|
+
CLI 与 Skills 会根据系统与环境变量自动选择使用的语言:
|
|
218
|
+
|
|
219
|
+
- 系统语言或环境变量以 `zh` 开头(如 `zh_CN`、`en_US`)→ 使用 `zh_cn` 文案与元数据;
|
|
220
|
+
- 其他语言环境 → 默认使用 `en_us` 文案与元数据。
|
|
221
|
+
|
|
222
|
+
在终端环境中,可以通过以下方式影响语言选择:
|
|
223
|
+
|
|
224
|
+
- 操作系统语言设置(macOS / Linux / Windows);
|
|
225
|
+
- Shell 中的本地化环境变量:`LC_ALL`、`LC_MESSAGES`、`LANG`、`LANGUAGE` 等。
|
|
226
|
+
|
|
227
|
+
在需要强制指定语言时,推荐在运行命令前显式设置环境变量,例如:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
LC_ALL=zh_CN.UTF-8 neta-cli make_image --help
|
|
231
|
+
LANG=en_US.UTF-8 neta-cli make_image --help
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## 🔧 本地开发
|
|
237
|
+
|
|
238
|
+
在本地开发与调试时,可以使用以下脚本:
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
# 安装依赖
|
|
242
|
+
corepack enabled
|
|
243
|
+
pnpm i
|
|
244
|
+
|
|
245
|
+
# TypeScript 类型检查
|
|
246
|
+
pnpm type-check
|
|
247
|
+
|
|
248
|
+
# 代码检查(lint)
|
|
249
|
+
pnpm lint
|
|
250
|
+
|
|
251
|
+
# 本地调试技能(watch / dev)
|
|
252
|
+
pnpm dev <command> [options]
|
|
253
|
+
|
|
254
|
+
# 构建 bin 脚本
|
|
255
|
+
pnpm build
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 📄 开源协议与链接
|
|
261
|
+
|
|
262
|
+
本项目基于 [MIT License](LICENSE) 开源。
|
|
263
|
+
|
|
264
|
+
- [Neta Art 官网](https://www.neta.art/)
|
|
265
|
+
- [skills.sh 文档](https://skills.sh/docs)
|
|
266
|
+
|
package/bin/apis/tcp.js
CHANGED
|
@@ -9,8 +9,38 @@ export const createTcpApis = (client) => {
|
|
|
9
9
|
.get(`/v2/travel/parent/${uuid}/profile`)
|
|
10
10
|
.then((res) => res.data);
|
|
11
11
|
};
|
|
12
|
+
const createCharacter = async (params) => {
|
|
13
|
+
return client
|
|
14
|
+
.post("/v3/oc/character", params)
|
|
15
|
+
.then((res) => res.data);
|
|
16
|
+
};
|
|
17
|
+
const updateCharacter = async (tcp_uuid, params) => {
|
|
18
|
+
return client
|
|
19
|
+
.patch(`/v3/oc/character/${tcp_uuid}`, params)
|
|
20
|
+
.then((res) => res.data);
|
|
21
|
+
};
|
|
22
|
+
const createElementum = async (params) => {
|
|
23
|
+
return client
|
|
24
|
+
.post("/v3/oc/elementum", params)
|
|
25
|
+
.then((res) => res.data);
|
|
26
|
+
};
|
|
27
|
+
const updateElementum = async (tcp_uuid, params) => {
|
|
28
|
+
return client
|
|
29
|
+
.patch(`/v3/oc/elementum/${tcp_uuid}`, params)
|
|
30
|
+
.then((res) => res.data);
|
|
31
|
+
};
|
|
32
|
+
const listMyTCPs = async (query) => {
|
|
33
|
+
return client
|
|
34
|
+
.get("/v2/travel/parent", { params: query })
|
|
35
|
+
.then((res) => res.data);
|
|
36
|
+
};
|
|
12
37
|
return {
|
|
13
38
|
searchTCPs,
|
|
14
39
|
tcpProfile,
|
|
40
|
+
createCharacter,
|
|
41
|
+
updateCharacter,
|
|
42
|
+
createElementum,
|
|
43
|
+
updateElementum,
|
|
44
|
+
listMyTCPs,
|
|
15
45
|
};
|
|
16
46
|
};
|
package/bin/cli.js
CHANGED
|
@@ -9,8 +9,6 @@ program
|
|
|
9
9
|
.name("neta")
|
|
10
10
|
.description("NETA CLI - Neta API Client")
|
|
11
11
|
.version(pkg.version);
|
|
12
|
-
const cli = program
|
|
13
|
-
.option("--token <string>", "neta token (default: from env NETA_TOKEN)")
|
|
14
|
-
.option("--api_base_url <string>", "api base url (default: NETA_API_BASE_URL or locale-based default)");
|
|
12
|
+
const cli = program.option("--api_base_url <string>", "api base url (default: NETA_API_BASE_URL or locale-based default)");
|
|
15
13
|
await buildCommands(cli);
|
|
16
14
|
cli.parse(process.argv);
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: create_character
|
|
2
|
+
title: Create Character
|
|
3
|
+
description: |
|
|
4
|
+
Create a new original character (OC) and generate a character Token (TCP).
|
|
5
|
+
|
|
6
|
+
After creation, the character can be referenced in make_image using @CharacterName.
|
|
7
|
+
|
|
8
|
+
Usage Notes:
|
|
9
|
+
- Character creation costs credits; users with unlimited credits or special privileges are not affected
|
|
10
|
+
- avatar_artifact_uuid comes from make_image response artifacts[0].uuid (the preview image artifact UUID)
|
|
11
|
+
- prompt should only describe visual features, not personality or backstory
|
|
12
|
+
- trigger must be in English for image and language model recognition
|
|
13
|
+
|
|
14
|
+
Field Descriptions:
|
|
15
|
+
- name: Character name, max 128 characters
|
|
16
|
+
- prompt: Visual description for image models (physical features, clothing, distinctive marks)
|
|
17
|
+
- trigger: English recognition tags, e.g., "1girl, Ada Wong, black hair, red dress, spy"
|
|
18
|
+
- description: For Agents and users to read, should include appearance summary + backstory. Write more for deeper roleplay (up to 1000 characters).
|
|
19
|
+
|
|
20
|
+
parameters:
|
|
21
|
+
name: Character name (max 128 characters)
|
|
22
|
+
gender: 'Character gender. English: male, female, neutral, other. Chinese: 男, 女, 自由, 其他. Defaults to neutral/自由'
|
|
23
|
+
avatar_artifact_uuid: Character avatar artifact UUID from make_image response artifacts[0].uuid
|
|
24
|
+
prompt: |
|
|
25
|
+
Visual description for image models.
|
|
26
|
+
- Only include: physical features, clothing, distinctive marks
|
|
27
|
+
- Exclude: personality, story, background
|
|
28
|
+
- Example: "long black hair, red qipao dress, blue eyes, gun holster on thigh"
|
|
29
|
+
trigger: |
|
|
30
|
+
English recognition tags for LLM and image models.
|
|
31
|
+
- Must be in English
|
|
32
|
+
- Include: gender tag (1girl/1boy), character name, key features, IP series
|
|
33
|
+
- Example: "1girl, Ada Wong, black hair, red dress, spy, elegant, resident evil series"
|
|
34
|
+
accessibility: Visibility, PUBLIC or PRIVATE, defaults to PUBLIC
|
|
35
|
+
age: Character age (optional)
|
|
36
|
+
interests: Character interests and hobbies (optional)
|
|
37
|
+
persona: Character personality description (optional)
|
|
38
|
+
description: |
|
|
39
|
+
Character description for Agents and users to read.
|
|
40
|
+
- Should include: appearance summary + backstory/worldview/motivations
|
|
41
|
+
- Write more for deeper roleplay and richer character interactions (up to 1000 characters)
|
|
42
|
+
- Example: "Ada Wong, a mysterious spy with black hair and red dress. Her true identity is unknown, and she has repeatedly appeared as a middleman in Resident Evil incidents."
|
|
43
|
+
occupation: Character occupation (optional)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { parseMeta } from "../../utils/parse_meta.js";
|
|
3
|
+
import { mapProfileToCharacterAssign } from "../../utils/tcp_mapper.js";
|
|
4
|
+
import { createCommand } from "../factory.js";
|
|
5
|
+
const meta = parseMeta(Type.Object({
|
|
6
|
+
name: Type.String(),
|
|
7
|
+
title: Type.String(),
|
|
8
|
+
description: Type.String(),
|
|
9
|
+
parameters: Type.Object({
|
|
10
|
+
name: Type.String(),
|
|
11
|
+
gender: Type.String(),
|
|
12
|
+
avatar_artifact_uuid: Type.String(),
|
|
13
|
+
prompt: Type.String(),
|
|
14
|
+
trigger: Type.String(),
|
|
15
|
+
accessibility: Type.String(),
|
|
16
|
+
age: Type.String(),
|
|
17
|
+
interests: Type.String(),
|
|
18
|
+
persona: Type.String(),
|
|
19
|
+
description: Type.String(),
|
|
20
|
+
occupation: Type.String(),
|
|
21
|
+
}),
|
|
22
|
+
}), import.meta);
|
|
23
|
+
const createCharacterParameters = Type.Object({
|
|
24
|
+
name: Type.String({ description: meta.parameters.name }),
|
|
25
|
+
gender: Type.Union([
|
|
26
|
+
Type.Literal("男"),
|
|
27
|
+
Type.Literal("女"),
|
|
28
|
+
Type.Literal("自由"),
|
|
29
|
+
Type.Literal("其他"),
|
|
30
|
+
Type.Literal("male"),
|
|
31
|
+
Type.Literal("female"),
|
|
32
|
+
Type.Literal("neutral"),
|
|
33
|
+
Type.Literal("other"),
|
|
34
|
+
], { description: meta.parameters.gender, default: "自由" }),
|
|
35
|
+
avatar_artifact_uuid: Type.String({
|
|
36
|
+
description: meta.parameters.avatar_artifact_uuid,
|
|
37
|
+
}),
|
|
38
|
+
prompt: Type.String({ description: meta.parameters.prompt }),
|
|
39
|
+
trigger: Type.String({ description: meta.parameters.trigger }),
|
|
40
|
+
accessibility: Type.Union([Type.Literal("PUBLIC"), Type.Literal("PRIVATE")], {
|
|
41
|
+
default: "PUBLIC",
|
|
42
|
+
description: meta.parameters.accessibility,
|
|
43
|
+
}),
|
|
44
|
+
age: Type.Optional(Type.String({ description: meta.parameters.age })),
|
|
45
|
+
interests: Type.Optional(Type.String({ description: meta.parameters.interests })),
|
|
46
|
+
persona: Type.Optional(Type.String({ description: meta.parameters.persona })),
|
|
47
|
+
description: Type.Optional(Type.String({ description: meta.parameters.description })),
|
|
48
|
+
occupation: Type.Optional(Type.String({ description: meta.parameters.occupation })),
|
|
49
|
+
});
|
|
50
|
+
export const createCharacter = createCommand({
|
|
51
|
+
name: meta.name,
|
|
52
|
+
title: meta.title,
|
|
53
|
+
description: meta.description,
|
|
54
|
+
inputSchema: createCharacterParameters,
|
|
55
|
+
}, async ({ name, gender, avatar_artifact_uuid, prompt, trigger, accessibility, age, interests, persona, description, occupation, }, { apis }) => {
|
|
56
|
+
const result = await apis.tcp.createCharacter({
|
|
57
|
+
name,
|
|
58
|
+
gender,
|
|
59
|
+
avatar_artifact_uuid,
|
|
60
|
+
prompt,
|
|
61
|
+
trigger,
|
|
62
|
+
// IMAGE_EDIT uses avatar in its pipeline; pass ref_image_uuid = avatar for backend consistency
|
|
63
|
+
ref_image_uuid: avatar_artifact_uuid,
|
|
64
|
+
accessibility,
|
|
65
|
+
age,
|
|
66
|
+
interests,
|
|
67
|
+
persona,
|
|
68
|
+
description,
|
|
69
|
+
occupation,
|
|
70
|
+
});
|
|
71
|
+
return { detail: mapProfileToCharacterAssign(result) };
|
|
72
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
name: create_character
|
|
2
|
+
title: 创建角色
|
|
3
|
+
description: |
|
|
4
|
+
创建一个新的原创角色(OC)并生成对应的角色 Token(TCP)。
|
|
5
|
+
|
|
6
|
+
角色创建后可在 make_image 中通过 @角色名 引用。
|
|
7
|
+
|
|
8
|
+
使用说明:
|
|
9
|
+
- 角色创建需要消耗电量;拥有无限电量或特殊权限的用户不受影响
|
|
10
|
+
- avatar_artifact_uuid 来自 make_image 工具返回的 artifacts[0].uuid,即角色预览图的素材 UUID
|
|
11
|
+
- prompt 只写纯视觉特征,不写性格、故事背景
|
|
12
|
+
- trigger 必须为英文识别词,供图像模型和语言模型识别角色用
|
|
13
|
+
|
|
14
|
+
字段说明:
|
|
15
|
+
- name:角色名称,最多128字符
|
|
16
|
+
- prompt:纯视觉描述,供图像模型直接读取(生理特征、服装、特殊标志)
|
|
17
|
+
- trigger:英文识别词,如 1girl, Ada Wong, black hair, red dress, spy
|
|
18
|
+
- description:供 Agent 和用户阅读,应包含外貌摘要 + 角色背景故事。多写一些可以获得更深的角色扮演体验(最多1000字符)
|
|
19
|
+
|
|
20
|
+
parameters:
|
|
21
|
+
name: 角色名称(最多128字符)
|
|
22
|
+
gender: '角色性别。中文:男、女、自由、其他。English: male, female, neutral, other。默认 自由/neutral'
|
|
23
|
+
avatar_artifact_uuid: 角色头像的素材 UUID,来自 make_image 返回的 artifacts[0].uuid
|
|
24
|
+
prompt: |
|
|
25
|
+
纯视觉特征描述,供图像模型直接读取。
|
|
26
|
+
- 只写:生理特征、服装、特殊标志
|
|
27
|
+
- 不写:性格、故事、背景
|
|
28
|
+
- 示例:"long black hair, red qipao dress, blue eyes, gun holster on thigh"
|
|
29
|
+
trigger: |
|
|
30
|
+
英文识别词,供语言模型和图像模型识别角色。
|
|
31
|
+
- 必须为英文
|
|
32
|
+
- 包含:性别词(1girl/1boy)、角色姓名、突出外貌特征、IP系列
|
|
33
|
+
- 示例:"1girl, Ada Wong, black hair, red dress, spy, resident evil series"
|
|
34
|
+
accessibility: 可见性,PUBLIC(公开)或 PRIVATE(私密),默认 PUBLIC
|
|
35
|
+
age: 角色年龄(可选)
|
|
36
|
+
interests: 角色兴趣爱好(可选)
|
|
37
|
+
persona: 角色性格描述(可选)
|
|
38
|
+
description: |
|
|
39
|
+
角色简介,供 Agent 和用户阅读。
|
|
40
|
+
- 应包含:外貌摘要 + 角色背景故事/世界观/动机
|
|
41
|
+
- 多写一些可以获得更深的角色扮演体验和更丰富的角色互动(最多1000字符)
|
|
42
|
+
- 示例:"艾达·王,黑发红裙的神秘间谍,游走于各方势力之间,真实目的无人知晓。"
|
|
43
|
+
occupation: 角色职业(可选)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: create_elementum
|
|
2
|
+
title: Create Elementum
|
|
3
|
+
description: |
|
|
4
|
+
Create a new style element (Elementum) and generate an element Token (TCP).
|
|
5
|
+
|
|
6
|
+
An element represents a visual concept (scene, prop, clothing, weapon, pose, meme, etc.). After creation, it can be referenced in make_image using /ElementName.
|
|
7
|
+
|
|
8
|
+
Usage Notes:
|
|
9
|
+
- Elementum creation costs credits; users with unlimited credits or special privileges are not affected
|
|
10
|
+
- artifact_uuid comes from make_image response artifacts[0].uuid (the preview image artifact UUID)
|
|
11
|
+
- prompt is the direct image generation instruction passed to the image model
|
|
12
|
+
- description is metadata for Agents explaining what this element is and how to use it
|
|
13
|
+
|
|
14
|
+
Field Descriptions:
|
|
15
|
+
- prompt: Direct image generation instruction for the model
|
|
16
|
+
- description: Agent-facing usage guide, format: "This element represents X, use with Y, reference image shows Z"
|
|
17
|
+
|
|
18
|
+
parameters:
|
|
19
|
+
name: Element name (max 128 characters)
|
|
20
|
+
artifact_uuid: Element representative image artifact UUID from make_image response artifacts[0].uuid
|
|
21
|
+
prompt: |
|
|
22
|
+
Direct image generation instruction for the model.
|
|
23
|
+
- Should be clear visual description that can be combined with other prompts
|
|
24
|
+
- Example: "Resident Evil 4 style European medieval village, dilapidated stone houses, burning bonfire, thick fog, horror atmosphere"
|
|
25
|
+
description: |
|
|
26
|
+
Agent-facing metadata explaining this element.
|
|
27
|
+
- Recommended format: "This element represents [concept], use by [method], reference image shows [description]"
|
|
28
|
+
- Example: "This element represents the RE4 abandoned village's horror atmosphere. Use with night, fog, character descriptions. Reference image is a recreation of the original village scene."
|
|
29
|
+
ref_image_uuid: Concept anchor reference image artifact UUID (optional), used for visual style anchoring
|
|
30
|
+
accessibility: Visibility, PUBLIC or PRIVATE, defaults to PUBLIC
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Type } from "@sinclair/typebox";
|
|
2
|
+
import { parseMeta } from "../../utils/parse_meta.js";
|
|
3
|
+
import { mapProfileToElementumAssign } from "../../utils/tcp_mapper.js";
|
|
4
|
+
import { createCommand } from "../factory.js";
|
|
5
|
+
const meta = parseMeta(Type.Object({
|
|
6
|
+
name: Type.String(),
|
|
7
|
+
title: Type.String(),
|
|
8
|
+
description: Type.String(),
|
|
9
|
+
parameters: Type.Object({
|
|
10
|
+
name: Type.String(),
|
|
11
|
+
artifact_uuid: Type.String(),
|
|
12
|
+
prompt: Type.String(),
|
|
13
|
+
description: Type.String(),
|
|
14
|
+
ref_image_uuid: Type.String(),
|
|
15
|
+
accessibility: Type.String(),
|
|
16
|
+
}),
|
|
17
|
+
}), import.meta);
|
|
18
|
+
const createElementumParameters = Type.Object({
|
|
19
|
+
name: Type.String({ description: meta.parameters.name }),
|
|
20
|
+
artifact_uuid: Type.String({ description: meta.parameters.artifact_uuid }),
|
|
21
|
+
prompt: Type.String({ description: meta.parameters.prompt }),
|
|
22
|
+
description: Type.Optional(Type.String({ description: meta.parameters.description })),
|
|
23
|
+
ref_image_uuid: Type.Optional(Type.String({ description: meta.parameters.ref_image_uuid })),
|
|
24
|
+
accessibility: Type.Union([Type.Literal("PUBLIC"), Type.Literal("PRIVATE")], {
|
|
25
|
+
default: "PUBLIC",
|
|
26
|
+
description: meta.parameters.accessibility,
|
|
27
|
+
}),
|
|
28
|
+
});
|
|
29
|
+
export const createElementum = createCommand({
|
|
30
|
+
name: meta.name,
|
|
31
|
+
title: meta.title,
|
|
32
|
+
description: meta.description,
|
|
33
|
+
inputSchema: createElementumParameters,
|
|
34
|
+
}, async ({ name, artifact_uuid, prompt, description, ref_image_uuid, accessibility }, { apis }) => {
|
|
35
|
+
const result = await apis.tcp.createElementum({
|
|
36
|
+
name,
|
|
37
|
+
artifact_uuid,
|
|
38
|
+
prompt,
|
|
39
|
+
description,
|
|
40
|
+
ref_image_uuid,
|
|
41
|
+
accessibility,
|
|
42
|
+
});
|
|
43
|
+
return { detail: mapProfileToElementumAssign(result) };
|
|
44
|
+
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: create_elementum
|
|
2
|
+
title: 创建元素
|
|
3
|
+
description: |
|
|
4
|
+
创建一个新的风格元素(Elementum),生成对应的元素 Token(TCP)。
|
|
5
|
+
|
|
6
|
+
元素代表一个可视化概念(场景、道具、服装、武器、姿势、梗图等),创建后可在 make_image 中通过 /元素名 引用。
|
|
7
|
+
|
|
8
|
+
使用说明:
|
|
9
|
+
- 元素创建需要消耗电量;拥有无限电量或特殊权限的用户不受影响
|
|
10
|
+
- artifact_uuid 来自 make_image 工具返回的 artifacts[0].uuid,即元素预览图的素材 UUID
|
|
11
|
+
- prompt 是直接传给图像模型的生图指令,应清晰、可组合
|
|
12
|
+
- description 是给 Agent 读取的元说明,告诉 Agent 这个元素是什么、怎么用
|
|
13
|
+
|
|
14
|
+
字段说明:
|
|
15
|
+
- prompt:图像模型直读的生图描述,语言应简洁精准
|
|
16
|
+
- description:Agent 读取的使用说明,格式建议:"此元素表示X,使用时搭配Y,参考图为Z"
|
|
17
|
+
|
|
18
|
+
parameters:
|
|
19
|
+
name: 元素名称(最多128字符)
|
|
20
|
+
artifact_uuid: 元素代表图的素材 UUID,来自 make_image 返回的 artifacts[0].uuid
|
|
21
|
+
prompt: |
|
|
22
|
+
图像模型直读的生图指令。
|
|
23
|
+
- 应为清晰的视觉描述,可组合到 make_image 提示词中
|
|
24
|
+
- 示例:"生化危机4风格欧洲中世纪村庄,破旧石屋,燃烧篝火,浓雾弥漫,恐怖氛围"
|
|
25
|
+
description: |
|
|
26
|
+
供 Agent 读取的元说明,描述此元素代表什么以及如何使用。
|
|
27
|
+
- 格式建议:"此元素表示[概念],使用时[使用方法],参考图展示[参考图说明]"
|
|
28
|
+
- 示例:"此元素表示RE4废弃村庄的恐怖氛围,使用时搭配夜晚、雾气、人物描述,参考图为原版村庄截图"
|
|
29
|
+
ref_image_uuid: 概念锚定参考图的素材 UUID(可选),用于视觉风格锚定
|
|
30
|
+
accessibility: 可见性,PUBLIC(公开)或 PRIVATE(私密),默认 PUBLIC
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: list_my_characters
|
|
2
|
+
title: List My Characters
|
|
3
|
+
description: |
|
|
4
|
+
List all characters created by the current user.
|
|
5
|
+
|
|
6
|
+
Returns a paginated list of the user's own characters including both PUBLIC and PRIVATE ones.
|
|
7
|
+
Useful for finding characters created in previous sessions for updates or reference.
|
|
8
|
+
|
|
9
|
+
Usage Notes:
|
|
10
|
+
- Requires NETA_TOKEN to be set
|
|
11
|
+
- Returns only the current user's characters
|
|
12
|
+
- Use keyword parameter to filter results
|
|
13
|
+
- Returns character UUID (tcp_uuid), name, avatar image, accessibility, and status
|
|
14
|
+
|
|
15
|
+
parameters:
|
|
16
|
+
keyword: Search keyword to filter characters by name (optional)
|
|
17
|
+
page_index: Page index for pagination, defaults to 0
|
|
18
|
+
page_size: Number of results per page (1-50), defaults to 20
|
|
@@ -0,0 +1,45 @@
|
|
|
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
|
+
}), import.meta);
|
|
9
|
+
const listMyCharactersParameters = Type.Object({
|
|
10
|
+
keyword: Type.Optional(Type.String({ description: "Search keyword to filter characters" })),
|
|
11
|
+
page_index: Type.Integer({ minimum: 0, default: 0 }),
|
|
12
|
+
page_size: Type.Integer({ minimum: 1, maximum: 50, default: 20 }),
|
|
13
|
+
});
|
|
14
|
+
export const listMyCharacters = createCommand({
|
|
15
|
+
name: meta.name,
|
|
16
|
+
title: meta.title,
|
|
17
|
+
description: meta.description,
|
|
18
|
+
inputSchema: listMyCharactersParameters,
|
|
19
|
+
}, async ({ keyword, page_index, page_size }, { apis }) => {
|
|
20
|
+
// Get current user info to obtain UUID
|
|
21
|
+
const user = await apis.user.me();
|
|
22
|
+
if (!user) {
|
|
23
|
+
throw new Error("Failed to get user info. Please check your NETA_TOKEN.");
|
|
24
|
+
}
|
|
25
|
+
const result = await apis.tcp.listMyTCPs({
|
|
26
|
+
user_uuid: user.uuid,
|
|
27
|
+
parent_type: "oc",
|
|
28
|
+
keyword,
|
|
29
|
+
page_index,
|
|
30
|
+
page_size,
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
total: result.total,
|
|
34
|
+
page_index: result.page_index,
|
|
35
|
+
page_size: result.page_size,
|
|
36
|
+
list: result.list.map((item) => ({
|
|
37
|
+
uuid: item.uuid,
|
|
38
|
+
name: item.name,
|
|
39
|
+
type: item.type === "official" ? "character" : "character",
|
|
40
|
+
avatar_img: item.config?.avatar_img,
|
|
41
|
+
accessibility: item.accessibility,
|
|
42
|
+
status: item.status,
|
|
43
|
+
})),
|
|
44
|
+
};
|
|
45
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: list_my_characters
|
|
2
|
+
title: 列出我的角色
|
|
3
|
+
description: |
|
|
4
|
+
列出当前用户创建的所有角色。
|
|
5
|
+
|
|
6
|
+
返回当前用户自己创建的角色分页列表,包括 PUBLIC 和 PRIVATE 角色。
|
|
7
|
+
适用于查找之前会话创建的角色,用于更新或引用。
|
|
8
|
+
|
|
9
|
+
使用说明:
|
|
10
|
+
- 需要设置 NETA_TOKEN
|
|
11
|
+
- 仅返回当前用户的角色
|
|
12
|
+
- 可使用 keyword 参数过滤结果
|
|
13
|
+
- 返回角色 UUID (tcp_uuid)、名称、头像图片、可见性和状态
|
|
14
|
+
|
|
15
|
+
parameters:
|
|
16
|
+
keyword: 按名称搜索角色的关键词(可选)
|
|
17
|
+
page_index: 分页页码,默认为 0
|
|
18
|
+
page_size: 每页结果数量(1-50),默认为 20
|