ENGINEERING

三个旗舰共用一套自研 Agent 内核:模型只负责理解和选择工具,计算、校验、审批与续跑由代码负责。

内核位于 src/lib/agent-core:11 个 TypeScript 文件,共 963 行。 本页所有数字在构建时从代码与评测结果文件统计生成,不手工维护。

请求链路

浏览器 use-agent-runSSE · 自动续跑 · 审批
/api/agents/runOrigin 校验 · 限流
run-handlerregistry · parseTrusted
agent-core/loop预算 · 钩子 · 检查点 · Trace
工具内置 terminal / 领域工具 / MCP 工具
ai/runtime多 provider · native / json 工具协议

旁支:/api/mcp 对外暴露公开只读工具(见下文 MCP 一节);scripts/eval 在进程内直接调用同一循环做评测,不走 HTTP。

内核模块

src/lib/agent-core 下的每个文件:职责与关键约束
文件行数职责关键约束
budget.ts16请求预算(单次 HTTP 请求最长运行时间)默认 25 秒;环境变量只能调小(min(DEFAULT, env))。
builtin-tools.ts27final_answer / ask_user / refuse 终端工具工厂终端工具生效前必须通过 beforeTerminal 校验。
checkpoint.ts36HMAC-SHA256 签名检查点(仅服务端)无数据库:状态封装后由客户端回传续跑;篡改 / 过期 / 弱密钥显式报错。
compact.ts28超限上下文压缩只替换较早的工具结果内容,从不删除消息或改写 system / 最后一条 user。
json-protocol.ts73非原生 tool calling 的 JSON 降级协议哪些 provider:model 走原生协议由探针实测决定,不做假设。
loop.ts324runAgent 核心循环:预算、钩子、检查点、Trace每个 tool_call id 在下一次模型调用前必有对应 tool 消息;terminal 生效后同批调用全部标记 skipped。
mcp-tools.ts98MCP Client → ToolDefinition 适配只引入 allow 白名单内的工具;同一份 ToolDefinition 同时用于 Agent 循环、MCP 注册与测试。
model-client.ts139RuntimeModelClient:多 provider 调用入口原生 tool calling 优先、JSON 协议降级;第一次成功调用固定 provider:model(pin)。
tool.ts38defineTool、参数校验、结果截断、模型侧 Schema 生成参数不符 Schema 以错误结果回传给模型重试,不中断运行。
trace.ts26TraceRecorder(OTel GenAI 语义属性)span 只在结束时发出,前端据此区分「运行完整」与「被时限中断」。
types.ts158AgentSpec / Budget / ToolContext 等全部共享类型ToolContext 由 loop 注入,工具不得自造运行上下文。

关键约束提炼自各文件头注释与内核不变量测试(scripts/test-agent-core-loop.mjs 覆盖 10 条循环不变量)。

三旗舰 × 内核能力矩阵

每个旗舰用到的内核能力(数据来自 src/content/flagships.ts,已逐项对照各 Agent 的 spec 核实)
内核能力F1 库存问数F2 生产重排F3 供应商延期应对
只读工具✓——
SQL 闸门✓——
执行出错自修复✓——
数字落地校验(beforeTerminal)✓——
多轮记忆✓——
MCP 公开工具✓✓—
受限意图—✓—
写操作人工审批(awaiting_approval → 签名检查点续跑)—✓—
确定性排程—✓—
委派子 Agent——✓
MCP 客户端取工具——✓
决策权守护规则(preToolUse / beforeTerminal)——✓
人工审批续跑——✓
单 Agent 基线对照——✓
软截止暂停续跑——✓

运行时约束与取舍

平台约 30 秒掐断请求

软截止(F3 编排默认 8 秒)与请求预算(默认 25 秒,到点前 500ms 硬中断进行中的步骤)都到点即暂停,运行状态封装成签名检查点交给浏览器续跑。环境变量只能把两者调小,不能调大。

无数据库、会话存浏览器

服务端无状态:计划会话与审批检查点都由客户端持有并回传;同一机制同时承担 Serverless 时长上限与人工审批中断。

多 provider 轮转

运行时按消息哈希在已配置的 provider 间轮转起点,失败自动换家重试;provider 切换记入 Trace(provider_switch 事件)。

守护规则单独统计

preToolUse / beforeTerminal 的拦截在 Trace 里标记 blocked 并按错误码计数,不计入模型能力;评测里守护拦截与运行失败分开报告。

评测框架

每个旗舰都以「单 Agent 基线 vs 实际形态」同题对照;评测在本地或 CI 进程内直接调用同一循环,结果 JSON 入库后由页面展示,访客不会触发评测。 运行方式:

node scripts/eval/run-agent-eval.mjs --agent <agentId> --variant <variant> --provider zhipu --model glm-5.3 --repeats 3

指标:pass@1 = 单次运行通过的比例;k 次全对 = 每题在全部重复中都通过的比例;heldOut = 未参与调优的题目。评分由确定性评分器完成,失败如实记录。

最新评测结果(按 agentId + variant 取最新题集的最新一次运行)
变体日期模型题数pass@1k 次全对
inventory / loop2026-11-10zhipu:glm-5.33489.2%79.4%
scheduling / loop2026-11-08zhipu:glm-5.33797.3%94.6%
control-tower / single2026-11-09zhipu:glm-5.31689.6%81.3%
control-tower / orchestrated2026-11-09zhipu:glm-5.31679.2%62.5%

成绩只对该题集、该模型和当次运行有效。

质量门禁

  • typecheckTypeScript 全量类型检查(tsc --noEmit)。
  • test:models43 个 node:assert 测试脚本自动发现执行:内核不变量、各 Agent 边界、评分器、UI 复制与 SSR。
  • buildNext.js 生产构建,静态页预渲染。
  • 浏览器证据安装 CJK 字体后对本地生产服务跑组合页浏览器走查(组合页、Build 动线、首页孪生等)。
  • 生产版本门禁main 合并后等待生产域名返回本次确切的构建修订标记(最长 10 分钟),防止「CI 绿但线上还是旧版」。
  • 线上冒烟部署完成后对生产域名重跑组合页浏览器走查。

MCP

站点同时是一个公共 MCP 端点(/api/mcp,线上 https://build.winstonwang.site/api/mcp), 符合 MCP Streamable HTTP 传输,无状态、无会话。当前暴露 7 个工具,全部只读或试算、确定性输出,且不消耗模型额度:

  • inventory_describe_semantic_layer
  • inventory_run_readonly_sql
  • scheduling_get_baseline_plan
  • scheduling_preview_scenario
  • supply_list_delay_scenarios
  • supply_assess_delay_scenario
  • decision_rights_evaluate

无鉴权因此无写入;限流按客户端 IP(每分钟 20 次),请求体上限 64 KiB,带 Origin 的跨源请求返回 403。 VS Code 连接配置:

// .vscode/mcp.json
{ "servers": { "winston-builds": { "type": "http", "url": "https://build.winstonwang.site/api/mcp" } } }

已知限制

  • 全部业务数据为合成数据,不连接真实 ERP、APS、SRM、MES 或执行 API;批准不触发任何真实动作。
  • 评测只覆盖单一模型与固定题集;结论只对该题集、该模型和当次运行有效。
  • 公共 MCP 端点无鉴权,因此只暴露只读/试算工具,不是通用安全方案。
  • 注入防护是提示词约束加确定性守护规则;拦截单独统计,不宣称通用的 LLM 安全能力。
  • 运行时依赖平台约 30 秒的请求上限模型;该上限变化时请求预算与软截止需要重新校准。