aps-agent/poc/pi-aps/README.md

141 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# pi-aps:Pi Agent 访问 APS Gateway 的 PoC 包
本目录实现 **方向 A(外向接入)**:Pi CLI 作为外部
客户端智能体,通过新增的 `/api/agent/*` 适配层调用 APS 业务能力,不在 Pi 侧另开
排产执行通道。
> 当前状态:这是 **P0/P1 只读接入扩展包**。服务端 `/api/agent/intents` 与
> `/api/agent/invoke` 由 Gateway 侧实现并另行验收;本扩展不包含任何模拟 APS 数据。
## 包结构
```text
poc/pi-aps/
├── package.json # pi-package manifest,本地路径安装
├── extensions/aps.ts # Pi ExtensionAPI:健康/摘要/调用 + 动态意图工具
├── skills/pi-aps/SKILL.md # 面向 Pi 的 skill
├── README.md
└── e2e/
├── mock-llm.mjs # OpenAI-compatible 剧本 LLM(只用于真实 Pi E2E)
├── e2e.mjs # 真实 Pi CLI 端到端包装
└── pi-home/ # PI_CODING_AGENT_DIR 隔离配置(运行时生成)
```
## 安装(本地路径,不发布 npm)
```powershell
$env:APS_BASE_URL = "http://127.0.0.1:8000"
$env:APS_AGENT_TOKEN = "" # 正式态填 Agent Token;开发态 APS_AUTH_ENABLED=0 可留空
$repo = (Resolve-Path ".").Path
$env:PI_CODING_AGENT_DIR = Join-Path $repo "poc\pi-aps\e2e\pi-home" # 隔离配置,不改全局 ~/.pi/agent
$piCli = Join-Path $repo "poc\pi-fallback\runtime\node_modules\@mariozechner\pi-coding-agent\dist\cli.js"
node $piCli install (Join-Path $repo "poc\pi-aps")
```
只临时试一次、不写全局/项目配置:
```powershell
node $piCli `
--mode json --no-session --model "<provider>/<model>" `
-e (Join-Path $repo "poc\pi-aps\extensions\aps.ts") `
-p "查询订单池"
```
`<provider>/<model>` 替换为真实 LLM provider(或在隔离配置目录中写好 mock provider)。
真实用法需要把 `PI_CODING_AGENT_DIR` 指向包含 `models.json` 的配置目录:
```powershell
$env:PI_CODING_AGENT_DIR = Join-Path $repo "poc\pi-aps\e2e\pi-home"
# 把 baseUrl/apiKey/models 写到 $env:PI_CODING_AGENT_DIR\models.json
node "...\pi-coding-agent\dist\cli.js" --mode json --no-session --model <provider>/<model> `
--extension "...\extensions\aps.ts" -p "查询订单池"
```
### 持久化配置
可以改用持久化配置文件(计划落点 `~/.pi/aps.json`;若设置
`PI_CODING_AGENT_DIR`,则读取 `<PI_CODING_AGENT_DIR>/aps.json`;
`APS_CONFIG_FILE` 可显式覆盖路径):
```json
{
"aps": {
"baseUrl": "http://127.0.0.1:8000",
"token": "replace-with-issued-agent-token",
"requestTimeoutMs": 30000,
"catalogTimeoutMs": 8000
}
}
```
环境变量优先级最高:`APS_BASE_URL`、`APS_AGENT_TOKEN`、
`APS_REQUEST_TIMEOUT_MS`、`APS_CATALOG_TIMEOUT_MS` 会覆盖 JSON 同名字段。
配置文件缺失或损坏时扩展回退环境变量/默认值,并可在 `/aps-status` 看到
配置加载错误,不会伪装成成功请求。
## 工具与意图目录
扩展固定注册:
| 工具 | 调用 | 说明 |
|------|------|------|
| `aps_health` | `GET /api/health` | APS 健康/接口版本 |
| `aps_summary` | `GET /api/world/summary` | 世界/KPI 摘要 |
| `aps_invoke` | `POST /api/agent/invoke` | 按 `intent` 名调用 |
`session_start` 时扩展请求 `GET /api/agent/intents`,把目录中每个意图注册为
`aps_` + 下划线形式的动态工具(例如 `order.pool` → `aps_order_pool`)。目录不可用
不影响上述三个基础工具。
命令 `/aps-status` 显示 baseUrl、token 是否已配置(只掩码后四位,绝不打印原文)、
已注册工具数和最近错误。
## 只读边界与预期错误
当前阶段只把只读目录暴露给 Pi。P0 只读意图应直通执行;P1/P2/P3 写类意图由
Gateway 返回以下错误之一,Pi 工具会作为失败事件抛给模型,而不是包装成成功:
- `CONFIRM_REQUIRED`
- `POWER_DENIED`
- `INTENT_NOT_REGISTERED`
- `UPSTREAM_FAILED`
## E2E 验证
`e2e.mjs` 不伪造 APS 数据:它先探测真实 APS `/api/health`,再启动本地
OpenAI-compatible 剧本 LLM,最后拉起真实 Pi CLI 和本扩展。
```powershell
$env:APS_BASE_URL = "http://127.0.0.1:8000"
node (Join-Path $repo "poc\pi-aps\e2e\e2e.mjs")
```
要专门验证配置文件读取,可把 token/URL 只放配置文件,不让环境变量进入
Pi 子进程:
```powershell
$env:APS_CONFIG_FILE = Join-Path $repo "poc\pi-aps\e2e\pi-home\aps.json"
$env:APS_E2E_CONFIG_FILE_ONLY = "1"
node (Join-Path $repo "poc\pi-aps\e2e\e2e.mjs")
```
`e2e.mjs` 会临时生成该文件并在结束时删除(仅限 pi-home 内生成的配置)。
输出与产物:
- `last-events.jsonl`:Pi 原始 JSONL 事件,供人工复查
- `last-summary.json`:断言结果摘要
- 若 `/api/agent/intents` 可用且含 `order.pool`,走 `aps_order_pool` 动态工具;
否则回退 `aps_health` 只验证基础 HTTP 接入
Pi headless 的**进程退出码恒为 0**,判成败必须以 JSONL 中的
`tool_execution_end.isError` 和最后 assistant 消息 `stopReason=stop` 为准。
## 已知边界
- 服务端 `/api/agent/*` 三件套与 Agent Token 签发是 Gateway 侧交付,本目录只做
Pi 侧客户端;未看到服务端路由前,`/api/agent/intents` 返回 404 属预期。
- P2 确认卡(写操作审批)尚未在本扩展内实现交互;当前写意图应失败显式。
- Pi 自身无沙箱;安全边界靠扩展只发 APS HTTP + 现场 token 管理实现。