LLM providers
Configure an external large language model (LLM) provider only when an enabled and licensed Koldan capability requires one. Provider accounts, network access, data-governance controls, model availability, quota, and credentials are operator-managed.
Prerequisites
Before enabling a provider, approve the data residency and retention terms, endpoint location, model or deployment ID, authentication method, rate and token quotas, expected concurrency, cost controls, timeout policy, and incident owner. Permit egress only to the required endpoint and ensure DNS and TLS work from the Koldan namespace.
Provider model catalogs and names change independently of Koldan. Use a model ID currently enabled in your provider account and supported by that provider's API; do not copy a sample model name into production without validating it.
Configuration contract
Provider declarations are a named map under koldan.llm.providers. Each entry has a stable operator-selected ID and one supported type:
config: |
koldan:
llm:
providers:
primary:
type: <openai|azure-openai|ollama|bedrock|gemini|anthropic|vertex-ai>
<provider-type>:
model: <provider-model-or-deployment-id>
Koldan capability settings reference the provider ID and may override its model. The supported routing keys in this release are:
koldan.llm.session-history-summarykoldan.llm.session-history-autotitlekoldan.llm.ai-simple-text-summarykoldan.llm.speech-service-transcription-summary
Each accepts provider and optional model. Configure only the capabilities enabled for the deployment. For example:
config: |
koldan:
llm:
providers:
primary:
type: ollama
ollama:
base-url: https://llm.example.net
model: <model-id>
timeout: 5m
session-history-summary:
provider: primary
Provider IDs referenced by a capability must exist. Every provider declaration requires its own model or deployment ID. A capability-level model changes the model for that capability; it does not make the provider-level value optional.
Protect credentials
API keys, static cloud credentials, credential JSON files, and sensitive custom headers are secrets. Values under the chart's config block are rendered into a ConfigMap; a populated API key there is not protected as a Kubernetes Secret. Follow Configuration and secrets, restrict Helm and namespace access, and prefer provider workload identity where supported.
A string such as ${PROVIDER_API_KEY} is only a reference: it does not inject an environment variable into a pod. Use it only when your approved deployment customization makes that variable available to every Koldan workload that consumes the provider. Verify the rendered pod specification before relying on it.
Disable provider request-and-response logging for production data unless the resulting content has been explicitly approved for the log destination and retention policy.
OpenAI and compatible endpoints
Use type: openai for the OpenAI Chat API or a compatible endpoint validated with the installed release.
| Property | Requirement and effect | Default |
|---|---|---|
openai.api-key |
Required API credential | None |
openai.model |
Required provider model ID | None |
openai.base-url |
Optional API base URL for a gateway or compatible service | Provider endpoint |
openai.temperature |
Optional sampling temperature accepted by the selected model | Model default |
openai.timeout |
Request timeout | 5m |
openai.service-tier |
Optional provider service tier | None |
openai.reasoning-effort |
Optional reasoning effort accepted by the selected model | None |
When using a gateway or compatible API, validate its base-URL path, authentication headers, streaming behavior, error format, and supported request parameters. API compatibility is not implied by an OpenAI-like product label.
Azure OpenAI
Use type: azure-openai with an Azure resource endpoint and deployment name.
| Property | Requirement and effect | Default |
|---|---|---|
azure-openai.endpoint |
Required Azure OpenAI resource endpoint | None |
azure-openai.api-key |
Required unless Azure credential authentication is enabled | None |
azure-openai.use-azure-credential |
Use the Azure default credential chain | false |
azure-openai.deployment-name |
Required Azure deployment ID | None |
azure-openai.service-version |
Optional Azure OpenAI API version | Provider default |
azure-openai.temperature, azure-openai.top-p |
Optional sampling controls | Model default |
azure-openai.max-tokens, azure-openai.max-completion-tokens |
Optional output limits; use the property supported by the selected deployment | Model default |
azure-openai.reasoning-effort |
Optional reasoning effort | None |
azure-openai.presence-penalty, azure-openai.frequency-penalty |
Optional penalty controls | Model default |
azure-openai.stop, azure-openai.user, azure-openai.seed |
Optional request controls | None |
azure-openai.strict-json-schema |
Optional strict schema behavior | None |
azure-openai.timeout |
Request timeout | 5m |
azure-openai.max-retries |
Optional retry limit | Client default |
azure-openai.log-requests-and-responses |
Log request and response content; may expose sensitive data | Client default |
azure-openai.user-agent-suffix |
Optional user-agent suffix | None |
azure-openai.custom-headers |
Optional headers; treat secret header values as credentials | None |
primary:
type: azure-openai
azure-openai:
endpoint: https://<resource-name>.openai.azure.com/
api-key: <injected-api-key>
deployment-name: <deployment-id>
timeout: 5m
For workload identity, set use-azure-credential: true, omit api-key, assign the Kubernetes workload identity access to the Azure resource, and make the Azure default credential chain available to the consuming pods. Do not assume a developer workstation or Azure CLI login is visible inside a pod.
Ollama
Use type: ollama for an operator-managed Ollama endpoint.
| Property | Requirement and effect | Default |
|---|---|---|
ollama.base-url |
Required endpoint URL | http://localhost:11434 |
ollama.model |
Required model ID | None |
ollama.temperature |
Optional sampling temperature | Model default |
ollama.timeout |
Request timeout | 5m |
ollama.think |
Optional provider thinking control | Provider/model default |
ollama.return-thinking |
Optional return-thinking control | Provider/model default |
Do not use the localhost default unless Ollama runs in the same pod. For an in-cluster or external service, use its routable HTTPS URL, restrict access with NetworkPolicy and authentication controls available at the endpoint or gateway, and size model memory and concurrency independently from Koldan.
Amazon Bedrock
Use type: bedrock for a model enabled in the selected AWS Region.
| Property | Requirement and effect | Default |
|---|---|---|
bedrock.region |
AWS Region containing model access | us-east-1 |
bedrock.model |
Required Bedrock model ID | None |
bedrock.access-key-id, bedrock.secret-access-key |
Optional static credential pair | AWS default credential chain |
bedrock.temperature |
Optional sampling temperature | Model default |
bedrock.max-tokens |
Optional output limit | Model default |
bedrock.timeout |
Request timeout | 5m |
Prefer pod workload identity, such as an IAM role associated with the chart service account, and omit both static credential properties. Grant only the required Bedrock invocation actions for approved resources. If static credentials are unavoidable, provide both values; a partial pair falls back to the default credential chain and is a configuration error from an operational perspective.
Google AI Gemini
Use type: gemini with a Google AI API key.
| Property | Requirement and effect | Default |
|---|---|---|
gemini.api-key |
Required API credential | None |
gemini.model |
Required model ID | None |
gemini.base-url |
Optional gateway or custom endpoint | Provider endpoint |
gemini.temperature |
Optional sampling temperature | Model default |
gemini.max-output-tokens |
Optional output limit | Model default |
gemini.timeout |
Request timeout | 5m |
gemini.thinking-config.include-thoughts |
Optional inclusion of provider thinking output | Model default |
gemini.thinking-config.thinking-budget |
Optional thinking token budget | Model default |
gemini.thinking-config.thinking-level |
Optional thinking level | Model default |
Enable returned thinking content only after reviewing its data-handling and logging implications.
Anthropic
Use type: anthropic with an Anthropic API key.
| Property | Requirement and effect | Default |
|---|---|---|
anthropic.api-key |
Required API credential | None |
anthropic.model |
Required model ID | None |
anthropic.base-url |
Optional gateway or custom endpoint | Provider endpoint |
anthropic.temperature, anthropic.top-p, anthropic.top-k |
Optional sampling controls | Model default |
anthropic.max-tokens |
Optional output limit | Model default |
anthropic.timeout |
Request timeout | 5m |
Google Cloud Vertex AI
Use type: vertex-ai for Gemini models hosted through Vertex AI.
| Property | Requirement and effect | Default |
|---|---|---|
vertex-ai.project |
Required Google Cloud project ID | None |
vertex-ai.location |
Required model location | None |
vertex-ai.model |
Required model ID | None |
vertex-ai.api-endpoint |
Optional regional or custom endpoint | Google Cloud default |
vertex-ai.temperature, vertex-ai.top-p, vertex-ai.top-k |
Optional sampling controls | Model default |
vertex-ai.max-output-tokens |
Optional output limit | Model default |
Vertex AI uses Google Cloud Application Default Credentials (ADC). Prefer Workload Identity on GKE. Where a service-account JSON file is required, create a Kubernetes Secret whose key is google-credentials.json, then use the chart's existing-Secret interface:
googleCredentials:
enabled: true
existingSecret: koldan-google-credentials
config: |
koldan:
llm:
providers:
primary:
type: vertex-ai
vertex-ai:
project: <project-id>
location: <location>
model: <model-id>
The chart mounts the credential in the Koldan API and workflow-worker workloads and sets GOOGLE_APPLICATION_CREDENTIALS. Do not populate googleCredentials.json in an ordinary values file: that alternate chart path creates a Secret but also retains the JSON in Helm release data. A host gcloud login is not an authentication method for cluster pods.
Verify and operate
After rendering and applying the configuration:
- Confirm only the intended Koldan workloads received the credential or workload identity.
- Verify endpoint DNS, TCP, TLS, and proxy behavior from the Koldan namespace.
- Confirm the identity can invoke the selected model but cannot administer unrelated provider resources.
- Exercise one small representative request through each enabled Koldan capability.
- Verify timeout and provider-unavailability behavior without changing security controls.
- Monitor request count, latency, error codes, throttling, token usage, quota, and spend without logging prompts or responses by default.
Rotate an API key by issuing a second key, updating and rolling all consuming workloads, testing every configured capability, and revoking the old key. For workload identity, apply and test the new role binding before removing the old permission.
| Symptom | Check and recovery |
|---|---|
| Startup reports an unknown provider | Exact type spelling and provider indentation |
| Capability refers to an unknown provider | Routing provider value does not match a key under providers |
| Required model is missing | Set the provider model or a capability-level model override |
| 401/403 response | Credential injection, workload identity binding, model permission, endpoint audience, and clock skew |
| Model or deployment not found | Model ID, Azure deployment ID, Region/location, project/account, and provider access approval |
| Requests time out or throttle | Namespace egress, proxy, provider quota, Koldan concurrency, model capacity, and configured timeout |
| TLS failure | Endpoint hostname, complete chain, private CA configuration, and pod restart after CA changes |
| Unexpected sensitive log content | Disable request/response logging, restrict and purge affected logs according to incident policy |