Skip to content

ACP 自定义客户端工具被自动拒绝(新旧版 optionId 不兼容) #426

Description

@KamingChanCN

What version of Kimi Code is running?

v0.9.0

Which open platform/subscription were you using?

Kimi Code

Which model were you using?

kimi-k2.6 thinking

What platform is your computer?

Microsoft Windows NT 10.0.19045.0 x64

What issue are you seeing?

Kimi Code v0.9.0 的 ACP 适配器无法识别旧版 Python kimi-cli 风格的 session/request_permission 响应 optionId。基于旧版行为实现的自定义 ACP 客户端发送 approveapprove_for_session 时,会被新版适配器防御性映射为 rejected,导致 Bash、Write 等工具被自动拒绝。

What steps can reproduce the bug?

  1. 启动 kimi acp
  2. 使用自定义 ACP 客户端完成握手并发送触发 Bash 的 prompt
  3. 客户端在响应 session/request_permission 时使用旧版 optionId:
{
  "jsonrpc": "2.0",
  "id": 4,
  "result": {
    "outcome": {
      "outcome": "selected",
      "optionId": "approve_for_session"
    }
  }
}
  1. 观察结果:Bash 工具被阻止,模型收到
Tool "Bash" was not run because the user rejected the approval request.

What is the expected behavior?

permissionResponseToApprovalResponse 中增加兼容分支:

case 'approve_once':
case 'approve':                   // ← 兼容旧版
  return { decision: 'approved' };
case 'approve_always':
case 'approve_for_session':       // ← 兼容旧版
  return { decision: 'approved', scope: 'session' };

或在 ACP 参考文档中显式声明 v0.9.0+ 的 canonical optionIds,要求自定义客户端适配。

Additional information

新旧版使用的 optionId 约定不同,但 kind 标准一致:

语义 旧版 Python kimi-cli 新版 TS kimi-code kind(标准一致)
一次性批准 approve approve_once allow_once
会话级批准 approve_for_session approve_always allow_always
拒绝 reject reject reject_once
  • 旧版:kimi-cli-source/src/kimi_cli/acp/session.py:426-439
  • 新版:kimi-code/packages/acp-adapter/src/approval.ts:21-71

推测根因

ACP 规范将 optionId 定义为 opaque to the client,由服务器实现自行选择。新旧版 SDK 的 kind 语义一致(allow_once / allow_allow / reject_once),说明 ACP 协议标准本身无冲突。
问题根源在于:Kimi 团队在从 Python(ACP SDK 0.8.0)迁移到 TypeScript(ACP SDK 0.23.0)时,更改了 opaque optionId 的约定,但未对旧版值做兼容,导致基于旧版行为实现的客户端被防御性拒绝。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions