client

package
v0.260409.1540 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 9, 2026 License: MPL-2.0 Imports: 32 Imported by: 0

Documentation

Index

Constants

View Source
const (
	DefaultClientTTL       = 60 * time.Minute // Default time-to-live for cached clients
	DefaultCleanupInterval = 60 * time.Minute // Default interval for cleanup task
)

Constants for client TTL and cleanup interval

View Source
const (
	DefaultMaxIdleConns        = 100
	DefaultMaxIdleConnsPerHost = 2
)

Go defaults for reference (not used directly, only for documentation)

View Source
const (
	DefaultTransportTTL             = 120 * time.Minute // Default time-to-live for cached transports
	DefaultTransportCleanupInterval = 60 * time.Minute  // Default interval for cleanup task
)

Constants for transport TTL and cleanup interval

View Source
const ClaudeCodeSystemHeader = "You are Claude Code, Anthropic's official CLI for Claude."

ClaudeCodeSystemHeader is a special system message for Claude Code OAuth subscriptions

View Source
const ClaudeToolPrefix = ""

ClaudeToolPrefix is empty to match real Claude Code behavior (no tool name prefix).

View Source
const (
	ProxyURLNone = "none" // Special value to force direct connection (disable proxy)
)

Constants for proxy URL values

View Source
const ScenarioContextKey contextKey = "scenario"

Variables

View Source
var NewAnthropicClient func(provider *typ.Provider, model string) (*AnthropicClient, error) = defaultNewAnthropicClient

NewAnthropicClient creates a new Anthropic client wrapper

View Source
var NewOpenAIClient func(provider *typ.Provider, model string) (*OpenAIClient, error) = defaultNewOpenAIClient

NewOpenAIClient creates a new OpenAI client wrapper

Functions

func ApplyClaudeToolPrefix

func ApplyClaudeToolPrefix(body []byte, prefix string) []byte

ApplyClaudeToolPrefix applies a prefix to tool names in the request body. This is required for Claude Code OAuth tokens to avoid conflicts with built-in tools. The prefix is applied to user-defined tools only.

func CloseClient

func CloseClient(client protocol.Client) error

CloseClient closes a client if it implements Close()

func CreateHTTPClientForProvider

func CreateHTTPClientForProvider(provider *typ.Provider, model string) *http.Client

CreateHTTPClientForProvider creates an HTTP client configured for the given provider It handles proxy and OAuth hooks if applicable The model parameter is used for transport pool keying (provider+model+proxy)

Returns a configured http.Client

func CreateHTTPClientWithProxy

func CreateHTTPClientWithProxy(proxyURL string) *http.Client

CreateHTTPClientWithProxy creates an HTTP client with proxy support

func IsClaudeOAuthToken

func IsClaudeOAuthToken(apiKey string) bool

IsClaudeOAuthToken checks if the given API key is a Claude OAuth token by checking for the "sk-ant-oat" prefix.

func IsModelsEndpointNotSupported

func IsModelsEndpointNotSupported(err error) bool

IsModelsEndpointNotSupported checks if an error is ErrModelsEndpointNotSupported

func SetTransportConfig

func SetTransportConfig(config *TransportConfig)

SetTransportConfig updates the transport pool configuration Pass nil to reset to Go defaults (backward compatible) This affects newly created transports only, existing transports are not modified

func StripClaudeToolPrefixFromResponse

func StripClaudeToolPrefixFromResponse(body []byte, prefix string) []byte

StripClaudeToolPrefixFromResponse removes the tool prefix from tool names in the API response. This reverses the transformation done by ApplyClaudeToolPrefix.

func StripClaudeToolPrefixFromStreamLine

func StripClaudeToolPrefixFromStreamLine(line []byte, prefix string) []byte

StripClaudeToolPrefixFromStreamLine removes the tool prefix from tool names in a single SSE stream line. This is used for streaming responses.

Types

type AnthropicClient

type AnthropicClient struct {
	// contains filtered or unexported fields
}

AnthropicClient wraps the Anthropic SDK client

func (*AnthropicClient) APIStyle

func (c *AnthropicClient) APIStyle() protocol.APIStyle

ProviderType returns the provider type

func (*AnthropicClient) BetaMessagesNew

BetaMessagesNew creates a new beta message request

func (*AnthropicClient) BetaMessagesNewStreaming

BetaMessagesNewStreaming creates a new beta streaming message request

func (*AnthropicClient) Client

func (c *AnthropicClient) Client() *anthropic.Client

Client returns the underlying Anthropic SDK client

func (*AnthropicClient) Close

func (c *AnthropicClient) Close() error

Close closes any resources held by the client

func (*AnthropicClient) GetProvider

func (c *AnthropicClient) GetProvider() *typ.Provider

GetProvider returns the provider for this client

func (*AnthropicClient) HttpClient

func (c *AnthropicClient) HttpClient() *http.Client

HttpClient returns the underlying HTTP client for passthrough/proxy operations

func (*AnthropicClient) ListModels

func (c *AnthropicClient) ListModels(ctx context.Context) ([]string, error)

ListModels returns the list of available models from the Anthropic API

func (*AnthropicClient) MessagesCountTokens

MessagesCountTokens counts tokens for a message request

func (*AnthropicClient) MessagesNew

MessagesNew creates a new message request

func (*AnthropicClient) MessagesNewStreaming

MessagesNewStreaming creates a new streaming message request

func (*AnthropicClient) ProbeChatEndpoint

func (c *AnthropicClient) ProbeChatEndpoint(ctx context.Context, model string) ProbeResult

ProbeChatEndpoint tests the messages endpoint with a minimal request

func (*AnthropicClient) ProbeModelsEndpoint

func (c *AnthropicClient) ProbeModelsEndpoint(ctx context.Context) ProbeResult

ProbeModelsEndpoint tests the models list endpoint

func (*AnthropicClient) ProbeOptionsEndpoint

func (c *AnthropicClient) ProbeOptionsEndpoint(ctx context.Context) ProbeResult

ProbeOptionsEndpoint tests basic connectivity with an OPTIONS request

func (*AnthropicClient) SetRecordSink

func (c *AnthropicClient) SetRecordSink(sink *obs.Sink)

SetRecordSink sets the record sink for the client

type ClientPool

type ClientPool struct {
	// contains filtered or unexported fields
}

ClientPool manages unified client instances for different providers

func NewClientPool

func NewClientPool() *ClientPool

NewClientPool creates a pool with once mode (new default)

func NewSharedClientPool

func NewSharedClientPool() *ClientPool

NewSharedClientPool creates a pool with shared mode (explicit)

func (*ClientPool) Clear

func (p *ClientPool) Clear()

Clear removes all clients from the pool

func (*ClientPool) GetAnthropicClient

func (p *ClientPool) GetAnthropicClient(provider *typ.Provider, model string, sessionID typ.SessionID) *AnthropicClient

GetAnthropicClient returns an Anthropic client wrapper for the specified provider. sessionID is used to scope the client for OAuth providers; pass "" when no session is available.

func (*ClientPool) GetGoogleClient

func (p *ClientPool) GetGoogleClient(provider *typ.Provider, model string, sessionID typ.SessionID) *GoogleClient

GetGoogleClient returns a Google client wrapper for the specified provider. sessionID is reserved for future use; Google providers use API keys so it is currently ignored.

func (*ClientPool) GetOpenAIClient

func (p *ClientPool) GetOpenAIClient(provider *typ.Provider, model string, sessionID typ.SessionID) *OpenAIClient

GetOpenAIClient returns an OpenAI client wrapper for the specified provider. sessionID is used to scope the client for OAuth providers; pass "" when no session is available.

func (*ClientPool) GetProviderKeys

func (p *ClientPool) GetProviderKeys() []string

GetProviderKeys returns all provider keys currently in the pool

func (*ClientPool) GetRecordSink

func (p *ClientPool) GetRecordSink() *obs.Sink

GetRecordSink returns the record sink

func (*ClientPool) InvalidateProvider

func (p *ClientPool) InvalidateProvider(providerUUID string)

InvalidateProvider removes all cached clients for a specific provider UUID This should be called when provider credentials are updated (e.g., OAuth token refresh)

func (*ClientPool) InvalidateSession added in v0.260409.1540

func (p *ClientPool) InvalidateSession(providerUUID, sessionID string)

InvalidateSession removes all cached clients associated with a specific session for a provider. This is useful when a session ends or its OAuth token is revoked.

func (*ClientPool) RemoveProvider

func (p *ClientPool) RemoveProvider(provider *typ.Provider, model string)

RemoveProvider removes a specific provider's client from the pool

func (*ClientPool) SetRecordSink

func (p *ClientPool) SetRecordSink(sink *obs.Sink)

SetRecordSink sets the record sink for the client pool

func (*ClientPool) Size

func (p *ClientPool) Size() int

Size returns the total number of clients currently in both pools

func (*ClientPool) StartCleanupTask

func (p *ClientPool) StartCleanupTask(interval time.Duration)

StartCleanupTask starts a periodic cleanup task that removes expired clients The cleanup runs in a background goroutine and continues until the process exits

func (*ClientPool) Stats

func (p *ClientPool) Stats() map[string]interface{}

Stats provides statistics about the client pool

type ClientPoolBuilder

type ClientPoolBuilder struct {
	// contains filtered or unexported fields
}

ClientPoolBuilder builds a ClientPool with specified configuration

func NewClientPoolBuilder

func NewClientPoolBuilder() *ClientPoolBuilder

NewClientPoolBuilder creates a new builder with default settings

func (*ClientPoolBuilder) Build

func (b *ClientPoolBuilder) Build() *ClientPool

Build creates the ClientPool with configured settings

func (*ClientPoolBuilder) WithCleanupInterval

func (b *ClientPoolBuilder) WithCleanupInterval(interval time.Duration) *ClientPoolBuilder

WithCleanupInterval sets the cleanup interval (shared mode only)

func (*ClientPoolBuilder) WithClientTTL

func (b *ClientPoolBuilder) WithClientTTL(ttl time.Duration) *ClientPoolBuilder

WithClientTTL sets the TTL for cached clients (shared mode only)

func (*ClientPoolBuilder) WithMode

func (b *ClientPoolBuilder) WithMode(mode PoolMode) *ClientPoolBuilder

WithMode sets the pool mode

func (*ClientPoolBuilder) WithOnceMode

func (b *ClientPoolBuilder) WithOnceMode() *ClientPoolBuilder

WithOnceMode enables once mode (no caching, convenience method)

func (*ClientPoolBuilder) WithRecordSink

func (b *ClientPoolBuilder) WithRecordSink(sink *obs.Sink) *ClientPoolBuilder

WithRecordSink sets the record sink for all clients

func (*ClientPoolBuilder) WithSharedMode

func (b *ClientPoolBuilder) WithSharedMode() *ClientPoolBuilder

WithSharedMode enables shared mode with caching (convenience method)

type ErrModelsEndpointNotSupported

type ErrModelsEndpointNotSupported struct {
	Provider string
	Reason   string
}

ErrModelsEndpointNotSupported is returned when the provider does not support the models endpoint

func (*ErrModelsEndpointNotSupported) Error

type GoogleClient

type GoogleClient struct {
	// contains filtered or unexported fields
}

GoogleClient wraps the Google genai SDK client

func NewGoogleClient

func NewGoogleClient(provider *typ.Provider, model string) (*GoogleClient, error)

NewGoogleClient creates a new Google client wrapper

func (*GoogleClient) APIStyle

func (c *GoogleClient) APIStyle() protocol.APIStyle

ProviderType returns the provider type

func (*GoogleClient) Client

func (c *GoogleClient) Client() *genai.Client

Client returns the underlying Google genai SDK client

func (*GoogleClient) Close

func (c *GoogleClient) Close() error

Close closes any resources held by the client

func (*GoogleClient) GenerateContent

func (c *GoogleClient) GenerateContent(ctx context.Context, model string, contents []*genai.Content, config *genai.GenerateContentConfig) (*genai.GenerateContentResponse, error)

GenerateContent generates content using the Google API

func (*GoogleClient) GenerateContentStream

func (c *GoogleClient) GenerateContentStream(ctx context.Context, model string, contents []*genai.Content, config *genai.GenerateContentConfig) iter.Seq2[*genai.GenerateContentResponse, error]

GenerateContentStream generates content using streaming

func (*GoogleClient) GetProvider

func (c *GoogleClient) GetProvider() *typ.Provider

GetProvider returns the provider for this client

func (*GoogleClient) ListModels

func (c *GoogleClient) ListModels(ctx context.Context) ([]string, error)

ListModels returns the list of available models from the Google Gemini API Note: Google genai SDK doesn't have a direct ListModels method, so we return ErrModelsEndpointNotSupported to signal the caller to use template fallback.

func (*GoogleClient) ProbeChatEndpoint

func (c *GoogleClient) ProbeChatEndpoint(ctx context.Context, model string) ProbeResult

ProbeChatEndpoint tests the chat endpoint with a minimal request

func (*GoogleClient) ProbeModelsEndpoint

func (c *GoogleClient) ProbeModelsEndpoint(ctx context.Context) ProbeResult

ProbeModelsEndpoint tests the models list endpoint

func (*GoogleClient) ProbeOptionsEndpoint

func (c *GoogleClient) ProbeOptionsEndpoint(ctx context.Context) ProbeResult

ProbeOptionsEndpoint tests basic connectivity with an OPTIONS request

func (*GoogleClient) SetRecordSink

func (c *GoogleClient) SetRecordSink(sink *obs.Sink)

SetRecordSink sets the record sink for the client

type HookFunc

type HookFunc func(req *http.Request) error

HookFunc is a function that can modify the request before it's sent

type ModelLister

type ModelLister interface {
	// ListModels returns the list of available models from the provider API
	// Returns ErrModelsEndpointNotSupported if the provider does not support the models endpoint
	ListModels(ctx context.Context) ([]string, error)
}

ModelLister defines the interface for fetching model lists from provider APIs

type OpenAIClient

type OpenAIClient struct {
	// contains filtered or unexported fields
}

OpenAIClient wraps the OpenAI SDK client

func (*OpenAIClient) APIStyle

func (c *OpenAIClient) APIStyle() protocol.APIStyle

ProviderType returns the provider type

func (*OpenAIClient) ChatCompletionsNew

ChatCompletionsNew creates a new chat completion request

func (*OpenAIClient) ChatCompletionsNewStreaming

ChatCompletionsNewStreaming creates a new streaming chat completion request

func (*OpenAIClient) Client

func (c *OpenAIClient) Client() *openai.Client

Client returns the underlying OpenAI SDK client

func (*OpenAIClient) Close

func (c *OpenAIClient) Close() error

Close closes any resources held by the client

func (*OpenAIClient) GetProvider

func (c *OpenAIClient) GetProvider() *typ.Provider

GetProvider returns the provider for this client

func (*OpenAIClient) HttpClient

func (c *OpenAIClient) HttpClient() *http.Client

HttpClient returns the underlying HTTP client for passthrough/proxy operations

func (*OpenAIClient) ListModels

func (c *OpenAIClient) ListModels(ctx context.Context) ([]string, error)

ListModels returns the list of available models from the OpenAI-compatible API

func (*OpenAIClient) ProbeChatEndpoint

func (c *OpenAIClient) ProbeChatEndpoint(ctx context.Context, model string) ProbeResult

ProbeChatEndpoint tests the chat completions endpoint with a minimal request

func (*OpenAIClient) ProbeModelsEndpoint

func (c *OpenAIClient) ProbeModelsEndpoint(ctx context.Context) ProbeResult

ProbeModelsEndpoint tests the models list endpoint

func (*OpenAIClient) ProbeOptionsEndpoint

func (c *OpenAIClient) ProbeOptionsEndpoint(ctx context.Context) ProbeResult

ProbeOptionsEndpoint tests basic connectivity with an OPTIONS request

func (*OpenAIClient) ResponsesNew

ResponsesNew creates a new Responses API request

func (*OpenAIClient) ResponsesNewStreaming

ResponsesNewStreaming creates a new streaming Responses API request

func (*OpenAIClient) SetRecordSink

func (c *OpenAIClient) SetRecordSink(sink *obs.Sink)

SetRecordSink sets the record sink for the client

type PoolMode

type PoolMode string

PoolMode defines the client lifecycle management strategy

const (
	// PoolModeOnce creates a new client for each request (no caching)
	PoolModeOnce PoolMode = "once"

	// PoolModeShared caches clients and reuses them with TTL management
	PoolModeShared PoolMode = "shared"
)

type ProbeResult

type ProbeResult struct {
	Success          bool
	Message          string
	Content          string
	LatencyMs        int64
	ModelsCount      int
	PromptTokens     int
	CompletionTokens int
	TotalTokens      int
	ErrorMessage     string
}

ProbeResult represents the result of a probe operation

type ProbeUsage

type ProbeUsage struct {
	PromptTokens     int
	CompletionTokens int
	TotalTokens      int
}

ProbeUsage represents token usage from a probe operation

type Prober

type Prober interface {
	// ProbeChatEndpoint tests the chat/messages endpoint with a minimal request
	// Returns a ProbeResult with success status, latency, and any response content
	ProbeChatEndpoint(ctx context.Context, model string) ProbeResult

	// ProbeModelsEndpoint tests the models list endpoint
	// Returns a ProbeResult with the number of available models
	ProbeModelsEndpoint(ctx context.Context) ProbeResult

	// ProbeOptionsEndpoint tests basic connectivity with an OPTIONS request
	// Returns a ProbeResult indicating if the endpoint is reachable
	ProbeOptionsEndpoint(ctx context.Context) ProbeResult
}

Prober defines the interface for client probe capabilities

type RecordRoundTripper

type RecordRoundTripper struct {
	// contains filtered or unexported fields
}

RecordRoundTripper is an http.RoundTripper that records requests and responses

func NewRecordRoundTripper

func NewRecordRoundTripper(transport http.RoundTripper, recordSink *obs.Sink, provider *typ.Provider) *RecordRoundTripper

NewRecordRoundTripper creates a new record round tripper

func (*RecordRoundTripper) RoundTrip

func (r *RecordRoundTripper) RoundTrip(req *http.Request) (*http.Response, error)

RoundTrip executes a single HTTP transaction and records request/response

type TransportConfig

type TransportConfig struct {
	MaxIdleConns        *int  // nil = use Go default (100)
	MaxIdleConnsPerHost *int  // nil = use Go default (2)
	MaxConnsPerHost     *int  // nil = use Go default (0, no limit)
	DisableKeepAlives   *bool // nil = use Go default (false)

	// RespectEnvProxy controls whether providers without explicit proxy configuration
	// should use environment/system proxy settings (HTTP_PROXY, HTTPS_PROXY, macOS system proxy, etc.)
	// Default (nil): false - providers without proxy_url connect directly
	// Set to true: providers without proxy_url will use system/environment proxy
	RespectEnvProxy *bool // nil = use default (false)
}

TransportConfig holds the configuration for HTTP transport connection pooling All fields are pointers so that zero-value (nil) means "use Go default"

type TransportPool

type TransportPool struct {
	// contains filtered or unexported fields
}

TransportPool manages shared HTTP transports for clients Transports are keyed by: providerUUID + proxyURL This allows multiple clients to share the same connection pool when they use the same provider+proxy combination.

func GetGlobalTransportPool

func GetGlobalTransportPool() *TransportPool

GetGlobalTransportPool returns the global transport pool singleton

func (*TransportPool) Clear

func (tp *TransportPool) Clear()

Clear removes all transports from the pool and closes idle connections

func (*TransportPool) GetTransport

func (tp *TransportPool) GetTransport(providerUUID, model, proxyURL string, oauthType oauth.ProviderType) *http.Transport

GetTransport returns or creates a shared HTTP transport for the given configuration. The transport key is based on: providerUUID + proxyURL.

func (*TransportPool) StartCleanupTask

func (tp *TransportPool) StartCleanupTask(interval, ttl time.Duration)

StartCleanupTask starts a periodic cleanup task that removes expired transports

func (*TransportPool) Stats

func (tp *TransportPool) Stats() map[string]interface{}

Stats returns statistics about the transport pool

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL