Files
shaw f08f9111e5 refactor(platform-seam): gatewayplatform 接缝——Provider/Registry + 两处 Forward 分发替换
经双视角评审裁决的收窄版 Phase-3 接缝(零行为变更):
- internal/gatewayplatform:Provider{Platform,Forward} 两方法 v1 接口 +
  ForwardRequest{Parsed,Body,IsStickySession,SessionGroupID,SessionKey} +
  构造期注册 Registry(重复 panic,运行期并发只读)
- 3 个单语句直返 adapter(anthropic/antigravity/gemini,错误零包裹——
  BetaBlockedError/PromptTooLong 的 errors.As 链由 T4 特征化守护)
- Messages 端点两处平台分发改 registry 查找;Type!=APIKey 条件保留调用点
- OpenAI(独立 handler)、v1beta 端点、内核 internal/plugin 零触碰

门禁:T1-T5 特征化全绿、安全网 45 包、bench allocs 全部持平(266/329/93/134)。
2026-06-12 00:27:10 +08:00

92 lines
3.8 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package gatewayplatform
// 本文件的三个 adapter 仅包装现有 service 的 Forward 入口(实现零移动)。
//
// 错误透传铁律(SEAM-DESIGN 裁决 / T4 特征化锁定):底层返回的 error 一律
// 原样 return,禁止任何包裹——handler 对 *service.BetaBlockedError /
// *service.PromptTooLongError / *service.UpstreamFailoverError 的 errors.As
// 断言链依赖错误原值。
import (
"context"
"github.com/Wei-Shaw/sub2api/internal/service"
"github.com/gin-gonic/gin"
)
// geminiForwardAction 是 /v1/messages gemini 分支传给 ForwardGemini 的 action
// 常量(SEAM-DESIGN 裁决:硬编码 "generateContent" + 测试锁定;该参数仅决定
// 客户端响应形态合法性,上游恒为 streamGenerateContent)。
const geminiForwardAction = "generateContent"
// AnthropicProvider 包装 GatewayService.Forward(Claude 协议主路径;
// :794 条件不命中侧,含 antigravity 平台的 APIKey 账号)。
type AnthropicProvider struct {
gateway *service.GatewayService
}
// NewAnthropicProvider 构造 anthropic 平台 Provider。
func NewAnthropicProvider(gateway *service.GatewayService) *AnthropicProvider {
return &AnthropicProvider{gateway: gateway}
}
// Platform 返回 service.PlatformAnthropic。
func (p *AnthropicProvider) Platform() string { return service.PlatformAnthropic }
// Forward 转发到 GatewayService.Forward;error 原样透传。
func (p *AnthropicProvider) Forward(ctx context.Context, c *gin.Context, account *service.Account, req *ForwardRequest) (*service.ForwardResult, error) {
return p.gateway.Forward(ctx, c, account, req.Parsed)
}
// AntigravityProvider 包装 AntigravityGatewayService.Forward(Claude 协议 →
// antigravity 上游;:794 条件命中侧:Platform == Antigravity && Type != APIKey)。
type AntigravityProvider struct {
antigravity *service.AntigravityGatewayService
}
// NewAntigravityProvider 构造 antigravity 平台 Provider。
func NewAntigravityProvider(antigravity *service.AntigravityGatewayService) *AntigravityProvider {
return &AntigravityProvider{antigravity: antigravity}
}
// Platform 返回 service.PlatformAntigravity。
func (p *AntigravityProvider) Platform() string { return service.PlatformAntigravity }
// Forward 转发到 AntigravityGatewayService.Forward;error 原样透传。
func (p *AntigravityProvider) Forward(ctx context.Context, c *gin.Context, account *service.Account, req *ForwardRequest) (*service.ForwardResult, error) {
return p.antigravity.Forward(ctx, c, account, req.Body, req.IsStickySession)
}
// GeminiProvider 包装 AntigravityGatewayService.ForwardGemini(gemini 平台
// 分组下的 antigravity 账号,:444 命中侧;gemini 平台的非 antigravity 账号
// 走 GeminiMessagesCompatService,映射逻辑保留在调用点)。
type GeminiProvider struct {
antigravity *service.AntigravityGatewayService
}
// NewGeminiProvider 构造 gemini 平台 Provider。
func NewGeminiProvider(antigravity *service.AntigravityGatewayService) *GeminiProvider {
return &GeminiProvider{antigravity: antigravity}
}
// Platform 返回 service.PlatformGemini。
func (p *GeminiProvider) Platform() string { return service.PlatformGemini }
// Forward 转发到 AntigravityGatewayService.ForwardGemini;error 原样透传。
// model/stream 取自 req.Parsed(与原调用点 reqModel/reqStream 同源),
// 粘性会话维度经 WithForwardGeminiSession 透传。
func (p *GeminiProvider) Forward(ctx context.Context, c *gin.Context, account *service.Account, req *ForwardRequest) (*service.ForwardResult, error) {
return p.antigravity.ForwardGemini(
ctx,
c,
account,
req.Parsed.Model,
geminiForwardAction,
req.Parsed.Stream,
req.Body,
req.IsStickySession,
service.WithForwardGeminiSession(req.SessionGroupID, req.SessionKey),
)
}