base

package
v1.5.4 Latest Latest
Warning

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

Go to latest
Published: Jul 2, 2026 License: Apache-2.0 Imports: 12 Imported by: 0

Documentation

Overview

Package base defines the unified provider abstraction shared across all PromptKit provider types (inference, TTS, STT, embedding, image generation).

Every provider implements Provider for cross-cutting concerns (identity, pricing, lifecycle) and exactly one of the per-type interfaces below for capability-specific operations.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func APIKeyFromCredential

func APIKeyFromCredential(c credentials.Credential) string

APIKeyFromCredential returns the raw API key from an APIKey credential, or "" for any other credential shape (or nil).

func CostInfoToMetaMap

func CostInfoToMetaMap(ci *types.CostInfo) map[string]any

CostInfoToMetaMap serializes a CostInfo into the map[string]any shape the arena statestore expects when reading ancillary cost from Message.Meta keys (tts_cost, stt_cost, etc.). The keys and types must match what tools/arena/statestore/telemetry.go's costInfoFromMeta reads.

func GetTyped

func GetTyped[T Provider](r *Registry, name string, typ ProviderType) (T, error)

GetTyped is a generic helper that returns a provider as a specific interface type T. Returns an error if the registered provider doesn't satisfy T.

func MakeCostInfo

func MakeCostInfo(
	desc *PricingDescriptor,
	providerName string,
	capability ProviderType,
	quantities map[string]float64,
	latency time.Duration,
) *types.CostInfo

MakeCostInfo builds a *types.CostInfo from raw quantities and runs ComputeCost against the supplied descriptor to fill TotalCost. Returns the CostInfo with quantities and identity tags populated even if pricing is nil or doesn't match — callers can decide whether to drop a nil-cost entry. This is the shared cost-construction path for ancillary providers (TTS, STT, image gen) that report a single-quantity unit at call time.

func NewHTTPService

func NewHTTPService(
	apiKey string,
	defaults HTTPServiceDefaults,
	opts ...HTTPServiceOption,
) (*Implementation, *HTTPServiceFields)

NewHTTPService produces the standard *Implementation + *HTTPServiceFields pair every HTTP-backed provider impl embeds, applying any caller-supplied HTTPServiceOption mutations on the way out. Eliminates per-impl constructor boilerplate.

func ReadAllAudio

func ReadAllAudio(stream TTSStream) ([]byte, *types.CostInfo, error)

ReadAllAudio drains a TTSStream into a byte slice and returns it along with the total cost. Convenience for callers that need the full audio up front (tests, batch synthesis, mocks).

func ResolveCredential

func ResolveCredential(
	ctx context.Context,
	providerType string,
	cfgDir string,
	cred *credentials.CredentialConfig,
) (credentials.Credential, error)

ResolveCredential resolves a provider's credential block into a concrete Credential. Shared by every typed-provider package's factory layer.

func StartCapabilitySpan

func StartCapabilitySpan(ctx context.Context, tracer trace.Tracer, args *SpanArgs) (context.Context, trace.Span)

StartCapabilitySpan begins a span named "<capability>.<operation>" with the standard provider.* attributes. Callers should defer span.End().

Types

type CapabilitySpec

type CapabilitySpec struct {
	// ID is a stable identifier; informational only at this layer.
	ID string
	// Type selects the implementation (e.g. openai, elevenlabs, cartesia).
	Type string
	// Model overrides the provider's default model.
	Model string
	// BaseURL overrides the provider's default API endpoint.
	BaseURL string
	// Credential carries the resolved credential.
	Credential credentials.Credential
	// AdditionalConfig carries provider-specific extras. Unknown keys
	// are ignored.
	AdditionalConfig map[string]any
}

CapabilitySpec is the unified runtime form of a typed-provider declaration (TTS, STT, embedding, image gen). The SDK's runtime-config layer translates pkg/config provider configs into this struct after resolving credentials.

Each capability package (tts, stt, embedding, image) aliases this type to preserve back-compat field-naming while sharing the factory machinery.

type EmbeddingProvider

type EmbeddingProvider interface {
	Provider
	Embed(ctx context.Context, req EmbeddingRequest) (EmbeddingResponse, error)
}

EmbeddingProvider returns vectors for input texts.

type EmbeddingRequest

type EmbeddingRequest struct {
	Inputs []string
	Hints  map[string]string
}

EmbeddingRequest carries text inputs for a vector embedding call.

type EmbeddingResponse

type EmbeddingResponse struct {
	Vectors [][]float32
	Cost    *types.CostInfo
	Latency time.Duration
}

EmbeddingResponse holds the embedding vectors and metadata from a provider.

type Factory

type Factory[T any] func(spec CapabilitySpec) (T, error)

Factory builds a typed Provider from a CapabilitySpec.

type FactoryRegistry

type FactoryRegistry[T any] struct {
	// contains filtered or unexported fields
}

FactoryRegistry is a typed registry keyed by the implementation discriminator (spec.Type). Each capability package owns one registry instance.

func NewFactoryRegistry

func NewFactoryRegistry[T any]() *FactoryRegistry[T]

NewFactoryRegistry creates an empty registry.

func (*FactoryRegistry[T]) Create

func (r *FactoryRegistry[T]) Create(spec CapabilitySpec) (T, error)

Create dispatches to the registered factory for spec.Type.

func (*FactoryRegistry[T]) Register

func (r *FactoryRegistry[T]) Register(implType string, f Factory[T])

Register adds a factory under the given implementation type.

type HTTPServiceDefaults

type HTTPServiceDefaults struct {
	// Name is the provider's unique registry name (e.g. "openai-whisper").
	Name string
	// Type is the capability discriminator (inference, tts, stt, ...).
	Type ProviderType
	// Pricing is the compiled-in pricing descriptor.
	Pricing *PricingDescriptor
	// BaseURL is the default API endpoint.
	BaseURL string
	// Model is the default model identifier.
	Model string
	// Timeout is the default HTTP client timeout. Zero is treated as
	// http.DefaultClient (no timeout) — pass a positive value.
	Timeout time.Duration
}

HTTPServiceDefaults carries the construction-time defaults for an HTTP service provider (TTS, STT impls). Used by NewHTTPService to produce the standard *Implementation + *HTTPServiceFields pair every impl embeds.

type HTTPServiceFields

type HTTPServiceFields struct {
	APIKey  string
	BaseURL string
	Model   string
	Client  *http.Client
}

HTTPServiceFields is the shared HTTP-call configuration embedded by service-style providers (TTS, STT impls). Each impl embeds *HTTPServiceFields to inherit APIKey/BaseURL/Model/Client storage plus the With* option helpers in this package — eliminating per-package With* boilerplate.

type HTTPServiceOption

type HTTPServiceOption func(*HTTPServiceFields)

HTTPServiceOption mutates an HTTPServiceFields. Each impl re-types this for their own option signatures (e.g., type OpenAIOption = HTTPServiceOption).

func WithAPIKey

func WithAPIKey(k string) HTTPServiceOption

WithAPIKey sets the API key (rarely used directly; constructors take it as a positional arg, but exposed for completeness).

func WithBaseURL

func WithBaseURL(url string) HTTPServiceOption

WithBaseURL overrides the service's API base URL (testing, proxies).

func WithClient

func WithClient(c *http.Client) HTTPServiceOption

WithClient overrides the HTTP client (custom timeout / transport).

func WithModel

func WithModel(m string) HTTPServiceOption

WithModel overrides the model name.

type ImageProvider

type ImageProvider interface {
	Provider
	Generate(ctx context.Context, req ImageRequest) (ImageResponse, error)
}

ImageProvider generates images from prompts.

type ImageRequest

type ImageRequest struct {
	Prompt  string
	Size    string // e.g. "1024x1024"
	Quality string // e.g. "standard" | "hd"
	Count   int    // default 1
	Hints   map[string]string
}

ImageRequest carries parameters for an image generation call.

type ImageResponse

type ImageResponse struct {
	Images   [][]byte
	MIMEType string
	Cost     *types.CostInfo
	Latency  time.Duration
}

ImageResponse holds generated image bytes and metadata from a provider.

type Implementation

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

Implementation is an embeddable struct that supplies default Provider method implementations for a provider. Concrete impls populate the fields in their constructor and override any methods (Validate, Init, HealthCheck, Close) that need real behavior.

func NewImplementation

func NewImplementation(name string, typ ProviderType, pricing *PricingDescriptor) *Implementation

NewImplementation constructs a helper. Pass nil pricing for free / local providers.

func (*Implementation) Close

func (i *Implementation) Close() error

Close releases resources. Default no-op.

func (*Implementation) HealthCheck

func (i *Implementation) HealthCheck(ctx context.Context) error

HealthCheck reports liveness. Default no-op.

func (*Implementation) Init

func (i *Implementation) Init(ctx context.Context) error

Init performs asynchronous setup (network, warm-up). Default no-op.

func (*Implementation) Name

func (i *Implementation) Name() string

Name returns the provider's unique registry name.

func (*Implementation) Pricing

func (i *Implementation) Pricing() *PricingDescriptor

Pricing returns the configured pricing descriptor (may be nil).

func (*Implementation) SetPricing

func (i *Implementation) SetPricing(p *PricingDescriptor)

SetPricing allows post-construction pricing wiring (used when the resolver fills in pricing after Init completes).

func (*Implementation) Type

func (i *Implementation) Type() ProviderType

Type returns the capability type.

func (*Implementation) Validate

func (i *Implementation) Validate() error

Validate performs synchronous config validation. Default no-op.

type InferenceProvider

type InferenceProvider interface {
	Provider
}

InferenceProvider is the shared interface for chat / realtime / multimodal LLM providers. The full surface (Predict, PredictStream, etc.) is defined in runtime/providers/provider.go and embedded here via the existing providers.Provider interface, kept intact for back-compat.

For PR 1 this interface is forward-declared. Existing implementations satisfy it once they compose the base.Implementation helper (Task 7).

type InlinePricingResolver

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

InlinePricingResolver returns descriptors registered at construction time (typically by the config loader). Lookup is keyed by (impl, model, capability).

func NewInlinePricingResolver

func NewInlinePricingResolver() *InlinePricingResolver

NewInlinePricingResolver creates an empty resolver.

func (*InlinePricingResolver) Register

func (r *InlinePricingResolver) Register(ref PricingRef, desc *PricingDescriptor)

Register stores a pricing descriptor under the given reference.

func (*InlinePricingResolver) Resolve

Resolve returns the registered descriptor for ref, or an error if none.

type LineItem

type LineItem struct {
	Unit       string            `json:"unit"`
	Quantity   float64           `json:"quantity"`
	Rate       float64           `json:"rate"`
	USD        float64           `json:"usd"`
	Dimensions map[string]string `json:"dimensions,omitempty"`
}

LineItem is one row of a cost breakdown for reports.

func ComputeCost

func ComputeCost(desc *PricingDescriptor, info *types.CostInfo) (totalUSD float64, breakdown []LineItem, err error)

ComputeCost multiplies raw quantities by matching rates from the pricing descriptor. Returns total USD, the breakdown for reports, and an error if any unit lacks a match.

Matching rule: a PriceItem matches a quantity unit if PriceItem.Unit == unit AND every key in PriceItem.Dimensions has a matching value in info.DimensionMatch. When multiple items match, the one with the most dimension keys wins (most specific).

nil pricing returns zero cost without error (free / local provider).

type PriceItem

type PriceItem struct {
	Unit       string            `json:"unit"`
	Rate       float64           `json:"rate"`
	Dimensions map[string]string `json:"dimensions,omitempty"`
}

PriceItem is one line of a pricing table: a rate per unit, optionally scoped by dimensions (e.g. image size + quality).

func (*PriceItem) UnmarshalJSON

func (p *PriceItem) UnmarshalJSON(data []byte) error

UnmarshalJSON normalizes the per-1M alias form into the canonical PriceItem shape.

type PricingDescriptor

type PricingDescriptor struct {
	Source           PricingSource `json:"source"`
	PricingCorrectAt time.Time     `json:"correct_at,omitempty"`
	Currency         string        `json:"currency,omitempty"` // default "usd"
	Items            []PriceItem   `json:"items"`
}

PricingDescriptor is the runtime-resolved pricing for a single provider+capability.

func PricingFromAdditionalConfig

func PricingFromAdditionalConfig(additional map[string]any) *PricingDescriptor

PricingFromAdditionalConfig extracts a *PricingDescriptor from a provider spec's AdditionalConfig map (under the "pricing" key) by JSON-round-tripping the value into the typed descriptor. Returns nil when the key is absent or the value can't be coerced — callers fall back to package-level defaults.

Used by the TTS and STT factories that translate pkg/config provider specs into runtime services.

type PricingRef

type PricingRef struct {
	Impl       string
	Model      string
	Capability ProviderType
	Hints      map[string]string
}

PricingRef identifies what we're pricing — the resolver maps this to a PricingDescriptor.

type PricingResolver

type PricingResolver interface {
	Resolve(ctx context.Context, ref PricingRef) (*PricingDescriptor, error)
}

PricingResolver returns a PricingDescriptor for a given reference. Foundation PR ships only InlinePricingResolver; future work may add a remote impl that calls out to a service.

type PricingSource

type PricingSource string

PricingSource discriminates how pricing values are obtained.

const (
	// PricingSourceInline reads pricing from the loaded YAML descriptor.
	PricingSourceInline PricingSource = "inline"
	// PricingSourceRemote is reserved; see RemotePricingResolver (future work).
	PricingSourceRemote PricingSource = "remote"
)

type Provider

type Provider interface {
	Name() string
	Type() ProviderType
	Pricing() *PricingDescriptor
	Validate() error
	Init(ctx context.Context) error
	HealthCheck(ctx context.Context) error
	Close() error
}

Provider is implemented by every provider type. It carries only the cross-cutting surface that the registry, config loader, metric collector, and cost rollup need.

type ProviderType

type ProviderType string

ProviderType discriminates capability types. Used as a registry key, metric label, and span attribute.

const (
	ProviderTypeInference ProviderType = "inference"
	ProviderTypeTTS       ProviderType = "tts"
	ProviderTypeSTT       ProviderType = "stt"
	ProviderTypeEmbedding ProviderType = "embedding"
	ProviderTypeImage     ProviderType = "image"
	ProviderTypeVideo     ProviderType = "video"
)

Defined ProviderType values. New types should be added here and to AllProviderTypes.

func AllProviderTypes

func AllProviderTypes() []ProviderType

AllProviderTypes returns every defined ProviderType. Used by the metric collector to pre-register ancillary metric families.

func ParseProviderType

func ParseProviderType(s string) (ProviderType, error)

ParseProviderType validates and returns a ProviderType from a string.

type Registry

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

Registry stores providers keyed by (name, capability).

func NewRegistry

func NewRegistry() *Registry

NewRegistry creates an empty registry with an InlinePricingResolver.

func (*Registry) CloseAll

func (r *Registry) CloseAll() error

CloseAll calls Close on every registered provider, returning the first error encountered.

func (*Registry) Get

func (r *Registry) Get(name string, typ ProviderType) (Provider, error)

Get returns the provider registered under (name, capability), or an error.

func (*Registry) GetAll

func (r *Registry) GetAll(typ ProviderType) []Provider

GetAll returns every provider of the given capability.

func (*Registry) InitAll

func (r *Registry) InitAll(ctx context.Context) error

InitAll calls Init on every registered provider; aborts on first error.

func (*Registry) PricingResolver

func (r *Registry) PricingResolver() PricingResolver

PricingResolver returns the registry's resolver (used by provider constructors at registration time).

func (*Registry) Register

func (r *Registry) Register(p Provider) error

Register adds a provider. Returns an error if (name, capability) is already registered.

func (*Registry) SetPricingResolver

func (r *Registry) SetPricingResolver(res PricingResolver)

SetPricingResolver injects a non-default resolver (used by tests / future remote impl).

type STTProvider

type STTProvider interface {
	Provider
	Transcribe(ctx context.Context, req STTRequest) (STTResponse, error)
}

STTProvider transcribes audio to text.

type STTRequest

type STTRequest struct {
	Audio    []byte
	MIMEType string
	Hints    map[string]string
}

STTRequest carries audio input for a speech-to-text transcription call.

type STTResponse

type STTResponse struct {
	Text    string
	Cost    *types.CostInfo
	Latency time.Duration
}

STTResponse holds the transcribed text and metadata from an STT provider.

type SpanArgs

type SpanArgs struct {
	Capability ProviderType
	Operation  string // "predict" | "synthesize" | "transcribe" | "embed" | "generate"
	Provider   string // base.Provider.Name()
	Impl       string // implementation discriminator (e.g. "openai", "imagen")
	Model      string
}

SpanArgs carries the standard attributes for a capability-scoped provider span.

type TTSProvider

type TTSProvider interface {
	Provider
	SynthesizeTTS(ctx context.Context, req TTSRequest) (TTSStream, error)
}

TTSProvider produces audio from text. Streaming-first: every TTS call returns a TTSStream regardless of whether the underlying provider supports incremental synthesis. Buffered consumers can use ReadAllAudio to collect all chunks into a []byte.

The method is named SynthesizeTTS rather than Synthesize to avoid a naming conflict with the legacy tts.Service.Synthesize method that takes (text string, config SynthesisConfig). Both interfaces can be satisfied by the same concrete type simultaneously.

type TTSRequest

type TTSRequest struct {
	Text       string
	Voice      string
	Speed      float32
	Format     string            // audio format hint, e.g. "mp3", "pcm" (provider-specific)
	SampleRate int               // desired output sample rate in Hz (0 = provider default)
	Hints      map[string]string // additional dimension hints passed to pricing
}

TTSRequest carries parameters for a text-to-speech synthesis call.

type TTSStream

type TTSStream interface {
	// Chunks returns the channel of audio chunks. Caller must drain to
	// completion or call Close to release resources. The channel closes
	// when synthesis completes successfully or on error.
	Chunks() <-chan audio.Chunk
	// Cost returns the total cost of this synthesis. Returns nil before
	// the chunk channel has closed; returns a populated *types.CostInfo
	// afterwards. Pricing comes from the provider's PricingDescriptor.
	Cost() *types.CostInfo
	// Close cancels an in-progress stream and releases resources.
	// Safe to call multiple times.
	Close() error
}

TTSStream is the streaming output of a TTS provider's Synthesize call. It exposes the chunk channel that downstream pipeline stages consume, plus a typed accessor for the total cost (available once the chunk channel closes) and a Close method for early cancellation.

type VideoProvider added in v1.5.1

type VideoProvider interface {
	Provider
	Generate(ctx context.Context, req VideoRequest) (VideoResponse, error)
}

VideoProvider generates videos from prompts. No concrete provider implements this interface yet; it defines the shape that the video__generate tool resolves against once a provider (e.g. Veo) lands.

type VideoRequest added in v1.5.1

type VideoRequest struct {
	Prompt      string
	AspectRatio string            // e.g. "16:9"
	Hints       map[string]string // additional dimension hints passed to pricing
}

VideoRequest carries parameters for a video generation call.

type VideoResponse added in v1.5.1

type VideoResponse struct {
	Videos   [][]byte
	MIMEType string // e.g. "video/mp4"
	Cost     *types.CostInfo
	Latency  time.Duration
}

VideoResponse holds generated video bytes and metadata from a provider.

Jump to

Keyboard shortcuts

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