Skip to content

refactor: share hostname part check and base URL setting - #387

Open
cunninghamcard-bit wants to merge 8 commits into
masterfrom
refactor/share-hostname-part-check-and-base-url-setting
Open

cunninghamcard-bit wants to merge 8 commits into
masterfrom
refactor/share-hostname-part-check-and-base-url-setting

Conversation

@cunninghamcard-bit

Copy link
Copy Markdown
Contributor

RFC-0046 R1 的第 9 个小 PR(清单见 #328):把 isValidHostnamePart 和“显式值或环境变量的 base URL”两个函数从 aimux-providers/src/shared/mod.rs 挪进 aimux-provider-utils,调用方改从 provider-utils 用。

Before:is_valid_hostname_part、base_url_setting 是 providers 里 shared 模块的 pub(crate) 函数。前者是上游 provider-utils 的公开函数,后者是上游 loadOptionalSetting + withoutTrailingSlash 在 OpenAI、Anthropic 工厂里的固定写法。

After:两个函数在 aimux_provider_utils 公开导出,Azure、Amazon Bedrock、Anthropic AWS、Google Vertex 的主机名校验和 OpenAI、Anthropic 的 base URL 都从这里取。行为不变。

一、体系现状(概览)

上游:

@ai-sdk/provider-utils 5.0.55
  is-valid-hostname-part.ts:9       isValidHostnamePart(value)   // /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/i 且整串匹配
  load-optional-setting.ts          loadOptionalSetting({ settingValue, environmentVariableName })
调用方
  anthropic-aws 2.0.63   anthropic-aws-provider.ts:219            region
  google-vertex 5.0.100  google-vertex-provider-base.ts:237       location
                         google-vertex-transcription-model.ts:114 region
                         anthropic/google-vertex-anthropic-provider.ts:191、maas/google-vertex-maas-provider.ts:85
  azure 4.0.84           azure-openai-provider.ts:273             同一个正则内联
  openai 4.0.83          openai-provider.ts:210                   withoutTrailingSlash(loadOptionalSetting(baseURL, OPENAI_BASE_URL)) ?? 默认
  anthropic 4.0.71       anthropic-provider.ts:129                同上,ANTHROPIC_BASE_URL

aimux(master 9f9f5ab):

aimux-providers/src/shared/mod.rs:35   pub(crate) fn is_valid_hostname_part
                                 :55   pub(crate) fn base_url_setting(explicit, var, default, normalize)
  ├─ anthropic_aws/fetch.rs:70、bedrock/sigv4_fetch.rs:53        region
  ├─ azure/openai_provider.rs:326                                  resource name
  ├─ vertex/provider_base.rs:131、vertex/transcription_model.rs:200  location、region
  └─ openai/provider.rs:100、anthropic/provider.rs:128             base_url_setting

二、本 PR 改动(细节)

aimux-provider-utils/src/is_valid_hostname_part.rs:10   is_valid_hostname_part(part) -> bool   // 原样搬来
aimux-provider-utils/src/api_key.rs:77                  base_url_setting(explicit, var, default, normalize)
                                                          -> Result<Result<String, AiMuxError>, AiMuxError>   // 原样搬来,放在 load_optional_setting 旁边
aimux-provider-utils/src/lib.rs                         pub mod + pub use

aimux-providers/src/
  shared/mod.rs                     删掉两个函数
  anthropic_aws/fetch.rs:68、bedrock/sigv4_fetch.rs:53、azure/openai_provider.rs:326
  vertex/provider_base.rs:130、vertex/transcription_model.rs:201     改从 provider-utils 引入
  openai/provider.rs:100、anthropic/provider.rs:128                  aimux_provider_utils::base_url_setting

base_url_setting 上游没有同名函数,名字沿用。外层 Err 是显式值不合法(工厂失败),内层 Err 是环境变量不合法(每次请求报错),与上游“创建时不校验环境变量、首个请求失败”一致。

测试:

文件 用例 说明
provider-utils src/tests/is_valid_hostname_part.rs 2 上游 is-valid-hostname-part.test.ts 的两张 it.each 表(accepts 6 行、rejects 17 行),每张表一个用例。5.0.55 的 npm 包不带测试,取自上游仓库,源码与 5.0.55 逐字相同

base_url_setting 的行为由 OpenAI、Anthropic 已有的 OPENAI_BASE_URL、ANTHROPIC_BASE_URL 用例覆盖,原样通过。工作区测试数不变(4380),provider-utils 另加 2 个。

改动规模:

范围 文件 增 删
aimux-provider-utils 5 95 1
aimux-providers 8 13 57
合计(含 CHANGELOG) 14 114 58

公开 API 与行为

  • Added:aimux_provider_utils::is_valid_hostname_part、aimux_provider_utils::base_url_setting。
  • 被删的是 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

isValidHostnamePart as @ai-sdk/provider-utils 5.0.55, with its upstream
tests, and the explicit-or-environment base URL setting the native
packages build from loadOptionalSetting. Both move here from
aimux-providers' shared module (RFC-0046 R1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0116HPMoqaLfFr1TyqDq1hrW
Azure, Amazon Bedrock, Anthropic AWS and Google Vertex check their host
parts, and OpenAI and Anthropic read their base URLs, through the
provider-utils functions; the shared copies are gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0116HPMoqaLfFr1TyqDq1hrW
…name-part-check-and-base-url-setting

# Conflicts:
#	aimux-provider-utils/src/lib.rs
#	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.

hostname/base URL 逻辑与旧实现一致,tests 表也和 upstream 一致。只差 rebase:基于 9f9f5ab,master 是 ab00ae4,冲突在 lib.rs 和 tests/mod.rs;保留 #380 的 convert/uint8 导出和新 helper 导出,CI 重跑。

…name-part-check-and-base-url-setting

# Conflicts:
#	aimux-providers/src/azure/openai_provider.rs
…name-part-check-and-base-url-setting

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

Copy link
Copy Markdown
Contributor Author
eric 的意见 处理
合上新 master,CI 重跑 已合上 master e76ffee(含 #380、#382、#389–#391),提交 2f8af19。冲突在 Azure 与 OpenAI 配置的 import(#389 把 URL 规则移进 openai/config.rs):保留 master 的结构,is_valid_hostname_part 改从 aimux_provider_utils 引入;CHANGELOG 和 tests/mod.rs 两边都保留。本地 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 + CHANGELOG/tests union;hostname/base URL 逻辑与批准时一致,16/16 CI 通过。Approve。

…name-part-check-and-base-url-setting

# Conflicts:
#	CHANGELOG.md

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

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 仅 CHANGELOG 插入,diff 与批准时一致,16/16 CI 通过。Re-approve。

…name-part-check-and-base-url-setting

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

Copy link
Copy Markdown
Contributor Author

合上 master d30f8343(#383 合入后),head ca937903。

文件 处理
provider-utils src/tests/mod.rs 模块列表冲突(与 map_reasoning_to_provider),两边都保留

本地 cargo fmt --check、scripts/check_provider_boundaries.sh、cargo +1.99 clippy -D warnings、cargo check --workspace、cargo doc、全部测试通过。没有其他改动。


Generated by Claude Code

This branch has not been deployed

No deployments
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