Skip to content

refactor: share tool result to content - #386

Merged
eric8810 merged 6 commits into
masterfrom
refactor/share-tool-result-to-content
Oct 28, 2026
Merged

eric8810 merged 6 commits into
masterfrom
refactor/share-tool-result-to-content

Conversation

@cunninghamcard-bit

Copy link
Copy Markdown
Contributor

RFC-0046 R1 的第 8 个小 PR(清单见 #328):把工具结果转内容的两个函数 tool_result_to_content、tool_result_content_value 从 OpenAI 的 chat 转换文件挪进 aimux-provider-utils,借用它们的 9 家改从 provider-utils 调用。

Before:这两个函数是 openai/chat/convert_to_chat_messages.rs 里的 pub(crate) 函数,经 openai::convert 转出去。Open Responses、xAI、OpenAI 兼容层、Mistral、Groq、DeepSeek、Cohere、Google 都去 OpenAI 的私有文件拿(RFC-0046 §2.2 第一行)。

After:两个函数在 aimux_provider_utils 公开导出,所有调用点直接用它们,openai::convert 不再转出。输出逐字节不变。

一、体系现状(概览)

上游没有共享函数,每个转换文件各写一遍同一个 switch:

@ai-sdk/openai 4.0.83         chat/convert-to-openai-chat-messages.ts:329、responses/convert-to-openai-responses-input.ts:110
@ai-sdk/openai-compatible     chat/convert-to-openai-compatible-chat-messages.ts:297
@ai-sdk/mistral               convert-to-mistral-chat-messages.ts:173
@ai-sdk/groq                  convert-to-groq-chat-messages.ts:137
@ai-sdk/deepseek              chat/convert-to-deepseek-chat-messages.ts:383
@ai-sdk/cohere                convert-to-cohere-chat-prompt.ts:173
@ai-sdk/open-responses        responses/convert-to-open-responses-input.ts:401
@ai-sdk/google                convert-to-google-messages.ts:702
@ai-sdk/xai                   responses/convert-to-xai-responses-input.ts
  switch (output.type)
    text / error-text      → output.value
    execution-denied       → output.reason ?? 'Tool call execution denied.'
    json / error-json / content → JSON.stringify(output.value)

aimux(master 9f9f5ab):

aimux-providers/src/openai/chat/convert_to_chat_messages.rs:292   pub(crate) fn tool_result_to_content
                                                         :307   pub(crate) fn tool_result_content_value
aimux-providers/src/openai/mod.rs:56                     mod convert 转出给别家
  ├─ open_responses、xai、openai_compatible、mistral、groq、deepseek、cohere → crate::openai::convert::tool_result_to_content
  └─ google → crate::openai::convert::tool_result_content_value

RFC-0046 §3.2 把这一族定为 provider-utils 的通用函数:上游各家重复的是同一段逻辑,Rust 这边已经只有一份,只是放错了地方。

二、本 PR 改动(细节)

aimux-provider-utils/src/tool_result_to_content.rs
  :17  tool_result_to_content(output: &ToolResultOutput) -> Value        // 原样搬来
  :36  tool_result_content_value(content: &[ToolResultContent]) -> Value // 原样搬来
aimux-provider-utils/src/lib.rs     pub mod + pub use

aimux-providers/src/
  openai/chat/convert_to_chat_messages.rs:208      删掉两个函数,改用 provider-utils
  openai/responses/convert_to_responses_input.rs:739
  openai/mod.rs                                     mod convert 不再转出这两个函数
  openai_compatible/chat/convert_to_chat_messages.rs:106
  mistral/convert_to_chat_messages.rs:81
  groq/convert_to_chat_messages.rs:149
  deepseek/chat/convert_to_chat_messages.rs:339、:347
  cohere/convert_to_chat_prompt.rs:182
  open_responses/responses/convert_to_input.rs:411
  xai/responses/convert_to_responses_input.rs:253
  google/convert_to_messages.rs:422、:448、:455、:480、:481   tool_result_content_value

Anthropic、Bedrock 的工具结果转换是各自的块格式,上游也是各写各的,不在本 PR 范围。

测试:

文件 用例 说明
provider-utils src/tests/tool_result_to_content.rs 4 上游没有对应的 .test.ts;4 条非上游:text/error-text、execution-denied(有无 reason)、json/error-json、content(camelCase 键、二进制按字节下标、url 带 originalUrl)

各厂商已有的工具结果用例全部原样通过。工作区测试数不变(4380),provider-utils 另加 4 个。

改动规模:

范围 文件 增 删
aimux-provider-utils 4 205 0
aimux-providers 11 18 91
合计(含 CHANGELOG) 16 229 91

公开 API 与行为

  • Added:aimux_provider_utils::tool_result_to_content、aimux_provider_utils::tool_result_content_value。
  • 被删的 OpenAI 函数是 pub(crate),没有 Breaking;行为不变。CHANGELOG 的 Added 一条。

检查

cargo fmt --check、scripts/check_provider_boundaries.sh、cargo +1.99 clippy(providers 与 provider-utils,-D warnings)、cargo check --workspace、cargo doc、全部测试均通过。


Generated by Claude Code

The tool message content the AI SDK's chat converters build from a tool
result: the text of a text or error-text output, the denial reason, or
JSON.stringify of a JSON or content output. Upstream repeats this switch
in each converter; RFC-0046 puts the shared copy in provider-utils.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0116HPMoqaLfFr1TyqDq1hrW
Ten converters reached into the OpenAI chat converter for
tool_result_to_content and tool_result_content_value. They now call the
provider-utils functions and the OpenAI copies are gone; output is
unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0116HPMoqaLfFr1TyqDq1hrW
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0116HPMoqaLfFr1TyqDq1hrW
…-result-to-content

# Conflicts:
#	aimux-provider-utils/src/tests/mod.rs

@eric8810 eric8810 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tool result content 转换语义核对通过(text/error-text/execution-denied/json/content parts、file data、providerOptions),新增测试也够。只差 rebase:冲突只在 provider-utils/src/tests/mod.rs,保留 mod tool_result_to_content; 和 mod uint8_utils;,CI 重跑。

…-result-to-content

# Conflicts:
#	CHANGELOG.md
#	aimux-provider-utils/src/lib.rs
#	aimux-provider-utils/src/tests/mod.rs

cunninghamcard-bit commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor Author
eric 的意见 处理
合上新 master,CI 重跑 已合上 master e76ffee(含 #380、#382、#389–#391),提交 25b8a75。lib.rs、tests/mod.rs、CHANGELOG 两边的改动都保留。合并后 openai/chat/convert_to_chat_messages.rs 里的 FileBytes 已经没有地方用,clippy 报未使用,这个 import 删掉了。本地 fmt、边界检查、clippy、doc、providers 与 provider-utils 全部测试通过,CI 重跑中

Generated by Claude Code

@eric8810 eric8810 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rebase 仅保留 union,同步删除未用 FileBytes import;tool_result_to_content 与测试逐字节未变,16/16 CI 通过。Approve。

@eric8810
eric8810 merged commit e7c94a5 into master Oct 28, 2026
16 checks passed
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.

3 participants