-
Notifications
You must be signed in to change notification settings - Fork 0
Configuration
Two files, clear separation:
-
config.yaml— non-secret, environment-specific settings (copy fromconfig.example.yaml). -
.env— secrets only (copy from.env.example; auto-created chmod 600). Never commit it.
Everything in config.yaml is also editable live from Settings in the dashboard. The jarvis/ package is the source of truth — install.sh never overwrites it.
identity:
name: Jarvis
owner: you
mode: shadow # shadow | active | autonomous-
shadow — proposes only, never executes (default;
would_execute = mode != "shadow"). - active / autonomous — executes allowed action classes.
action_classes:
investigate: allow # read-only
propose: allow # write a plan / open a PR
fix_pr: ask
deploy: deny
infra_mutate: deny
self_modify: deny # only via the seatbelt, opt-in deliberatelyValues: allow | ask | deny.
llm:
think_on_tick: true
routing: # role -> backend:model
triage: ollama_cloud:deepseek-v4-flash
orchestrator: claude:opus # the main brain — frontier
red_team: claude:opus
researcher: ollama_cloud:deepseek-v4-pro
fixer: ollama_cloud:deepseek-v4-pro
fallbacks: [ollama_cloud:deepseek-v4-flash]
aliases: {opus: claude-opus-4-8, sonnet: claude-sonnet-4-6, haiku: claude-haiku-4-5}
backends:
claude: ["claude","-p","--model","{model}"] # CLI
ollama_cloud: {http: "https://ollama.com/v1/chat/completions", api_key_env: OLLAMA_API_KEY} # HTTP
params: # optional per-role reasoning + context controls
orchestrator: {effort: high, context: 1000000} # Claude CLI: --effort + 1M variant
triage: {effort: low, context: 131072} # Ollama: reasoning_effort + num_ctx
fixer: {effort: high} # Codex: reasoning_effortA backend is either a CLI template (list, with {model}/{prompt}) or an HTTP endpoint (dict). HTTP is OpenAI-compatible by default; add format: anthropic for the Anthropic Messages API.
params are auto-validated against what each model supports — set them from the dashboard and Jarvis only offers (and keeps) valid values. The reasoning control name and option set differ per backend; context is the chosen window. See Model Routing for the full matrix.
mcp:
servers:
- {name: filesystem, command: npx, args: ["-y","@modelcontextprotocol/server-filesystem","/path"], enabled: true}
- {name: my-remote, url: "https://example.com/mcp", scope: "openid email", enabled: true} # OAuth ConnectLocal stdio servers (a command) or remote HTTP servers (a url, connected via one-click OAuth in Settings → MCP). Secrets are references, never values: env: {API_KEY: "${env:API_KEY}"}. See MCP.
The order Jarvis triages each tick (top = most important). Edit in Settings → Behavior or:
priorities: [p0_active_incident, p1_unfinished_wip, p2_self_caused_regression,
p4_self_maintenance, p5_curiosity, p3_needs_human_backlog]memory:
working: {kind: redis, url: redis://localhost:6379/0}
episodic: {kind: postgres, dsn: "postgresql://…"} # degrades to a JSONL ledgerJARVIS_LEDGER overrides where the jsonl reflection ledger lives.
ANTHROPIC_API_KEY=
OPENAI_API_KEY=
OLLAMA_API_KEY=
POSTGRES_PASSWORD=
TELEGRAM_BOT_TOKEN=
TELEGRAM_CHAT_ID=
Secrets are read into the environment at load; the dashboard writes connected keys here (chmod 600). See Safety.