ENGINEERING
三个旗舰共用一套自研 Agent 内核:模型只负责理解和选择工具,计算、校验、审批与续跑由代码负责。
内核位于 src/lib/agent-core:11 个 TypeScript 文件,共 963 行。 本页所有数字在构建时从代码与评测结果文件统计生成,不手工维护。
请求链路
浏览器 use-agent-runSSE · 自动续跑 · 审批/api/agents/runOrigin 校验 · 限流run-handlerregistry · parseTrustedagent-core/loop预算 · 钩子 · 检查点 · Trace工具内置 terminal / 领域工具 / MCP 工具ai/runtime多 provider · native / json 工具协议旁支:/api/mcp 对外暴露公开只读工具(见下文 MCP 一节);scripts/eval 在进程内直接调用同一循环做评测,不走 HTTP。
内核模块
| 文件 | 行数 | 职责 | 关键约束 |
|---|---|---|---|
budget.ts | 16 | 请求预算(单次 HTTP 请求最长运行时间) | 默认 25 秒;环境变量只能调小(min(DEFAULT, env))。 |
builtin-tools.ts | 27 | final_answer / ask_user / refuse 终端工具工厂 | 终端工具生效前必须通过 beforeTerminal 校验。 |
checkpoint.ts | 36 | HMAC-SHA256 签名检查点(仅服务端) | 无数据库:状态封装后由客户端回传续跑;篡改 / 过期 / 弱密钥显式报错。 |
compact.ts | 28 | 超限上下文压缩 | 只替换较早的工具结果内容,从不删除消息或改写 system / 最后一条 user。 |
json-protocol.ts | 73 | 非原生 tool calling 的 JSON 降级协议 | 哪些 provider:model 走原生协议由探针实测决定,不做假设。 |
loop.ts | 324 | runAgent 核心循环:预算、钩子、检查点、Trace | 每个 tool_call id 在下一次模型调用前必有对应 tool 消息;terminal 生效后同批调用全部标记 skipped。 |
mcp-tools.ts | 98 | MCP Client → ToolDefinition 适配 | 只引入 allow 白名单内的工具;同一份 ToolDefinition 同时用于 Agent 循环、MCP 注册与测试。 |
model-client.ts | 139 | RuntimeModelClient:多 provider 调用入口 | 原生 tool calling 优先、JSON 协议降级;第一次成功调用固定 provider:model(pin)。 |
tool.ts | 38 | defineTool、参数校验、结果截断、模型侧 Schema 生成 | 参数不符 Schema 以错误结果回传给模型重试,不中断运行。 |
trace.ts | 26 | TraceRecorder(OTel GenAI 语义属性) | span 只在结束时发出,前端据此区分「运行完整」与「被时限中断」。 |
types.ts | 158 | AgentSpec / Budget / ToolContext 等全部共享类型 | ToolContext 由 loop 注入,工具不得自造运行上下文。 |
关键约束提炼自各文件头注释与内核不变量测试(scripts/test-agent-core-loop.mjs 覆盖 10 条循环不变量)。
三旗舰 × 内核能力矩阵
| 内核能力 | 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 = 未参与调优的题目。评分由确定性评分器完成,失败如实记录。
| 变体 | 日期 | 模型 | 题数 | pass@1 | k 次全对 |
|---|---|---|---|---|---|
| inventory / loop | 2026-11-10 | zhipu:glm-5.3 | 34 | 89.2% | 79.4% |
| scheduling / loop | 2026-11-08 | zhipu:glm-5.3 | 37 | 97.3% | 94.6% |
| control-tower / single | 2026-11-09 | zhipu:glm-5.3 | 16 | 89.6% | 81.3% |
| control-tower / orchestrated | 2026-11-09 | zhipu:glm-5.3 | 16 | 79.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_layerinventory_run_readonly_sqlscheduling_get_baseline_planscheduling_preview_scenariosupply_list_delay_scenariossupply_assess_delay_scenariodecision_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 秒的请求上限模型;该上限变化时请求预算与软截止需要重新校准。