---
title: "Configuration overview"
description: "How the config files are laid out and what each switch does."
---

Bi's configuration is not one big table — it is split into small files by responsibility, all under `.bi/` in the launch directory:

| File | Controls |
| --- | --- |
| `config.json` | Runtime settings: port, workspace, default model, loop limits, thresholds |
| `llm.json` | Multi-provider / multi-model config, plus each provider's API key |
| `permissions.json` | Tool permission rules and auto-approval rules |
| `intercept_rules.json` | Intercept rules (match = reject) |
| `bi.db` | SQLite session database (messages, tool calls, usage stats) |
| `history.json` | Plaintext cross-session conversation log |
| `checkpoints/` | Workspace shadow Git repo for "roll back to this step" |
| `skills/`, `plugins/` | Skill and plugin directories |
| `logs/` | Runtime logs and network activity records |

## Key fields in config.json

| Field | Default | Meaning |
| --- | --- | --- |
| `base_url` | `https://api.deepseek.com/v1` | Model endpoint |
| `model` | `deepseek-chat` | Default model |
| `port` | `8080` | Local server port |
| `workspace` | Launch directory | Workspace root for the agent |
| `max_loops` | `200` | Max tool-loop iterations per turn |
| `max_sub_agents` / `max_sub_depth` | `5` / `2` | Sub-agent count and depth limits |
| `turn_timeout` | `30` (minutes) | Total time cap for one turn |
| `recent_turns_full` | `6` | Recent turns injected in full when packing context |
| `tool_result_keep` | `4` | Tool results kept in full inside a tool loop |
| `read_cache_enabled` | `true` | Read-result cache (mtime+size checked) |
| `network_log_enabled` | `false` | Network activity log (off by default, privacy first) |
| `auto_search` | `true` | New conversations start with smart search on |
| `disabled_tools` | — | Tool ids to disable |

Two fields worth attention:

- **`network_log_enabled`** is off by default. When on, every LLM call and every full `exec` command is appended as JSONL under `.bi/logs/network/`. That is sensitive data, so enable it only when you specifically need it.
- **`link_schemes`** is the protocol whitelist for rendering Markdown into clickable links — `http`, `https`, `mailto` by default. Executable protocols like `javascript:` are never rendered as links.

## Missing-field behaviour

An absent field falls back to the defaults above; an explicit `0` / `false` usually means "off" and is respected (a few fields like `recent_turns_full` have no meaningful 0, so they fall back too). When unsure, delete the field entirely and let it return to default — don't guess.

## Providers and keys

Provider and key configuration lives separately in `llm.json`; it migrates once from a legacy `config.json`. Keys only travel to the endpoint you configured — Bi has no server of its own. See [model providers](/en/docs/configuration/providers).

## UI vs files

The settings UI edits exactly these files, so both stay in sync. For bulk edits or version-controlled configuration, edit the files directly — changes are picked up on save without a restart.
