Skip to content

enhance: align media modes and consolidate output negotiation#364

Merged
liujuanjuan1984 merged 4 commits intomainfrom
feat/363-assess-input-modes
Apr 2, 2026
Merged

enhance: align media modes and consolidate output negotiation#364
liujuanjuan1984 merged 4 commits intomainfrom
feat/363-assess-input-modes

Conversation

@liujuanjuan1984
Copy link
Copy Markdown
Collaborator

@liujuanjuan1984 liujuanjuan1984 commented Apr 2, 2026

概述

本 PR 聚焦审查并修正 Agent Card 中 input/output modes 的声明,并进一步补齐 runtime 对 acceptedOutputModes 的协商处理,同时将相关规范化逻辑收敛为单点复用,使声明、协商与执行行为保持一致,并更贴近 A2A 协议关于 media types 的最佳实践。

模块变更

Agent Card

  • opencode.chat 显式声明 input_modesoutput_modes
  • 为 JSON-RPC extension skills 显式声明 application/json 输入/输出
  • 将 agent 级默认输出 modes 从仅 text/plain 补齐为 text/plain + application/json

Runtime

  • message/sendmessage:stream 入口校验 acceptedOutputModes
  • 当客户端未接受 text/plain 时,显式拒绝聊天请求,避免返回与协商不兼容的主响应
  • 当客户端仅接受 text/plain 时,抑制流式结构化 DataPart / tool-call 更新
  • 当客户端未声明 acceptedOutputModes 或接受 application/json 时,保持现有宽松行为

Shared Utilities

  • 新增共享 output mode 工具模块,统一 acceptedOutputModes 的规范化与匹配判断
  • 去除 request handler 与 executor 之间重复的解析逻辑
  • 保留去重后的原始顺序,使错误负载中的 modes 列表更稳定、可预期

Tests

  • 扩充 Agent Card 测试,覆盖 chat skill 与 JSON-RPC extension skills 的 modes 声明
  • 增加 acceptedOutputModes 相关测试,覆盖请求级拒绝与流式结构化输出收敛
  • 保持内部 streaming metrics 测试兼容,避免因新增参数破坏现有调用

相关 Commits

  • 7d56050 align agent card media modes with runtime behavior
  • 4858346 respect accepted output modes for chat responses
  • a381aaa deduplicate accepted output mode normalization

审查结论

  • 当前实现已修正此前“声明了 application/json 输出能力,但 runtime 不按 acceptedOutputModes 收敛输出”的偏差
  • 这次收尾提交进一步去除了协商逻辑的重复实现,降低后续演进时 request 校验与执行期行为再次漂移的风险
  • 聊天输入对文件 MIME 的宽松语义本轮仍然保留,属于已知且有意暂缓处理的策略选择
  • 本 PR 与 issue #363 的关系使用 Closes #363 是准确的,本次改动已完成该 issue 目标范围内的修正

验证

  • ./scripts/doctor.sh
  • 结果:475 passed,coverage 91.36%

关联

@liujuanjuan1984
Copy link
Copy Markdown
Collaborator Author

审查结果:

  1. 代码变动
  • 未发现阻塞性问题。
  • 本次改动没有改变 runtime 的输入处理逻辑,只是把 Agent Card 的声明修正为更贴近真实行为:opencode.chat 继续对齐 TextPart / FilePart 场景,JSON-RPC extension skills 明确收敛为 application/json,避免其它 skills 被动继承聊天类默认值。
  • 将默认输出补齐 application/json 是合理的,因为当前流式 tool-call 更新会产生结构化 DataPart;此前卡片对此是低报。
  1. 与 issue 目标的贴合度
  1. 标题、描述与关联关系
  • PR 标题采用英文 commit message 风格,符合仓库约束。
  • PR 描述已按模块拆分为 Agent Card / Tests / 审查结论 / 验证。
  • Closes #363 关系准确;该 PR 直接完成了 issue 的审查与修正目标。
  1. 残余风险
  • defaultInputModes 仍使用 application/octet-stream 作为通用文件输入兜底,这是一个偏保守但可接受的声明;如果未来 runtime 进一步细化允许的文件 MIME 范围,Agent Card 需要继续同步。

@liujuanjuan1984
Copy link
Copy Markdown
Collaborator Author

补充说明:本轮已基于当前分支继续实现 acceptedOutputModes 协商。

新增结论:

  • 之前 PR 中指出的第 1 个问题已修正,runtime 不再无视客户端的 acceptedOutputModes
  • 对聊天主响应,text/plain 现在被视为必需输出模式;客户端若未接受,将收到显式拒绝
  • 对流式辅助结构化输出,只有在客户端接受 application/json 时才会继续发送 DataPart / tool-call 更新
  • 输入侧宽松文件 MIME 语义仍暂时保留,未在本轮调整

验证:./scripts/doctor.sh 已通过。

@liujuanjuan1984 liujuanjuan1984 changed the title align agent card media modes with runtime behavior align media mode declarations and honor output negotiation Apr 2, 2026
@liujuanjuan1984
Copy link
Copy Markdown
Collaborator Author

审查结果:

  1. 代码变动
  • 未发现阻塞性问题。
  • Agent Card 部分的改动方向正确:把 chat skill 与 JSON-RPC extension skills 的 modes 显式分开后,声明与真实能力更接近,也避免了 provider-private JSON-RPC skills 被聊天默认值误导。
  • acceptedOutputModes 协商的实现是合理的:把 text/plain 视为聊天主响应的必需模式,并在仅接受 text/plain 时抑制流式结构化 DataPart,这比继续无条件输出结构化数据更稳妥。
  • streaming metrics 相关回归通过给内部方法新增参数默认值的方式修复,兼容性处理是合适的。
  1. 仍需关注的低风险点
  • acceptedOutputModes 的解析与校验逻辑目前在 request handler 和 executor 两处各有一份,属于可接受的防御式实现,但后续如果继续扩展更多 mode,存在轻微漂移风险。
  • 聊天输入对文件 MIME 的宽松语义仍保留,这与当前 issue 目标一致,本 PR 没有偏离范围。
  1. 标题、描述与 issue 关系
  • PR 标题已更新为英文 commit message 风格:align media mode declarations and honor output negotiation,能覆盖两个相关 commits 的主题。
  • PR 描述已按 Agent Card / Runtime / Tests 分模块整理,并补充了相关 commits。
  • Closes #363 关系准确,不需要改成 Relates to;本 PR 已经直接完成该 issue 的审查与实现目标。
  1. 总结
  • 这组改动整体上是稳健且克制的:没有无谓扩面,主要修正了 media modes 声明漂移和输出协商缺失两个核心问题。

@liujuanjuan1984
Copy link
Copy Markdown
Collaborator Author

补充审查与实现同步:已处理此前评论里提到的低风险点。

本次提交:a381aaa deduplicate accepted output mode normalization

结论:

  • 未发现新的行为性问题
  • 当前改动将 acceptedOutputModes 的规范化与匹配判断收敛到单点复用,减少后续维护时声明校验与执行期协商逻辑再次漂移的风险
  • 同时保留去重后的原始顺序,使错误响应中的 accepted_output_modes 更稳定、可预期

验证:

  • ./scripts/doctor.sh
  • 结果:475 passed,coverage 91.36%

@liujuanjuan1984
Copy link
Copy Markdown
Collaborator Author

本轮基于当前 PR 再做了一次聚焦审查,结论如下。

审查结论:

  • 未发现新的阻塞性问题
  • Agent Card 声明、请求入口校验、执行期流式输出收敛三处现在已经形成闭环,整体实现方向合理
  • 新增的共享 output mode 工具模块把 acceptedOutputModes 的规范化与匹配判断收敛到单点复用,避免后续继续在 handler / executor 两侧分叉
  • 保留去重后的原始顺序是一个合理的小修正,能让错误负载中的 accepted_output_modes 更稳定,便于排障与回归比较

残余风险:

  • 聊天输入对文件 MIME 仍维持宽松语义,只在 Agent Card 中以 application/octet-stream 兜底表达;这不是本 PR 的回归,属于已知且暂缓处理的策略点

关联关系复核:

  • Closes #363 准确,不需要改为 Related to

验证:

  • ./scripts/doctor.sh
  • 结果:475 passed,coverage 91.36%

@liujuanjuan1984 liujuanjuan1984 changed the title align media mode declarations and honor output negotiation align media modes and consolidate output negotiation Apr 2, 2026
@liujuanjuan1984 liujuanjuan1984 changed the title align media modes and consolidate output negotiation enhance: align media modes and consolidate output negotiation Apr 2, 2026
@liujuanjuan1984 liujuanjuan1984 marked this pull request as ready for review April 2, 2026 04:32
@liujuanjuan1984 liujuanjuan1984 merged commit ad579db into main Apr 2, 2026
3 checks passed
@liujuanjuan1984 liujuanjuan1984 deleted the feat/363-assess-input-modes branch April 2, 2026 05:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

assess input modes against A2A best practices [Priority: Med] [Feature/Contracts] 为 AgentCard 与 skills 显式声明 inputModes / outputModes

1 participant