Skip to content

feat(acp): 实现 ACP v1 稳定标准的 Elicitation 族(elicitation/create + elicitation/complete) #146

Description

@YoungSx

结论

ACP v1 稳定标准中的 Elicitation(结构化用户输入)整族在本仓库零实现。我们用自造私有扩展 _interaction.ask_user 覆盖了同一场景,但任何遵循标准的 agent 发来 elicitation/create 都会被我们回 -32601 Method not found

证据链

1. 规范侧:这是 stable,不是 draft

  • https://agentclientprotocol.com/llms.txtprotocol/v1/elicitation 列在 v1 稳定协议章节,与 file-systemterminalssession-modes 同级。

  • 官网有专门公告:announcements/elicitation-stabilized.md —「Announcement that structured elicitation is now part of the stable ACP protocol.」

  • v1 schema 里 Client 侧方法共 8 个,其中两个属于本族:

    $ grep -nE '^### <span' /tmp/acp-v1-schema.md   # 节选 Client 段(873 行起)
    883:### elicitation/complete
    913:### elicitation/create
    1081:### fs/read_text_file
    1150:### fs/write_text_file
    1207:### session/request_permission
    1274:### session/update
    1318:### terminal/create
    ...
    
  • 配套类型(v1 schema ## 级):ElicitationCapabilitiesElicitationSchemaElicitationPropertySchemaElicitationFormModeElicitationUrlModeElicitationIdElicitationAcceptActionElicitationContentValueElicitationRequestScopeElicitationSessionScopeElicitationSchemaTypeElicitationFormCapabilitiesElicitationUrlCapabilities,以及表单字段用的 StringPropertySchema / IntegerPropertySchema / NumberPropertySchema / BooleanPropertySchema / MultiSelectPropertySchema / StringMultiSelectItems / TitledMultiSelectItems / EnumOption / StringFormat

2. 我们侧:一行都没有

$ grep -rin 'elicit' . --exclude-dir=.git | wc -l
0

整仓库(含 src/tests/docs/scripts/)零命中。

3. 未知方法会被拒

src/SalmonEgg.Acp/Client/AcpClient.cs:1216HandleRequest default 分支:

default:
    // Best-effort: respond with "method not found" so the agent doesn't hang waiting.
    RemovePendingInboundTracking(request.Id?.ToString() ?? string.Empty);
    _ = SendResponseAsync(new JsonRpcResponse(
        request.Id,
        JsonRpcError.CreateMethodNotFound(request.Method)));
    break;

elicitation/create 不在 case 列表(AcpClient.cs:1165-1211 只有 session/request_permissionfs/*terminal/*_interaction.ask_user),因此必然落到这里回 -32601

4. 我们的替代品是私有扩展,只有自家 agent 认

src/SalmonEgg.Acp/Protocol/ClientCapabilityMetadata.cs

public const string ExtensionsMetaKey = "salmonegg/extensions";
public const string AskUserExtensionMethod = "_interaction.ask_user";

ClientCapabilityDefaults.Create() 把它塞进 _meta 广告出去。命名以 _ 开头、能力走 _meta 广告,这两点是符合 extensibility 规范的protocol/v1/extensibility.md:46「The protocol reserves any method name starting with an underscore (_) for custom extensions」;:116「Implementations SHOULD use the _meta field in capability objects to advertise support for extensions」)。所以这不是协议违规,而是功能可用但不互操作:第三方 agent 不会去读 salmonegg/extensions

现有 _interaction.ask_user 的落地面(供改造时参考):

  • SDK:src/SalmonEgg.Acp/Protocol/AskUserTypes.csAskUserRequest/AskUserQuestion/AskUserOption/AskUserResponse/AskUserContract 校验与 BuildPrompt
  • Application:ChatService.csIChatService.csDelayedLoadChatService.cs
  • Presentation:AskUserInteractionViewModels.csAskUser/ChatAskUserStatePresenter.csChatViewModel.CommandWorkflow.csInput/ChatInputStatePresenter.cs

影响

任何实现了标准 elicitation 的 agent(含官方 Rust/TS SDK 1.0 起的实现)在需要用户补充结构化输入时会拿到 -32601,只能降级或中断该轮。反向也成立:我们的 ask_user 能力对它们不可见。

建议范围

  1. ClientCapabilities 增补 elicitation 字段(当前只有 fs/terminal/session,见 InitializeTypes.cs:107-126),按 form/url 两种模式分别声明。
  2. SDK 建模 elicitation/create(request,含 form / url / 未知模式三变体——规范要求不认识的模式必须保留原始 payload 且不得渲染成已知模式)与 elicitation/complete(notification)。
  3. AcpClient.HandleRequest 加 case,并按已广告能力做门控(与 SupportsAdvertisedFileSystemCapability 同形)。
  4. 表单 schema 至少覆盖 string / integer / number / boolean / multi-select 五类 PropertySchema。
  5. 迁移路径:_interaction.ask_user 与标准 elicitation 并存一段时间,能力广告二者都发;判定优先用标准,仅当对端不支持时回落私有扩展。

验证要求

  • 真实 agent 发标准 elicitation/create(form 与 url 各一)能走通到 UI 并正确回填。
  • 未知 mode(含 _ 前缀与非 _ 前缀)不渲染成已知模式、payload 原样保留。
  • 未广告 elicitation 能力时,收到 elicitation/create 仍回 -32601(fail-closed 反向验证)。
  • 探针法确认代码路径真的被走到(不能只看断言绿灯)。

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions