Class Diagram

internal/provider 类图

统一 Provider 流式接口:双驱动 (OpenAI / Anthropic 兼容) + 共享 transport + 有状态 Decoder + 注册表 / 凭证

类图 (Class Diagram) — 结构性图形。展现 Provider 抽象层静态结构:接口与两种驱动实现、传输/解码器契约、事件密封接口、注册表与凭证解析。

adapts Models() req Context Config StreamRequest returns produces EnvVars 构造 «INTERFACE» Provider + Name() string + Models() []Model + StreamCompletion(ctx, req) → (*Stream, error) // FR-13 FUNC ADAPTER StreamFnFromProvider Provider → StreamFn STRUCT Model ID · ContextWindow · Supports{Thinking,Tools,Images} STRUCT CompletionRequest Model · Context · Config StreamCompletion 的入参 STRUCT LlmContext SystemPrompt Messages · Tools STRUCT StreamConfig APIKey · ThinkingLevel Extra map[string]any STRUCT · realizes Provider openAICompatDriver name · baseURL · models requiresAuth · extraHeaders encodeOpenAIRequest() StreamCompletion() Chat Completions wire STRUCT · realizes Provider anthropicCompatDriver name · baseURL · models pathFor() · authHeader() encodeAnthropicRequest() StreamCompletion() Messages wire STRUCT + FUNC TransportConfig Client · NewRequest · Decoder MaxConnectRetries StreamRequest() → connect + pump 双看门狗: idle 5m · stall ×1.2 «INTERFACE» Decoder Decode(payload) []StreamEvent Finish() []StreamEvent 有状态 · 逐 SSE payload 增量解码 STRUCT · realizes Decoder OpenAIDecoder text · toolCalls · toolOrder responseID · usage · stopReason mapOpenAIFinishReason() chunk delta → events STRUCT · realizes Decoder AnthropicDecoder blocks map · order · usage responseID · stopReason mapAnthropicStopReason() content_block_* → events TYPE ALIAS · GENERIC AssistantMessageEventStream EventStream[Event, AssistantMessage] «SEALED INTERFACE» AssistantMessageEvent EventKind() EventKind isAssistantMessageEvent() // 密封 6 IMPLS (discriminated) StreamStartEvent · start TextEvent · text ThinkingEvent · thinking ToolCallEvent · toolcall DoneEvent · done ErrorEvent · error (终态) STRUCT · registry.go (~38 内置) ProviderSpec Name · EnvVars[] · DefaultBaseURL Protocol · AuthScheme · ExtraHeaders BaseURLEnvVars[] 仅存 env 变量名 · 从不含密钥值 STRUCT · auth.go CredentialStore GetAPIKey(): OAuth → override → env → config HasCredential() · SetOverride() STRUCT · OAuth TokenSource accessToken · expiry Refresh() · Token(ctx) · Leeway LEGEND realization (实现接口) dependency (依赖 / 使用) composition (组合 · 强持有) aggregation (聚合 · 弱持有) accent = 接口 / 核心契约

统一流式接口 · 双驱动

Provider · openAICompatDriver · anthropicCompatDriver

  • Provider 是唯一抽象:Name() / Models() / StreamCompletion()
  • 两种实现分别封装 OpenAI Chat Completions 与 Anthropic Messages 两套线协议。
  • 双失败模型 (FR-13):建流阶段失败以 error 返回;运行期失败以终态 ErrorEvent 落在流上,绝不再返回 error。
  • StreamFnFromProvider 将 Provider 适配为函数式 StreamFn

共享传输 · 有状态解码 · 注册凭证

TransportConfig · Decoder · ProviderSpec · CredentialStore

  • StreamRequest = connect + 后台 pump,双看门狗(idle 5m、stall ×1.2),429/503/529 仅在建连阶段重试。
  • DecoderOpenAIDecoder / AnthropicDecoder 实现,逐 SSE payload 增量解码为 AssistantMessageEvent(6 种密封事件)。
  • 注册表 ProviderSpec(约 38 个内置,含千帆/火山/百炼/混元)只存 env 变量名。
  • CredentialStore.GetAPIKey:OAuth → override → env → config;密钥仅在请求时解析,从不记录。