boss 的判断流水线有 四条接入路径:零门槛的体验接口、自带模型的 HTTP 三连、 Claude Code 里的 MCP、以及功能最全的本地自托管。它们的能力、凭证、限额差别很大, 选错会白折腾。这一页把四条路摆在一起对比,给出可直接粘贴的最小示例, 并附错误码与排障速查。
不必读完全页。先在下面四张卡里找到你的场景,直接跳到对应章节。
.mcp.json,之后用自然语言驱动,Claude 自动跑完 prepare → 评委 → submit → render 闭环。同一张表看完差异。「谁跑模型」是最关键的一列——它决定了你要不要自备 API key,以及费用算谁的。
| 路径 | 状态 | 谁跑模型 | 凭证 | 连知识库 | 限额 | 数据保留 | 上手成本 |
|---|---|---|---|---|---|---|---|
A · 体验接口/v1/demo/* |
已上线 | 服务端代跑 | 不需要 | ❌ 不连 | 每 IP 10 单/日 全局 60 单/日 并发 1 |
⚠️ 判例库公开 7 天 | 一条 curl |
B · HTTP 三连/v1/prepare|submit|render |
已上线 | 你自己(BYOM) | BOSS_SVC_TOKEN |
✅ 可选 | 无硬配额 | run TTL 24 小时 | 三次调用 |
C · MCP/mcp |
已上线 | 你的 Claude | 同上(经网关) | ✅ 可选 | 无硬配额 | run TTL 24 小时 | 一个配置文件 |
D · 本地 CLIrun_pipeline_local.py |
仅本地 | 你的模型 key | 模型 API key | ✅ 完整 | 你自己的额度 | 全在你机器上 | clone + 配置 |
这是最容易踩的坑:boss 对外有两个不同的 HTTP 服务,端点、用途、 token 全都不通用。看到 401 先确认你拿的是哪一套的 token。
BOSS_SVC_TOKEN(体验接口 免 token)GET /v1/healthzBOSS_API_TOKEN(与 ① 不通用)/v1/healthz 外一律 503。BOSS_SVC_TOKEN vs BOSS_API_TOKEN。https://svc.apex.fan/ 根路径和 /health 都是 404——这不是宕机。业务路由全挂在 /v1/ 下,探活的真实路径是 /v1/healthz。每条都给能直接粘贴的命令。示例里的 token 与域名请替换为你被授权的值。
首页的在线体验台走的就是这组接口。服务端用自己的模型代跑完整流程,你只管发议题、取报告。
# 1) 探活 $ curl -s https://svc.apex.fan/v1/healthz {"ok":true,"service":"boss-svc","schema_version":"1.0"} # 2) 起一单 (topic 与 review_doc 至少给一个) $ curl -s https://svc.apex.fan/v1/demo/start \ -H "Content-Type: application/json" \ -d '{"topic":"评估 X 产品线明年是否扩张"}' {"run_id":"run_...","judges_total":4,"judges":[...]} # 3) 轮询进度 (进度只存内存, 过期会 404 — 重新发起即可) $ curl -s https://svc.apex.fan/v1/demo/status/run_xxxxx # 4) 取报告 · 三种格式任选 $ curl -sL https://svc.apex.fan/v1/demo/report/run_xxxxx/md -o report.md $ curl -sL https://svc.apex.fan/v1/demo/report/run_xxxxx/html -o report.html $ curl -sL https://svc.apex.fan/v1/demo/report/run_xxxxx/pdf -o report.pdf # 5) 浏览公开判例库 (别人跑过的, 保留 7 天) $ curl -s "https://svc.apex.fan/v1/demo/gallery?limit=5" $ curl -s https://svc.apex.fan/v1/demo/gallery/run_xxxxx
| 限制 | 默认值 | 说明 |
|---|---|---|
| 每 IP 每日 | 10 单 | 超出返回 429,次日 UTC 零点重置 |
| 全局每日 | 60 单 | 所有访客共享 |
| 并发 | 1 单 | 同时只跑一单,排队时会被拒 |
| 议题长度 | 500 字符 | 超出返回 400 |
| 文档长度 | 30000 字符 | 同上 |
| 判例保留 | 7 天 | 到期物理删除 |
以上为默认值,服务端可调;线上实际值以部署配置为准。
boss 出题与纪律,你的模型出判断,boss 再做确定性聚合。适合正式集成——模型选型和费用都在你手里。
# 环境 $ export BOSS=https://svc.apex.fan $ export TOKEN=*** # 值来自 BOSS_SVC_TOKEN, 向服务管理员申请 $ AUTH=(-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json") # 1) prepare — 起 run, 拿冻结 context + 全套 prompt 包 $ curl -s $BOSS/v1/prepare "${AUTH[@]}" \ -d '{"scene":"default","topic":"评估 X 产品线明年是否扩张"}' # 2) 你的模型按 prompt 包跑 synthesis 与每位评委, 然后回传 $ curl -s $BOSS/v1/submit "${AUTH[@]}" \ -d '{"run_id":"run_...","reviews":[{"judge":"tian","review_md":"---\n..."}]}' # 3) render — 确定性聚合出富报告 (可重复调用) $ curl -s $BOSS/v1/render "${AUTH[@]}" -d '{"run_id":"run_..."}'
adversarial_view 三字段(if_thesis_wrong / contrary_signal_observed / base_rate_warning),anchor 评委不写。<<SYNTHESIS_MD>> / <<REVIEWS_MD>> 必须用字符串替换,不要用模板引擎(正文含大括号会炸)。「prepare → 跑 synthesis → 逐评委打分 → submit → merge → render」全帮你串好, 模型调用留在你自己进程里。拷走随便改,没有黑盒。
零第三方依赖(只用标准库)。评委并发、错误提示更细,支持
Anthropic 与 OpenAI 兼容网关。
examples/boss_byom.py ↓
需要 curl + jq。串行跑评委,胜在一眼看得懂、方便嵌进现有 shell 流程。
examples/boss-byom.sh ↓
# 下载并跑 (Python 版) $ curl -O https://www.apex.fan/examples/boss_byom.py $ export BOSS_SVC_TOKEN=*** # 服务 token $ export ANTHROPIC_API_KEY=*** # 或 OPENAI_API_KEY $ python3 boss_byom.py "评估 X 产品线明年是否扩张" -o report.md ① prepare … run_id=run_... · panel=default · 4 位评委 ② synthesis … ③ 4 位评委打分 (并发 3) … ✓ tian (anchor) ✓ industry-trend (dimension) … ④ submit … ⑤ merge … ⑥ render … ✓ 报告已写入 report.md # 评议一份现成文档 $ python3 boss_byom.py --doc plan.md -o review.md # Bash 版: 报告走 stdout, 进度走 stderr, 所以重定向只拿到报告 $ curl -O https://www.apex.fan/examples/boss-byom.sh && chmod +x boss-byom.sh $ ./boss-byom.sh "评估 X 产品线明年是否扩张" > report.md
call_model() 一个函数——脚本其余部分与模型无关。/docs 为准,脚本可能需要同步——它们是示例,不是受支持的产品。与路径 B 能力等价,但你不用手写调用——配好之后用自然语言驱动,Claude 自己跑完整闭环。
// .mcp.json — 放在项目根目录, 重启会话生效 { "mcpServers": { "boss": { "type": "http", "url": "https://<your-endpoint>/mcp" } } }
然后在对话里直接说:
用 boss_prepare 起一个评审: scene 用 default, 议题是"评估 X 产品线明年是否扩张"。
拿到 prompt 包后你自己跑 synthesis 和每位评委, 然后 submit 回去, 最后 render 出报告给我。
| 工具 | 作用 |
|---|---|
| boss_prepare | 起 run,返回冻结 context + synthesis/评委/merge 的全套 prompt 包 |
| boss_submit_reviews | 回传结构化 reviews(校验同路径 B,全批原子) |
| boss_render_report | 确定性聚合出富报告,可重复调用 |
BOSS_SVC_ALLOWED_HOSTS。MCP SDK 的 DNS-rebinding 防护默认只认 localhost,隧道进来的请求 Host 是公网域名,不加白名单会返回 421 Invalid Host header。本机直连调试用 http://127.0.0.1:8431/mcp。curl 打 /mcp 会得到 406,这是正常的——MCP 要求客户端接受 text/event-stream。能收到 406 说明请求已穿过安全层。唯一能连完整知识库、用全部参数、跑三套导出的方式。没有 pip 包,直接跑仓库里的脚本。
# 安装 $ git clone https://github.com/zhanglunet/boss-vault.git && cd boss-vault $ make install # 依赖 + git hook + 建目录 $ bash scripts/install_tian_skill.sh # 把 /boss 装进 Claude Code $ cp .env.example .env.local && vi .env.local # 填模型 key $ set -a; source .env.local; set +a # ⚠ .env 不会自动加载, 必须手动 source $ make smoke # 1 分钟自检 # 跑一单 $ python3 scripts/run_pipeline_local.py "议题" --brand <slug> # 评议一份现成方案文档 $ python3 scripts/run_pipeline_local.py --review docs/plan.md # 在 Claude Code 里用 slash command > /boss 评估 X 产品线明年是否扩张
.env 不会自动加载。脚本里没有 dotenv 调用,必须自己 set -a; source .env; set +a 或逐个 export,否则模型调用会因为缺 key 而失败。/boss 的参数和 Python CLI 不是同一套。--quick / --refresh / --focus 等只被 slash command 理解,直接传给 run_pipeline_local.py 会报 unrecognized arguments。按「该谁修」排序——有些码是你的问题,有些是服务端的问题,重试也没用。
| 码 | 含义 | 该谁修 / 怎么办 |
|---|---|---|
| 200 | 正常 | — |
| 202 | 评审 job 已受理(异步) | 记下 job_id,轮询查状态 |
| 400 | 输入不合法(议题与文档都为空、超长) | 你:修请求 |
| 401 | 缺 / 错 Authorization: Bearer | 你:确认 token 正确,且是对应那套服务的 token(见 §3) |
| 404 | run / job 不存在或已过期 | 你:确认 id;run TTL 24h、体验进度仅存内存,过期需重跑。 也可能是路径写错——如 /health 应为 /v1/healthz |
| 406 | MCP:客户端未声明接受 text/event-stream | 你:加 Accept 头。裸 curl 打 /mcp 出现这个是正常的,说明已穿过安全层 |
| 421 | MCP:Invalid Host header | 服务端:把对外域名加进 BOSS_SVC_ALLOWED_HOSTS。重试无用 |
| 422 | review 校验失败(全批拒绝) | 你:看返回的逐条明细;多半是缺 adversarial_view 字段 |
| 429 | 体验接口配额用尽 | 你:等次日 UTC 零点重置,或改走路径 B |
| 502 | 网关连不上源站 | 服务端:多半是服务重启的几秒空窗,等 10 秒重试;持续 502 才是真故障 |
| 503 | 服务端未配置 token(fail-close) | 服务端:不是你的错,重试永远好不了,找部署方配 token |
以下每一条都来自实际排查,不是假想。
421 Invalid Host header+MCP SDK 在服务绑定 localhost 时会自动开启 DNS-rebinding 防护,而它的白名单硬编码只有 127.0.0.1 / localhost / [::1]。经反向代理(如隧道)进来的请求,Host 头是公网域名,因此一律被判死。
解法:服务端把对外域名加进 BOSS_SVC_ALLOWED_HOSTS(逗号分隔),然后重启服务。不要用关闭防护的方式绕过——那等于对任意 Host 敞开。
502+大概率是重启空窗:旧进程已退出、新进程还没监听,这中间通常有几秒,网关此时无处可连,就返回 502。
解法:等 10 秒再验证。要确认服务真活着,看进程状态和端口监听,而不是只看 HTTP 码。持续 502 才需要查日志。
这是假警。手动跑自检读的是你当前 shell 的环境变量,而线上的值配在 systemd unit 的 Environment= 里——两者不互通。所以 shell 下「未配」不代表服务没配。
查真实生效值:systemctl show boss-svc -p Environment。
/mcp 得到 406,是坏了吗?+没坏,这恰恰是好消息。406 Not Acceptable: Client must accept text/event-stream 是 MCP 协议层在抱怨你没带 Accept 头。能收到这句话,说明请求已经穿过安全层进到协议层了。
真正的验证方式是用 MCP 客户端(如配好 .mcp.json 的 Claude Code)连一次,或手工发一个带正确头的 initialize 请求。
早期文档写过「v1 API 默认无 auth」,那已经作废——现在是 Bearer 必填 + fail-close。带日期的历史信息图(/showcase/ 下)是发布当日的存档,刻意不改写,页首有横幅提示,请勿照抄其中的示例。
以什么为准:运行中服务的 /docs、cookbook,以及本页。
.env 明明填了+脚本里没有 dotenv 自动加载。填了 .env 不等于进程能读到。
解法:set -a; source .env.local; set +a,或把变量逐个 export 之后再跑。