@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,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: douyin-monitor-9000AI
|
|
3
|
+
description: 当用户要管理抖音主页监控对象、提交主页监控任务、查看运行历史或回看结果时使用。这个 skill 只负责主页监控这一项业务能力。
|
|
4
|
+
triggers:
|
|
5
|
+
- 抖音主页监控
|
|
6
|
+
- 主页监控
|
|
7
|
+
- 对标账号监控
|
|
8
|
+
- 监控抖音主页
|
|
9
|
+
- 查看主页监控结果
|
|
10
|
+
- /douyin 监控
|
|
11
|
+
- /douyin 主页监控
|
|
12
|
+
- /douyin-monitor-9000AI
|
|
13
|
+
- /douyin 监控 9000AI
|
|
14
|
+
role: operator
|
|
15
|
+
scope: execution
|
|
16
|
+
output-format: task-oriented
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# 抖音主页监控 Skill
|
|
20
|
+
|
|
21
|
+
这个 skill 对应一整套主页监控能力,不只是提交异步任务。
|
|
22
|
+
|
|
23
|
+
## 适用范围
|
|
24
|
+
|
|
25
|
+
用于:
|
|
26
|
+
- 查看当前 key 和能力
|
|
27
|
+
- 新建监控对象
|
|
28
|
+
- 查看监控对象列表
|
|
29
|
+
- 修改、启停、重置、删除监控对象
|
|
30
|
+
- 提交主页监控任务
|
|
31
|
+
- 查看运行历史和单次运行详情
|
|
32
|
+
- 查看任务状态和任务结果
|
|
33
|
+
|
|
34
|
+
## 工作方式
|
|
35
|
+
|
|
36
|
+
主页监控的"提交运行"是异步任务,标准动作是:
|
|
37
|
+
1. 先确认或创建监控对象
|
|
38
|
+
2. 提交后台任务
|
|
39
|
+
3. 拿到 `task_id` 和 `run_id`
|
|
40
|
+
4. 告诉用户任务已在后台运行
|
|
41
|
+
5. 稍后回查运行详情、任务状态或任务结果
|
|
42
|
+
|
|
43
|
+
如果用户只是管理监控对象或查看历史,不需要走异步等待。
|
|
44
|
+
|
|
45
|
+
推荐话术:
|
|
46
|
+
- "我已经帮你提交了主页监控任务,任务号是 `<task_id>`,运行号是 `<run_id>`。这条任务会在后台跑,我们先继续别的事情,稍后我再回来查结果。"
|
|
47
|
+
|
|
48
|
+
## 配置
|
|
49
|
+
|
|
50
|
+
通过 CLI 统一管理:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
9000ai config set --base-url http://127.0.0.1:8025 --api-key <key>
|
|
54
|
+
9000ai config show
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
也支持环境变量:
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
9000AI_BASE_URL
|
|
61
|
+
9000AI_API_KEY
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 中文输入约束
|
|
65
|
+
|
|
66
|
+
如果要提交中文名称、关注方向、备注,优先使用 UTF-8 编码的 JSON 文件。
|
|
67
|
+
|
|
68
|
+
推荐方式:
|
|
69
|
+
- 把请求体写进 `creator.json`、`creator_update.json`、`run_request.json`
|
|
70
|
+
- 确保文件保存为 UTF-8
|
|
71
|
+
- 再用 `--json-file` 提交
|
|
72
|
+
|
|
73
|
+
不推荐方式:
|
|
74
|
+
- 在终端里直接内联一大段中文 JSON
|
|
75
|
+
|
|
76
|
+
后端会拦截明显疑似乱码的内容,要求重新用 UTF-8 提交。
|
|
77
|
+
|
|
78
|
+
## 命令
|
|
79
|
+
|
|
80
|
+
查看帮助:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
9000ai monitor --help
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
常用命令:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
9000ai config set --base-url http://127.0.0.1:8025 --api-key <key>
|
|
90
|
+
9000ai auth whoami
|
|
91
|
+
9000ai auth capabilities
|
|
92
|
+
9000ai monitor list-creators
|
|
93
|
+
9000ai monitor create-creator --json-file creator.json
|
|
94
|
+
9000ai monitor update-creator --creator-id <creator_id> --json-file creator_update.json
|
|
95
|
+
9000ai monitor enable-creator --creator-id <creator_id>
|
|
96
|
+
9000ai monitor disable-creator --creator-id <creator_id>
|
|
97
|
+
9000ai monitor reset-creator --creator-id <creator_id>
|
|
98
|
+
9000ai monitor delete-creator --creator-id <creator_id>
|
|
99
|
+
9000ai monitor submit --json-file run_request.json
|
|
100
|
+
9000ai monitor list-runs
|
|
101
|
+
9000ai monitor run-detail --run-id <run_id>
|
|
102
|
+
9000ai task status --task-id <task_id>
|
|
103
|
+
9000ai task results --task-id <task_id>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 参考
|
|
107
|
+
|
|
108
|
+
接口和请求体示例见:
|
|
109
|
+
|
|
110
|
+
```text
|
|
111
|
+
douyin-monitor-9000AI/references/endpoints.md
|
|
112
|
+
```
|
|
@@ -0,0 +1,104 @@
|
|
|
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
|
+
douyin-monitor-9000AI/local/config.json
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 鉴权与能力
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
GET /api/v1/auth/me
|
|
25
|
+
GET /api/v1/auth/capability-permissions
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 监控对象管理
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
GET /api/v1/douyin/monitor/creators
|
|
32
|
+
POST /api/v1/douyin/monitor/creators
|
|
33
|
+
GET /api/v1/douyin/monitor/creators/{creator_id}
|
|
34
|
+
PATCH /api/v1/douyin/monitor/creators/{creator_id}
|
|
35
|
+
DELETE /api/v1/douyin/monitor/creators/{creator_id}
|
|
36
|
+
POST /api/v1/douyin/monitor/creators/{creator_id}/enable
|
|
37
|
+
POST /api/v1/douyin/monitor/creators/{creator_id}/disable
|
|
38
|
+
POST /api/v1/douyin/monitor/creators/{creator_id}/reset
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
新增监控对象请求体示例:
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"name": "李一般",
|
|
46
|
+
"sec_user_id": "MS4wLjABAAAA1wMuf3tRz1UJFVViYSmD7J9Y8M8zCEs4Clv9STQdjjU",
|
|
47
|
+
"focus": "热点对标账号",
|
|
48
|
+
"notes": "AI 热点与话题表达",
|
|
49
|
+
"enabled": true
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
更新监控对象请求体示例:
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"notes": "已更新备注",
|
|
58
|
+
"enabled": true
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 运行任务
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
POST /api/v1/douyin/monitor/run
|
|
66
|
+
GET /api/v1/douyin/monitor/runs
|
|
67
|
+
GET /api/v1/douyin/monitor/runs/{run_id}
|
|
68
|
+
GET /api/v1/tasks/{task_id}
|
|
69
|
+
GET /api/v1/tasks/{task_id}/results
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
提交监控任务示例:
|
|
73
|
+
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"creator_ids": [
|
|
77
|
+
"b2d7bc00-26fa-4b78-9029-6ace9f85fc8f"
|
|
78
|
+
],
|
|
79
|
+
"count": 12,
|
|
80
|
+
"sort_type": 0,
|
|
81
|
+
"top": 20,
|
|
82
|
+
"force_fresh": false
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
也可以直接传 creators:
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"creators": [
|
|
91
|
+
{
|
|
92
|
+
"name": "李一般",
|
|
93
|
+
"sec_user_id": "MS4wLjABAAAA1wMuf3tRz1UJFVViYSmD7J9Y8M8zCEs4Clv9STQdjjU",
|
|
94
|
+
"focus": "热点对标账号",
|
|
95
|
+
"notes": "AI 热点与话题表达",
|
|
96
|
+
"enabled": true
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
"count": 12,
|
|
100
|
+
"sort_type": 0,
|
|
101
|
+
"top": 20,
|
|
102
|
+
"force_fresh": false
|
|
103
|
+
}
|
|
104
|
+
```
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import sys
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
REPO_ROOT = Path(__file__).resolve().parents[2]
|
|
8
|
+
HUB_ROOT = REPO_ROOT / "9000AI-hub-9000AI"
|
|
9
|
+
if str(HUB_ROOT) not in sys.path:
|
|
10
|
+
sys.path.insert(0, str(HUB_ROOT))
|
|
11
|
+
|
|
12
|
+
from shared.runner import ( # noqa: E402
|
|
13
|
+
ModuleSpec,
|
|
14
|
+
configure_stdout_encoding,
|
|
15
|
+
load_json_file,
|
|
16
|
+
print_json,
|
|
17
|
+
request_json,
|
|
18
|
+
resolve_api_key,
|
|
19
|
+
resolve_base_url,
|
|
20
|
+
save_local_config,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
SKILL_ROOT = Path(__file__).resolve().parents[1]
|
|
24
|
+
MODULE_SPEC = ModuleSpec(
|
|
25
|
+
module="douyin-monitor",
|
|
26
|
+
skill_root=SKILL_ROOT,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def build_parser() -> argparse.ArgumentParser:
|
|
31
|
+
parser = argparse.ArgumentParser(description="Douyin monitor API client")
|
|
32
|
+
parser.add_argument("--base-url", default=None)
|
|
33
|
+
parser.add_argument("--api-key", default=None)
|
|
34
|
+
subparsers = parser.add_subparsers(dest="command", required=True)
|
|
35
|
+
|
|
36
|
+
subparsers.add_parser("configure", help="写入本地配置文件")
|
|
37
|
+
subparsers.add_parser("whoami", help="查看当前 key 对应的调用方")
|
|
38
|
+
subparsers.add_parser("capabilities", help="查看当前 key 开通的能力")
|
|
39
|
+
subparsers.add_parser("list-creators", help="查看监控对象列表")
|
|
40
|
+
|
|
41
|
+
create_creator = subparsers.add_parser("create-creator", help="新增监控对象")
|
|
42
|
+
create_creator.add_argument("--json-file", required=True)
|
|
43
|
+
|
|
44
|
+
get_creator = subparsers.add_parser("get-creator", help="查看单个监控对象")
|
|
45
|
+
get_creator.add_argument("--creator-id", required=True)
|
|
46
|
+
|
|
47
|
+
update_creator = subparsers.add_parser("update-creator", help="修改监控对象")
|
|
48
|
+
update_creator.add_argument("--creator-id", required=True)
|
|
49
|
+
update_creator.add_argument("--json-file", required=True)
|
|
50
|
+
|
|
51
|
+
delete_creator = subparsers.add_parser("delete-creator", help="删除监控对象")
|
|
52
|
+
delete_creator.add_argument("--creator-id", required=True)
|
|
53
|
+
|
|
54
|
+
enable_creator = subparsers.add_parser("enable-creator", help="启用监控对象")
|
|
55
|
+
enable_creator.add_argument("--creator-id", required=True)
|
|
56
|
+
|
|
57
|
+
disable_creator = subparsers.add_parser("disable-creator", help="停用监控对象")
|
|
58
|
+
disable_creator.add_argument("--creator-id", required=True)
|
|
59
|
+
|
|
60
|
+
reset_creator = subparsers.add_parser("reset-creator", help="重置监控对象状态")
|
|
61
|
+
reset_creator.add_argument("--creator-id", required=True)
|
|
62
|
+
|
|
63
|
+
submit = subparsers.add_parser("submit", help="提交主页监控任务")
|
|
64
|
+
submit.add_argument("--json-file", required=True)
|
|
65
|
+
|
|
66
|
+
list_runs = subparsers.add_parser("list-runs", help="查看运行历史")
|
|
67
|
+
list_runs.add_argument("--page", type=int, default=1)
|
|
68
|
+
list_runs.add_argument("--page-size", type=int, default=20)
|
|
69
|
+
list_runs.add_argument("--status", default=None)
|
|
70
|
+
|
|
71
|
+
run_detail = subparsers.add_parser("run-detail", help="查看单次运行详情")
|
|
72
|
+
run_detail.add_argument("--run-id", required=True)
|
|
73
|
+
|
|
74
|
+
task = subparsers.add_parser("task", help="查看任务状态")
|
|
75
|
+
task.add_argument("--task-id", required=True)
|
|
76
|
+
|
|
77
|
+
results = subparsers.add_parser("results", help="查看任务结果")
|
|
78
|
+
results.add_argument("--task-id", required=True)
|
|
79
|
+
return parser
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def main() -> None:
|
|
83
|
+
configure_stdout_encoding()
|
|
84
|
+
parser = build_parser()
|
|
85
|
+
args = parser.parse_args()
|
|
86
|
+
|
|
87
|
+
if args.command == "configure":
|
|
88
|
+
if not args.base_url or not args.api_key:
|
|
89
|
+
raise SystemExit("configure 需要同时传 --base-url 和 --api-key")
|
|
90
|
+
save_local_config(MODULE_SPEC, base_url=args.base_url, api_key=args.api_key)
|
|
91
|
+
print_json({"message": "配置已写入", "config_path": str(MODULE_SPEC.config_path)})
|
|
92
|
+
return
|
|
93
|
+
|
|
94
|
+
base_url = resolve_base_url(MODULE_SPEC, args.base_url)
|
|
95
|
+
api_key = resolve_api_key(MODULE_SPEC, args.api_key)
|
|
96
|
+
|
|
97
|
+
if args.command == "whoami":
|
|
98
|
+
print_json(
|
|
99
|
+
request_json(MODULE_SPEC, method="GET", base_url=base_url, api_key=api_key, path="/api/v1/auth/me")
|
|
100
|
+
)
|
|
101
|
+
return
|
|
102
|
+
|
|
103
|
+
if args.command == "capabilities":
|
|
104
|
+
print_json(
|
|
105
|
+
request_json(
|
|
106
|
+
MODULE_SPEC,
|
|
107
|
+
method="GET",
|
|
108
|
+
base_url=base_url,
|
|
109
|
+
api_key=api_key,
|
|
110
|
+
path="/api/v1/auth/capability-permissions",
|
|
111
|
+
)
|
|
112
|
+
)
|
|
113
|
+
return
|
|
114
|
+
|
|
115
|
+
if args.command == "list-creators":
|
|
116
|
+
print_json(
|
|
117
|
+
request_json(
|
|
118
|
+
MODULE_SPEC,
|
|
119
|
+
method="GET",
|
|
120
|
+
base_url=base_url,
|
|
121
|
+
api_key=api_key,
|
|
122
|
+
path="/api/v1/douyin/monitor/creators",
|
|
123
|
+
)
|
|
124
|
+
)
|
|
125
|
+
return
|
|
126
|
+
|
|
127
|
+
if args.command == "create-creator":
|
|
128
|
+
print_json(
|
|
129
|
+
request_json(
|
|
130
|
+
MODULE_SPEC,
|
|
131
|
+
method="POST",
|
|
132
|
+
base_url=base_url,
|
|
133
|
+
api_key=api_key,
|
|
134
|
+
path="/api/v1/douyin/monitor/creators",
|
|
135
|
+
payload=load_json_file(args.json_file),
|
|
136
|
+
)
|
|
137
|
+
)
|
|
138
|
+
return
|
|
139
|
+
|
|
140
|
+
if args.command == "get-creator":
|
|
141
|
+
print_json(
|
|
142
|
+
request_json(
|
|
143
|
+
MODULE_SPEC,
|
|
144
|
+
method="GET",
|
|
145
|
+
base_url=base_url,
|
|
146
|
+
api_key=api_key,
|
|
147
|
+
path=f"/api/v1/douyin/monitor/creators/{args.creator_id}",
|
|
148
|
+
)
|
|
149
|
+
)
|
|
150
|
+
return
|
|
151
|
+
|
|
152
|
+
if args.command == "update-creator":
|
|
153
|
+
print_json(
|
|
154
|
+
request_json(
|
|
155
|
+
MODULE_SPEC,
|
|
156
|
+
method="PATCH",
|
|
157
|
+
base_url=base_url,
|
|
158
|
+
api_key=api_key,
|
|
159
|
+
path=f"/api/v1/douyin/monitor/creators/{args.creator_id}",
|
|
160
|
+
payload=load_json_file(args.json_file),
|
|
161
|
+
)
|
|
162
|
+
)
|
|
163
|
+
return
|
|
164
|
+
|
|
165
|
+
if args.command == "delete-creator":
|
|
166
|
+
print_json(
|
|
167
|
+
request_json(
|
|
168
|
+
MODULE_SPEC,
|
|
169
|
+
method="DELETE",
|
|
170
|
+
base_url=base_url,
|
|
171
|
+
api_key=api_key,
|
|
172
|
+
path=f"/api/v1/douyin/monitor/creators/{args.creator_id}",
|
|
173
|
+
)
|
|
174
|
+
)
|
|
175
|
+
return
|
|
176
|
+
|
|
177
|
+
if args.command == "enable-creator":
|
|
178
|
+
print_json(
|
|
179
|
+
request_json(
|
|
180
|
+
MODULE_SPEC,
|
|
181
|
+
method="POST",
|
|
182
|
+
base_url=base_url,
|
|
183
|
+
api_key=api_key,
|
|
184
|
+
path=f"/api/v1/douyin/monitor/creators/{args.creator_id}/enable",
|
|
185
|
+
)
|
|
186
|
+
)
|
|
187
|
+
return
|
|
188
|
+
|
|
189
|
+
if args.command == "disable-creator":
|
|
190
|
+
print_json(
|
|
191
|
+
request_json(
|
|
192
|
+
MODULE_SPEC,
|
|
193
|
+
method="POST",
|
|
194
|
+
base_url=base_url,
|
|
195
|
+
api_key=api_key,
|
|
196
|
+
path=f"/api/v1/douyin/monitor/creators/{args.creator_id}/disable",
|
|
197
|
+
)
|
|
198
|
+
)
|
|
199
|
+
return
|
|
200
|
+
|
|
201
|
+
if args.command == "reset-creator":
|
|
202
|
+
print_json(
|
|
203
|
+
request_json(
|
|
204
|
+
MODULE_SPEC,
|
|
205
|
+
method="POST",
|
|
206
|
+
base_url=base_url,
|
|
207
|
+
api_key=api_key,
|
|
208
|
+
path=f"/api/v1/douyin/monitor/creators/{args.creator_id}/reset",
|
|
209
|
+
)
|
|
210
|
+
)
|
|
211
|
+
return
|
|
212
|
+
|
|
213
|
+
if args.command == "submit":
|
|
214
|
+
print_json(
|
|
215
|
+
request_json(
|
|
216
|
+
MODULE_SPEC,
|
|
217
|
+
method="POST",
|
|
218
|
+
base_url=base_url,
|
|
219
|
+
api_key=api_key,
|
|
220
|
+
path="/api/v1/douyin/monitor/run",
|
|
221
|
+
payload=load_json_file(args.json_file),
|
|
222
|
+
)
|
|
223
|
+
)
|
|
224
|
+
return
|
|
225
|
+
|
|
226
|
+
if args.command == "list-runs":
|
|
227
|
+
query = f"/api/v1/douyin/monitor/runs?page={args.page}&page_size={args.page_size}"
|
|
228
|
+
if args.status:
|
|
229
|
+
query += f"&status={args.status}"
|
|
230
|
+
print_json(
|
|
231
|
+
request_json(MODULE_SPEC, method="GET", base_url=base_url, api_key=api_key, path=query)
|
|
232
|
+
)
|
|
233
|
+
return
|
|
234
|
+
|
|
235
|
+
if args.command == "run-detail":
|
|
236
|
+
print_json(
|
|
237
|
+
request_json(
|
|
238
|
+
MODULE_SPEC,
|
|
239
|
+
method="GET",
|
|
240
|
+
base_url=base_url,
|
|
241
|
+
api_key=api_key,
|
|
242
|
+
path=f"/api/v1/douyin/monitor/runs/{args.run_id}",
|
|
243
|
+
)
|
|
244
|
+
)
|
|
245
|
+
return
|
|
246
|
+
|
|
247
|
+
if args.command == "task":
|
|
248
|
+
print_json(
|
|
249
|
+
request_json(
|
|
250
|
+
MODULE_SPEC,
|
|
251
|
+
method="GET",
|
|
252
|
+
base_url=base_url,
|
|
253
|
+
api_key=api_key,
|
|
254
|
+
path=f"/api/v1/tasks/{args.task_id}",
|
|
255
|
+
)
|
|
256
|
+
)
|
|
257
|
+
return
|
|
258
|
+
|
|
259
|
+
if args.command == "results":
|
|
260
|
+
print_json(
|
|
261
|
+
request_json(
|
|
262
|
+
MODULE_SPEC,
|
|
263
|
+
method="GET",
|
|
264
|
+
base_url=base_url,
|
|
265
|
+
api_key=api_key,
|
|
266
|
+
path=f"/api/v1/tasks/{args.task_id}/results",
|
|
267
|
+
)
|
|
268
|
+
)
|
|
269
|
+
return
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
if __name__ == "__main__":
|
|
273
|
+
main()
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: douyin-topic-discovery-9000AI
|
|
3
|
+
description: 当用户要获取抖音热点榜、按关键词搜索抖音搜索流,或者把候选结果落到本地 output 文件供后续分析脚本继续消费时使用。这个 skill 只负责抖音选题发现,不负责业务判断。
|
|
4
|
+
triggers:
|
|
5
|
+
- 抖音热点榜
|
|
6
|
+
- 抖音热榜
|
|
7
|
+
- 抖音搜索流
|
|
8
|
+
- 抖音关键词搜索
|
|
9
|
+
- 抖音选题发现
|
|
10
|
+
- /douyin 热榜
|
|
11
|
+
- /douyin 搜索
|
|
12
|
+
- /douyin 选题
|
|
13
|
+
- /douyin-topic-discovery-9000AI
|
|
14
|
+
- /douyin 搜索 9000AI
|
|
15
|
+
role: operator
|
|
16
|
+
scope: execution
|
|
17
|
+
output-format: file-oriented
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# 抖音选题发现 Skill
|
|
21
|
+
|
|
22
|
+
这个 skill 对应一个能力:`douyin_topic_discovery`。
|
|
23
|
+
|
|
24
|
+
## 先看变量名
|
|
25
|
+
|
|
26
|
+
不要去别的文档里猜变量名。这个 skill 固定只认中台统一变量:
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
9000AI_BASE_URL
|
|
30
|
+
9000AI_API_KEY
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
请求头里的 key 名固定是:
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
X-API-Key
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
读取优先级固定是:
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
1. 命令行参数
|
|
43
|
+
2. 9000AI_BASE_URL / 9000AI_API_KEY
|
|
44
|
+
3. douyin-topic-discovery-9000AI/local/config.json
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
本地配置文件的字段名固定是:
|
|
48
|
+
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"base_url": "http://127.0.0.1:8025",
|
|
52
|
+
"api_key": "sk-xxx"
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 批量选题调研
|
|
57
|
+
|
|
58
|
+
当用户让你围绕某个主题批量调研、搜索选题素材时,请先阅读工作流文档(参考这个流程,跟用户说按照这个流程是否有问题?):
|
|
59
|
+
|
|
60
|
+
- `douyin-topic-discovery-9000AI/workflow/topic-research.md`
|
|
61
|
+
|
|
62
|
+
按该文档的阶段逐步执行,不要跳步。
|
|
63
|
+
|
|
64
|
+
## 当前范围
|
|
65
|
+
|
|
66
|
+
用于:
|
|
67
|
+
- 获取抖音热点榜
|
|
68
|
+
- 按关键词搜索抖音搜索流
|
|
69
|
+
- 把结果落到 `output/` 目录
|
|
70
|
+
- 让后续脚本按文件继续消费
|
|
71
|
+
- 批量选题调研(按工作流文档执行)
|
|
72
|
+
|
|
73
|
+
不负责:
|
|
74
|
+
- 自动生成推荐结论
|
|
75
|
+
|
|
76
|
+
## 工作方式
|
|
77
|
+
|
|
78
|
+
标准动作是:
|
|
79
|
+
1. 调热榜或搜索流 API
|
|
80
|
+
2. 把结果写到 `douyin-topic-discovery-9000AI/output/`
|
|
81
|
+
3. 对话里只展示摘要和少量关键字段
|
|
82
|
+
|
|
83
|
+
`search` 现在是真异步:
|
|
84
|
+
1. 先提交 `batch`
|
|
85
|
+
2. 立即返回 `batch_id`
|
|
86
|
+
3. 需要结果时,再用 `batch-result` 查询
|
|
87
|
+
4. 查询到结果后,再落 `latest_search.json/tsv`
|
|
88
|
+
|
|
89
|
+
## 配置
|
|
90
|
+
|
|
91
|
+
优先推荐直接配中台统一环境变量:
|
|
92
|
+
|
|
93
|
+
```powershell
|
|
94
|
+
$env:9000AI_BASE_URL = "http://127.0.0.1:8025"
|
|
95
|
+
$env:9000AI_API_KEY = "sk-xxx"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
或者通过 CLI 写入配置:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
9000ai config set --base-url http://127.0.0.1:8025 --api-key <key>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 输出目录
|
|
105
|
+
|
|
106
|
+
固定输出到:
|
|
107
|
+
|
|
108
|
+
```text
|
|
109
|
+
output/
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
常用文件:
|
|
113
|
+
- `latest_hot.json`
|
|
114
|
+
- `latest_hot.tsv`
|
|
115
|
+
- `latest_search.json`
|
|
116
|
+
- `latest_search.tsv`
|
|
117
|
+
|
|
118
|
+
## 命令
|
|
119
|
+
|
|
120
|
+
查看帮助:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
9000ai search --help
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
常用命令:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
9000ai config set --base-url http://127.0.0.1:8025 --api-key <key>
|
|
130
|
+
9000ai auth whoami
|
|
131
|
+
9000ai auth capabilities
|
|
132
|
+
9000ai search hot --type society --count 20
|
|
133
|
+
9000ai search keyword "AI创业" "副业" --sort 0 --time 7 --content-type 1 --filter-duration 0 --min-likes 200 --min-comments 20
|
|
134
|
+
9000ai search batch-result --batch-id <batch_id>
|
|
135
|
+
9000ai search list-output
|
|
136
|
+
9000ai search show-result --input latest_search --row 3
|
|
137
|
+
9000ai search export-media --input latest_search --row 3
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
搜索结果数量规则:
|
|
141
|
+
- `search` 每个关键词默认抓取 `30` 条
|
|
142
|
+
- 后端会基于 `search_general_v3` 自动翻页聚合,不需要额外传分页参数
|
|
143
|
+
|
|
144
|
+
## 一句话总结
|
|
145
|
+
|
|
146
|
+
这是一个”热榜 + search_general_v3 搜索流”的抖音选题发现 skill。
|