Skip to content

# [Feature Request] 新增 /acp compact 命令,复用 models.json 实现协同压缩 #240

Description

@Juna9969

1. 背景与动机 (Background & Motivation)

当前 billion-context-picompress 工具调用由主模型 (Main LLM) 自身完成。为了降低主模型的 Token 消耗和推理干扰,我们需要引入“独立压缩模型”机制。

痛点:如果让用户在 acp.json 中手动配置压缩模型的 baseUrlapiKey,会造成严重的重复配置。
解决方案:直接复用 Pi Coding Agent 原生的模型配置文件 ~/.pi/agent/models.json。通过新增 /acp compact 命令,让用户一键将已配置的某个模型(如小参数量的 Qwen、GPT-4o-mini 等)指定为专属的“上下文压缩模型”。

2. 命令设计 (CLI Command Design)

在插件中注册 /acp compact 命令,行为定义如下:

  • /acp compact (无参数):显示当前配置的压缩模型状态。如果未配置,列出 ~/.pi/agent/models.json 中可用的模型 ID 供用户参考。
  • /acp compact <model-id>:将 <model-id> 设置为当前会话/全局的压缩模型。
  • /acp compact reset:清除配置,Fallback 回默认行为(由主模型执行压缩)。

状态持久化
用户的选择应持久化到插件的状态中(例如写入 ~/.pi/acp.jsoncompressionModelId 字段),以便下次启动时自动生效。

3. 系统架构与协同流程 (Proposed Pipeline Flow)

AI 在修改代码时,请遵循以下协同 Pipeline:

  1. Command Execution: 用户执行 /acp compact qwen-mini。插件验证 qwen-mini 存在于 models.json 中,并将 compressionModelId: "qwen-mini" 写入配置。
  2. Context Event Trigger: 插件拦截 context 事件,决定需要压缩,主模型调用 compress 工具。
  3. Interception & Routing (核心修改点):
    • 检查配置中是否存在 compressionModelId
    • If Exists: 拦截工具调用。读取 ~/.pi/agent/models.json,提取该 model-id 对应的 provider, baseUrl, apiKey, model 等凭证。
    • Dynamic Client: 动态实例化一个 LLM Client(独立于主模型),并构建摘要专用的 System Prompt。
    • API Call: 将请求发送给该压缩模型。
  4. Result Injection: 将压缩模型返回的摘要结果,作为 compress 工具的 toolResult 注入回会话历史中。
  5. Fallback (If Not Exists / Error): 如果未配置,或动态调用的外部模型报错(网络超时、API 余额不足),必须捕获异常并 Fallback 到主模型,由主模型自己生成摘要,确保 Session 不中断。

4. 给 AI/开发者的实现建议 (Implementation Hints for AI)

为了实现此 Feature,建议 AI 代理/开发者重点关注以下模块的修改:

  • [ ] 模型配置读取 (Models Config Parsing):
    需要读取 ~/.pi/agent/models.json注意:请使用 os.homedir() 拼接路径(参考项目中已有的 src/user-config.ts 路径解析逻辑),确保跨平台(Windows/macOS/Linux)兼容。
  • [ ] 命令注册 (Command Registration):
    src/commands.ts 中注册 /acp compact 命令,处理参数解析和状态更新,并向用户输出友好的 UI 反馈。
  • [ ] 工具执行层 (src/compress-tool.ts):
    修改 handleCompress 逻辑。增加一层判断:如果存在 compressionModelId,则从内存中缓存的 models.json 数据里查找对应的 API 凭证,并发起独立的 HTTP 请求(或复用 Pi 内部的 LLM 调用接口,如果 Pi 暴露了相关 API 的话)。
  • [ ] 降级与容错 (Fallback Mechanism - 极其重要):
    外部压缩模型的调用必须是 try...catch 包裹的。一旦失败,Log 记录警告,并立即将执行权交还给主模型(即执行原有的压缩逻辑)。

5. 验收标准 (Acceptance Criteria)

  • 成功注册 /acp compact 命令,能正确读取并列出 models.json 中的模型。
  • 执行 /acp compact <id> 后,触发 compress 工具时,主模型不再消耗 output tokens,而是由指定的模型完成摘要。
  • 具备完善的 Fallback 机制:指定的压缩模型 API 报错时,能无缝降级为主模型压缩,不阻断主流程。
  • 单元测试覆盖:Mock models.json 读取、Mock 外部模型 API 响应、验证 Fallback 逻辑。
  • 更新 README.mdCONFIGURATION.md,说明如何使用 /acp compact 命令。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions