Koldan Server Configuration Reference
This document catalogs the custom configuration properties used across the Koldan services.
Site Properties
Site properties control basic configuration settings for the Koldan application interface and client behavior. These settings affect how the application presents itself to users.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.site.name | Site title/name displayed in UI | Koldan | Controls the main branding text shown throughout the application interface |
| koldan.site.updates-url-override | Overrides the update URL for desktop clients | (empty) | Defaults to /api/update on the HTTP server. Use this to customize where desktop clients check for updates |
| koldan.site.updates-url-v2-override | Overrides the update URL for desktop clients for V2 updater | (empty) | Defaults to /api/update/v2/updates.xml on the HTTP server |
Feature Properties
Feature properties control optional capabilities that can be enabled or disabled for the site. Each feature requires both a valid license with the corresponding feature flag and the property to be enabled. Features are disabled by default and must be explicitly enabled in the configuration.
| Property | Description | Default | License Feature Required |
|---|---|---|---|
| koldan.features.session-history-enabled | Enables the session history feature. When enabled, speech session results (segments) are saved to S3 storage and can be retrieved later via the GetSessionHistoryResults API. When disabled, only session metadata records are saved but segment data is not stored or retrievable. |
false | session-history |
| koldan.features.session-history-summary-enabled | Enables AI-generated summaries for session history. When enabled, users can request summaries of their recorded speech sessions via the RequestNewSummary API. Requires session-history feature to also be enabled. |
false | session-history-summary |
| koldan.features.online-diarization-enabled | Enables online speaker diarization during speech recognition. When enabled, users can set OnlineSpeakerDiarizationSettings.enabled=true in their recognition requests to identify and tag different speakers in real-time. Sessions requesting diarization will be rejected if disabled. |
false | online-diarization |
| koldan.features.session-history-autotitle-enabled | Enables automatic session titling. When enabled, a workflow is triggered at the end of a session to automatically generate a title based on the transcript. Requires session-history feature to also be enabled. |
false | session-history-autotitle |
| koldan.features.speech-services-enabled | Enables the speech-services REST API. When enabled, the speech-services HTTP endpoints (transcription jobs, file management, summaries, file sharing) and their supporting services are registered. When disabled, these endpoints do not exist and related beans are not loaded. | false | speech-services |
| koldan.features.multi-tenancy-enabled | Enables multi-tenancy support. When enabled, requests may specify a non-default tenant via the X-Tenant-Id header. When disabled, all requests are silently routed to the default tenant regardless of the header value. |
false | multi-tenancy |
S3 Object Storage
Koldan uses S3-compatible object storage to store and manage large objects such as models, audio files, and other artifacts.
The S3 integration supports any S3-compatible storage service, including AWS S3, MinIO, and other compatible implementations.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.s3.enabled | Enable loading models from S3-compatible object storage | true | |
| koldan.s3.url | S3 endpoint URL | http://localhost:9000 | |
| koldan.s3.bucket | Default S3 bucket name | koldan | |
| koldan.s3.access-key | S3 access key, required when enabled is true |
||
| koldan.s3.secret-key | S3 secret key, required when enabled is true |
Default Tenant OIDC Configuration
Koldan uses OpenID Connect (OIDC) for authentication and authorization. OIDC is a secure identity layer built on top of OAuth 2.0 that enables Single Sign-On (SSO) and identity federation. When users access Koldan, they are redirected to authenticate with the OIDC provider, which then provides secure tokens that Koldan uses to verify the user's identity and permissions.
The default tenant OIDC properties serve two purposes:
- Bootstrap: On first startup,
DefaultTenantBootstrapseeds the default tenant's OIDC provider from these properties. - Engine token generation: Engine modules use the nested
enginesub-properties to obtain client-credentials tokens directly from configuration, without requiring database access.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.oidc.default-tenant.client-id | OAuth2 client ID for the default tenant's OIDC provider | Required for bootstrap | |
| koldan.oidc.default-tenant.client-secret | OAuth2 client secret for the default tenant's OIDC provider | Required for bootstrap | |
| koldan.oidc.default-tenant.issuer-uri | OIDC issuer URI | Required for bootstrap | |
| koldan.oidc.default-tenant.authorization-uri | OIDC authorization endpoint | ||
| koldan.oidc.default-tenant.token-uri | OIDC token endpoint | Required for bootstrap and engine token generation | |
| koldan.oidc.default-tenant.user-info-uri | OIDC user info endpoint | ||
| koldan.oidc.default-tenant.jwk-set-uri | OIDC JWK Set URI for token signature verification | Required for bootstrap | |
| koldan.oidc.default-tenant.end-session-uri | OIDC end session (logout) endpoint | ||
| koldan.oidc.default-tenant.introspection-uri | OIDC token introspection endpoint | ||
| koldan.oidc.default-tenant.engine.client-id | Engine OAuth2 client ID for service-to-service authentication | koldan-engine | Used by engines to obtain client-credentials tokens |
| koldan.oidc.default-tenant.engine.client-secret | Engine OAuth2 client secret | Required for engine token generation. Use env var KOLDAN_ENGINE_OIDC_CLIENT_SECRET |
Elasticsearch
Elasticsearch is used in Koldan to index client logs. The Elasticsearch integration is mandatory for API modules to function properly.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.elasticsearch.mandatory | If true, health/readiness fails when ES is down | true (api modules), false (engines) | |
| koldan.elasticsearch.host | Elasticsearch server host | localhost | |
| koldan.elasticsearch.port | Elasticsearch server port | 9200 | |
| koldan.elasticsearch.index | Elasticsearch index name for client logs | koldan |
Engine Services
Engine-specific properties are listed below. These properties affect all types of engines (k2, slibe, etc...)
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.engine.hostname | Hostname of engine for advertise to service discovery | localhost | |
| koldan.engine.port | Binding port for engine gRPC server | 8200 | |
| koldan.engine.management-port | Actuator management port | 5200 | |
| koldan.engine.preset-name | Preset name for engine runtime and model selection | (required) | |
| koldan.engine.model-temp-dir | Filesystem path to a local model directory. Engines may load models from here when S3 is disabled or as a cache. | (empty) | When empty, defaults to ${java.io.tmpdir} |
| koldan.engine.warmup.enabled | Whether to enable engine warmup on startup, recommended | true | |
| koldan.engine.warmup.timeout | Warmup timeout in seconds | 30 | |
| koldan.engine.warmup.noise-duration | Duration (in seconds) of synthetic noise added to the input audio during warmup | 10 | |
| koldan.engine.shutdown-timeout-seconds | Maximum time in seconds to wait for active recognitions to complete during graceful shutdown | 300 | |
| koldan.engine.k2.* | K2 Engine configurations TODO: move to K2 Section | - | See K2 Config section |
gRPC API Service
The Koldan gRPC API service provides the core communication interface between clients and the Koldan speech recognition system. It handles streaming audio recognition requests, manages user sessions, and coordinates with speech recognition engines. It is the main API for Koldan Desktop clients and other applications that integrate with Koldan for real-time streaming.
The following properties configure the gRPC API service behavior:
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.api-grpc.address | Internal address for the API gRPC server to be published to service discovery | localhost | |
| koldan.api-grpc.port | TCP port for API gRPC server | 8195 | |
| koldan.api-grpc.management-port | Actuator management port | 5195 | |
| koldan.api-grpc.shutdown-timeout-seconds | Maximum time in seconds to wait for active requests to complete during graceful shutdown | 300 | |
| koldan.api-grpc.advertisement.address | gRPC server advertisement address | ${koldan.api-grpc.address} |
Use gRPC binding address by default |
| koldan.api-grpc.advertisement.port | gRPC server advertisement port | ${koldan.api-grpc.port} |
Use gRPC binding port by default |
| koldan.api-grpc.advertisement.ssl | gRPC server advertise SSL for external connections | ${koldan.api-grpc.ssl.enabled} |
By default, will advertise true if ssl is enabled on server |
| koldan.api-grpc.ssl.enabled | Whether to enable SSL on gRPC server | false | |
| koldan.api-grpc.ssl.use-spring-ssl-context | Use Spring-managed SSL context for gRPC server. When true, koldan.api-grpc.ssl.enabled is ignored. |
false | When true, you may need to set koldan.api-grpc.advertisement.ssl manually |
| koldan.api-grpc.ssl.key-store | Keystore path | - | |
| koldan.api-grpc.ssl.key-store-password | Keystore password | - | |
| koldan.api-grpc.ssl.key-store-type | Keystore type (usually PEM/PKCS12) | PKCS12 | |
| koldan.api-grpc.ssl.key-file | Private key file (PEM) when using PEM mode | - | |
| koldan.api-grpc.ssl.cert-file | Certificate file (PEM) when using PEM mode | - | |
| koldan.api-grpc.online.words-filter.enabled | Whether to enable words filtering (usually insertions and illegal words) in online recognizer pipelines | true | |
| koldan.api-grpc.online.words-filter.words | Set of words (can be comma separated) to filter out from results | NOSE,NOS,SPN,SP | |
| koldan.api-grpc.online.diarization.uri | Target address of the diarization service ([scheme://][authority/]endpoint) |
localhost:7400 | Example values: localhost:7400, dns:///example.com:7400, static://addr1:7400,addr2:7400 |
| koldan.api-grpc.online.diarization.load-balancing-policy | Sets the load balancing policy for the connection (pick_first, round_robin) |
round_robin | |
| koldan.api-grpc.online.diarization.connection-timeout-ms | TCP connection timeout in milliseconds | 5000 | |
| koldan.api-grpc.online.diarization.keep-alive-time-ms | Keep-alive ping interval in milliseconds | 30000 | |
| koldan.api-grpc.online.diarization.keep-alive-timeout-ms | Keep-alive ping timeout in milliseconds | 5000 | |
| koldan.api-grpc.online.diarization.keep-alive-without-calls | Send keep-alive pings even when there are no active RPCs | false | |
| koldan.api-grpc.online.diarization.max-inbound-message-size | Maximum inbound message size accepted by the client channel (bytes) | 4194304 (4 MiB) | |
| koldan.api-grpc.online.diarization.ssl.enabled | Enable TLS for the client connection to the diarization server | false | |
| koldan.api-grpc.online.diarization.certificate-path | Path to client certificate file (PEM) used for mTLS | Required when ssl.enabled=true and server requires client cert | |
| koldan.api-grpc.online.diarization.private-key-path | Path to client private key file (PEM) used for mTLS | Required with certificate-path and server requires client cert | |
| koldan.api-grpc.online.diarization.trust-cert-collection-path | Path to trusted CA certificates file (PEM) to validate server certificate | ||
| koldan.api-grpc.recordings.enabled | Whether to enable audio recording (PCM) for speech recognition sessions. Recordings are stored in S3. | false | Requires session-history feature to be enabled for tracking. |
HTTP API Service
The Koldan HTTP API service provides a REST interface for interacting with Koldan platform and a web-based administration console.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.api-http.port | Bind port for the API HTTP server | 8193 | |
| koldan.api-http.management-port | Actuator management port | 5193 | |
| koldan.api-http.advertisement.address | HTTP server advertisement address | ${koldan.api-grpc.address} |
|
| koldan.api-http.advertisement.port | HTTP server advertisement port | ${koldan.api-http.port} |
|
| koldan.api-http.advertisement.ssl | HTTP server advertise SSL for external connections | ${server.ssl.enabled} |
|
| koldan.api-http.security.model-url-whitelist-pattern | Regex pattern for whitelisting URL's for downloading models to Koldan | ^https:\/\/(www\.)?dixilang\.com(\/.*)?$ |
|
| koldan.api-http.updates-dir | Path to directory to serve updates from (static) | ./updates |
|
| koldan.api-http.cors.enabled | Whether to enable Cross-Origin Resource Sharing | false | For production the recommended value is false |
Rate Limits
Default rate limit values applied when no tenant-level or user-level override exists in the database. All values represent the maximum number of allowed requests per minute. These can be overridden at the tenant or user level via the admin API; the resolution order is: user override → tenant default → application property.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.api.rate-limits.file-uploads | Maximum file upload requests per minute | 20 | |
| koldan.api.rate-limits.transcription-job-executions | Maximum transcription job execution requests per minute | 20 | |
| koldan.api.rate-limits.summary-executions | Maximum summary execution requests per minute | 30 | |
| koldan.api.rate-limits.translation-executions | Maximum translation execution requests per minute | 30 | |
| koldan.api.rate-limits.text-translation-executions | Maximum text translation execution requests per minute | 60 | |
| koldan.api.rate-limits.global-requests | Maximum total API requests per minute (across all operations) | 600 | Applies to every authenticated request, all endpoints |
Session History Post-Session Diarization
Post-session diarization is used for re-processing diarization on completed session recordings using a slower but more accurate diarization model. This runs asynchronously after a session ends.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.session-history-post-diarization.enabled | Whether post-session diarization is enabled | false | |
| koldan.session-history-post-diarization.min-duration-ms | Minimum audio duration (ms) to be eligible for post-diarization | 60000 | |
| koldan.session-history-post-diarization.uri | URI of the post-session diarization server (host:port) | localhost:7400 | Example values: localhost:7400, dns:///example.com:7400, static://addr1:7400,addr2:7400 |
| koldan.session-history-post-diarization.load-balancing-policy | Sets the load balancing policy for the connection | round_robin | pick_first, round_robin |
| koldan.session-history-post-diarization.connection-timeout-ms | TCP connection timeout in milliseconds | 5000 | |
| koldan.session-history-post-diarization.keep-alive-time-ms | Keep-alive ping interval in milliseconds | 30000 | |
| koldan.session-history-post-diarization.keep-alive-timeout-ms | Keep-alive ping timeout in milliseconds | 5000 | |
| koldan.session-history-post-diarization.keep-alive-without-calls | Send keep-alive pings even when there are no active RPCs | false | |
| koldan.session-history-post-diarization.max-inbound-message-size | Maximum inbound message size accepted by the client channel (bytes) | 4194304 (4 MiB) | |
| koldan.session-history-post-diarization.ssl-enabled | Enable TLS for the client connection to the diarization server | false | |
| koldan.session-history-post-diarization.certificate-path | Path to client certificate file (PEM) used for mTLS | Required when ssl-enabled=true and server requires client cert | |
| koldan.session-history-post-diarization.private-key-path | Path to client private key file (PEM) used for mTLS | Required with certificate-path when server requires client cert | |
| koldan.session-history-post-diarization.trust-cert-collection-path | Path to trusted CA certificates file (PEM) to validate server certificate | ||
| koldan.session-history-post-diarization.audio-chunk-size-bytes | Chunk size in bytes for streaming audio data to the diarization server | 32768 (32 KB) | Reasonable for PCM audio streaming |
| koldan.session-history-post-diarization.completion-timeout-ms | Deadline (in milliseconds) for diarization to complete | 180000 | Default: 30 minutes |
Speech Services: Punctuation & Capitalization (PNCP)
The punctuation and capitalization service enriches transcription job results with automatic punctuation and capitalization by calling a dedicated PNCP gRPC server. When enabled, the transcription workflow calls this service after decoding (and after merge/interleave when applicable). Users can individually opt in to punctuation and/or capitalization via the transcription request options.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.speech-services.punctuation-capitalization.enabled | Whether the punctuation & capitalization service is enabled | false | |
| koldan.speech-services.punctuation-capitalization.uri | URI of the PNCP server (host:port) | localhost:7500 | Example values: localhost:7500, dns:///example.com:7500, static://addr1:7500,addr2:7500 |
| koldan.speech-services.punctuation-capitalization.load-balancing-policy | Sets the load balancing policy for the connection | round_robin | pick_first, round_robin |
| koldan.speech-services.punctuation-capitalization.connection-timeout-ms | TCP connection timeout in milliseconds | 5000 | |
| koldan.speech-services.punctuation-capitalization.keep-alive-time-ms | Keep-alive ping interval in milliseconds | 30000 | |
| koldan.speech-services.punctuation-capitalization.keep-alive-timeout-ms | Keep-alive ping timeout in milliseconds | 5000 | |
| koldan.speech-services.punctuation-capitalization.max-inbound-message-size | Maximum inbound message size accepted by the client channel (bytes) | 4194304 (4 MiB) | |
| koldan.speech-services.punctuation-capitalization.ssl-enabled | Enable TLS for the client connection to the PNCP server | false | |
| koldan.speech-services.punctuation-capitalization.certificate-path | Path to client certificate file (PEM) used for mTLS | Required when ssl-enabled=true and server requires client cert | |
| koldan.speech-services.punctuation-capitalization.private-key-path | Path to client private key file (PEM) used for mTLS | Required with certificate-path when server requires client cert | |
| koldan.speech-services.punctuation-capitalization.trust-cert-collection-path | Path to trusted CA certificates file (PEM) to validate server certificate | ||
| koldan.speech-services.punctuation-capitalization.completion-timeout-ms | Deadline (in milliseconds) for punctuation/capitalization to complete | 600000 | Default: 10 minutes |
API Keys
API Keys provide an alternative authentication mechanism for accessing Koldan APIs. Instead of using JWT tokens from
Keycloak, clients can authenticate using a static API key passed in the X-API-Key header. This is useful for
server-to-server integrations, scripts, and automated workflows where OAuth flows are impractical.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.api.api-keys.enabled | Enable API Key authentication. When enabled, requests can authenticate using X-API-Key header. | true | |
| koldan.api.api-keys.hmac-secret | HMAC secret for hashing API keys, should be changed per site and rotated if api keys are compromised. | koldan-api-key-secret-change-me-in-production |
any random string will work |
| koldan.api.api-keys.default-scopes | Default scopes (roles) assigned to API keys when not explicitly specified during creation. | koldan-user | Comma-separated list of role names |
| koldan.api.api-keys.key-prefix | The prefix for generated API keys. | kk- | |
| koldan.api.api-keys.key-length | The length of the random part of the API key (excluding prefix). | 64 | Total key length = prefix length + key-length |
| koldan.api.api-keys.max-active-keys-per-user | Maximum number of active (non-revoked, non-expired) API keys allowed per user. Set to 0 or negative to disable. | 15 | Returns HTTP 429 when limit is reached |
Workflow Worker
| Property | Description | Default | Notes |
|---|---|---|---|
| spring.temporal.* | Temporal Spring Boot properties | - | |
| koldan.workflows-worker.management-port | Actuator management port | 5196 |
Data Retention Cleanup Workflow
The data retention cleanup workflow runs periodically via a Temporal scheduled workflow to purge expired resources (files, transcriptions, summaries, translations, listening audio, text translations) based on per-tenant and per-user retention policies. See Retention API for full details.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.retention-cleanup-workflow.enabled | Whether the retention cleanup Temporal schedule is registered on startup | true | When false, no scheduled cleanup runs; manual purge still works |
| koldan.retention-cleanup-workflow.cron | Cron expression (Temporal cron format) controlling how often the cleanup workflow runs | 0 * * * * |
Default: every hour at minute 0 |
Webhook Delivery
These properties control how webhook notifications are delivered and retried when API consumers register webhooks on transcription jobs, summaries, or file operations.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.webhooks.retry.max-attempts | Maximum number of delivery attempts before marking webhook as exhausted | 10 | |
| koldan.webhooks.retry.initial-interval | Delay before the first retry attempt | 5s | |
| koldan.webhooks.retry.backoff-coefficient | Multiplier applied to the interval after each failed attempt | 3.2 | Produces an approximate schedule: 5s → 30s → 1m → 5m → 15m → 45m → 2h → 6h → 24h |
| koldan.webhooks.retry.maximum-interval | Upper bound on the delay between retry attempts | 24h | |
| koldan.webhooks.delivery.connect-timeout | HTTP connect timeout for webhook POST requests | 10s | |
| koldan.webhooks.delivery.read-timeout | HTTP read timeout for webhook POST requests | 30s |
Webhook Security
Security settings for webhook delivery. These protect against common attack vectors such as SSRF and man-in-the-middle attacks.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.webhooks.security.url-allow-pattern | Regex pattern for allowed webhook URLs. URLs that don't match are rejected at registration and delivery time. | ^https://.* |
Set to .* to allow any URL including http:// (not recommended for production) |
| koldan.webhooks.security.block-private-ips | Block webhook URLs that resolve to private/internal IP addresses (SSRF protection) | true | Disable for local deployments where webhooks target localhost or internal services |
| koldan.webhooks.security.max-redirects | Maximum number of HTTP redirects to follow. Redirects can bypass URL whitelist and IP checks. | 0 | 0 = redirects disabled entirely. Recommended to keep at 0 for security. |
| koldan.webhooks.security.ssl-verify | Whether to verify SSL certificates on webhook delivery | true | Set to false for local deployments using self-signed certificates |
Local development override example
Data Retention Policy Defaults
Default data retention values used to seed newly created tenants. All values represent the number of days a resource is retained before being permanently purged. Admins can override these per-tenant and per-user via the Retention Admin API.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.api.data-retention.deleted-file-content-retention-days | Days a soft-deleted file is retained before permanent purge | 30 | |
| koldan.api.data-retention.file-content-retention-days | Days after file creation before the source media binary is automatically discarded | 90 | |
| koldan.api.data-retention.completed-transcription-result-retention-days | Days a completed transcription result is retained | 90 | |
| koldan.api.data-retention.failed-transcription-retention-days | Days a failed/cancelled transcription is retained before auto-deletion | 30 | |
| koldan.api.data-retention.deleted-transcription-retention-days | Days a soft-deleted transcription's data is retained before permanent purge | 0 | 0 means data is purged immediately upon soft-deletion |
| koldan.api.data-retention.completed-summary-result-retention-days | Days a completed summary result is retained | 90 | |
| koldan.api.data-retention.failed-summary-retention-days | Days a failed/cancelled summary is retained before auto-deletion | 30 | |
| koldan.api.data-retention.deleted-summary-retention-days | Days a soft-deleted summary's data is retained before permanent purge | 30 | |
| koldan.api.data-retention.completed-translation-result-retention-days | Days a completed translation result is retained | 90 | |
| koldan.api.data-retention.failed-translation-retention-days | Days a failed/cancelled translation is retained before auto-deletion | 30 | |
| koldan.api.data-retention.deleted-translation-retention-days | Days a soft-deleted translation's data is retained before permanent purge | 30 | |
| koldan.api.data-retention.completed-listening-audio-retention-days | Days a completed listening audio MP3 is retained after creation | 90 | |
| koldan.api.data-retention.deleted-listening-audio-retention-days | Days a soft-deleted listening audio is retained before permanent purge | 30 | |
| koldan.api.data-retention.listening-audio-content-retention-days | Days after creation before a listening audio MP3 is automatically discarded | 90 | |
| koldan.api.data-retention.text-translation-history-retention-days | Days a text translation history record is retained before automatic purge | 90 | |
| koldan.api.data-retention.deleted-text-translation-retention-days | Days a soft-deleted text translation's data is retained before permanent purge | 30 |
Audit Log Retention
Retention periods for audit log entries, configured per importance level. The data retention cleanup workflow automatically deletes audit records that have exceeded their configured retention period. Lower-importance events are cleaned more aggressively to keep the audit table manageable while preserving critical compliance records.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.audit.retention.low-days | Days to retain LOW importance audit events | 7 | Health checks, routine reads, OPTIONS/HEAD |
| koldan.audit.retention.medium-days | Days to retain MEDIUM importance audit events | 30 | Standard CRUD, configuration reads, search |
| koldan.audit.retention.high-days | Days to retain HIGH importance audit events | 180 | File uploads, deletions, admin writes |
| koldan.audit.retention.critical-days | Days to retain CRITICAL importance audit events | 365 | Auth failures, impersonation, role changes |
Audit log cleanup runs as part of the Data Retention Cleanup Workflow on the same schedule. Unlike other retention policies, audit retention is global (not per-tenant or per-user).
LLM / Session History AI Properties
These properties configure the LLM providers and the LLM-based generation of summaries and autotitles for session history.
LLM Providers
LLM providers are configured under koldan.llm.providers.<provider-id>. Each provider has a type (openai or ollama) and type-specific settings.
OpenAI Provider Properties
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.llm.providers.\<id>.type | Provider type | Must be openai |
|
| koldan.llm.providers.\<id>.openai.api-key | OpenAI API key | Required | |
| koldan.llm.providers.\<id>.openai.model | Model name (e.g. gpt-4) |
Required unless overridden by task config | |
| koldan.llm.providers.\<id>.openai.base-url | Custom base URL for OpenAI-compatible endpoints | Optional | |
| koldan.llm.providers.\<id>.openai.temperature | Sampling temperature | Optional | |
| koldan.llm.providers.\<id>.openai.timeout | Request timeout | 5m | |
| koldan.llm.providers.\<id>.openai.service-tier | OpenAI service tier (e.g. priority) |
Optional. When not set, no service tier is sent to the OpenAI API | |
| koldan.llm.providers.\<id>.openai.reasoning-effort | Reasoning effort for reasoning models (e.g. low, medium, high) |
Optional. When not set, no reasoning effort is sent to the OpenAI API |
Ollama Provider Properties
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.llm.providers.\<id>.type | Provider type | Must be ollama |
|
| koldan.llm.providers.\<id>.ollama.base-url | Ollama server base URL | http://localhost:11434 | Required |
| koldan.llm.providers.\<id>.ollama.model | Model name | Required unless overridden by task config | |
| koldan.llm.providers.\<id>.ollama.temperature | Sampling temperature | Optional | |
| koldan.llm.providers.\<id>.ollama.timeout | Request timeout | 5m |
Task Configuration
Tasks reference a provider by its ID and optionally override the model:
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.llm.session-history-summary.provider | Provider ID to use for summary generation | ||
| koldan.llm.session-history-summary.model | Model override for summary generation | ||
| koldan.llm.session-history-autotitle.provider | Provider ID to use for autotitle generation | ||
| koldan.llm.session-history-autotitle.model | Model override for autotitle generation |
Task-Specific Properties
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.llm.session-history-autotitle.max-words-in-transcript | Maximum number of words from transcript to use for autotitling | 72 | |
| koldan.llm.session-history-summary.minimum-words-count | Minimum number of words required in a session to allow summary generation. Sessions with fewer words will be rejected with a validation error. | 20 | |
| koldan.llm.session-history-summary.system-prompt-template | Default system prompt used for summary generation when no language-specific or tenant-specific override is found. | Please summarize the following conversation: |
|
| koldan.llm.session-history-summary.user-prompt-template | Default user prompt template used for summary generation. Uses {{transcript}} placeholder. |
TRANSCRIPT:\n{{transcript}} |
|
| koldan.llm.session-history-summary.user-custom-prompt-template | Default user prompt template when a custom user request is provided. Uses {{userCustomPrompt}} and {{transcript}} placeholders. |
USER CUSTOM ADDITIONAL REQUESTS: {{userCustomPrompt}}\n\nTRANSCRIPT:\n{{transcript}} |
|
| koldan.llm.session-history-autotitle.system-prompt-template | Default system prompt used for autotitle generation when no language-specific or tenant-specific override is found. | Please provide a short, descriptive title for the following conversation (maximum 10 words): |
|
| koldan.llm.session-history-autotitle.user-prompt-template | Default user prompt template used for autotitle generation. Uses {{transcript}} placeholder. |
TRANSCRIPT:\n{{transcript}} |
ZooKeeper
ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. Koldan uses ZooKeeper for service discovery and coordination between its distributed microservices.
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.zookeeper.url | Zookeeper connection string for coordination and discovery | localhost:2181 |
Sessions Concurrency Limits
Concurrent session restrictions help manage and limit the number of simultaneous speech recognition sessions that can be active at any given time. This helps prevent system overload and ensures fair resource distribution among users. The system supports both per-user limits (to prevent a single user from consuming too many resources) and global limits (to manage overall system capacity).
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.concurrent-session-restriction.enabled | Enable per-user/global concurrent session limits | false | |
| koldan.concurrent-session-restriction.max-sessions-per-user | Max concurrent sessions per user | 3 | |
| koldan.concurrent-session-restriction.max-global-sessions | Max total concurrent sessions across users | 100 | |
| koldan.concurrent-session-restriction.acquire-timeout-ms | Timeout (milliseconds) waiting for a session slot and acquire lock | 400 |
Task Executors
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.default-task-executor.core-pool-size | Core pool size for task executor | 2 | Default may be incorrect |
| koldan.default-task-executor.max-pool-size | Max pool size for task executor | 8 | Default may be incorrect |
| koldan.default-task-executor.wait-for-tasks-to-complete-on-shutdown | Wait for tasks on shutdown | true | Default may be incorrect |
Discovery
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.discovery.port | UDP discovery service port | 8194 |
Engine K2 configuration
| Property | Description | Default | Notes |
|---|---|---|---|
| koldan.engine.k2.config.sample-rate | Audio sample rate used by the recognizer | 16000 | |
| koldan.engine.k2.config.decoding-method | Decoder decoding method | greedy_search | |
| koldan.engine.k2.config.initial-noise-duration | Duration (in deciseconds) of audio that will be artificially inserted for each transcription segment before the audio received from the client | 0 | |
| koldan.engine.k2.config.final-noise-duration | Duration (in deciseconds) of audio that will be artificially inserted for each transcription segment after the audio received from the client (tail). This value is crucial for ensuring that the last word of the speech is properly recognized. | 6 | |
| koldan.engine.k2.config.batch-size | Decoder batch size | 24 | |
| koldan.engine.k2.config.hot-words.enabled | Enable hot words boosting | false | |
| koldan.engine.k2.config.hot-words.file | File path to hotwords file | ||
| koldan.engine.k2.config.hot-words.default-score | Default hot word score (if not score not specified in hotwords file) | 1.5 | |
| koldan.engine.k2.config.hot-words.modeling-unit | Hot words modeling unit | bpe | |
| koldan.engine.k2.config.endpointing.enabled | Enable endpointing detection | true | True by default for Koldan, false by default in SherpWrap |
| koldan.engine.k2.config.feature-dim | Feature dimension | 80 | |
| koldan.engine.k2.config.max-active | Max active tokens/graphs | 3000 | |
| koldan.engine.k2.config.num-threads | Threads used by decoder | 4 | |
| koldan.engine.k2.config.max-active-paths | Max active paths | 4 | |
| koldan.engine.k2.config.lm-model | External LM model path | ||
| koldan.engine.k2.config.lm-scale | Language model scale | 0.5 | |
| koldan.engine.k2.config.model-type | Model type | zipformer2 | |
| koldan.engine.k2.config.provider | Runtime provider (cpu/cuda) | cpu | CPU/CUDA |
| koldan.engine.k2.config.device-id | Device ID for provider (usually for CUDA) | 0 |