@9000ai/cli 0.1.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/dist/client.d.ts +10 -0
- package/dist/client.js +45 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +18 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +30 -0
- package/dist/commands/feedback.d.ts +2 -0
- package/dist/commands/feedback.js +48 -0
- package/dist/commands/monitor.d.ts +2 -0
- package/dist/commands/monitor.js +101 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +135 -0
- package/dist/commands/task.d.ts +2 -0
- package/dist/commands/task.js +20 -0
- package/dist/commands/transcribe.d.ts +2 -0
- package/dist/commands/transcribe.js +59 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +37 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +25 -0
- package/dist/output.d.ts +6 -0
- package/dist/output.js +49 -0
- package/dist/postinstall.d.ts +5 -0
- package/dist/postinstall.js +17 -0
- package/dist/utils/format.d.ts +1 -0
- package/dist/utils/format.js +16 -0
- package/package.json +31 -0
- package/skills/9000AI-hub/SKILL.md +195 -0
- package/skills/9000AI-hub/configure.py +56 -0
- package/skills/9000AI-hub/init/SKILL.md +130 -0
- package/skills/9000AI-hub/init/templates/CLAUDE.md +24 -0
- package/skills/9000AI-hub/init/templates/agents/README.md +7 -0
- package/skills/9000AI-hub/init/templates/agents/content-agent.md +181 -0
- package/skills/9000AI-hub/init/templates/claims/README.md +91 -0
- package/skills/9000AI-hub/init/templates/claims/claims.json +7 -0
- package/skills/9000AI-hub/init/templates/guide.md +185 -0
- package/skills/9000AI-hub/init/templates/inbox/README.md +26 -0
- package/skills/9000AI-hub/init/templates/profile/identity.md +8 -0
- package/skills/9000AI-hub/init/templates/profile/product.md +26 -0
- package/skills/9000AI-hub/init/templates/profile/topics.md +7 -0
- package/skills/9000AI-hub/init/templates/profile/voice.md +8 -0
- package/skills/9000AI-hub/init/templates/projects/README.md +5 -0
- package/skills/9000AI-hub/references/env.example +5 -0
- package/skills/9000AI-hub/references/runner-spec-v1.md +138 -0
- package/skills/9000AI-hub/shared/__init__.py +1 -0
- package/skills/9000AI-hub/shared/runner.py +135 -0
- package/skills/douyin-monitor/SKILL.md +112 -0
- package/skills/douyin-monitor/agents/openai.yaml +3 -0
- package/skills/douyin-monitor/references/endpoints.md +104 -0
- package/skills/douyin-monitor/scripts/douyin_monitor_api.py +273 -0
- package/skills/douyin-topic-discovery/SKILL.md +146 -0
- package/skills/douyin-topic-discovery/agents/openai.yaml +3 -0
- package/skills/douyin-topic-discovery/references/endpoints.md +127 -0
- package/skills/douyin-topic-discovery/scripts/douyin_topic_discovery_api.py +497 -0
- package/skills/douyin-topic-discovery/workflow/topic-research.md +216 -0
- package/skills/feedback/SKILL.md +69 -0
- package/skills/feedback/references/endpoints.md +46 -0
- package/skills/feedback/scripts/feedback_api.py +93 -0
- package/skills/video-transcription/SKILL.md +108 -0
- package/skills/video-transcription/agents/openai.yaml +3 -0
- package/skills/video-transcription/references/endpoints.md +82 -0
- package/skills/video-transcription/scripts/video_transcription_api.py +183 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# 选题调研工作流
|
|
2
|
+
|
|
3
|
+
当用户给你一个主题或观点,要求你围绕它做一轮批量选题调研时,按以下阶段执行。不要跳步。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 阶段 1:定主观点
|
|
8
|
+
|
|
9
|
+
不要直接搜。先确认用户的"母判断"是什么。
|
|
10
|
+
|
|
11
|
+
做法:
|
|
12
|
+
1. 问用户或从用户描述中提炼出一个明确的立场/观点
|
|
13
|
+
2. 用一两句话写下来,作为整轮调研的锚点
|
|
14
|
+
|
|
15
|
+
示例:
|
|
16
|
+
- "普通家庭没有资格模糊,教育首先是一笔投资"
|
|
17
|
+
- "副业不是自由,是另一种被筛选"
|
|
18
|
+
|
|
19
|
+
所有后续搜索都围着这个母判断展开,不是漫无目的搜。
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 阶段 2:拆子观点
|
|
24
|
+
|
|
25
|
+
把主观点拆成 3-5 个子观点。每个子观点决定你要搜哪一类素材。
|
|
26
|
+
|
|
27
|
+
示例(主观点:"普通家庭教育是投资"):
|
|
28
|
+
1. 普通家庭做教育决策,本来就是风险管理
|
|
29
|
+
2. 同一条路径,对不同家庭后果不同
|
|
30
|
+
3. 普通家庭最吃亏的是信息差、规则差、路径差
|
|
31
|
+
4. 公共语境反功利,但真实系统一直按结果结算
|
|
32
|
+
|
|
33
|
+
有了子观点,关键词才不会乱飘。
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 阶段 3:按素材用途拆关键词
|
|
38
|
+
|
|
39
|
+
关键词不是随便想。按 4 类用途拆,每类 3-5 个关键词。
|
|
40
|
+
|
|
41
|
+
### 第一类:主张词
|
|
42
|
+
|
|
43
|
+
围着主观点和子观点搜深度观点样本。
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
普通家庭 选专业
|
|
47
|
+
教育投资
|
|
48
|
+
志愿填报 信息差
|
|
49
|
+
专业 避坑 家长必看
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 第二类:反方词
|
|
53
|
+
|
|
54
|
+
主动搜和主观点相反的说法。用来了解对立面、做素材对比。
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
别太功利 教育
|
|
58
|
+
不把孩子当投资 教育
|
|
59
|
+
兴趣比就业重要
|
|
60
|
+
快乐教育
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 第三类:现象词
|
|
64
|
+
|
|
65
|
+
搜现实里的反差现象、焦虑场景、具体问题。
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
无薪实习 大学生
|
|
69
|
+
志愿填报 比高考难 家长
|
|
70
|
+
教育返贫 普通家庭
|
|
71
|
+
快乐教育 陷阱 普通家庭
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 第四类:机制词
|
|
75
|
+
|
|
76
|
+
搜系统、规则、结构性问题。
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
普职分流 家长焦虑
|
|
80
|
+
中考分流 家长 焦虑 教育
|
|
81
|
+
志愿填报 规则 家长必读
|
|
82
|
+
掌握这些信息差 入编机会
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 关键词质量规则
|
|
86
|
+
|
|
87
|
+
关键词要"带场景",不能太抽象。
|
|
88
|
+
|
|
89
|
+
好的关键词包含:**人群 + 场景 + 决策动作 + 冲突点**
|
|
90
|
+
|
|
91
|
+
| 差 | 好 |
|
|
92
|
+
|---|---|
|
|
93
|
+
| 张雪峰 信息差 | 志愿填报 信息差 家长必看 |
|
|
94
|
+
| 普通家庭 没有资格 模糊 | 快乐教育 陷阱 普通家庭 |
|
|
95
|
+
| 教育焦虑 | 中考分流 家长 焦虑 教育 |
|
|
96
|
+
|
|
97
|
+
太抽象 = 像评论词,不像用户真实搜索词,容易跑偏。
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 阶段 4:多轮搜索
|
|
102
|
+
|
|
103
|
+
按 4 类关键词分批提交搜索。
|
|
104
|
+
|
|
105
|
+
### 执行方式
|
|
106
|
+
|
|
107
|
+
每类关键词作为一轮搜索:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# 第一轮:主张词
|
|
111
|
+
9000ai search keyword "普通家庭 选专业" "教育投资" "志愿填报 信息差" "专业 避坑 家长必看"
|
|
112
|
+
|
|
113
|
+
# 拿到 batch_id 后等 10-30 秒,再查结果
|
|
114
|
+
9000ai search batch-result --batch-id <batch_id>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
依次提交 4 轮(主张词、反方词、现象词、机制词)。
|
|
118
|
+
|
|
119
|
+
### 注意
|
|
120
|
+
|
|
121
|
+
- 每轮 search 会覆盖 `latest_search.json`,所以拿到结果后先记录关键信息再提交下一轮
|
|
122
|
+
- 或者在每轮结果落盘后,从 `output/` 目录里读带时间戳的快照文件
|
|
123
|
+
- 多轮结果累积形成样本池
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 阶段 5:筛选(三层漏斗)
|
|
128
|
+
|
|
129
|
+
搜到就转写是错的。先筛选再决定。
|
|
130
|
+
|
|
131
|
+
### 第一层:业务判断
|
|
132
|
+
|
|
133
|
+
不是看标题里有没有关键词,而是判断:
|
|
134
|
+
|
|
135
|
+
> 这条视频能不能给某个子观点提供价值?
|
|
136
|
+
|
|
137
|
+
它属于哪种素材?
|
|
138
|
+
- 深度观点样本?
|
|
139
|
+
- 反方观点样本?
|
|
140
|
+
- 现象/案例样本?
|
|
141
|
+
- 制度/机制样本?
|
|
142
|
+
|
|
143
|
+
如果都不沾,直接淘汰。
|
|
144
|
+
|
|
145
|
+
### 第二层:数据判断
|
|
146
|
+
|
|
147
|
+
数据是硬门槛,不是参考项。
|
|
148
|
+
|
|
149
|
+
- 点赞太低 → 不考虑
|
|
150
|
+
- 点赞低 + 时长长 → 更不考虑
|
|
151
|
+
- 热度说明内容有没有真实穿透力
|
|
152
|
+
|
|
153
|
+
具体阈值参考(可根据主题调整):
|
|
154
|
+
- 通用最低门槛:点赞 >= 200
|
|
155
|
+
- 长视频(> 60 秒):点赞 >= 500
|
|
156
|
+
- 特别长视频(> 180 秒):点赞 >= 1000
|
|
157
|
+
|
|
158
|
+
### 第三层:时长判断
|
|
159
|
+
|
|
160
|
+
时长帮助判断视频有没有完整论证。
|
|
161
|
+
|
|
162
|
+
- 短视频(< 30 秒):适合拿观点金句
|
|
163
|
+
- 中视频(30-180 秒):最常用,观点 + 案例
|
|
164
|
+
- 长视频(> 180 秒):只有数据过线才值得转写
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 阶段 6:送转写
|
|
169
|
+
|
|
170
|
+
### 准备链接
|
|
171
|
+
|
|
172
|
+
转写优先用 `media_url` 或 `download_url`,不要用 `video_url`(那是页面链接,转写容易失败)。
|
|
173
|
+
|
|
174
|
+
用 export-media 导出可转写链接:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
9000ai search export-media --input latest_search --row <row_no>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### 提交转写
|
|
181
|
+
|
|
182
|
+
把筛选出的视频链接整理成 JSON 文件,送 video-transcription skill:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
9000ai transcribe submit --json-file video_tasks.json
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
`video_tasks.json` 格式:
|
|
189
|
+
|
|
190
|
+
```json
|
|
191
|
+
{
|
|
192
|
+
"tasks": [
|
|
193
|
+
{
|
|
194
|
+
"video_url": "<media_url 或 download_url>",
|
|
195
|
+
"third_party_task_id": "topic-research-001"
|
|
196
|
+
}
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### 取转写结果
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
9000ai task status --task-id <task_id>
|
|
205
|
+
9000ai transcribe text --task-id <task_id>
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## 流程总览
|
|
211
|
+
|
|
212
|
+
```
|
|
213
|
+
定主观点 → 拆子观点 → 按 4 类拆关键词 → 多轮搜索 → 三层筛选 → 导出链接 → 送转写
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
每一步都有明确的输入和输出,不要跳步,不要搜到就转写。
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: feedback-9000AI
|
|
3
|
+
description: 当用户要给 9000AI 中台提交反馈时使用。包括工作流串联建议、Bug 报告、功能请求等。这个 skill 只负责收集和提交反馈,不负责业务执行。
|
|
4
|
+
triggers:
|
|
5
|
+
- 提交反馈
|
|
6
|
+
- 反馈
|
|
7
|
+
- 我有个建议
|
|
8
|
+
- 报个 bug
|
|
9
|
+
- /feedback
|
|
10
|
+
- /feedback-9000AI
|
|
11
|
+
role: operator
|
|
12
|
+
scope: execution
|
|
13
|
+
output-format: task-oriented
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# 反馈 Skill
|
|
17
|
+
|
|
18
|
+
## 这个 skill 做什么?
|
|
19
|
+
|
|
20
|
+
让用户通过对话直接向 9000AI 团队提交反馈。
|
|
21
|
+
|
|
22
|
+
反馈内容不限——可以是:
|
|
23
|
+
- 发现了多个 skill 串联使用的好方法,想让团队固化成自动流程
|
|
24
|
+
- 某个接口报错、脚本跑不通
|
|
25
|
+
- 想要的新功能
|
|
26
|
+
- 任何使用过程中的想法
|
|
27
|
+
|
|
28
|
+
提交后,反馈会存到中台数据库,同时自动推送飞书通知给团队。
|
|
29
|
+
|
|
30
|
+
## 工作方式
|
|
31
|
+
|
|
32
|
+
1. 用户在对话中描述反馈
|
|
33
|
+
2. agent 整理成结构化信息(标题 + 详细内容)
|
|
34
|
+
3. 调用 CLI 提交到中台
|
|
35
|
+
4. 拿到 `feedback_id`,告诉用户反馈已收到
|
|
36
|
+
|
|
37
|
+
**重要**:agent 应该主动帮用户整理反馈内容,不要让用户自己写 JSON。
|
|
38
|
+
agent 在对话中确认标题和内容后,直接组装参数调 CLI 就行。
|
|
39
|
+
|
|
40
|
+
## 反馈字段说明
|
|
41
|
+
|
|
42
|
+
| 字段 | 必填 | 说明 |
|
|
43
|
+
|------|------|------|
|
|
44
|
+
| `--title` | 是 | 一句话概括,比如"搜索流+转写可以串联" |
|
|
45
|
+
| `--content` | 是 | 详细描述 |
|
|
46
|
+
| `--type` | 否 | 可选分类:workflow / bug / feature / other |
|
|
47
|
+
| `--context-json` | 否 | 附加上下文,比如涉及的 skill 名、task_id 等,JSON 格式 |
|
|
48
|
+
|
|
49
|
+
## 命令
|
|
50
|
+
|
|
51
|
+
查看帮助:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
9000ai feedback --help
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
常用命令:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
9000ai feedback submit --title "搜索流+转写串联" --content "先用选题发现搜到视频,再批量转写提文案,这个流程建议做成一键"
|
|
61
|
+
9000ai feedback submit --title "热榜接口超时" --content "获取热榜偶尔超时,大概 10 次有 2 次" --type bug
|
|
62
|
+
9000ai feedback submit --json-file feedback.json
|
|
63
|
+
9000ai feedback list
|
|
64
|
+
9000ai auth whoami
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 参考
|
|
68
|
+
|
|
69
|
+
接口细节见 `feedback-9000AI/references/endpoints.md`。
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# 反馈接口
|
|
2
|
+
|
|
3
|
+
基础地址默认:
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
http://127.0.0.1:8025
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
所有接口都需要:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
X-API-Key: <你的 key>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 提交反馈
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
POST /api/v1/feedback
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
请求体:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"title": "搜索流+转写串联建议",
|
|
26
|
+
"content": "先用选题发现搜到视频,再批量转写提文案,建议做成一键流程",
|
|
27
|
+
"type": "workflow",
|
|
28
|
+
"context": {
|
|
29
|
+
"skills_involved": ["douyin-topic-discovery-9000AI", "video-transcription"]
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
其中 `type` 和 `context` 可选。
|
|
35
|
+
|
|
36
|
+
## 查看反馈列表
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
GET /api/v1/feedback?page=1&page_size=20
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 查看单条反馈
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
GET /api/v1/feedback/{feedback_id}
|
|
46
|
+
```
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import json
|
|
5
|
+
import sys
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
REPO_ROOT = Path(__file__).resolve().parents[2]
|
|
9
|
+
HUB_ROOT = REPO_ROOT / "9000AI-hub-9000AI"
|
|
10
|
+
if str(HUB_ROOT) not in sys.path:
|
|
11
|
+
sys.path.insert(0, str(HUB_ROOT))
|
|
12
|
+
|
|
13
|
+
from shared.runner import ( # noqa: E402
|
|
14
|
+
ModuleSpec,
|
|
15
|
+
configure_stdout_encoding,
|
|
16
|
+
load_json_file,
|
|
17
|
+
print_json,
|
|
18
|
+
request_json,
|
|
19
|
+
resolve_api_key,
|
|
20
|
+
resolve_base_url,
|
|
21
|
+
save_local_config,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
SKILL_ROOT = Path(__file__).resolve().parents[1]
|
|
25
|
+
MODULE_SPEC = ModuleSpec(
|
|
26
|
+
module="feedback",
|
|
27
|
+
skill_root=SKILL_ROOT,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def build_parser() -> argparse.ArgumentParser:
|
|
32
|
+
parser = argparse.ArgumentParser(description="9000AI 反馈提交")
|
|
33
|
+
parser.add_argument("--base-url", default=None)
|
|
34
|
+
parser.add_argument("--api-key", default=None)
|
|
35
|
+
sub = parser.add_subparsers(dest="command", required=True)
|
|
36
|
+
|
|
37
|
+
sub.add_parser("configure", help="写入本地配置")
|
|
38
|
+
sub.add_parser("whoami", help="查看当前调用方")
|
|
39
|
+
|
|
40
|
+
submit = sub.add_parser("submit", help="提交反馈")
|
|
41
|
+
submit.add_argument("--title", help="反馈标题")
|
|
42
|
+
submit.add_argument("--content", help="反馈详细内容")
|
|
43
|
+
submit.add_argument("--type", default=None, help="可选分类: workflow / bug / feature / other")
|
|
44
|
+
submit.add_argument("--context-json", default=None, help="附加上下文 JSON 字符串")
|
|
45
|
+
submit.add_argument("--json-file", default=None, help="从 JSON 文件读取反馈内容")
|
|
46
|
+
|
|
47
|
+
sub.add_parser("list", help="查看我的反馈列表")
|
|
48
|
+
return parser
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def main() -> None:
|
|
52
|
+
configure_stdout_encoding()
|
|
53
|
+
parser = build_parser()
|
|
54
|
+
args = parser.parse_args()
|
|
55
|
+
|
|
56
|
+
if args.command == "configure":
|
|
57
|
+
if not args.base_url or not args.api_key:
|
|
58
|
+
raise SystemExit("configure 需要同时传 --base-url 和 --api-key")
|
|
59
|
+
save_local_config(MODULE_SPEC, base_url=args.base_url, api_key=args.api_key)
|
|
60
|
+
print_json({"message": "配置已写入", "config_path": str(MODULE_SPEC.config_path)})
|
|
61
|
+
return
|
|
62
|
+
|
|
63
|
+
base_url = resolve_base_url(MODULE_SPEC, args.base_url)
|
|
64
|
+
api_key = resolve_api_key(MODULE_SPEC, args.api_key)
|
|
65
|
+
|
|
66
|
+
if args.command == "whoami":
|
|
67
|
+
print_json(request_json(MODULE_SPEC, method="GET", base_url=base_url, api_key=api_key, path="/api/v1/auth/me"))
|
|
68
|
+
return
|
|
69
|
+
|
|
70
|
+
if args.command == "submit":
|
|
71
|
+
if args.json_file:
|
|
72
|
+
payload = load_json_file(args.json_file)
|
|
73
|
+
elif args.title and args.content:
|
|
74
|
+
payload: dict = {"title": args.title, "content": args.content}
|
|
75
|
+
if args.type:
|
|
76
|
+
payload["type"] = args.type
|
|
77
|
+
if args.context_json:
|
|
78
|
+
payload["context"] = json.loads(args.context_json)
|
|
79
|
+
else:
|
|
80
|
+
raise SystemExit("submit 需要 --title + --content,或者 --json-file")
|
|
81
|
+
|
|
82
|
+
print_json(
|
|
83
|
+
request_json(MODULE_SPEC, method="POST", base_url=base_url, api_key=api_key, path="/api/v1/feedback", payload=payload)
|
|
84
|
+
)
|
|
85
|
+
return
|
|
86
|
+
|
|
87
|
+
if args.command == "list":
|
|
88
|
+
print_json(request_json(MODULE_SPEC, method="GET", base_url=base_url, api_key=api_key, path="/api/v1/feedback"))
|
|
89
|
+
return
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
if __name__ == "__main__":
|
|
93
|
+
main()
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video-transcription
|
|
3
|
+
description: 当用户要提交批量视频转文字、查看转写任务状态、回看转写结果时使用。这个 skill 只负责视频转文字这一项业务能力。标准工作流是先提交后台任务,拿到 task_id,再稍后回查结果,不阻塞当前对话。
|
|
4
|
+
triggers:
|
|
5
|
+
- 视频转文字
|
|
6
|
+
- 批量视频转文字
|
|
7
|
+
- 视频转录
|
|
8
|
+
- 视频转文稿
|
|
9
|
+
- 查转写结果
|
|
10
|
+
role: operator
|
|
11
|
+
scope: execution
|
|
12
|
+
output-format: task-oriented
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# 批量视频转文字 Skill
|
|
16
|
+
|
|
17
|
+
这个 skill 只对应一个能力:批量视频转文字。
|
|
18
|
+
|
|
19
|
+
## 适用范围
|
|
20
|
+
|
|
21
|
+
用于:
|
|
22
|
+
- 提交批量视频转文字任务
|
|
23
|
+
- 查询转写任务状态
|
|
24
|
+
- 查询转写任务结果
|
|
25
|
+
- 只提取原文文案
|
|
26
|
+
- 查看当前 key 是否已开通视频转文字能力
|
|
27
|
+
|
|
28
|
+
## 工作方式
|
|
29
|
+
|
|
30
|
+
视频转文字是异步任务,不要同步等待整批结果。
|
|
31
|
+
标准动作:
|
|
32
|
+
1. 提交后台任务
|
|
33
|
+
2. 拿到 `task_id`
|
|
34
|
+
3. 告诉用户任务已在后台运行
|
|
35
|
+
4. 继续处理别的事情
|
|
36
|
+
5. 稍后回查状态或结果
|
|
37
|
+
|
|
38
|
+
## 配置
|
|
39
|
+
|
|
40
|
+
通过 CLI 统一管理:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
9000ai config set --base-url http://127.0.0.1:8025 --api-key <key>
|
|
44
|
+
9000ai config show
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
也支持环境变量:
|
|
48
|
+
|
|
49
|
+
```text
|
|
50
|
+
9000AI_BASE_URL
|
|
51
|
+
9000AI_API_KEY
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 原文提取规则
|
|
55
|
+
|
|
56
|
+
不要把整份转写 JSON 原样塞进上下文。
|
|
57
|
+
|
|
58
|
+
如果只需要原文文案,优先这样做:
|
|
59
|
+
1. 先查 `9000ai task status --task-id <task_id>`
|
|
60
|
+
2. 从 `data.output.json_url` 拿到转写 JSON 地址
|
|
61
|
+
3. 直接提取 JSON 根字段:
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
text
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
句子级文本在:
|
|
68
|
+
|
|
69
|
+
```text
|
|
70
|
+
timecodes.sentences[*].text
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
已经提供了直接提原文的命令:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
9000ai transcribe text --task-id <task_id>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
这个命令会直接返回:
|
|
80
|
+
- `text_field = "text"`
|
|
81
|
+
- `sentence_field = "timecodes.sentences[*].text"`
|
|
82
|
+
- `text`
|
|
83
|
+
|
|
84
|
+
所以后续如果 AI 只想拿原文文案,优先用 `text`,不要把整份 JSON 全读进上下文。
|
|
85
|
+
|
|
86
|
+
## 命令
|
|
87
|
+
|
|
88
|
+
查看帮助:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
9000ai transcribe --help
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
常用命令:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
9000ai config set --base-url http://127.0.0.1:8025 --api-key <key>
|
|
98
|
+
9000ai auth whoami
|
|
99
|
+
9000ai auth capabilities
|
|
100
|
+
9000ai transcribe submit --json-file video_tasks.json
|
|
101
|
+
9000ai task status --task-id <task_id>
|
|
102
|
+
9000ai task results --task-id <task_id>
|
|
103
|
+
9000ai transcribe text --task-id <task_id>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 参考
|
|
107
|
+
|
|
108
|
+
接口细节和 JSON 示例见 `references/endpoints.md`。
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# 批量视频转文字接口
|
|
2
|
+
|
|
3
|
+
基础地址默认:
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
http://127.0.0.1:8025
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
所有接口都需要:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
X-API-Key: <你的 key>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
本地固定配置文件:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
video-transcription/local/config.json
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 查看当前调用方
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
GET /api/v1/auth/me
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 查看当前已开通能力
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
GET /api/v1/auth/capability-permissions
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 提交批量视频转文字
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
POST /api/v1/media/batch-video-to-text
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
请求体示例:
|
|
40
|
+
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"tasks": [
|
|
44
|
+
{
|
|
45
|
+
"video_url": "https://example.com/video.mp4",
|
|
46
|
+
"third_party_task_id": "demo-001"
|
|
47
|
+
}
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 查询任务状态
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
GET /api/v1/tasks/{task_id}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## 查询任务结果
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
GET /api/v1/tasks/{task_id}/results
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 转写 JSON 取文案规则
|
|
65
|
+
|
|
66
|
+
视频转写完成后,任务查询通常先给出:
|
|
67
|
+
|
|
68
|
+
- `output.audio_url`
|
|
69
|
+
- `output.json_url`
|
|
70
|
+
|
|
71
|
+
如果只需要原文文案,不要把整份 JSON 全部塞进上下文。
|
|
72
|
+
转写 JSON 的主文本字段是:
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
text
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
句子级文本字段是:
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
timecodes.sentences[*].text
|
|
82
|
+
```
|