Configuration overview
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_enabledis off by default. When on, every LLM call and every fullexeccommand is appended as JSONL under.bi/logs/network/. That is sensitive data, so enable it only when you specifically need it.link_schemesis the protocol whitelist for rendering Markdown into clickable links —http,https,mailtoby default. Executable protocols likejavascript: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.
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.