任何能执行提示词、调用 HTTP 的外部 Agent(OpenClaw、Hermes、或自建脚本)都可接入拾题工作台。
两条链路各取所需:
- 读取——把工作台已搜罗的热榜、证据、选题产物当作素材库,先读后搜,避免重复劳动
- 回传——把 Agent 自己搜罗整理的成果按协议送回工作台(先待审)
拍板(decision)只能由人在审查台完成,Agent 不能改。
curl http://127.0.0.1:5173/api/v1/health # {"ok":true,...}打开工作台「外部接入 → 接入令牌」页:
| 勾选项 | scope | 能力 |
|---|---|---|
| ☐ 只读访问 | read | 读热榜/证据/选题产物 |
| ☐ 消费标记 | consume | 批量消费标记 + 撤销 |
| ☐ 建议写回 | suggest | 写回 clusters / outlines / suggestions / draft |
| 提交回传 | submit | 默认包含,无需勾选——回传证据包的基础能力 |
创建后立即复制令牌(dd_ 开头,仅显示一次,服务端只存散列)。
TOKEN=dd_你的令牌
BASE=http://127.0.0.1:5173
# ① 读人设(expect 200;401 = 令牌错,403 = 没 read scope)
curl -s -w "\n%{http_code}" -H "Authorization: Bearer $TOKEN" "$BASE/api/v1/agent/persona"
# ② PUT clusters 空 body(expect 400 校验错——400 才算权限通过,403 是没 suggest scope)
curl -s -w "\n%{http_code}" -X PUT "$BASE/api/v1/agent/clusters" \
-H "Authorization: Bearer $TOKEN" -H "content-type: application/json" -d '{}'
# ③ 读消费状态(expect 200)
curl -s -H "Authorization: Bearer $TOKEN" "$BASE/api/v1/agent/consume/status?target=hotspots"
# ④ POST consume dryRun(expect 200 + toConsume/notFound)
curl -s -X POST "$BASE/api/v1/agent/consume" \
-H "Authorization: Bearer $TOKEN" -H "content-type: application/json" \
-d '{"target":"hotspots","reason":"no-ai-signal","dryRun":true}'①③④ 返回 200 即通过;② 返回 400 是权限通过但参数不全——也算通过(因为你只发 {})。
{
"mcpServers": {
"draftdesk": {
"type": "http",
"url": "http://127.0.0.1:5173/api/v1/mcp",
"headers": {
"Authorization": "Bearer dd_你的令牌"
}
}
}
}五个工具:search_hotspots(热榜)、search_evidence(证据)、list_artifacts(产物,带质量标签)、get_artifact(产物详情)、get_workspace_stats(库存概览)。参数与同名 REST 查询参数一致。
| 能力 | scope | 说明 |
|---|---|---|
| 读热榜/证据/产物 | read | GET /agent/hotspots、evidence、artifacts、stats |
| 读簇/大纲 | read | GET /agent/clusters、outlines(支持 limit≤100 与 cursor 偏移分页,响应带 nextCursor/total) |
| 消费标记 | consume | POST /agent/consume、/agent/unconsume |
| 建簇 | suggest | PUT /agent/clusters(建簇不受 GROUPS_MISSING 闸约束——闸只锚大纲写口) |
| 写大纲 | suggest | PUT /agent/outlines(带 id 更新也跑 48h 查重) |
| 写组结构 | suggest | PUT /agent/triage/groups(external 语义处理主写口,增量合并) |
| 写归档 | suggest | PUT /agent/triage/archive(判 none 组进归档队列) |
| 写机会卡 | suggest | PUT /agent/opportunities(form 六值必填) |
| 向量检索 | suggest | POST /agent/vectors/search;GET /agent/vectors/status?jobId=(索引对账) |
| 候选明细 | read | GET /agent/triage/candidates?jobId=&status=&limit=&offset= |
| 分类目录 | read | GET /agent/activity-categories、/agent/hotspot-categories |
| 写建议 | read | POST /agent/suggestions |
| 写草稿正文 | suggest | PUT /agent/decisions/:id/draft |
| 删 pending 大纲/簇 | suggest | DELETE /agent/outlines/:id、/agent/clusters/:id(仅全 pending;见下) |
| 拍板 decision | ❌ 永不可写 | 只能由人在审查台完成,接口层无此路由 |
| 删已拍板内容 | ❌ 不可删除 | decision 非 pending 的大纲及其簇 400 拒绝(拍板历史保护);消费只改可见性,unconsume 可撤销 |
decision 字段不在任何 agent 写入面的 zod schema 里——塞进去会被 .strict() 校验拒绝返回 400 Unrecognized key。
簇成员(memberIds)与大纲的 evidenceRefs 一律用热点 url 原文。 服务端在消费时会自动做 urlKey 归一化(去 hash、去 utm_/fbclid/gclid 追踪参数), 所以传原始 url 或归一化 url 均可匹配。不要自己拼归一化,也不要填 ev-xxx。
多个 Agent 可同时写 suggestions 与 clusters,按 producedBy 区分(builtin-ai / agent:名称 / human),互不覆盖。拍板(decision)只能由人在审查台完成,Agent 不能改。
R10.27 起按令牌 scope 控权(participants 来源级管控已整体拆除——配置零写入方、从未生效): 读=read / 写=suggest / 消费回执=consume / 提交=submit,令牌铸造时勾选,撤销即时生效。 删除保护另见 §②:已拍板(decision 非 pending)的大纲与所在簇不可删除。
消费只改可见性与计数,不删除原始记录。
已消费的条目仍可查询,只是不再计入 remaining。
30 天内可用 POST /agent/unconsume 撤销,超时返回 410 Gone。
clusterIds 消费整簇、exceptIds 排除部分条目、ids 单条精准消费——
三选一,dryRun 默认 true 先拿影响面再落库。
| HTTP | code | 触发场景 |
|---|---|---|
| 400 | INVALID_PAYLOAD | 参数格式错、字段缺失、zod 校验失败 |
| 400 | TARGET_MISMATCH | 簇 target 与请求 target 不一致 |
| 400 | BATCH_TOO_LARGE | 簇展开后 >5000 条 |
| 401 | UNAUTHENTICATED | 令牌缺失/拼错/已撤销 |
| 403 | SCOPE_MISMATCH | 令牌无所需 scope |
| 404 | NOT_FOUND | 路径或产物 ID 不存在 | | 409 | CONFLICT | 同 ID 不同内容(回传幂等冲突)| | 410 | GONE | unconsume 超过 30 天撤销窗口 |
除证据包外,Agent 还可以把每天看到的热词/新词回传到热词雷达,与内置提取共用一个词库:
curl -X PUT "$DRAFTDESK_URL/api/v1/agent/seen-terms" -H "Authorization: Bearer $DRAFTDESK_TOKEN" -H "content-type: application/json" -d '{"items":[{"term":"claude skills","sources":["reddit"],"observations":3,"relevance":"strong","region":"global"}]}'字段语义(全部可选除 term):
relevance:strong | weak | off三档。strong=AI 全谱系 top 级需求(工具/模型发布、AI 名人动态、AI 政策版权、AI 短剧、独立开发自动化);weak=沾边非主航道;off=圈外(自动驾驶、点击器类灰产、影视明星)。只有 strong 词会回流挖掘种子,off 同时置 offTopic。region:global | cn。海外词=英文内容选题+站群候选;中文词=纯内容创作线。不传时按 sources 自动推断(百度/B站/微博/掘金/知乎等→cn,其余→global)。observations:观测次数(整数);重复回传取 max,不叠加。seed:首见血缘标记;status:new/rising/sustained(只升不降)。
判定由工作台内置 AI 兜底:未判定词会在每日整理时按 persona 标尺回填三档(只写档位,不虚增观测)。词表与统计在「热词趋势」页;同题重复回传按 termId 归一(trim+小写+去内部空格)。
意图三分类与站群门槛(第七轮批 1,规则同源):
demandIntent:tool | info | nav三分类(tool=工具/产品需求语义,如 generator/converter/calculator 词根族)。内置 AI 判 strong 时自动产出;外部 Agent 复核 PUT/agent/seen-terms时也可带同名字段。标尺读persona.intentPolicy(GET /agent/persona即含),与内置判定同源。GET /agent/siteGate:站群门槛规则(requireStrong/serpDedicatedMax/monthlySearchMin/kdMax/cpcMin)。外部 Agent 的站群标注逻辑必须读它而不是硬编码白名单——改config.siteGate数值双端行为跟随。内置判定 tick 会自动给达标词标siteCandidate=true(siteCandidateBy=builtin-gate-v1),Agent 复核只需处理价值分与域名清单;已标注词内置 sweep 不覆写。- 哥飞三指标(第七轮批2):
PUT /agent/seo-terms已放行monthlySearch/kd/cpc/gepheiFetchedAt四字段;gepheiFetchedAt超 90 天视为过期,读方(siteGate 全门槛判定、价值分 月搜×CPC÷KD)自动回退降级。 - 哥飞分工(第七轮批4 v3.1 手动优先,覆盖旧口径):外部 Agent 直连哥飞永久移除——哥飞 API 调用唯一出口=工作台内置 tick(token 在 settings,用户自填)。外部 Agent 为只读消费方:读词库指标/机会卡/标杆站页面(GET /agent/benchmark-pages)/外链来源站(GET /agent/link-prospects)做分析与意图交叉验证(哥飞权威 vs 内置标注,冲突标 intent-conflict 留人工)。付费接口自动调用由用户在 settings 授权勾选(autoMetrics/autoCollect,默认关=纯手动模式);手动数据经「站点发现页手动回传框」或 POST /api/v1/seo-terms/manual 落库(✋manual-gephei 权重最高)。判定方法论共用 skills/seo-methodology/SKILL.md(工作台内置,与内置判定同源)。
- 哥飞余额语义(实测):
GET /api/v1/me返回apiAvailable(开放 API 可用,工作台自动调用只扣这部分)/wallet.daySpent/dayCap(日上限)/gift(每日赠送 500,仅限网站内使用,API 不扣)。响应归一已按真实合同校准(2026-10-14 实测:data.keywords 为 map;volume 值含 avg/avgCpc;difficulty 值为纯数字)。
R10.40 归口重构:工作台零自动出卡,全部语义判断归外部 Agent——四信号七生成器 sweep 已整体下线(存量 auto 卡已清理)。卡片唯一写口=PUT /agent/opportunities:小拾每日对四个信号源(组 appGap / info-tool 强词站群化候选 / 官方动态缺口 / 新品复刻)做语义评估,值得才写(≤15 张/日,verdictReason 必须带具体判断依据,模板句=废卡)。site:cand 纯数值门槛标注照旧(只标注不落卡)。
① 全量采集(01:00 上海,collectAllTick):全部 enabled 内容源一次采集落盘(discovery 批次 jobId=collectall-{日},planName=「全量采集」)。当日双闸(非当日 filtered;RSS 24h fallback)+ 超 300 按「当日新>热度」精简 + 跨源 URL 去重。计划的 sourceIds 退化为分析期过滤条件(定时采集已迁移关停)。web 搜索源不在全量采集范围(它是查询执行器,仍由计划/补证路径驱动)。
② 语义初筛(采集完自动):默认全开(config.aiPolicy.triage=cheap;计划可 aiPolicy.enabled=false 退出)。判 none 的组进归档队列(GET /triage/archive 可查;POST /triage/restore {jobId,groupId?} 可恢复)——成员置 filtered(reason 注明归档),不再静默留池。平台角度扩 8 值:+x/facebook/instagram/linkedin(schema 允许 14 键,即 z.enum(PLATFORM_KEYS).max(14);实际策略值以 core/defaults.ts 为准(三个策略中两个为 gzh/xhs-note、一个仅 gzh),triage 侧过滤到 ANGLE_PLATFORMS 8 值;xhs-video 不进角度草案)。
③ 最后分析与消费(互斥,二选一):consumerMode 语义不变——external=外部 Agent(小拾)完成分析与消费,builtin=内置 AI。每次跑完 ping POST /agent/consume-report(consume scope,body {consumed:N, note?});审查台今日总览显示回执,超 24h 未跑标黄提醒(运维信号,不触发内置补稿)。机会引擎新增:新站复刻卡(site-launches motive=business/pain 且 HN≥50 或撞词 →「复刻已验证」)、form 扩六值(web-app/site-group/mobile-app/mini-program/tool/open-source,带 monetization 变现口径)。
④ 审查台(唯一拍板口):导航四环节(采集→初筛→消费→审查台);今日总览卡(采集 N→待拍 N→待查词→外部消费回执)。SkillsView 定位=方法论手册(高级层级)。
挖掘类 tick 豁免(R10.25-1 总纲修订):external 模式=内置 AI 零调用的唯一豁免是四个采集侧数据增强 tick——判定回填(judgeBackfillTick)/题材标注(outlineCategoryTick)/新站六类判定(siteLaunchesTick)/词判定(seenJudgeTick),cheap 档(~10 次/12 万 tokens/日),消耗入 model-metrics 台账(设置页「预算与成本看板」公开可查)。属词库与新站的采集侧增强,非消费链。
采集批次入库后,内置 AI 对规则放行的存活池做一次语义初筛(分片 cheap 调用 + 片间合并),产出三件事:
- 归类:同一事件/主题的跨源候选并为「组」(candidate-groups 集合,
tg-{jobId}一批一条);组 id 幂等,重复触发不重算。 - 注意力判级:strong / potential / none + 一句话理由——none(体育/时政/民生噪音)永不占 selected 名额;名额按组分配(strong 优先占满 → potential 补位)。
- 双线草案:有注意力的组给多平台内容角度(platform ∈ 策略 platformAffinity)与 web/app 配套缺口路线(appGap)。
候选条目新增 attention 与 groupId 字段,判级理由写入 reason(GET /agent/hotspots 直读可见)。
- 总开关:
config.aiPolicy.triage(off/cheap/full,审查台「内置 AI 参与开关」可改;off=回退来源均衡分配,不跑 AI)。计划级plan.aiPolicy可微调:enabled(缺省 trends 类计划开)/attentionCriteria(追加判级标准,优先级最高)/groupGranularity(coarse=同大事件并组,fine=只有同一事件才并组)。 - 触发:正常批次在采集时内联跑(初筛,不受 consumerMode 门控);失败批次标「待语义初筛」由 worker tick 自动补跑(日上限 3 批)。显式补跑:
POST /api/v1/triage/generate(可带{"jobId":"…"}定向;不要带令牌,本机无鉴权口)。 - 读结果:
GET /api/v1/triage/groups?jobId=…(组+成员+判级+草案);GET /api/v1/triage/status?jobId=…(done/failed/pending)。 - 组卡(机械转换口):
POST /api/v1/opportunities/from-group(UI 组卡按钮在用,{jobId,groupId})——有 appGap 的组一张应用卡(app:grp:*),属人工触发的机械转换;常规路径是外部 Agent 语义评估后走PUT /agent/opportunities(form 必填六值)。内容线选题走 outlines(大纲链路)。 - 分工边界:内置 AI 出「组+判级+双线草案」;外部 Agent(小拾)对组做主分析(哪些组值得写、写什么角度、app 路线深挖——草案是输入不是替代)+ 质量巡检(抽查归类准确性,归错组超标报用户调 prompt/aiPolicy);拍板只在审查台。跨日重复组(同一事件分属两天批次)是已知形态,小拾主分析时在拍板建议里注明「与 X 日某组同事件」。
外部 Agent(external 模式)是「approved → 第一版大纲」的主执行者。builtin 兜底仅在没有外部 Agent 时启用(aiPolicy.draft 联动),两者不双跑。
platform十四值枚举:gzh(公众号)/tiebuhao(贴图号)/xhs-note(小红书图文笔记)/xhs-video(小红书视频笔记)/threads/x/facebook/instagram/linkedin/shipinhao(微信视频号)/douyin(抖音)/kuaishou(快手)/bilibili(哔哩哔哩)/youtube。中文标签(当前显示标签)提交时自动归一;旧值不映射(总纲)。bilibili/youtube仅枚举存在,长视频线启用前不得分配选题、不得标长视频形态。category六值枚举:newtech(AI 新技术)/news(新资讯)/oss(开源工具)/selfproduct(自研产品)/thinking(个人思考)/hot(社会热点)。- 资讯类选题覆盖贴图号(R8-2① → R10.35 语义变更):category=news/newtech 的选题,
platforms里必须含tiebuhao(图卡形态:3-6 张、首图即观点、每张 ≤54 字、视觉关键词 3-5 个)。R10.35 起不再克隆出一条独立的 tiebuhao 大纲,内置侧 ensureTiebuhaoClones 直接把tiebuhao补进该选题的platforms;外部 Agent 编排时同规则执行(在 platforms 里带上即可,不要为贴图号单开一条)。 - 机会引擎整理职责(R9-3,人不整理只拍板):opportunities 池的整理/去重/合并/遗弃建议由 AI/外部 Agent 巡检完成——platform 适配产出的多平台卡(同 url 不同 platform 的 site:ev:* 卡)按簇聚合、可标遗弃建议(老大批板后执行)。watch 候选命中多平台时每平台一张卡(dedupeKey 带 platform 后缀);适配平台随策略 platformAffinity(当前 trend-radar 口径 gzh/xhs-note)。
# upsert(带 id 更新,不带新建);clusterId 必须是已存在的簇(clu-inbox 收集箱可用)
curl -X PUT "$BASE/api/v1/agent/outlines" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"id": "out-optional-for-update",
"clusterId": "clu-inbox",
"platforms": ["gzh", "xhs-note", "tiebuhao"],
"recommendation": "主投公众号做完整论证;小红书切片成清单笔记;贴图号出 4 张图卡(首图即结论)",
"category": "newtech",
"contentType": "长文",
"title": "选题标题",
"outline": ["第一部分", "第二部分", "第三部分"],
"keyPoints": ["要点一", "要点二"],
"evidenceRefs": ["https://…"],
"draftBody": "完整的 Markdown 初稿(approved 选题的第一版大纲写在这里)"
}'- 一选题一条大纲(R10.35):
platforms是主字段(适合投放的平台,1-4 个),platform退化为「主平台」=platforms[0](只为兼容存量读口与按平台拍板而保留,只给 platform 的老调用会自动收敛成platforms:[platform])。不要为同一选题按平台各写一条——平台差异写进recommendation(一句话:主投哪个平台、其余怎么适配、哪个不出)。 ⚠️ 路径 id 怪癖:PUT /agent/outlines/<任意子路径>(含/:id/draft)都落大纲处理器且以 body.id 为准——按 REST 惯例带路径 id 而 body 无 id 会新建而非更新;更新一律 body 带 id。- approved 选题写完
draftBody后,把决策推进到 drafting:PUT /api/v1/outlines/:id/decision(无令牌 UI 口)或集群工具同义口。 - 提示词矩阵(平台模板 × 题材角度,与内置 AI 共用的单一来源)随 Skill 包分发:
skills/prompts/outline-matrix.md——按「平台模板节 + 题材角度节 + 选题素材」组合,不硬编码 24 组合。 - 拍板(R10.50):
POST /api/v1/outlines/:id/decision,body{"decision":"approved"}——决策全局唯一(待决策/已通过/写作中/已发布/否决/暂缓),与平台彻底解耦:platforms只是适配标注(POST /outlines/:id/platforms增删,状态零联动);发布经POST /decisions/:id/publish(publishedRef 可空直切状态;platform 可选,按平台存publishedRefs互不覆盖)。
工作台把每日组摘要与增量词嵌入进 Redis(db1,text-embedding-v3 / 1024 维,嵌入调用量记在 meta vector-embed:<日>)。外部 Agent 两个集成点:
- 合并判断前 KNN 查历史同事件(减少重复出题):
curl -X POST "$BASE/api/v1/agent/vectors/search" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"index":"eventline","text":"AI播放器 本地模型爆火","topK":5}'
# → {"ok":true,"index":"eventline","degraded":false,"hits":[{"title":"...","jobId":"collectall-2026-10-22","attention":"strong","similarity":0.95,"date":1760000000}]}index:eventline(组摘要)或termcluster(增量词);可选sinceHours/untilHours圈时间窗。- 相似度 = 1 - 余弦距离;≥0.90 视为疑似同事件,命中则挂线复用(不重新出题)。
degraded:true= 向量线不可用(照常处理,不做历史对齐)。
- 大纲重复抑制(服务端强制,无需 Agent 参与):
PUT /agent/outlines写入时,工作台自动对新标题与前 48h(不含当日)的组摘要做 KNN——相似度 >0.92 返回200 {"duplicate":true,"semantic":true,"score":0.95,"matchedEvent":{...}}跳过入库。与 48h 标题精确去重互补;当日向量不参与(当日大纲本就派生自当日组)。R10.35 起另有同簇防线:同簇 48h 内已有大纲时,新建(无id)一律回200 {"duplicate":true,"sameCluster":true,"existingId":"..."}——一簇=一选题=一条大纲,改内容带existingId走更新。