Skip to content

feat(platform): 自定义平台 + Gemini OpenAI 兼容#2977

Open
bwliangc wants to merge 1 commit into
Wei-Shaw:mainfrom
bwliangc:feat/custom-platform
Open

feat(platform): 自定义平台 + Gemini OpenAI 兼容#2977
bwliangc wants to merge 1 commit into
Wei-Shaw:mainfrom
bwliangc:feat/custom-platform

Conversation

@bwliangc
Copy link
Copy Markdown

@bwliangc bwliangc commented Jun 2, 2026

背景 / 动机

平台此前是固定枚举(anthropic / openai / gemini / antigravity),无法接入任意「OpenAI 兼容」的第三方上游(自建网关、聚合服务、各类兼容 endpoint)。

本 PR 引入一个通用的 custom 自定义平台:管理员只需填 Base URL + API Key,即可把请求以 OpenAI 兼容 Chat Completions 协议透传到任意上游。同时把同一套能力作为 Gemini 平台的 openai_chat_completions 上游模式 复用。

关键设计点:无论客户端用哪种入站协议(OpenAI / Anthropic / Gemini 原生),都会转换为 OpenAI Chat Completions 发往上游,因此一个自定义平台分组可被任意客户端访问。

能力总览

入站协议 端点 处理
OpenAI Chat Completions POST /v1/chat/completions 原样透传到 {base_url}/chat/completions
Anthropic Messages POST /v1/messages Anthropic ↔ OpenAI 双向转换(流式 + 非流式)
Gemini 原生 POST /v1beta/models/{model}:generateContent Gemini ↔ OpenAI 双向转换(流式 + 非流式)

均支持流式 / 非流式、工具调用、用量计费。

改了什么

后端

  • 新平台常量 PlatformCustom = "custom"domain/constants.goservice/domain_constants.go),加入 AllowedQuotaPlatformsent/schema/user_platform_quota.go 配额平台白名单同步放行(account.platform / group.platform 为自由字符串,无需数据库迁移)。
  • 账号能力判断service/account.go):IsCustom()UsesOpenAICompatRawForward()(统一识别自定义平台 + Gemini openai_chat_completions 模式)。
  • 三条转发路径(均转换/透传到 {base_url}/chat/completions):
    • gemini_chat_completions_raw.go:OpenAI 入站原样转发;
    • gemini_messages_openai_compat.go:Anthropic Messages ↔ OpenAI(复用 apicompatAnthropicToResponsesResponsesToChatCompletionsRequest 及 CC→Responses→Anthropic 事件链生成 Anthropic SSE);
    • gemini_native_openai_compat.go:Gemini generateContent ↔ OpenAI(请求/响应双向转换,含流式 SSE 与 countTokens 估算)。
  • 路由接入gateway_handler_chat_completions.gogemini_messages_compat_service.gogemini_v1beta_handler.go 在命中 OpenAI 兼容账号时分流到上述路径。
  • 上游模型同步upstream_models.go 新增自定义平台 {base_url}/models 同步;统一 buildOpenAIModelsURL 的版本段识别(兼容 /v1/v1/models、任意版本段、自带 /models)。
  • 平台门控gemini_v1beta_handler.go 允许 custom 分组走 Gemini 原生端点(geminiNativeAllowedPlatform)。
  • 计费billing_service.go):
    • 流式响应缺少 usage 时按输出文本 + 入站请求估算 token,避免流式输出零计费;
    • 补全 Gemini 系列回退定价:gemini-3.5-flash(业务指定价,输入 $1.5 / 输出 $9 / 缓存读 $0.15 per MTok)、通用 Gemini Flash、非 flash 回退 3.1-Pro;图片模型走图片计费不受影响。
  • account_service.go TestCredentials 支持 custom

前端

  • 类型AccountPlatform / GroupPlatform / PlatformQuotaPlatform 增加 custom;新增 GeminiUpstreamMode
  • 账号创建 / 编辑弹窗:新增「自定义」平台(含 OpenAI 格式说明)、平台名称字段;Gemini 平台新增「上游模式」选择;模型经「同步上游支持的模型」获取。
  • 平台展示:修复 PlatformTypeBadge 把未知平台兜底显示为 Gemini 的 bug(自定义平台显示用户平台名 / Custom,中性配色);PlatformIcon 齿轮图标;platformColors 标签。
  • 模型选择ModelWhitelistSelector 对自定义平台启用上游同步;getModelsByPlatform('custom') 返回空(依赖上游同步)。
  • 其他:配额弹窗/单元格、账号筛选、分组平台选项与筛选均加入 custom;i18n(中英)。

使用方式(管理员)

  1. 账号管理 → 新建 → 平台选「自定义」→ 填平台名称、Base URL、API Key,保存。
  2. 编辑该账号 → 「同步上游支持的模型」从 {base_url}/models 拉取模型。
  3. 建一个 platform = custom 的分组并挂入该账号,即可用 OpenAI / Anthropic / Gemini 任一协议访问。
  4. 如上游模型不在内置回退价中,可在渠道定价里为其单独配置价格。

兼容性 / 迁移

  • 无数据库迁移:平台字段为自由字符串。
  • 完全向后兼容:不影响现有 anthropic / openai / gemini / antigravity;新增能力均为 opt-in。

测试

  • 后端:go build ./...go test -tags=unit ./... 全通过;新增转换器与定价单测(Gemini↔OpenAI、Anthropic↔OpenAI 请求/响应转换、finishReason 映射、Base URL 兼容、Gemini 系列回退定价)。
  • 前端:vue-tsc 类型检查通过;更新并通过配额相关单测。
  • CI(test / frontend / golangci-lint)全绿。

自查清单

  • 编译 / 类型检查 / lint 通过
  • 单元测试通过、CI 全绿
  • 无数据库迁移、向后兼容
  • 中英文 i18n 同步
  • 分支基于纯净 main,单一提交,diff 仅含本功能

已知限制

  • 流式计费在上游完全不返回 usage 时使用约 4 字符≈1 token 的估算兜底;上游正常返回 usage 时以真实值为准。
  • Gemini ↔ OpenAI / Anthropic ↔ OpenAI 转换覆盖文本、系统提示、生成参数、工具调用、多模态、流式等主路径并有单测;未对接真实上游做端到端验证。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@bwliangc bwliangc force-pushed the feat/custom-platform branch from 0befef0 to 150e246 Compare June 2, 2026 09:17
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.

1 participant