Skip to content

fix(ai): honor custom provider endpoints #2757

Description

@poboll

问题描述

后台 AI Provider 已允许填写自定义 endpoint,但在当前 core 的 AI runtime / 测试连接路径中,保存后的自定义 endpoint 仍可能没有真正覆盖注册模型的默认 base URL。

实际表现是:即使在管理后台把 OpenAI Compatible Provider 的 endpoint 配置为代理或中转地址,请求仍可能落到官方 OpenAI / Pi 注册模型的默认地址,最终在不支持地区的服务器上报错:

OpenAI API error 403 Country/Region or Territory not supported

这类配置在前端看起来已经保存成功,但运行时并没有按用户填写的 endpoint 发请求。

预期行为

当 AI Provider 配置里存在自定义 endpoint 时:

  • OpenAI Compatible / Anthropic 等 provider 的 runtime 应优先使用用户保存的 endpoint;
  • 即使模型可以从 Pi/OpenAI provider registry 中解析到,也应让自定义 endpoint 覆盖注册模型自带的 base URL;
  • getAiProviderById 这类运行时读取路径应使用已经解密后的配置,避免加密 API key 在测试连接或实际调用中被错误使用。

不是前端侧问题

我重新看了一遍调用链,这个问题不太适合只在前端修。

前端主要负责收集和保存 provider 的 endpoint/apiKey/model 配置;真正构造模型、选择 baseUrl、执行测试连接和运行时请求的是 core 后端里的 AI runtime adapter 和配置服务。因此前端可以改展示或表单校验,但无法保证后端最终请求一定走自定义 endpoint。

对应修复点在:

  • apps/core/src/modules/ai/runtime/pi-runtime.adapter.ts
  • apps/core/src/modules/configs/configs.service.ts

已准备的补丁

我已经在 fork 中基于最新 mx-space/core@master 准备了一个最小修复分支:

提交信息:

fix(ai): honor custom provider endpoints

补丁做了这些事:

  1. 当 registry 中存在模型定义且用户配置了自定义 endpoint 时,保留 registry 模型元数据,但覆盖 baseUrl 为用户配置的 endpoint。
  2. 让 runtime 解析 provider 配置时走解密后的 config cache,避免 encrypted apiKey 被直接用于 AI 测试/调用。
  3. 增加回归测试,覆盖自定义 endpoint 覆盖注册模型 base URL,以及 provider 配置解密读取路径。

验证

在 fork 分支上已重新执行:

pnpm -C apps/core exec vitest run test/src/modules/ai/pi-runtime.adapter.spec.ts test/src/modules/configs/configs.service.spec.ts
pnpm -C apps/core run typecheck

结果:

  • 2 个测试文件通过
  • 31 个测试用例通过
  • apps/core typecheck 通过

PR 创建受阻

我本来想直接向 mx-space/core 提 PR,但 GitHub API 创建 PR 时报了权限错误:

GraphQL: poboll does not have the correct permissions to execute CreatePullRequest (createPullRequest)

fork 本身已确认是 mx-space/core 的公开 fork,所以先把补丁分支和 compare 链接放在 issue 里,方便维护者直接审阅或手动拉取。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions