Skip to content

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-summary
  • koldan.llm.session-history-autotitle
  • koldan.llm.ai-simple-text-summary
  • koldan.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
primary:
  type: openai
  openai:
    api-key: <injected-api-key>
    model: <model-id>
    timeout: 5m

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.

primary:
  type: ollama
  ollama:
    base-url: https://llm.example.net
    model: <model-id>
    timeout: 5m

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.

primary:
  type: bedrock
  bedrock:
    region: <aws-region>
    model: <model-id>
    timeout: 5m

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
primary:
  type: gemini
  gemini:
    api-key: <injected-api-key>
    model: <model-id>
    timeout: 5m

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
primary:
  type: anthropic
  anthropic:
    api-key: <injected-api-key>
    model: <model-id>
    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:

  1. Confirm only the intended Koldan workloads received the credential or workload identity.
  2. Verify endpoint DNS, TCP, TLS, and proxy behavior from the Koldan namespace.
  3. Confirm the identity can invoke the selected model but cannot administer unrelated provider resources.
  4. Exercise one small representative request through each enabled Koldan capability.
  5. Verify timeout and provider-unavailability behavior without changing security controls.
  6. 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