Skip to content

Configuration

The exhaustive reference. Every key in kazma.yaml, every environment variable, the ConfigStore override model, the provider/model registry, and the security config files — all traceable to source.


Kazma resolves configuration from three layers. For the generic ConfigStore.get(key), the order is:

flowchart LR
C[In-process cache] -->|miss| DB[(SQLite settings.db)]
DB -->|miss / child-merge| YAML[(kazma.yaml)]
YAML -->|fallback| DEFAULT[hardcoded default]
#LayerWins?Notes
1Env varOnly in specific helpers (get_kazma_secret, get_or_create_disclosure_key) — not in the generic get().e.g. KAZMA_SECRET
2ConfigStore DB (kazma-data/settings.db)Yes for runtime reads via get().DB overrides YAML.
3kazma.yamlBaseline on first boot.reconcile_from_yaml() seeds DB only for keys not already present.
4Hardcoded defaultLast resort.e.g. gpt-4o-mini, DEFAULT_DANGER_TOOLS.
  • ConfigStore.get(key) (config_store.py:471-516): checks the in-process _cache first (with a _MISSING sentinel for known-absent keys), then an exact DB row, then a DB child-key re-merge via _collect_prefixed (rows whose key starts with key. are de-dotted into a nested dict), then a YAML dotted-key lookup.
  • ConfigStore.set(key, value) writes one row and clears the cache for that key (config_store.py:518-536).
  • ConfigStore.batch_set(items) is the atomic multi-key write — single BEGIN/COMMIT, rollback on any failure (config_store.py:538-568). Always prefer it for multi-key updates.
  • ConfigStore.transaction() is a @contextmanager yielding the raw connection for caller-driven multi-op transactions (config_store.py:572).
  • reconcile_from_yaml() seeds DB with kazma.yaml leaf values for keys not already in DB — it never overwrites existing DB keys (config_store.py:678-685). This is the startup step that makes ConfigStore authoritative.
  • export_yaml() / import_yaml() round-trip DB overrides merged into YAML (config_store.py:632, 650).
  • reset_all() deletes all DB rows → reverts to YAML defaults (config_store.py:732).

Singleton rule: Always use get_config_store() (config_store.py:760), never ConfigStore() directly. On SQLite init failure it falls back to a thread-safe _InMemoryStore with TTL eviction (config_store.py:777) — settings then won’t survive a restart.


The full default file (kazma.yaml) with every key, type, and default. Line numbers reference the shipped file.

KeyTypeDefaultDescription
agent.namestringkazmaBot display name.
agent.versionstring0.2.0Note: diverges from pyproject.toml (0.3.0). Not auto-synced.
agent.languagestringarUI/agent language. ar → RTL + Arabic; en → English.
agent.rtlbooltrueMaster RTL switch.
KeyTypeDefaultDescription
models.defaultstringgpt-4o-miniDefault model id.
models.routerstringlitellmString only. Gates the fallback-model branch in llm_provider.py:336. Kazma does not import litellm — it treats LiteLLM as a compatible proxy endpoint on port 4000.
models.fallbackstringgpt-4o-miniModel used on retry if router == "litellm" and a request fails (llm_provider.py:335-347).
KeyTypeDefaultDescription
llm.base_urlstringhttps://api.openai.com/v1OpenAI-compatible endpoint. /v1 is auto-appended if missing (except Ollama :11434 and LiteLLM :4000).
llm.api_keystring''Leave empty to load from env (OPENAI_API_KEYKAZMA_API_KEY"not-needed" for local).
llm.modelstringgpt-4o-miniModel id sent in the payload.
llm.max_tokensint4096Completion token cap.
llm.temperaturefloat0.7Sampling temperature.
llm.timeoutfloat60.0Per-request timeout (seconds).
llm.input_cost_per_1mfloat0.15USD per 1M input tokens — used for cost accounting.
llm.output_cost_per_1mfloat0.6USD per 1M output tokens.
KeyTypeDefaultDescription
mcp.serverslistsee belowMCP server definitions.
mcp.servers[].namestringServer identifier.
mcp.servers[].transportstringstdiostdio or sse. SSE supports an auth field (bearer/custom header).
mcp.servers[].truststringtrustedPlain config string — not consumed by any trust-tier code.
mcp.servers[].commandlistargv for stdio spawn.
mcp.ide_server.enabledbooltrueEnable the in-process IDE/file MCP server.
mcp.ide_server.rootstring.Workspace root.
mcp.ide_server.max_file_sizeint10485761 MB file size cap.

Shipped default server:

mcp:
servers:
- name: filesystem
transport: stdio
trust: trusted
command: [npx, -y, '@modelcontextprotocol/server-filesystem', 'kazma-data/workspace']
ide_server:
enabled: true
root: .
max_file_size: 1048576

Multi-line string. The default is Arabic-aware: “You are Kazma (كاظمه), an autonomous AI agent framework…” and instructs the model to respond in the user’s language/dialect.

KeyTypeDefaultDescription
storage.enginestringsqliteCheckpointer engine.
storage.pathstringkazma-data/checkpoints.dbLangGraph checkpointer DB.
storage.vector_dimint1536Declared vector dimension. Note: the actual VectorMemory uses all-MiniLM-L6-v2 (384-d). This value is informational and not enforced consistently.
KeyTypeDefaultDescription
memory.enabledbooltrueMaster memory switch.
memory.max_context_tokensint128000Context window for compaction. Compaction fires at 80% (= 102,400).
memory.retrieval_top_kint5Top-K for memory retrieval (used by compaction’s intended retrieval step — see Memory & RAG).
memory.provenancebooltrueTag memories with source metadata.
KeyTypeDefaultDescription
skills.pathstringkazma-skills/manifests/Skill manifest directory.
skills.auto_discoverbooltrueAuto-load manifests on startup.
KeyTypeDefaultToken env var
connectors.telegram.enabledbooltrueTELEGRAM_BOT_TOKEN
connectors.discord.enabledboolfalseDISCORD_BOT_TOKEN
connectors.slack.enabledboolfalseSLACK_BOT_TOKEN + SLACK_APP_TOKEN
KeyTypeDefaultDescription
gateway.rate_limits.telegramint30Requests per window.
gateway.rate_limits.discordint5Requests per window.
gateway.rate_limits.slackint1Requests per window.
gateway.suggestions.enabledbooltrueSuggested-followup UI.
gateway.voice.enabledboolfalseVoice/STT (Telegram only).
gateway.voice.providerstringopenaiOne of openai, local, groq.
KeyTypeDefaultDescription
safety.hitl.enabledbooltrueMaster HITL switch (graph path).
safety.hitl.require_approval_forlistsee belowDanger tools for the graph path.
safety.hitl.approval_timeout_secondsint60Pipeline-checkpoint auto-reject timeout.
safety.hitl.auto_deny_on_timeoutbooltrueAuto-reject paused tasks on timeout.

Default require_approval_for:

safety:
hitl:
enabled: true
require_approval_for:
- file_write
- file_delete
- shell_exec
- code_exec
- python_exec
- spawn_agent
- spawn_agents
- schedule_task
- cancel_scheduled
approval_timeout_seconds: 60
auto_deny_on_timeout: true

The swarm bus uses a separate, broader list (_EXTENDED_DANGER adds python_exec, code_exec, spawn_agent, spawn_agents, schedule_task, cancel_scheduled, run_tests). The MCP path classifies dynamically by name pattern. See Security & Safety → danger-tool lists.

KeyTypeDefaultDescription
ui.hoststring127.0.0.1Bind host. Switches to 0.0.0.0 under kazma serve only if KAZMA_SECRET is set.
ui.portint8000Bind port.
ui.rtlbooltrueUI RTL.
ui.titlestringKazma DashboardPage title.
KeyTypeDefaultDescription
logging.levelstringINFOLog level.
logging.formatstringjsonjson or plain.
logging.langfuse.enabledboolfalseLangfuse tracing. Roadmap — dependency present, integration not active.
logging.langfuse.public_keystring''
logging.langfuse.secret_keystring''
KeyTypeDefaultDescription
time_travel.enabledbooltrueEnable /replay.
time_travel.max_snapshotsint50Snapshot cap.
time_travel.db_pathstringkazma-data/snapshots.dbSnapshot DB.
KeyTypeDefaultDescription
swarm.enabledbooltrueMaster swarm switch.
swarm.group_chat_idint0Real value read from SWARM_CHAT_ID env.
swarm.default_patternstrdispatchFallback pattern: dispatch | pipeline | consult | fan_out | broadcast.
swarm.auto_routebooltrueEnable semantic auto-routing (UnifiedRouter) for workers=["auto"].
swarm.max_concurrent_tasksint10 (1–100)Max concurrent swarm tasks.
swarm.max_concurrentint5Fan-out / broadcast / consult worker concurrency.
swarm.orchestrator.namestringKazma OrchestratorOrchestrator display name.
swarm.orchestrator.profilestringdefaultOrchestrator profile id.
swarm.workerslist[]Populated at runtime via Web UI / POST /api/swarm/workers.
swarm.output_targetobjnone{bot_token, chat_id, platform, enabled} — when set, the token must match the active Telegram bot token.

Two predefined pipelines (lists of stages, each with worker, depends_on, system_prompt):

  • standard — 4 stages: researcher (worker core) → refiner (worker bridge) → builder (worker core) → validator (worker bridge).
  • quick — 2 stages: researcher (worker core) → builder (worker core).

VariablePurposeDefault
TELEGRAM_BOT_TOKENTelegram adapter token.placeholder
DISCORD_BOT_TOKENDiscord adapter token.empty
SLACK_BOT_TOKENSlack bot token.empty
SLACK_APP_TOKENSlack app token (Socket Mode).empty
OPENAI_API_KEYOpenAI key (also generic LLM fallback #2).empty
DEEPSEEK_API_KEYDeclared in .env.example but not read by code — set the key via the provider list instead.empty
ANTHROPIC_API_KEYDeclared in .env.example but not read by code.empty
GOOGLE_CLOUD_PROJECTGCP project for Vertex AI (if ADC lacks a default).commented out
SWARM_BOT_TOKENSwarm output bot token.empty
SWARM_CHAT_IDSwarm group chat id (feeds swarm.group_chat_id).empty
KAZMA_SECRETHITL shared secret; binds serve to 0.0.0.0; hub write-auth; kazma hub sign.commented out
KAZMA_VECTOR_PATHVector memory dir.~/.kazma/vector_memory
KAZMA_VECTOR_COLLECTIONChromaDB collection name.agent_memory
KAZMA_VECTOR_MODELEmbedding model.all-MiniLM-L6-v2
VariablePurposeLocation
KAZMA_AUTH_DISABLEDIf true/1/yes, get_kazma_secret() returns "" (auth disabled).config_store.py:52
KAZMA_DISCLOSURE_KEYDisclosure HMAC key; auto-generated if unset.config_store.py:95
KAZMA_API_KEYLLM key fallback #3.llm_provider.py:142
KAZMA_MAX_COSTCost breaker ceiling (default $0.50).cost_breaker.py:42
KAZMA_SILENCE_WINDOWCost breaker silence window (default 300s).cost_breaker.py:44
KAZMA_SEMANTIC_CACHEEnable response cache ("true", default off).llm_provider.py:212
KAZMA_HUB_DBHub SQLite registry path.hub/cli.py:109
KAZMA_HUB_URLHub API base (default https://hub.kazma.ai).hub/cli.py:115
KAZMA_PORTServer port override (default 8000).gateway.py:36
HF_HUB_DISABLE_SYMLINKS_WARNING / HF_HUB_DISABLE_TELEMETRYSilence HuggingFace telemetry (set by CLI).main.py:9-10

No dedicated per-provider env vars for DeepSeek/Anthropic/xAI/Groq/Gemini are read by kazma_core. Key those providers through the ConfigStore provider list or kazma.yaml.


LLMProvider._resolve_api_key() (llm_provider.py:136-146) resolves in this order:

  1. self.config.api_key (from LLMConfig)
  2. os.getenv("OPENAI_API_KEY")
  3. os.getenv("KAZMA_API_KEY")
  4. "not-needed" (for local LM Studio/Ollama)

Provider-specific dummy keys for local servers (url_utils.py:138-172):

ServerDummy key
LM Studio (:1234)sk-lm-studio-dummy-key
Ollama (:11434)ollama
LiteLLM proxy (:4000)sk-litellm-dummy-key
other localhostnot-needed

Google Vertex AI uses Application Default Credentials only — no API key. GeminiProvider._resolve_api_key() returns "adc-placeholder" and the real bearer token is fetched per-call via google.auth.default() + credentials.refresh() (google_llm.py:232-252). Project resolution: explicit project_id= > GOOGLE_CLOUD_PROJECT > google.auth.default() > ADC quota_project_id > gcloud config_default.

Keys are stored per-provider in ConfigStore providers.list (each entry has api_key, base_url, models, …). Masked placeholders (***) are rejected on upsert unless a real key already exists (model_registry.py:646-652); keys are masked in all read-backs (_mask_profile).


ModelRegistry (model_registry.py:81) is a process-wide singleton (module global _registry, thread-safe via threading.RLock()). Backward-compat alias: UnifiedModelRegistry (line 950).

FunctionPurpose
initialize_model_registry(config_store)Construct + deserialize + seed presets.
get_model_registry()Retrieve singleton (raises RuntimeError if uninitialized).
reset_model_registry()Teardown.

From kazma-core/kazma_core/providers.py:13-84:

KeyDisplay namebase_urlauth_header
openaiOpenAIhttps://api.openai.com/v1Bearer
anthropicAnthropichttps://api.anthropic.com/v1x-api-key
deepseekDeepSeekhttps://api.deepseek.com/v1Bearer
googleGoogle Gemini(computed per project/location)Bearer
xaixAI / Grokhttps://api.x.ai/v1Bearer
openrouterOpenRouterhttps://openrouter.ai/api/v1Bearer
ollamaOllama (Local)http://127.0.0.1:11434/v1(none)
lm-studioLM Studio (Local)http://localhost:1234/v1(none)
nvidiaNVIDIA NIMhttps://integrate.api.nvidia.com/v1Bearer
customCustom Endpoint(blank)Bearer

Hardcoded GEMINI_MODELS (Vertex AI has no static /models endpoint): gemini-2.5-flash, gemini-2.5-pro, gemini-2.0-flash, gemini-2.0-flash-lite.

Default-enabled provider: Only google is enabled=True out of the box (model_registry_store.py:117). All others must be configured before use. custom is excluded from preset seeding.

Anthropic auth caveat: The preset declares auth_header: x-api-key, but LLMProvider.chat() always sends Authorization: Bearer. The preset header only takes effect during discover_models(). For chat, Anthropic may require routing through an OpenAI-compatible proxy.

discover_models(provider_name) (model_registry.py:427) hits {base_url}{models_endpoint} (default /models), parses the OpenAI {"data":[{"id":...}]} shape, with an SSRF guard (kazma_core.security.ssrf.validate_url). Results cached in _discovered_models.

KeyPurpose
providers.listStored provider array.
providers.health.*Per-provider health.
models.saved.*Saved model profiles.
models.defaults.*Per-task defaults (chat, code, summarize, translate).
llm.model, llm.base_url, llm.api_keyLegacy fallbacks.
registry.active_provider, registry.active_model, registry.discovered_modelsActive selection + cache.

The tenacity-based retry decorators read overrides from ConfigStore (retry.py:69-86):

KeyDefaultDescription
retry.max_attempts3Max retry attempts.
retry.min_wait2 (s)Min backoff.
retry.max_wait10 (s)Max backoff.

Retries fire only on network/timeout exceptions (ConnectionError, TimeoutError, asyncio.TimeoutError, httpx TimeoutException/ConnectError/RemoteProtocolError). 4xx errors are never retried (retry.py:107-109). There is no 429 backoff.


Enterprise division-based MCP allow/deny lists (the “ALMuhalab” divisions):

divisions:
gas_oil:
allowed_mcp_servers: [oil-pricing-api, contract-manager, supplier-directory]
denied_mcp_servers: [tourism-booking-api, general-inventory-api]
tourism:
allowed_mcp_servers: [booking-engine, hotel-api, flight-search]
denied_mcp_servers: [oil-pricing-api, contract-manager]
general_trading:
allowed_mcp_servers: [inventory-api, supplier-directory, procurement-api]
denied_mcp_servers: [oil-pricing-api, booking-engine]
cross_division_rules:
require_explicit_approval: true
max_approval_duration_hours: 24
notify_admins: true
audit_all_access: true
SectionKey options
scanningenabled, interval: "24h", sources: [osv, github_advisories, nvd], auto_create_issues, severity_threshold: medium, ignore.
disclosureenabled, response_window: "48h", assessment_window: "7d", pgp_key_url, encrypted_channels.
bug_bountyenabled, min_payout: 50, max_payout: 2000, currency: USD, tiers (critical [500,2000], high [200,500], medium [50,200], low Hall of Fame).
hardeningrun_on_startup, fail_on_critical, auto_fix: false, checks (8: secrets_in_logs, input_validation, rbac_enforcement, tls_required, dependency_audit, least_privilege, audit_trail, config_integrity).

These files declare a security policy posture. Whether every check is actively enforced at runtime should be verified against the hardening runner before relying on it in production — see Security & Safety.

commands:
install: "pip install -e kazma-tui/ -e kazma-core/"
test: "python -m pytest kazma-tui/tests/ -v"
lint: "python -m ruff check kazma-tui/kazma_tui/"
typecheck: "python -m mypy kazma-tui/kazma_tui/"
services: {}

  • Version drift: pyproject.toml is 0.3.0; kazma.yaml agent.version is 0.2.0; the CLI --help text prints v0.2.0. These are independent and unsynchronized — a known wart.
  • storage.vector_dim: 1536 does not match the actual embedding model (all-MiniLM-L6-v2 = 384-d). Documented as-is.
  • .env.example lists DEEPSEEK_API_KEY / ANTHROPIC_API_KEY but no code reads them — flagged to prevent user confusion.
  • mcp.servers[].trust is a plain YAML string with no enforcing consumer — not a cryptographic trust tier.