ocai-search-agent-skill 0.1.4
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/CURSOR_SETUP.md +68 -0
- package/README.md +64 -0
- package/mcp-config.example.json +10 -0
- package/ocai-skill/ocai +5 -0
- package/ocai-skill/ocai.ps1 +39 -0
- package/ocai-skill/scripts/ocai-init.sh +16 -0
- package/ocai-skill/skills/research-collect-orchestrator/SKILL.md +136 -0
- package/ocai-skill/skills/research-collect-orchestrator/deps/requirements.txt +7 -0
- package/ocai-skill/skills/research-collect-orchestrator/docs/reference.md +54 -0
- package/ocai-skill/skills/research-collect-orchestrator/mcp/collection_mcp_server.py +1110 -0
- package/ocai-skill/skills/research-collect-orchestrator/scripts/ocai-cli +41 -0
- package/ocai-skill/skills/research-collect-orchestrator/scripts/ocai_cli.py +233 -0
- package/ocai-skill/skills/research-collect-orchestrator/scripts/run_collection_server.sh +4 -0
- package/package.json +28 -0
package/CURSOR_SETUP.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Cursor 接入说明(最小可用)
|
|
2
|
+
|
|
3
|
+
本项目在 Cursor 中使用时,需要两部分:
|
|
4
|
+
|
|
5
|
+
- MCP server 接入(让 Cursor 能调用采集工具)
|
|
6
|
+
- 规则加载(让 Cursor 按 Skill 逻辑分流)
|
|
7
|
+
|
|
8
|
+
## 1) 准备环境
|
|
9
|
+
|
|
10
|
+
在项目根目录执行:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
./ocai-skill/ocai install-env
|
|
14
|
+
./ocai-skill/ocai doctor
|
|
15
|
+
./ocai-skill/ocai set-token "YOUR_TOKEN"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Windows PowerShell:
|
|
19
|
+
|
|
20
|
+
```powershell
|
|
21
|
+
.\ocai-skill\ocai.ps1 install-env
|
|
22
|
+
.\ocai-skill\ocai.ps1 doctor
|
|
23
|
+
.\ocai-skill\ocai.ps1 set-token "YOUR_TOKEN"
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 2) 配置 Cursor MCP
|
|
27
|
+
|
|
28
|
+
在 Cursor 的 MCP 配置中添加一个 server(stdio 模式):
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"mcpServers": {
|
|
33
|
+
"collection-service": {
|
|
34
|
+
"command": "python",
|
|
35
|
+
"args": [
|
|
36
|
+
"ocai-skill/skills/research-collect-orchestrator/mcp/collection_mcp_server.py"
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
说明:仓库里已有 `mcp-config.example.json` 可直接参考。
|
|
44
|
+
|
|
45
|
+
## 3) 规则文件
|
|
46
|
+
|
|
47
|
+
仓库已包含 Cursor 规则:
|
|
48
|
+
|
|
49
|
+
- `.cursor/rules/ocai-collection-skill.mdc`
|
|
50
|
+
|
|
51
|
+
该规则会约束 Cursor:
|
|
52
|
+
|
|
53
|
+
- 先检查 token,再执行工具
|
|
54
|
+
- 只有明确采集意图才调用 `collect`
|
|
55
|
+
- 查询意图优先使用 `list` / `query`
|
|
56
|
+
|
|
57
|
+
## 4) 验证是否生效
|
|
58
|
+
|
|
59
|
+
在 Cursor 对话中测试:
|
|
60
|
+
|
|
61
|
+
- “帮我查任务名包含‘小米’的任务” -> 应走 `list_tasks_by_name`
|
|
62
|
+
- “帮我采集百度里‘小米 su7 新款’” -> 应走 `collect`
|
|
63
|
+
|
|
64
|
+
如果没生效,优先检查:
|
|
65
|
+
|
|
66
|
+
- Python 是否为 3.10+
|
|
67
|
+
- MCP server 路径是否正确
|
|
68
|
+
- token 是否已设置
|
package/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# OCAI Search Agent
|
|
2
|
+
|
|
3
|
+
这是一个面向 Agent 的采集 Skill 项目,核心由三部分组成:
|
|
4
|
+
|
|
5
|
+
- `ocai-skill/skills/research-collect-orchestrator/SKILL.md`:交互编排规则
|
|
6
|
+
- `ocai-skill/skills/research-collect-orchestrator/mcp/collection_mcp_server.py`:MCP 服务实现
|
|
7
|
+
- `ocai-skill/ocai`:统一 CLI 入口
|
|
8
|
+
- `ocai-skill/ocai.ps1`:Windows PowerShell CLI 入口
|
|
9
|
+
|
|
10
|
+
## 3 分钟上手(推荐)
|
|
11
|
+
|
|
12
|
+
在项目根目录执行:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
which python && python -V
|
|
16
|
+
./ocai-skill/ocai install-env
|
|
17
|
+
./ocai-skill/ocai doctor
|
|
18
|
+
./ocai-skill/ocai set-token "YOUR_TOKEN"
|
|
19
|
+
./ocai-skill/ocai collect --baidu-word "小米 su7 新款"
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 常用命令
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# 环境与依赖检查
|
|
26
|
+
./ocai-skill/ocai init
|
|
27
|
+
./ocai-skill/ocai doctor
|
|
28
|
+
|
|
29
|
+
# token 管理
|
|
30
|
+
./ocai-skill/ocai token-status
|
|
31
|
+
./ocai-skill/ocai set-token "YOUR_TOKEN"
|
|
32
|
+
./ocai-skill/ocai clear-token
|
|
33
|
+
|
|
34
|
+
# 采集与查询
|
|
35
|
+
./ocai-skill/ocai collect --baidu-word "关键词"
|
|
36
|
+
./ocai-skill/ocai list "任务名称"
|
|
37
|
+
./ocai-skill/ocai query --task-id <32位task_id>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Windows(PowerShell)用法
|
|
41
|
+
|
|
42
|
+
在项目根目录执行:
|
|
43
|
+
|
|
44
|
+
```powershell
|
|
45
|
+
python --version
|
|
46
|
+
.\ocai-skill\ocai.ps1 install-env
|
|
47
|
+
.\ocai-skill\ocai.ps1 doctor
|
|
48
|
+
.\ocai-skill\ocai.ps1 set-token "YOUR_TOKEN"
|
|
49
|
+
.\ocai-skill\ocai.ps1 collect --baidu-word "小米 su7 新款"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## MCP 集成(通用示例)
|
|
53
|
+
|
|
54
|
+
可参考 `mcp-config.example.json`(使用 stdio 启动,不依赖 Docker)。
|
|
55
|
+
|
|
56
|
+
## Cursor 使用
|
|
57
|
+
|
|
58
|
+
可直接参考 `CURSOR_SETUP.md`(包含 MCP 接入、规则文件与验证步骤)。
|
|
59
|
+
|
|
60
|
+
## 常见问题
|
|
61
|
+
|
|
62
|
+
- 缺少 `mcp` 依赖:执行 `./ocai-skill/ocai install-env`
|
|
63
|
+
- Python 版本低于 3.10:升级后重试
|
|
64
|
+
- `token_invalid`:执行 `./ocai-skill/ocai set-token "NEW_TOKEN"` 后重试
|
package/ocai-skill/ocai
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
Set-StrictMode -Version Latest
|
|
2
|
+
$ErrorActionPreference = "Stop"
|
|
3
|
+
|
|
4
|
+
function Get-PythonCommand {
|
|
5
|
+
if ($env:OCAI_PYTHON) {
|
|
6
|
+
return @($env:OCAI_PYTHON)
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
if (Get-Command python -ErrorAction SilentlyContinue) {
|
|
10
|
+
return @("python")
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
if (Get-Command py -ErrorAction SilentlyContinue) {
|
|
14
|
+
return @("py", "-3")
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (Get-Command python3 -ErrorAction SilentlyContinue) {
|
|
18
|
+
return @("python3")
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
throw "未找到 Python,请先安装 Python 3.10+ 并加入 PATH。"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
$scriptPath = Join-Path $PSScriptRoot "skills/research-collect-orchestrator/scripts/ocai_cli.py"
|
|
25
|
+
$reqPath = Join-Path $PSScriptRoot "skills/research-collect-orchestrator/deps/requirements.txt"
|
|
26
|
+
$pythonParts = Get-PythonCommand
|
|
27
|
+
$pythonExe = $pythonParts[0]
|
|
28
|
+
$pythonBaseArgs = @()
|
|
29
|
+
if ($pythonParts.Count -gt 1) {
|
|
30
|
+
$pythonBaseArgs = $pythonParts[1..($pythonParts.Count - 1)]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if ($args.Count -gt 0 -and $args[0] -eq "install-env") {
|
|
34
|
+
& $pythonExe @pythonBaseArgs -m pip install -r $reqPath
|
|
35
|
+
exit $LASTEXITCODE
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
& $pythonExe @pythonBaseArgs $scriptPath @args
|
|
39
|
+
exit $LASTEXITCODE
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# Python 版本检查(推荐 3.10+)
|
|
5
|
+
if ! command -v python3 >/dev/null 2>&1; then
|
|
6
|
+
echo "未找到 python3,请先安装 Python 3.10+"
|
|
7
|
+
exit 1
|
|
8
|
+
fi
|
|
9
|
+
|
|
10
|
+
python3 - <<'PY'
|
|
11
|
+
import sys
|
|
12
|
+
if sys.version_info < (3, 10):
|
|
13
|
+
raise SystemExit("当前 Python 版本低于 3.10,请升级后再执行(推荐 3.10+)")
|
|
14
|
+
PY
|
|
15
|
+
|
|
16
|
+
bash "ocai-skill/skills/research-collect-orchestrator/scripts/ocai-cli" init
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: unified-research-collection
|
|
3
|
+
description: Interactively orchestrate MCP web collection using `collect` tool. Use when the user requests to crawl/collect/extract structured data from URLs or platform keywords.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Collection Orchestration (Interactive)
|
|
7
|
+
|
|
8
|
+
## 目标
|
|
9
|
+
|
|
10
|
+
这是一个“交互式采集任务流”的 Skill:只有在用户明确要求采集/抓取/提取等时才会下发任务并按固定频率查询;如果用户不要求采集,则优先做“任务列表查询/已有 taskId 结果查询”,否则只给出采集建议并等待用户确认。
|
|
11
|
+
|
|
12
|
+
## Step 0:Token 检查与临时存储(必做)
|
|
13
|
+
|
|
14
|
+
1. 调用 MCP 工具 `get_token_status`。
|
|
15
|
+
2. 如果 `has_token=false`:
|
|
16
|
+
- 提示用户先在你们平台完成登录,生成当前密钥 token。
|
|
17
|
+
- 请用户把 token 提供给对话(或在参数里输入)。
|
|
18
|
+
- 调用 MCP 工具 `set_token(token)` 把 token 临时写入文件。
|
|
19
|
+
3. 在后续调用中如果任一工具返回 `error=token_invalid`:
|
|
20
|
+
- 立刻向用户索要新的 token。
|
|
21
|
+
- 调用 `set_token(token)` 写入临时文件。
|
|
22
|
+
- **保持本次任务的同一组** `task_urls` / `ai_fields` / `poll_interval_sec` / `poll_attempts` 以及 `task_max_page` 不变,重新执行当前分支(可能是 `collect` / `list_tasks_by_name` / `query_success_task_data`)。
|
|
23
|
+
|
|
24
|
+
## 环境准备(降低上手难度)
|
|
25
|
+
|
|
26
|
+
为了避免工具调用失败(如 `ModuleNotFoundError`),请在 MCP Server 运行的同一个 Python 环境里安装依赖。
|
|
27
|
+
推荐 Python 版本:`3.10+`。
|
|
28
|
+
|
|
29
|
+
先确认当前解释器(避免装到错误环境):
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
which python && python -V
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
统一推荐安装命令(在项目根目录执行):
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
./ocai-skill/ocai install-env
|
|
39
|
+
./ocai-skill/ocai doctor
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
如果你确实要手动安装,也可以在目标环境执行(把环境名按实际替换):
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
conda run -n <your-env> pip install -r ocai-skill/skills/research-collect-orchestrator/deps/requirements.txt
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
如果你不确定环境名,请先在对话里告诉用户“你的 Cursor/MCP 是用哪个 conda 环境运行的”,然后把对应命令展示出来。
|
|
49
|
+
|
|
50
|
+
## 快速开始(复制即用)
|
|
51
|
+
|
|
52
|
+
在项目根目录按顺序执行:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
./ocai-skill/ocai install-env
|
|
56
|
+
./ocai-skill/ocai doctor
|
|
57
|
+
./ocai-skill/ocai init
|
|
58
|
+
./ocai-skill/ocai set-token "YOUR_TOKEN"
|
|
59
|
+
./ocai-skill/ocai collect --baidu-word "小米 su7 新款"
|
|
60
|
+
./ocai-skill/ocai list "任务名称"
|
|
61
|
+
./ocai-skill/ocai query --task-id <32位task_id>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 常见问题排查
|
|
65
|
+
|
|
66
|
+
- `ModuleNotFoundError: No module named 'mcp'`
|
|
67
|
+
- 先执行:`./ocai-skill/ocai install-env`
|
|
68
|
+
- 再检查:`./ocai-skill/ocai init`
|
|
69
|
+
- `token_invalid`
|
|
70
|
+
- 重新设置:`./ocai-skill/ocai set-token "NEW_TOKEN"`
|
|
71
|
+
- 然后按原参数重试同一条命令
|
|
72
|
+
- `python: command not found` 或版本过低
|
|
73
|
+
- 安装 Python 3.10+,并重新确认:`which python && python -V`
|
|
74
|
+
|
|
75
|
+
## Step 1:识别输入类型(URL or 关键词)
|
|
76
|
+
|
|
77
|
+
- 若用户直接输入了 URL:用它作为 `task_urls`。
|
|
78
|
+
- 若用户输入的是“百度/平台关键词/主题”(例如“百度里习近平的内容”):
|
|
79
|
+
- 判断是否是“要采集/抓取/提取/下发任务”的意图;
|
|
80
|
+
- 若需要入口页类型(百度新闻/百度百科/百度搜索),向用户做最少追问或采用默认(百度新闻检索页)。
|
|
81
|
+
|
|
82
|
+
## Step 2:判断用户是否“要采集”
|
|
83
|
+
|
|
84
|
+
当用户语句中出现任意命令词:`采集/抓取/提取/入库/下发/抓取正文/结构化`,则进入 Step 3。
|
|
85
|
+
否则进入 Step 4(任务查询/建议采集)。
|
|
86
|
+
|
|
87
|
+
## Step 3:下发采集任务并等待查询(固定查询:6 秒一次,查询 10 次)
|
|
88
|
+
|
|
89
|
+
1. 组装 `ai_fields`
|
|
90
|
+
- 用户指定字段:按用户字段构造
|
|
91
|
+
- 否则使用默认字段:`title`/`publish_time`/`content`/`author`
|
|
92
|
+
2. 调用 MCP 工具 `collect`
|
|
93
|
+
- `task_max_page`:默认 `10`(如用户说“最多 N 页”就改成 N)
|
|
94
|
+
- `poll_interval_sec = 6`
|
|
95
|
+
- `poll_attempts = 10`
|
|
96
|
+
3. MCP Server 会在内部按固定频率轮询任务状态:
|
|
97
|
+
- 若在窗口内完成:返回 `status=completed` 与 `data.items`
|
|
98
|
+
- 若窗口结束仍未完成:返回 `status=collecting`、包含 `task_id` 和当前进度
|
|
99
|
+
4. 如果返回 `status=collecting`:
|
|
100
|
+
- 提示用户“任务已下发到系统内正在采集中”
|
|
101
|
+
- 告知用户可以登录平台用 `task_id` 查进度/查看结果
|
|
102
|
+
|
|
103
|
+
## Step 4:任务查询/建议采集(非采集意图)
|
|
104
|
+
|
|
105
|
+
如果用户没有出现采集命令词(即用户并未明确要求采集/抓取/提取):
|
|
106
|
+
1. 若用户在问“任务列表/任务名称包含/查询任务/task/page”:
|
|
107
|
+
- 从输入提取 `task_name`
|
|
108
|
+
- 调用 MCP 工具 `list_tasks_by_name` 返回匹配到的 `records`
|
|
109
|
+
2. 若用户提供 `task_id`,并且是在请求“返回结果/查询数据/success-task-data/采集结果”:
|
|
110
|
+
- 调用 MCP 工具 `query_success_task_data` 返回字段还原后的 `items`
|
|
111
|
+
3. 否则(用户未明确要查具体结果,也未明确要采集):
|
|
112
|
+
- 将输入尽量转成可采集的入口页 URL(如百度检索页)
|
|
113
|
+
- 不调用 MCP `collect`(因此不会触发 insert,也不会产生新的采集任务)
|
|
114
|
+
- 返回“我可以帮你采集”的建议与需要用户确认的信息:
|
|
115
|
+
- 建议采集入口 URL
|
|
116
|
+
- 建议的默认字段(title/publish_time/content/author,或用户指定字段)
|
|
117
|
+
- 请用户明确回复一次“采集/抓取/提取/下发/结构化”(或直接使用 `/ocai-cli` 命令)后,才进入 Step 3 真正下发任务
|
|
118
|
+
|
|
119
|
+
## 默认值与字段模板
|
|
120
|
+
|
|
121
|
+
- `task_max_page = 10`
|
|
122
|
+
- `is_use_proxy = false`
|
|
123
|
+
- 默认 `ai_fields`:
|
|
124
|
+
- `title`(type_code `10`)
|
|
125
|
+
- `publish_time`(type_code `40`)
|
|
126
|
+
- `content`(type_code `10`)
|
|
127
|
+
- `author`(type_code `10`)
|
|
128
|
+
|
|
129
|
+
## 运行 MCP Server(给 MCP 客户端用)
|
|
130
|
+
|
|
131
|
+
- stdio(本地):`bash skills/research-collect-orchestrator/scripts/run_collection_server.sh`
|
|
132
|
+
- HTTP/SSE:`bash skills/research-collect-orchestrator/scripts/run_collection_server.sh --host 0.0.0.0 --port 11900`
|
|
133
|
+
|
|
134
|
+
## 参考
|
|
135
|
+
|
|
136
|
+
- 输出协议:`docs/reference.md`
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Collection Orchestrator Reference (Interactive)
|
|
2
|
+
|
|
3
|
+
## 输入
|
|
4
|
+
|
|
5
|
+
- 自然语言请求(可能包含 URL,或包含“平台关键词/主题”但未给 URL)
|
|
6
|
+
- 可包含采集字段需求(可选)
|
|
7
|
+
- 可包含最大页数/是否需要代理(可选)
|
|
8
|
+
|
|
9
|
+
## 必须的 Token 流程
|
|
10
|
+
|
|
11
|
+
1. 调用 MCP 工具 `get_token_status`
|
|
12
|
+
2. 若 `has_token=false`:提示用户先在你们平台登录获取 token
|
|
13
|
+
3. 调用 MCP 工具 `set_token(token)` 把 token 临时写入服务端文件
|
|
14
|
+
|
|
15
|
+
## 依赖安装(建议先做)
|
|
16
|
+
|
|
17
|
+
在运行你的 MCP Server 的同一个 Python 环境里安装依赖:
|
|
18
|
+
推荐 Python 版本:`3.10+`。
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
python3 -m pip install -r skills/research-collect-orchestrator/deps/requirements.txt
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
如果在工具调用时报 `ModuleNotFoundError`,直接把报错对应的包安装命令输出给用户。
|
|
25
|
+
|
|
26
|
+
## 调用 MCP 工具 `collect`
|
|
27
|
+
|
|
28
|
+
- 工具:`collect(task_urls, ai_fields, poll_interval_sec, poll_attempts, task_max_page, is_use_proxy, ...)`
|
|
29
|
+
- `api_key`:在你的实现里是可选的;缺省会从 `COLLECTION_AUTH_TOKEN` 或 token 文件读取
|
|
30
|
+
|
|
31
|
+
### 默认值
|
|
32
|
+
|
|
33
|
+
- `task_max_page = 10`
|
|
34
|
+
- `poll_interval_sec = 6`
|
|
35
|
+
- `poll_attempts = 10`
|
|
36
|
+
- 默认 `ai_fields`:`title(10)`, `publish_time(40)`, `content(10)`, `author(10)`
|
|
37
|
+
|
|
38
|
+
### 输出状态
|
|
39
|
+
|
|
40
|
+
- `success=false`:失败(常见 `token_missing` / `token_invalid` / HTTP 错误)
|
|
41
|
+
- `status=completed`:已完成,返回 `data.items`
|
|
42
|
+
- `status=collecting`:轮询窗口内未完成,返回 `task_id/progress`,提示用户任务已下发并可到系统内查看
|
|
43
|
+
|
|
44
|
+
## 非采集意图的快速回填
|
|
45
|
+
|
|
46
|
+
- 如果用户并未要求“采集/抓取/提取”,但希望你返回信息:
|
|
47
|
+
- 若在问“任务列表/任务名称包含/查询 task/page”:调用 `list_tasks_by_name` 返回 `records`
|
|
48
|
+
- 若在问“taskId 的数据/返回结果/success-task-data”:调用 `query_success_task_data` 返回 `items`
|
|
49
|
+
- 否则:不调用 MCP `collect`(因此不会触发 insert),返回“建议的采集入口 URL 与字段”,并请用户确认是否需要采集
|
|
50
|
+
|
|
51
|
+
## 查询工具(不会 insert)
|
|
52
|
+
|
|
53
|
+
- `list_tasks_by_name(task_name, page_num, per_page_record_count, ...)`:按任务名称条件查询任务列表
|
|
54
|
+
- `query_success_task_data(task_id, url_type_code, page_num, max_items, ...)`:查询已有任务的采集结果
|