结论
ACP v1 稳定标准中的 Elicitation(结构化用户输入)整族在本仓库零实现。我们用自造私有扩展 _interaction.ask_user 覆盖了同一场景,但任何遵循标准的 agent 发来 elicitation/create 都会被我们回 -32601 Method not found。
证据链
1. 规范侧:这是 stable,不是 draft
-
https://agentclientprotocol.com/llms.txt 把 protocol/v1/elicitation 列在 v1 稳定协议章节,与 file-system、terminals、session-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 ## 级):ElicitationCapabilities、ElicitationSchema、ElicitationPropertySchema、ElicitationFormMode、ElicitationUrlMode、ElicitationId、ElicitationAcceptAction、ElicitationContentValue、ElicitationRequestScope、ElicitationSessionScope、ElicitationSchemaType、ElicitationFormCapabilities、ElicitationUrlCapabilities,以及表单字段用的 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:1216 的 HandleRequest 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_permission、fs/*、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.cs(AskUserRequest/AskUserQuestion/AskUserOption/AskUserResponse/AskUserContract 校验与 BuildPrompt)
- Application:
ChatService.cs、IChatService.cs、DelayedLoadChatService.cs
- Presentation:
AskUserInteractionViewModels.cs、AskUser/ChatAskUserStatePresenter.cs、ChatViewModel.CommandWorkflow.cs、Input/ChatInputStatePresenter.cs
影响
任何实现了标准 elicitation 的 agent(含官方 Rust/TS SDK 1.0 起的实现)在需要用户补充结构化输入时会拿到 -32601,只能降级或中断该轮。反向也成立:我们的 ask_user 能力对它们不可见。
建议范围
ClientCapabilities 增补 elicitation 字段(当前只有 fs/terminal/session,见 InitializeTypes.cs:107-126),按 form/url 两种模式分别声明。
- SDK 建模
elicitation/create(request,含 form / url / 未知模式三变体——规范要求不认识的模式必须保留原始 payload 且不得渲染成已知模式)与 elicitation/complete(notification)。
AcpClient.HandleRequest 加 case,并按已广告能力做门控(与 SupportsAdvertisedFileSystemCapability 同形)。
- 表单 schema 至少覆盖 string / integer / number / boolean / multi-select 五类 PropertySchema。
- 迁移路径:
_interaction.ask_user 与标准 elicitation 并存一段时间,能力广告二者都发;判定优先用标准,仅当对端不支持时回落私有扩展。
验证要求
- 真实 agent 发标准
elicitation/create(form 与 url 各一)能走通到 UI 并正确回填。
- 未知 mode(含
_ 前缀与非 _ 前缀)不渲染成已知模式、payload 原样保留。
- 未广告 elicitation 能力时,收到
elicitation/create 仍回 -32601(fail-closed 反向验证)。
- 探针法确认代码路径真的被走到(不能只看断言绿灯)。
结论
ACP v1 稳定标准中的 Elicitation(结构化用户输入)整族在本仓库零实现。我们用自造私有扩展
_interaction.ask_user覆盖了同一场景,但任何遵循标准的 agent 发来elicitation/create都会被我们回-32601 Method not found。证据链
1. 规范侧:这是 stable,不是 draft
https://agentclientprotocol.com/llms.txt把protocol/v1/elicitation列在 v1 稳定协议章节,与file-system、terminals、session-modes同级。官网有专门公告:
announcements/elicitation-stabilized.md—「Announcement that structured elicitation is now part of the stable ACP protocol.」v1 schema 里 Client 侧方法共 8 个,其中两个属于本族:
配套类型(v1 schema
##级):ElicitationCapabilities、ElicitationSchema、ElicitationPropertySchema、ElicitationFormMode、ElicitationUrlMode、ElicitationId、ElicitationAcceptAction、ElicitationContentValue、ElicitationRequestScope、ElicitationSessionScope、ElicitationSchemaType、ElicitationFormCapabilities、ElicitationUrlCapabilities,以及表单字段用的StringPropertySchema/IntegerPropertySchema/NumberPropertySchema/BooleanPropertySchema/MultiSelectPropertySchema/StringMultiSelectItems/TitledMultiSelectItems/EnumOption/StringFormat。2. 我们侧:一行都没有
整仓库(含
src/、tests/、docs/、scripts/)零命中。3. 未知方法会被拒
src/SalmonEgg.Acp/Client/AcpClient.cs:1216的HandleRequestdefault 分支:elicitation/create不在case列表(AcpClient.cs:1165-1211只有session/request_permission、fs/*、terminal/*、_interaction.ask_user),因此必然落到这里回-32601。4. 我们的替代品是私有扩展,只有自家 agent 认
src/SalmonEgg.Acp/Protocol/ClientCapabilityMetadata.cs: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_metafield in capability objects to advertise support for extensions」)。所以这不是协议违规,而是功能可用但不互操作:第三方 agent 不会去读salmonegg/extensions。现有
_interaction.ask_user的落地面(供改造时参考):src/SalmonEgg.Acp/Protocol/AskUserTypes.cs(AskUserRequest/AskUserQuestion/AskUserOption/AskUserResponse/AskUserContract校验与BuildPrompt)ChatService.cs、IChatService.cs、DelayedLoadChatService.csAskUserInteractionViewModels.cs、AskUser/ChatAskUserStatePresenter.cs、ChatViewModel.CommandWorkflow.cs、Input/ChatInputStatePresenter.cs影响
任何实现了标准 elicitation 的 agent(含官方 Rust/TS SDK 1.0 起的实现)在需要用户补充结构化输入时会拿到
-32601,只能降级或中断该轮。反向也成立:我们的 ask_user 能力对它们不可见。建议范围
ClientCapabilities增补elicitation字段(当前只有fs/terminal/session,见InitializeTypes.cs:107-126),按 form/url 两种模式分别声明。elicitation/create(request,含 form / url / 未知模式三变体——规范要求不认识的模式必须保留原始 payload 且不得渲染成已知模式)与elicitation/complete(notification)。AcpClient.HandleRequest加 case,并按已广告能力做门控(与SupportsAdvertisedFileSystemCapability同形)。_interaction.ask_user与标准 elicitation 并存一段时间,能力广告二者都发;判定优先用标准,仅当对端不支持时回落私有扩展。验证要求
elicitation/create(form 与 url 各一)能走通到 UI 并正确回填。_前缀与非_前缀)不渲染成已知模式、payload 原样保留。elicitation/create仍回-32601(fail-closed 反向验证)。