Skip to content

[Priority: Med] [Contracts] 明确 chat acceptedOutputModes 前置校验与输出模式边界 #379

@liujuanjuan1984

Description

@liujuanjuan1984

背景

  • 在对照 codex-a2aopencode-a2a 的 input/output modes 实现时,发现 opencode-a2a 当前已经做了比较清晰的输入边界约束,但输出 modes 侧仍有一处可进一步收口的契约表达。
  • codex-a2a 最近补上了 task-scoped 的 acceptedOutputModes 协商持久化;反过来看,opencode-a2a 有一条实践值得继续固化并补齐文档:对 chat 请求做 fail-fast 的 output modes 兼容性校验。

现状

  • 当前实现已经在入口和 executor 层要求 OpenCode chat 至少接受 text/plain,否则会返回明确错误,而不是在运行过程中隐式丢内容。
  • 这条约束本身是合理的,因为 OpenCode chat 的自然语言主输出仍以 TextPart 为主;application/json 仅覆盖结构化 tool_call 增量,不足以表达全部正常回复。
  • 但这条设计意图在 guide 中还没有被直接说透,客户端读 Agent Card / guide 时,仍可能把 default_output_modes = [text/plain, application/json] 误解成“只接受 application/json 也总能工作”。

建议

  • 将当前的 fail-fast 校验提升为显式稳定契约:对于 main chat,若请求声明了 acceptedOutputModes,则必须与服务声明能力兼容,且必须包含 text/plain
  • 在 guide 中直接补一句 consumer guidance:application/json 是增量结构化输出能力,不承诺所有自然语言回复都能无损升级为 JSON;期望普通 assistant prose 的客户端应继续接受 text/plain
  • 为这条约束补一组更聚焦的契约测试,覆盖:
    • acceptedOutputModes=["application/json"] 时在入口被拒绝
    • 错误类型/消息/数据字段稳定
    • Agent Card / guide /测试三处表达一致

可参考的另一方向

价值

  • 降低客户端误解 Agent Card modes 的概率
  • 让失败更早、更稳定、更容易调试
  • 为后续若要扩展更细粒度 output negotiation 留出清晰的契约起点

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions