Skip to content

refactor: share reasoning effort and budget mapping - #383

Merged
eric8810 merged 8 commits into
masterfrom
refactor/share-reasoning-effort-and-budget-mapping
Oct 28, 2026
Merged

eric8810 merged 8 commits into
masterfrom
refactor/share-reasoning-effort-and-budget-mapping

Conversation

@cunninghamcard-bit

Copy link
Copy Markdown
Contributor

RFC-0046 R1 的第 5 个小 PR(清单见 #328):把 mapReasoningToProviderEffort 和 mapReasoningToProviderBudget 放进 aimux-provider-utils,9 家厂商按上游的调用点改用它们。

Before:顶层 reasoning 等级到厂商参数的换算在各家各写一份。Anthropic 有 map_reasoning_to_effort、reasoning_budget_percentage、map_reasoning_to_budget 三个函数,Cohere 又有一份 reasoning_budget_percentage 和 DEFAULT_REASONING_MAX_TOKENS,Bedrock、DeepSeek、Google、Groq、Mistral、xAI、Open Responses 各自用 match 换算并自己拼警告文字。Open Responses 把 minimal 发成 low 时不出警告。

After:9 家都调用同一对函数,各自只保留上游写在调用点的那张等级表或预算上限。警告文字只有一处。Open Responses 把 minimal 发成 low 时出 compatibility 警告,与上游一致。

一、体系现状(概览)

上游:

@ai-sdk/provider-utils 5.0.55
  map-reasoning-to-provider.ts
    DEFAULT_REASONING_BUDGET_PERCENTAGES  minimal 0.02 / low 0.1 / medium 0.3 / high 0.6 / xhigh 0.9 / max 0.95
    mapReasoningToProviderEffort({ reasoning, effortMap, warnings })        // 不在表里 → unsupported;换了名字 → compatibility
    mapReasoningToProviderBudget({ reasoning, maxOutputTokens, maxReasoningBudget, minReasoningBudget = 1024, budgetPercentages, warnings })
                                                                            // min(max, max(min, round(maxOutputTokens × pct)))
调用方
  anthropic-language-model.ts:3479 / :3496            effort(adaptive)/ budget
  amazon-bedrock-chat-language-model.ts:1659 / :1670 / :1686
  cohere-chat-language-model.ts:488                    budget(32768, 32768)
  deepseek-chat-language-model.ts:354
  google-language-model.ts:1365 / :1425                Gemini 3 thinkingLevel / Gemini 2.5 thinkingBudget
  groq-chat-language-model.ts:191
  mistral-chat-language-model.ts:148
  open-responses-language-model.ts:344
  xai-responses-language-model.ts:292

aimux(master b0450d4):

aimux-providers
  anthropic/language_model.rs     map_reasoning_to_effort / reasoning_budget_percentage / map_reasoning_to_budget
  cohere/chat_language_model.rs   DEFAULT_REASONING_MAX_TOKENS / reasoning_budget_percentage
  bedrock/chat_language_model.rs  reasoning_capabilities → (预算比例 f64, ..),effort 用 match
  deepseek / google / groq / mistral / xai / open_responses   各自 match ReasoningEffort,警告文字各拼一份
aimux-provider-utils              没有对应函数

二、本 PR 改动(细节)

aimux-provider-utils/src/map_reasoning_to_provider.rs
  :10  DEFAULT_REASONING_BUDGET_PERCENTAGES      // 没有 max:aimux 的 ReasoningEffort 没有这一级
  :19  DEFAULT_MIN_REASONING_BUDGET = 1024
  :43  map_reasoning_to_provider_effort(reasoning, effort_map, warnings) -> Option<&str>
  :75  map_reasoning_to_provider_budget(reasoning, max_output_tokens, max_reasoning_budget,
                                        min_reasoning_budget, budget_percentages, warnings) -> Option<u32>
aimux-provider-utils/src/lib.rs     pub mod + pub use 两个函数、两个常量

aimux-providers/src/
  anthropic/language_model.rs:2185   resolve_anthropic_reasoning_config 改用两个函数;删掉三个本地函数
  bedrock/chat_language_model.rs:842 AMAZON_BEDROCK_REASONING_EFFORT_MAP(上游同名表)
                                :942 / :952  非 adaptive 用 budget,adaptive 和非 Anthropic 模型用 effort
  cohere/chat_language_model.rs:557  resolve_cohere_thinking 多一个 warnings 参数,:605 用 budget
  deepseek/chat/chat_language_model.rs:275  minimal/low → low,medium/high → high,xhigh → max
  google/language_model.rs:1677 / :1698     Gemini 3 用 effort(none → 最低一级),Gemini 2.5 用 budget(none → 0)
  groq/chat_language_model.rs:150           表换算后转成 options::ReasoningEffort
  mistral/chat_language_model.rs:602        resolve_reasoning_effort,请求体和 request_warnings 共用
  open_responses/responses/language_model.rs:988   minimal → low,其余同名
  xai/responses/responses_language_model.rs:1297   xhigh 只对 grok-4.6 保留,其他模型发 high

测试:

文件 用例 说明
provider-utils src/tests/map_reasoning_to_provider.rs 14 上游用例;max 那条没有对应等级,未移植;“所有等级”一条标 partial(少 max)
open_responses tests/responses/language_model.rs 1 新增:minimal 发成 low 并出 compatibility 警告;在 master 上失败

其余厂商的已有用例全部原样通过,请求体和警告不变。工作区测试 4380 → 4381(provider-utils 的 14 个另计)。

改动规模:

范围 文件 增 删
aimux-provider-utils 4 336 0
aimux-providers 10 232 258
合计(含 CHANGELOG) 15 577 258

公开 API 与行为

  • Added:aimux_provider_utils::map_reasoning_to_provider_effort、map_reasoning_to_provider_budget、DEFAULT_REASONING_BUDGET_PERCENTAGES、DEFAULT_MIN_REASONING_BUDGET。
  • Fixed:Open Responses 换算 reasoning 等级时出 compatibility 警告。
  • 被删的厂商函数都是私有的,没有 Breaking。CHANGELOG 的 Added、Fixed 各一条。

检查

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

Ports mapReasoningToProviderEffort, mapReasoningToProviderBudget and
their defaults from @ai-sdk/provider-utils 5.0.55, with the upstream
test cases (the `max` level has no aimux counterpart).

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

Anthropic, Amazon Bedrock, Cohere, DeepSeek, Google, Groq, Mistral and
xAI call map_reasoning_to_provider_effort/_budget where upstream does,
keeping only their effort maps and budget limits. Requests and warnings
are unchanged.

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

Open Responses now maps the top-level reasoning level with
map_reasoning_to_provider_effort, so sending `minimal` as `low` adds the
compatibility warning upstream emits.

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

@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.

budget 公式和九家 effort 表逐项一致;不可达分支审计通过;Open Responses minimal 的 compatibility warning 是有意修正并有测试。Approve。

…oning-effort-and-budget-mapping

# Conflicts:
#	aimux-provider-utils/src/tests/mod.rs
…oning-effort-and-budget-mapping

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

Copy link
Copy Markdown
Contributor Author
项 处理
合上新 master 已合上 master 5cc14b1(含 #380、#389–#391),提交 1463f4b;本 PR 的改动不变。本地 fmt、边界检查、clippy、doc、providers 与 provider-utils 全部测试通过,CI 重跑中

Generated by Claude Code

…oning-effort-and-budget-mapping

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

Copy link
Copy Markdown
Contributor Author
项 内容
这次推送 cc2c4ba0:只合了 master 0bc182a9(#392 #393 #394 合入后),解决和它们的冲突
本 PR 改动 不变,和你批准时一样(相对 master 的 diff 还是这 15 个文件)
本地检查 fmt、边界脚本、clippy -D warnings、workspace check、doc、providers 测试 4380 个全过

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 tests/mod.rs,diff 与批准时一致,16/16 CI 通过。Re-approve。

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