Skip to content

feat: implement pi-rpc protocol for Pi agent #130

Description

@IntelAMDNVIDIA

概述

Pi agent 已经能被识别(/api/agents 返回 available: true),但调用时抛出 UnsupportedAgentProtocolError,因为 pi-rpc 协议尚未实现。

这是与 ACP 协议(Hermes/Kimi/Devin 等)同类的问题,但 Pi 使用的是独立的 pi-rpc 协议,需要单独实现。

当前状态

/api/agents 返回片段

{
  "id": "pi",
  "label": "Pi",
  "vendor": "Inflection",
  "protocol": "pi-rpc",
  "models": [
    {"id": "default", "label": "Default (CLI config)"},
    {"id": "anthropic/claude-sonnet-4-5", "label": "Claude Sonnet 4.5"},
    {"id": "anthropic/claude-opus-4-5", "label": "Claude Opus 4.5"},
    {"id": "openai/gpt-5", "label": "GPT-5"},
    {"id": "google/gemini-2.5-pro", "label": "Gemini 2.5 Pro"}
  ],
  "unsupported": true,
  "available": true,
  "path": "/home/bewg/.local/share/fnm/node-versions/v24.18.0/installation/bin/pi",
  "resolvedBin": "pi"
}

错误信息

调用 Pi 时返回:

pi uses the pi-rpc protocol, which is not yet wired up in this build. 
Pick one of: claude / codex / cursor-agent / gemini / copilot / opencode / qwen / qoder / codewhale / deepseek-tui / aider.

后台日志

POST /api/convert 200 in 21ms

21ms 返回是因为 buildArgv 阶段就抛出了 UnsupportedAgentProtocolError,没有真正调用 Pi。

Pi 版本信息

$ pi --version
0.82.0

$ which pi
/home/bewg/.local/share/fnm/node-versions/v24.18.0/installation/bin/pi

$ file $(which pi)
symbolic link to ../lib/node_modules/@earendil-works/pi-coding-agent/dist/cli.js

Pi 非交互模式测试(关键信息)

Pi 支持非交互模式,类似于 Claude 的 -p 参数:

# 测试 1:简单输入
$ echo "hello" | pi -p
你好!👋

我是 MiMo-v2.5,由小米大模型核心团队开发的 AI 助手。

有什么我可以帮你的吗?无论是代码编写、文件操作、问题调研,还是其他任何事情,随时告诉我!😊

# 测试 2:JSON 输出格式
$ echo "hello" | pi -p --mode json
[NDJSON 输出,包含 message_update、message_end、turn_end、agent_end 等事件]

Pi 支持的关键参数

--print, -p                    # 非交互模式:处理提示后退出
--mode <mode>                  # 输出模式:text (默认), json, 或 rpc
--model <pattern>              # 模式或 ID(支持 "provider/id" 和可选的 ":<thinking>")
--provider <name>              # 提供商名称(默认:google)
--system-prompt <text>         # 系统提示(默认:编码助手提示)
--no-tools, -nt                # 默认禁用所有工具
--tools, -t <tools>            # 逗号分隔的工具名称白名单

Pi 的 JSON 输出格式

Pi 的 --mode json 输出是 NDJSON(换行分隔的 JSON),主要事件类型:

{"type":"message_update","assistantMessageEvent":{"type":"text_delta","contentIndex":1,"delta":"你好!很高兴见到你。有什么我可以帮忙的吗?",...}}
{"type":"message_end","message":{...},"toolResults":[]}
{"type":"turn_end","message":{...},"toolResults":[]}
{"type":"agent_end","messages":[...],"willRetry":false}

实现建议

方案 A:使用 --mode json(推荐)

pi -p --mode json --model <model> "prompt"
  • 输出格式:NDJSON(换行分隔的 JSON)
  • 与 Claude 的 stream-json 类似,但事件结构不同
  • 需要解析 message_update 事件中的 text_delta

方案 B:使用默认文本模式

pi -p --model <model> "prompt"
  • 输出格式:纯文本
  • 简单但无法流式输出

需要修改的文件

  1. src/lib/agents/detect.ts - 移除 unsupported: true 标记
  2. src/lib/agents/argv.ts - 实现 pi-rpc 协议的 buildArgv 和解析器
  3. src/lib/agents/invoke.ts - 处理 Pi 的 NDJSON 输出

参考

期望输出

实现后,用户可以选择 Pi 作为 agent,正常进行 HTML 转换。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requesthelp wantedExtra attention is needed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions