# Pi Agent 接入 · 详细实施计划 > 版本 v1.0 · 2026-09-02 · 配套摘要文档:`Pi-Agent接入计划.md` > 依据:`plan.md` §2.1/§2.2、`PROJECT_OPERATING_RULES.md`、`docs/architecture/harness.md`、`docs/architecture/skills.md` > 现状代码基线:`server/agent_core/`(harness `_POWER_MAP` 62 项登记、tool_runtime 只读白名单 19 项、mcp_bus、skills、audit)、`server/auth/`(JMS provider + 许可证 token + 租户)、`server/gateway/app.py` > > **对象界定**:Pi Agent = badlogic 开源 Pi(pi-coding-agent CLI + pi-agent-core + npm 技能包生态)。方向 A:外向接入,Pi 作为外部客户端智能体经 Gateway 调用 APS 能力,不开第二个执行通道。 --- ## 0. 总览 | 阶段 | 名称 | 工期(人日) | 出口标准(Go/No-Go 门禁) | |------|------|------------|--------------------------| | P0 | 验证性 PoC | 2-3 | 终端内完成真实查询往返;Pi 扩展 API 三个未知数全部有答案 | | P1 | 只读接入 | 5 | 只读意图 19 项全部可经 agent 端点调用;token 越权测试 fail-closed | | P2 | 写操作过门禁 | 5-10 | P1/P2 意图经确认卡执行;CLI 侧确认/拒绝/超时三态可演示 | | P3 | MCP 总线治理化 | 5-10 | Pi 插件入总线清单;契约三方同步门禁通过;管理台可见 | | P4 | 验收与发布门禁 | 5 | 全量黄金测试绿;文档同轮完成;安全评审签字 | | **合计** | | **22-33 人日(约 5-7 周/1 人)** | | **串行前提**:与 Tauri 迁移不并行(都动 Gateway/sidecar 周边);FF-01 基线已提交(8b7063f)。 --- ## P0 · 验证性 PoC(2-3 人日) ### 目标 用最小成本验证"Pi 技能包 ↔ 现有 FastAPI Gateway"匹配度,产出 go/no-go。 ### 任务分解 | # | 任务 | 产出 | 工时 | |---|------|------|------| | P0-1 | 安装 Pi(`npm i -g` pi-coding-agent),跑通官方 hello 技能包,确认扩展 API 形态(工具注册签名、权限钩子、配置落点 `~/.pi/`) | 笔记 + 截图 | 0.5d | | P0-2 | 起本地 APS server(`.venv` 固定 CPython,`python -m uvicorn server.main:app --port 8000`),确认 `/api/health` 返回 `interfaceVersion=1.0` | 环境就绪 | 0.5d | | P0-3 | 写最小技能包 `pi-aps`(单文件):注册 2 个工具 `aps_health` / `aps_summary`,调 `/api/health` 与 `/api/world/summary`,结果原样透传 | PoC 技能包 | 1d | | P0-4 | 验证 SSE:终端订阅 `/api/chat` 会话流或等价端点,确认流式事件在 CLI 可读(决定 P2 确认卡用轮询还是 SSE) | 技术结论 | 0.5d | | P0-5 | go/no-go 报告:三个未知数(扩展 API 形态 / 认证链路 / SSE 呈现)+ P1 估算修正 | 报告 | 0.5d | ### PoC 技术约束(防止 PoC 污染产品路径) - PoC 技能包只读、不进仓库 `apps/` 或 `server/`;放 `poc/pi-aps/`; - 认证用开发态临时方案(环境变量 token),**不写** token 签发产品代码——那是 P1 的事; - 遵守规范:工具失败显式报错,不包装成泛化成功回复。 ### 出口标准(全部满足才进 P1) 1. 在 Pi 终端输入自然语言/命令 → 返回真实 APS 数据(非 mock); 2. Pi 权限钩子能在工具调用前拦截(P2 确认卡的技术前提); 3. 无明显阻塞性限制(如技能包无法持久化配置、无法发 HTTPS 到自签证书内网服务器等)。 --- ## P1 · 只读接入(5 人日) ### 目标 Pi 用户可完成全部只读场景:查订单池、KPI、分桶计划、冲突、知识库。 ### API 设计(新增 `/api/agent/` 适配层) 设计原则:**薄适配,零业务逻辑**(Gateway 职责边界:不含排产算法/LLM 决策)。复用 `handle_intent`,不复制逻辑。 ``` POST /api/agent/invoke 请求:{ "intent": "order.pool", "params": {...}, "requestId": "uuid" } 响应:{ "ok": true, "intent": "...", "power": "P0", "data": {...}, "evidenceRefs": [...], "interfaceVersion": "1.0" } 错误:{ "ok": false, "error": { "code": "INTENT_NOT_REGISTERED" | "POWER_DENIED" | "CONFIRM_REQUIRED" | "UPSTREAM_FAILED", ... } } GET /api/agent/intents # 列出该 token scope 可调用的意图目录(从白名单/_POWER_MAP 派生) GET /api/agent/intents/{name} # 单意图参数 schema(供 Pi 动态生成工具签名) ``` 行为规则: - 只读意图(tool_runtime 白名单 19 项 + `_POWER_MAP` 中 P0 项)→ 直通执行; - P1/P2/P3 → P1 阶段一律返回 `CONFIRM_REQUIRED`/`POWER_DENIED`(P2 阶段才接通); - **未登记意图 → 拒绝 + 审计**(与 tool_runtime 同语义,fail closed)。 ### 任务分解 | # | 任务 | 涉及文件 | 工时 | |---|------|---------|------| | P1-1 | `/api/agent/*` 三个端点:参数校验(Pydantic)、intent 登记检查、委托 handle_intent、统一错误码 | `server/gateway/app.py`(新增路由段,<150 行) | 1d | | P1-2 | Agent Token:基于 `server/auth/` 既有体系签发长期 token(type="agent",scope=["read"]),绑定租户 + device;签发/吊销登记 P2 意图 `agent.token.issue` / `agent.token.revoke` 入 `_POWER_MAP` | `server/auth/`(新增 `agent_tokens.py`)、`harness.py` 登记 2 项 | 1.5d | | P1-3 | 审计:`actor="pi-agent:"`,全部调用落 TOOL/AGENT 审计事件,可按 actor 过滤 | `server/agent_core/audit.py`(复用,仅扩展 actor 约定) | 0.5d | | P1-4 | `pi-aps` v0.1:从 `/api/agent/intents` 动态生成工具集;配置项(server URL、token、超时)落 `~/.pi/aps.json`;错误码 → 人类可读终端输出 | `poc/pi-aps/` → 转正为独立 npm 包 | 1.5d | | P1-5 | 黄金测试:端点契约、未登记意图拒绝、token 无效/越权/吊销 fail-closed、审计落链断言 | `tests/golden/test_agent_gateway.py`(新增) | 0.5d | ### 出口标准 - 只读意图 100% 可调;非只读一律显式拒绝; - token 六种异常(缺失/伪造/过期/吊销/scope 越界/跨租户)全部 fail-closed 且有审计; - `pytest tests/golden/test_agent_gateway.py` 全绿;`test_contract_sync.py` 不受影响。 --- ## P2 · 写操作过门禁(5-10 人日) ### 目标 Pi 可发起 P1/P2 意图(试排、登记 skill 等),确认卡在终端完成人机确认。 ### 确认卡交互设计(CLI 三态) ``` Pi 发起 flex.schedule(P1 草稿类)→ 直通执行,返回 evidenceRefs(含 schedule-version) Pi 发起 schedule.publish(P2)→ /api/agent/invoke 返回 CONFIRM_REQUIRED + cardId → Pi 权限钩子向用户呈现确认卡摘要(动作/影响/evidenceRefs 指纹) → 用户批准:POST /api/actions/confirm { cardId, approved: true }(既有唯一执行通道 ✅) → 用户拒绝/超时(默认 5min):fail closed,审计留痕 ``` ### 任务分解 | # | 任务 | 工时 | |---|------|------| | P2-1 | invoke 端点接通 P1 意图(沙盒/草稿语义直通,返回 evidenceRefs) | 1d | | P2-2 | invoke 端点接通 P2:生成确认卡(复用 harness 出卡逻辑,冻结 evidenceRefs/beforeSnapshot),返回 cardId + 摘要 payload | 1.5d | | P2-3 | token scope 升级:`read` → `read+write`(签发改 P2 确认卡;scope 与意图权力交叉校验:P2 意图必须 write scope) | 1d | | P2-4 | pi-aps v0.2:确认卡终端 UI(摘要渲染 + y/n + 超时倒计时);批准后轮询/SSE 拿执行结果;失败显式呈现 | 1.5-3d | | P2-5 | 证据链黄金测试:Pi 发起的 P2 写,审计含 beforeSnapshot + evidenceRefs + `verify_pending_evidence` 缺项拒绝 | 1d | | P2-6 | 超时/并发边界:一 token 同时仅一张 pending 卡;卡过期自动拒绝 | 1d(含测试) | ### 出口标准 - 演示脚本全绿:试排→发布→回滚三链路在 Pi 终端闭环; - 安全测试:无卡直调 confirm、伪造 cardId、过期卡、跨 token 用卡——全部拒绝 + 审计; - 变数说明:P2-4 的 CLI 交互若 Pi 权限钩子能力受限(P0-4 结论),可能退化为"Web 确认 + CLI 只读结果",工期取下限。 --- ## P3 · MCP 总线治理化(5-10 人日) ### 目标 Pi 接入面成为 `mcp_bus` 正式插件,享受统一治理(契约、权限、健康、启停、审计、管理台)。 ### 插件 manifest(落 `server/data/mcp_plugins/plugins.json`) ```json { "plugin_id": "pi-agent-gateway", "name": "Pi Agent 接入面", "version": "1.0.0", "min_bus_version": "1.0", "endpoint": "self:///api/agent", "tools": [ {"name": "order.pool", "power": "P0", "input_schema_ref": "shared/schemas/..."}, {"name": "flex.schedule", "power": "P1", "input_schema_ref": "shared/schemas/..."}, {"name": "schedule.publish", "power": "P2", "input_schema_ref": "shared/schemas/..."} ], "ragScopes": [] } ``` ### 任务分解 | # | 任务 | 工时 | |---|------|------| | P3-1 | 把 `/api/agent/intents` 目录生成为 MCP manifest(自动生成 + 版本化),注册进 mcp_bus | 1.5d | | P3-2 | tool 级 allow/deny 配置面:按现场可裁剪 Pi 可用意图(deny 优先,fail closed) | 1d | | P3-3 | 三方契约同步:`shared/schemas/agent_invoke.schema.json` ↔ `server/contracts.py` ↔ pi-aps 类型定义;入 `test_contract_sync.py` 门禁 | 1.5d | | P3-4 | 管理台:SkillConsole 复用双面板模式呈现 Pi 插件(概览/健康/审计/日志页签) | 2d | | P3-5 | 健康探测:agent 端点纳入总线探测历史(最近 20 次) | 0.5d | | P3-6 | 文档同轮:harness.md 端点备案、skills.md 增补、CHANGELOG | 0.5d | ### 出口标准 - 总线清单可见、可启停(P2 确认卡)、审计可按插件过滤; - 契约漂移测试阻断生效(故意改一端 → CI 红)。 --- ## P4 · 验收与发布门禁(5 人日) | # | 任务 | 工时 | |---|------|------| | P4-1 | 全量黄金测试(基线 1071 项 + 新增 agent 专项)固定 CPython 运行时全绿 | 1d | | P4-2 | 安全评审:token 存储(`~/.pi/aps.json` 权限 600)、传输(内网 HTTP → 建议 HTTPS 或 SSH 隧道指引)、桌面态 nonce 与 agent token 并存策略 | 1.5d | | P4-3 | 真实场景验收:康尼数据集上跑"查询→试排→确认发布"全链路 5 轮 | 1d | | P4-4 | 发布物料:pi-aps npm 包版本化 + 安装文档 + 现场部署 runbook | 1d | | P4-5 | 回顾:估算偏差分析,更新本计划为 v1.1 | 0.5d | --- ## 6. 横切约束(每阶段都必须遵守,来自 PROJECT_OPERATING_RULES) 1. **无后门**:任何写路径不得绕过 `tool_runtime`/`/api/actions/confirm`;P1 起加黄金测试断言"agent 端点代码无直接 store 写调用"(import 扫描级)。 2. **失败显式**:工具失败/为空/中止 → 结构化错误码透传到终端,禁止泛化确认。 3. **状态诚实**:DRAFT/未批准/失败状态在 agent 响应中显式标注 `status` 字段,不得当完成事实。 4. **证据链**:P2/P3 写全部携带 `beforeSnapshot` + `evidenceRefs`;审计 append-only。 5. **契约三方同步**:改契约必须三端同改 + `test_contract_sync.py`。 6. **文档同轮**:每阶段收尾同步 harness.md / CHANGELOG;`docs/README.md` 铁律。 7. **运行时**:所有验证用 `.venv` 固定 CPython,禁用 PATH 上的 Anaconda python(WinError 127 前科)。 8. **提交纪律**:未经用户授权不提交/不推送;每阶段一个独立 commit,conventional 中文提交信息。 ## 7. 风险登记册 | # | 风险 | 概率 | 影响 | 触发阶段 | 对策 | |---|------|------|------|---------|------| | R1 | Pi 权限钩子不支持异步确认交互 | 中 | P2 降级为"CLI 发起 + Web 确认" | P0-4 暴露 | PoC 即验证;降级方案可接受 | | R2 | token 长期持有泄漏 | 低 | 数据外泄 | P1 后 | scope 最小化 + 吊销通道 + 审计告警(audit_alerts 既有) | | R3 | Pi 上游 API breaking change | 中 | 技能包失效 | 长期 | 技能包锁版本范围;manifest `min_bus_version` 同款声明 | | R4 | 与现场交付(康尼/徐工)抢人力 | 高 | 双方延期 | 全程 | P0/P1 先行(可演示价值),P2+ 按交付间隙排 | | R5 | 内网无 npm registry,技能包分发难 | 中 | 现场装不上 | P4 | 离线 tarball 分发 + runbook 写明 | | R6 | 与 Tauri 迁移冲突 | 低 | 返工 | — | 已约定串行 | ## 8. 关键依赖与前置 - ✅ FF-01 基线已提交(8b7063f) - ⬜ P0 需要:本机可装 Pi(npm 网络)、APS server 本地可起 - ⬜ P1 需要:确认 agent token 在桌面态(sidecar nonce 门禁)与 Web 态(JMS 登录)两种部署下的统一策略——**建议 P0 期间出结论** - ⬜ P4 需要:康尼数据集可用 ## 9. 里程碑视图 ``` W1 W2 W3-4 W5-6 W7 [P0 PoC]→[P1 只读]→[P2 写门禁]→[P3 治理化]→[P4 验收] ↑go/no-go ↑可演示 ↑安全评审预备 ↑发布门禁 ```