# ╔══════════════════════════════════════════════════════════════════════════════╗ # ║ DeepSeek TUI Configuration ║ # ║ ║ # ║ Unofficial CLI for DeepSeek Platform - Not affiliated with DeepSeek Inc. ║ # ╚══════════════════════════════════════════════════════════════════════════════╝ # See `docs/CONFIGURATION.md` for how config is loaded (profiles, env overrides, etc.). # ───────────────────────────────────────────────────────────────────────────────── # Active provider + DeepSeek defaults # ───────────────────────────────────────────────────────────────────────────────── # Choose which provider to use by default. Per-provider credentials live in the # `[providers.*]` sections near the bottom of # this file — keeping both stored at once means `/provider deepseek` and # `/provider nvidia-nim` (or `--provider fireworks`, `/provider sglang`) toggle without having to # re-enter keys. Top-level `api_key` / `base_url` are still read as DeepSeek # defaults when `[providers.deepseek]` is absent (backward compatibility). provider = "deepseek" # deepseek | nvidia-nim | openrouter | novita | fireworks | sglang api_key = "YOUR_DEEPSEEK_API_KEY" # must be non-empty base_url = "https://api.deepseek.com" # base_url = "https://api.deepseeki.com" # China users # base_url = "https://api.deepseek.com/beta" # DeepSeek beta features such as strict tool mode # ───────────────────────────────────────────────────────────────────────────────── # Default Models # ───────────────────────────────────────────────────────────────────────────────── # DeepSeek V4 family: # deepseek-v4-pro — flagship reasoning model on DeepSeek Platform # deepseek-v4-flash — fast, cost-efficient (legacy aliases: deepseek-chat, deepseek-reasoner) # deepseek-ai/deepseek-v4-pro — NVIDIA NIM-hosted Pro model ID # deepseek-ai/deepseek-v4-flash — NVIDIA NIM-hosted Flash model ID # accounts/fireworks/models/deepseek-v4-pro — Fireworks AI Pro model ID # deepseek-ai/DeepSeek-V4-Pro — SGLang self-hosted Pro model ID # deepseek-ai/DeepSeek-V4-Flash — SGLang self-hosted Flash model ID default_text_model = "deepseek-v4-pro" # ───────────────────────────────────────────────────────────────────────────────── # Thinking Mode (DeepSeek V4 reasoning effort) # ───────────────────────────────────────────────────────────────────────────────── # "off" — disables chain-of-thought (thinking.type = disabled) # "low" — compat-maps to "high" server-side # "medium" — compat-maps to "high" server-side # "high" — reasoning_effort = high (DeepSeek default) # "max" — reasoning_effort = max (deepest reasoning) # # Shift+Tab in the TUI cycles between off / high / max. The header shows the # current tier as a ⚡ chip. reasoning_effort = "max" # ───────────────────────────────────────────────────────────────────────────────── # Paths # ───────────────────────────────────────────────────────────────────────────────── skills_dir = "~/.deepseek/skills" mcp_config_path = "~/.deepseek/mcp.json" notes_path = "~/.deepseek/notes.txt" memory_path = "~/.deepseek/memory.md" # Parsed but currently unused (reserved for future versions): # tools_file = "./tools.json" # ───────────────────────────────────────────────────────────────────────────────── # Security # ───────────────────────────────────────────────────────────────────────────────── allow_shell = true approval_policy = "on-request" # on-request | untrusted | never sandbox_mode = "workspace-write" # read-only | workspace-write | danger-full-access | external-sandbox # auto_allow entries match by command prefix, not raw string. # See command_safety.rs for the prefix dictionary. # # Examples: # auto_allow = ["git status"] # auto-approves: git status, git status -s, git status --porcelain # # does NOT auto-approve: git push, git checkout # auto_allow = ["cargo check", "npm run"] # # auto_allow = [] max_subagents = 5 # optional (1-20) # Optional managed policy paths (defaults to /etc/deepseek/*.toml on unix): # managed_config_path = "/etc/deepseek/managed_config.toml" # requirements_path = "/etc/deepseek/requirements.toml" # ───────────────────────────────────────────────────────────────────────────────── # Per-provider credentials (peer providers — NIM is first-class, not a flag) # ───────────────────────────────────────────────────────────────────────────────── # Providers can be stored at once; `provider = "..."` (top of file) or # `/provider deepseek` / `/provider nvidia-nim` / `/provider fireworks` switches between them without # having to re-enter keys. Env vars override anything set here: # DeepSeek: DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL, DEEPSEEK_MODEL # NIM: NVIDIA_API_KEY (or NVIDIA_NIM_API_KEY), NIM_BASE_URL # (or NVIDIA_NIM_BASE_URL / NVIDIA_BASE_URL), NVIDIA_NIM_MODEL # Fireworks: FIREWORKS_API_KEY, FIREWORKS_BASE_URL # SGLang: SGLANG_BASE_URL, SGLANG_MODEL, optional SGLANG_API_KEY # DeepSeek Platform (https://platform.deepseek.com) [providers.deepseek] # api_key = "YOUR_DEEPSEEK_API_KEY" # base_url = "https://api.deepseek.com" # model = "deepseek-v4-pro" # NVIDIA NIM-hosted DeepSeek V4 (https://build.nvidia.com) [providers.nvidia_nim] # api_key = "YOUR_NVIDIA_API_KEY" # base_url = "https://integrate.api.nvidia.com/v1" # model = "deepseek-ai/deepseek-v4-pro" # or deepseek-ai/deepseek-v4-flash # Fireworks AI-hosted DeepSeek V4 (https://fireworks.ai) [providers.fireworks] # api_key = "YOUR_FIREWORKS_API_KEY" # base_url = "https://api.fireworks.ai/inference/v1" # model = "accounts/fireworks/models/deepseek-v4-pro" # Self-hosted SGLang OpenAI-compatible server [providers.sglang] # api_key = "OPTIONAL_SGLANG_TOKEN" # base_url = "http://localhost:30000/v1" # model = "deepseek-ai/DeepSeek-V4-Pro" # or deepseek-ai/DeepSeek-V4-Flash # ───────────────────────────────────────────────────────────────────────────────── # Network Policy (#135) # ───────────────────────────────────────────────────────────────────────────────── # Per-domain allow/deny rules for outbound network calls made by the TUI's # tools (`fetch_url`, `web_search`) and the MCP HTTP transport. Stdio MCP # servers and direct LLM API calls are unaffected. # # Precedence: deny wins. A host listed in both `allow` and `deny` is denied. # # Host-matching rules: # - Exact match: `api.deepseek.com` matches only `api.deepseek.com`. # - Subdomain wildcard: an entry starting with `.` (e.g. `.example.com`) # matches `api.example.com` and `a.b.example.com` but not the apex # `example.com`. To cover both, list both. `*.example.com` is also accepted. # # Defaults are intentionally conservative: when this section is absent, no # policy is enforced (mirrors pre-v0.7.0 behavior). To opt in: # # [network] # default = "prompt" # allow | deny | prompt # allow = ["api.deepseek.com", "github.com", ".githubusercontent.com"] # deny = [] # audit = true # one line per call to ~/.deepseek/audit.log # ───────────────────────────────────────────────────────────────────────────────── # Skills (#140) # ───────────────────────────────────────────────────────────────────────────────── # Settings for the `/skill install ` community-skill installer. # * registry_url — curated index.json that resolves bare names to # `github:owner/repo` specs. Override to point at # a private fork or internal mirror. # * max_install_size_bytes — per-skill uncompressed size cap. Tarballs that # exceed this limit are rejected during validation. # Default: 5 MiB. # # `/skill install` is gated by `[network]`. Make sure `github.com` and # `raw.githubusercontent.com` are reachable (default `prompt` is fine — you'll # be asked once and can persist) before running it. # # [skills] # registry_url = "https://raw.githubusercontent.com/Hmbown/deepseek-skills/main/index.json" # max_install_size_bytes = 5_242_880 # ───────────────────────────────────────────────────────────────────────────────── # TUI # ───────────────────────────────────────────────────────────────────────────────── [tui] alternate_screen = "auto" # auto | always | never mouse_capture = true # true copies only transcript user/assistant text; false uses raw terminal selection/copy # ───────────────────────────────────────────────────────────────────────────────── # Feature Flags # ───────────────────────────────────────────────────────────────────────────────── [features] shell_tool = true subagents = true web_search = true # enables canonical web.run plus the compatibility web_search alias apply_patch = true mcp = true exec_policy = true # ───────────────────────────────────────────────────────────────────────────────── # Retry Configuration # ───────────────────────────────────────────────────────────────────────────────── [retry] enabled = true max_retries = 3 initial_delay = 1.0 max_delay = 60.0 exponential_base = 2.0 # ───────────────────────────────────────────────────────────────────────────────── # Context Compaction # ───────────────────────────────────────────────────────────────────────────────── # Auto-compaction is a saved UI setting edited with `/config` (`auto_compact`). # There is no config-file `[compaction]` table yet; detailed thresholds are # chosen by the TUI from the active model/context budget. # Append-only Flash seams are experimental and opt-in while the v0.7.5 # context/cache audit validates prefix-cache behavior. [context] enabled = false verbatim_window_turns = 16 # Thresholds are based on the active request input estimate, not lifetime # summed API usage. l1_threshold = 192000 l2_threshold = 384000 l3_threshold = 576000 # Hard cycle also reserves the normal 262144-token output budget plus 1024 # safety tokens against the model window. cycle_threshold = 768000 seam_model = "deepseek-v4-flash" # ───────────────────────────────────────────────────────────────────────────────── # Capacity Controller (runtime pressure guardrails) # ───────────────────────────────────────────────────────────────────────────────── [capacity] enabled = false low_risk_max = 0.50 medium_risk_max = 0.62 severe_min_slack = -0.25 severe_violation_ratio = 0.40 refresh_cooldown_turns = 6 replan_cooldown_turns = 5 max_replay_per_turn = 1 min_turns_before_guardrail = 4 profile_window = 8 deepseek_v3_2_chat_prior = 3.9 deepseek_v3_2_reasoner_prior = 4.1 deepseek_v4_pro_prior = 3.5 deepseek_v4_flash_prior = 4.2 fallback_default_prior = 3.8 # ───────────────────────────────────────────────────────────────────────────────── # Profile Example (for multiple environments) # ───────────────────────────────────────────────────────────────────────────────── # Select a profile with `deepseek --profile ` or `DEEPSEEK_PROFILE=`. [profiles.work] api_key = "WORK_DEEPSEEK_API_KEY" base_url = "https://api.deepseek.com" [profiles.dev] api_key = "DEV_DEEPSEEK_API_KEY" allow_shell = true [profiles.nvidia-nim] provider = "nvidia-nim" api_key = "YOUR_NVIDIA_API_KEY" base_url = "https://integrate.api.nvidia.com/v1" default_text_model = "deepseek-ai/deepseek-v4-pro" # ───────────────────────────────────────────────────────────────────────────────── # Desktop Notifications (OSC 9 / BEL on long agent-turn completion) # ───────────────────────────────────────────────────────────────────────────────── # Emits an escape sequence to the terminal when a turn finishes and took longer # than `threshold_secs`. Useful when you tab away from the TUI and want an alert. # # method = "auto" # auto | osc9 | bel | off # auto: OSC 9 for iTerm.app / Ghostty / WezTerm, BEL otherwise. # osc9: \x1b]9;\x07 (iTerm2-style; shows macOS notification) # bel: plain \x07 beep # off: disable entirely # threshold_secs = 30 # only notify when the turn took >= this many seconds # include_summary = false # include elapsed time + cost in the notification body [notifications] # method = "auto" # threshold_secs = 30 # include_summary = false # ───────────────────────────────────────────────────────────────────────────────── # Workspace Snapshots (#137) # ───────────────────────────────────────────────────────────────────────────────── # Each turn the TUI takes a `pre-turn:` and `post-turn:` snapshot of # your workspace into a side-git repo at: # # ~/.deepseek/snapshots///.git # # Your own `.git` is never touched — `--git-dir` and `--work-tree` are always # set together when shelling out to git. Use `/restore N` (slash command) or # the `revert_turn` tool to roll the working tree back. Conversation history # is unaffected. # # Disk footprint: ~1-2 GB worst case for a 100 MB workspace × 12 turns/day, # typically far less thanks to git's content-addressed storage. The session # boot prunes anything older than `max_age_days` (default 7). # # [snapshots] # enabled = true # Snapshot workspace pre/post each turn for /restore # max_age_days = 7 # Older snapshots pruned at session start # ───────────────────────────────────────────────────────────────────────────────── # LSP Diagnostics (post-edit) (#136) # ───────────────────────────────────────────────────────────────────────────────── # After every successful file edit (`edit_file`, `apply_patch`, `write_file`), # the engine asks an LSP server for diagnostics on the file and injects them # as a synthetic system message before the next API call. This lets the agent # see compile breaks immediately without round-tripping through the user. # # Enabled by default. Failure modes are non-blocking: a missing LSP binary, # a crashed server, or a timeout simply skips the post-edit hook for that # turn — the agent's work is never blocked. # # Built-in language → server defaults: # rust → rust-analyzer # go → gopls serve # python → pyright-langserver --stdio # typescript → typescript-language-server --stdio # c, cpp → clangd # # Override the defaults via the `servers` table below. [lsp] # enabled = true # poll_after_edit_ms = 5000 # max_diagnostics_per_file = 20 # include_warnings = false # [lsp.servers] # rust = ["rust-analyzer"] # go = ["gopls", "serve"] # ───────────────────────────────────────────────────────────────────────────────── # Hooks (optional) # ───────────────────────────────────────────────────────────────────────────────── # Hooks run shell commands on lifecycle events (session start/end, tool calls, etc.). # Configure as `[[hooks.hooks]]` under a `[hooks]` table. # # [hooks] # enabled = true # default_timeout_secs = 30 # # [[hooks.hooks]] # event = "session_start" # command = "echo 'DeepSeek TUI session started'" # ───────────────────────────────────────────────────────────────────────────────── # Requirements (admin constraints) example file # ───────────────────────────────────────────────────────────────────────────────── # allowed_approval_policies = ["on-request", "untrusted", "never"] # allowed_sandbox_modes = ["read-only", "workspace-write"]