package promptkit import ( "gitea.maximumdirect.net/eric/ConfigKit" "gitea.maximumdirect.net/eric/promptkit/internal/backend" ) // BackendOpenRouter identifies the maintained OpenRouter backend. const BackendOpenRouter = backend.OpenRouterID // BackendRakestrawHome identifies the maintained Rakestrawhome backend. const BackendRakestrawHome = backend.RakestrawHomeID // BackendLocal is a conventional ID for a caller-configured local backend. const BackendLocal = "local" // BackendConfig is a presence-aware convenience value for a keyed backend // definition. Nil pointer fields are omitted, while non-nil pointers preserve // explicit zero or blank values. A nil ExtraParams map is omitted; a non-nil // empty map supplies an empty mapping. Use raw ConfigKit Mapping inputs for // explicit null. BackendConfig has no stable JSON representation. type BackendConfig struct { // Endpoint is the required absolute HTTP(S) base URL after all layers merge. Endpoint *string // APIKeyEnv optionally names an environment variable, not a credential. APIKeyEnv *string // ConcurrencyLimit is zero for unlimited generation; negative is invalid. ConcurrencyLimit *int // QueueCapacity defaults to 1024 for positive concurrency when omitted. // An explicit value, including zero, requires positive concurrency. QueueCapacity *int // ExtraParams supplies JSON-compatible provider request defaults. ExtraParams map[string]any } // BackendSource creates a labeled ConfigKit mapping from keyed backend values. // It encodes fields without validating them; NewEngine validates the final // effective configuration after all selected source layers are combined. // Mapping captures a copy of supported input values at creation; unsupported // values fail when the source is loaded. func BackendSource(label string, backends map[string]BackendConfig) configkit.Source { definitions := make(map[string]any, len(backends)) for id, config := range backends { fields := make(map[string]any) if config.Endpoint != nil { fields["endpoint"] = *config.Endpoint } if config.APIKeyEnv != nil { fields["api_key_env"] = *config.APIKeyEnv } if config.ConcurrencyLimit != nil { fields["concurrency_limit"] = *config.ConcurrencyLimit } if config.QueueCapacity != nil { fields["queue_capacity"] = *config.QueueCapacity } if config.ExtraParams != nil { fields["extra_params"] = providerMapForMapping(config.ExtraParams) } definitions[id] = fields } return configkit.Mapping(label, map[string]any{"backends": definitions}) } // LocalBackend supplies endpoint and concurrency pointers for a caller-chosen // backend ID; it does not select an ID or validate either value. func LocalBackend(endpoint string, concurrencyLimit int) BackendConfig { return BackendConfig{Endpoint: &endpoint, ConcurrencyLimit: &concurrencyLimit} }