Skip to content

Model Configuration

This guide explains how Self-Managed Kindo installations define and maintain global models — the system-wide LLMs (and related models like embeddings or transcription) that power workflows, chat, ingestion, and other core experiences.

In a self-managed environment, you add models to Kindo, map them to Unleash feature variants, and keep those mappings up to date when models are replaced.

Each key below is an Unleash feature whose variant payload contains one or more global model IDs. The backend and frontend read these variants to decide which models to use.

Feature KeyDescription
AUDIO_TRANSCRIPTIONConverts audio to text
CRON_EXPRESSION_GENERATIONGenerates cron expressions from natural language schedule descriptions
DEFAULT_WORKFLOW_STEP_MODELDefault model for workflow step execution
EMBEDDING_MODELSModels for generating text embeddings
INGESTION_WORKERSModels for data ingestion and extraction
INTERNAL_AUTO_GENERATIONInternal model for automatic content generation and internal worker tasks
LOCAL_STORAGE_CHAT_ACTIONS_MODELSFallback default chat model for the model dropdown and chat action selection. Applies when an org admin has not chosen a default chat model in Settings → Models (or the chosen model is unavailable)
TOOL_CALLING_MODELSModels that support tool/function calling (used to filter model selection in chat UI)
Feature KeyDescriptionNotes
API_STEP_GENERATIONModels for generating API steps in workflows
DYNAMIC_API_REQUEST_PARSERParses dynamic API requests
SLACK_MESSAGE_GENERATIONGenerates Slack messagesOnly if Slack integration is enabled
MULTIMODAL_MODELSModels with image/multimodal input supportOnly if multimodal chat is enabled

Self-Managed Kindo needs baseline global models to function. Without them, core flows like chat, workflow execution, ingestion, and indexing will fail.

Model TypePurposeRecommendations
Embedding modelSemantic search, retrieval, and indexingOpen source: BAAI/bge-m3. Hosted: Gemini embedding
Strong/large modelComplex reasoning, workflow execution, long-form generationOpen source: gpt-oss 120B. Hosted: Gemini 2.5 Pro, Claude 4.5, GPT 5.2
Audio transcriptionAudio file processing, voice notes, transcription workflowsOpen source: Faster Whisper. Hosted: Deepgram
  • Small model (title generation, quick summaries, low-latency steps): Gemma 3 or Llama 3.2 7B
  • Security-focused: DeepHat 32B
  • Multimodal: Gemini 2.5 Pro (image + text)
  1. Add the new model in Settings → Models → Add model.
  2. Update Unleash variants to reference the new model IDs.
  3. Delete the old model with replacement.

If you are operating through the released Helmfile installer, the equivalent workflow is make add-models, then make sync-model-flags. That path updates only the model ID payloads for the model-related flags instead of re-importing the full Unleash export.

A self-managed model is a model you already run or pay for somewhere else — a self-hosted vLLM box, a serverless endpoint such as Together, Fireworks, or Groq, an internal inference gateway, or your own OpenAI account — that you want to use inside Kindo for chat and agents. The endpoint must be OpenAI-compatible (it accepts OpenAI-style chat completion requests). The Add Model form asks only for the handful of facts any such endpoint needs, in plain English.

FieldRequired?What to enter
Display nameYesThe name you’ll see in Kindo when choosing this model, for example Llama 3.3 70B (self-managed).
Model IDYesThe model’s name exactly as your endpoint expects it in a request, for example Qwen/Qwen3.7-Max, llama-3.3-70b, or gpt-4o. Use exactly what your provider or server calls it. For Azure OpenAI, use your deployment name.
Endpoint URLYesThe base URL of your model’s API, for example https://api.together.xyz/v1, http://my-vllm:8000/v1, or https://your-resource.openai.azure.com. Paste exactly what your provider gives you — Kindo tidies it up (trims it, drops a trailing slash or a mis-pasted /chat/completions, and adds the version segment if your base URL doesn’t already include one).
API versionNoLeave blank for most providers. Only needed when your endpoint requires an api-version query parameter — for example an Azure OpenAI deployment pinned to a dated version such as 2024-10-21.
API keyYesThe key your endpoint uses to authenticate. Stored encrypted; never shown again.
Context windowYesYour model’s maximum context length in tokens, from your provider’s docs, for example 128000. Kindo uses this to keep long conversations within the model’s limit.
Max output tokensYesThe maximum number of tokens the model should generate per response, from your provider’s docs, for example 4096.

Paste the base URL your provider hands you. Common shapes already work as-is:

  • OpenAI: https://api.openai.com/v1
  • Together: https://api.together.xyz/v1
  • Groq: https://api.groq.com/openai/v1
  • Fireworks: https://api.fireworks.ai/inference/v1
  • Self-hosted vLLM: http://<host>:8000 (Kindo appends /v1 for you)
  • Azure OpenAI: https://<your-resource>.openai.azure.com (Kindo routes to Azure’s OpenAI-compatible /openai/v1 surface for you)

Azure OpenAI endpoints work like any other OpenAI-compatible endpoint:

  • Most deployments: paste your resource URL (for example https://my-resource.openai.azure.com), set Model ID to your deployment name, and leave API version blank. Kindo talks to Azure’s OpenAI-compatible v1 surface, which needs no api-version parameter.
  • Deployments pinned to a dated API version: fill in the API version field (for example 2024-10-21) and Kindo dispatches through Azure’s versioned API instead. Pasting the full target URI from the Azure portal (https://…/openai/deployments/<name>/chat/completions?api-version=…) also works — Kindo picks up the api-version from the URL automatically.

Test & Save (the primary button) sends one real chat completion to your endpoint before anything is saved. If the test fails, nothing is created — the form stays filled in and the error points at the field to fix: a rejected key highlights API key, an unknown model name highlights Model ID, an unreachable or timed-out endpoint highlights Endpoint URL, and a too-high Max output tokens or a rejected request parameter is called out by name. From the failure banner you can either Edit the form and test again, or Save anyway to store the config without a passing test.

Save without testing skips the test entirely — useful when the endpoint is temporarily down, a self-hosted model is cold-starting, or you don’t want to spend a request on a quota-limited endpoint.

The model list shows the outcome as a chip next to each self-managed model: Verified (last test passed), Untested (saved without a passing test), or Failed (a later re-test failed — hover the chip for the reason). Kindo’s built-in global models are managed for you and carry no chip.

Terminal window
curl -X POST <API_URL>/internal/openapi/admin/model/new \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <UM_INTERNAL_API_KEY>' \
-d '{
"orgId": "<YOUR_ORG_ID>",
"userId": "<YOUR_USER_ID>",
"displayName": "Model Display Name",
"modelProviderDisplayName": "Provider Name",
"type": "CHAT",
"contextWindow": 200000,
"metadata": {
"type": "Text Generation",
"costTier": "HIGH",
"usageTag": "Chat + Agents",
"description": "Model description",
"modelCreator": "Provider Name"
},
"litellmModelName": "model-name",
"litellmParams": {
"model": "provider/model-name",
"api_key": "<API_KEY>",
"max_tokens": 64000
}
}'
Terminal window
curl -X POST <API_URL>/internal/openapi/admin/model/delete-with-replacement \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <UM_INTERNAL_API_KEY>' \
-d '{
"deletingModelId": "<OLD_MODEL_ID>",
"replacementModelId": "<NEW_MODEL_ID>",
"orgId": "<YOUR_ORG_ID>",
"userId": "<YOUR_USER_ID>"
}'

To modify LiteLLM parameters for an existing model, update the LiteLLM database directly:

UPDATE "public"."LiteLLM_ProxyModelTable"
SET "litellm_params" = jsonb_set(
"litellm_params",
'{max_tokens}',
'64000'::jsonb
)
WHERE "model_name" = 'your-model-name';