Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@
# DEEPSEEK_BASE_URL=https://api.deepseek.com
# DEEPSEEK_PROVIDER=deepseek-cn

# Some third-party endpoints not surport url with version
# set `DEEPSEEK_PATH_SUFFIX` to empty string to disable adding `v1` to base_url without version
# set to other content to overwrite the version of base_url
# DEEPSEEK_BASE_URL = "http://www.example.com/"
# DEEPSEEK_PATH_SUFFIX = ""

# V4 model selection. Compatibility aliases such as `deepseek-chat` normalize
# to the current V4 flash model in the TUI.
# DEEPSEEK_MODEL=deepseek-v4-pro
Expand Down
47 changes: 29 additions & 18 deletions config.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@
# `--provider volcengine`, `--provider xiaomi-mimo`, `--provider fireworks`,
# `--provider siliconflow`, `/provider arcee`, `/provider moonshot`, `/provider sglang`,
# `/provider vllm`, `/provider ollama`) toggle without having to re-enter keys. Top-level
# `api_key` / `base_url` are
# `api_key` / `base_url` / `path_suffix` are
# still read as DeepSeek defaults when `[providers.deepseek]` is absent
# (backward compatibility).
provider = "deepseek" # deepseek | deepseek-cn | nvidia-nim | openai | atlascloud | wanjie-ark | volcengine | openrouter | xiaomi-mimo | novita | fireworks | siliconflow | arcee | moonshot | sglang | vllm | ollama
api_key = "YOUR_DEEPSEEK_API_KEY" # must be non-empty
base_url = "https://api.deepseek.com/beta"
# provider = "deepseek-cn" # legacy alias (official host is still https://api.deepseek.com)
# base_url = "https://api.deepseek.com" # opt out of DeepSeek beta features
# path_suffix = "v2" # overwrite or add the version to base_url, set to "" if accept only like `/chat/completions`
# Optional custom model request headers for OpenAI-compatible gateways.
# Authorization and Content-Type are managed by the client and cannot be overridden here.
# http_headers = { "X-Model-Provider-Id" = "your-model-provider" }
Expand Down Expand Up @@ -230,27 +231,32 @@ max_subagents = 10 # optional (1-20)
# `--provider wanjie-ark` / `/provider volcengine` / `/provider fireworks` /
# `--provider siliconflow` / `/provider arcee` / `/provider moonshot`
# switches between them without having to re-enter keys. Env vars override anything set here:
# DeepSeek: DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL, DEEPSEEK_MODEL
# DeepSeek: DEEPSEEK_API_KEY, DEEPSEEK_BASE_URL, DEEPSEEK_PATH_SUFFIX, 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
# OpenAI-compatible: OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MODEL
# Wanjie Ark: WANJIE_ARK_API_KEY (or WANJIE_API_KEY), WANJIE_ARK_BASE_URL, WANJIE_ARK_MODEL
# Volcengine Ark: VOLCENGINE_API_KEY (or VOLCENGINE_ARK_API_KEY / ARK_API_KEY), VOLCENGINE_BASE_URL, VOLCENGINE_MODEL
# OpenRouter: OPENROUTER_API_KEY, OPENROUTER_BASE_URL, OPENROUTER_MODEL
# Xiaomi MiMo: XIAOMI_MIMO_API_KEY (or XIAOMI_API_KEY / MIMO_API_KEY), XIAOMI_MIMO_BASE_URL, XIAOMI_MIMO_MODEL
# Novita: NOVITA_API_KEY, NOVITA_BASE_URL, NOVITA_MODEL
# Fireworks: FIREWORKS_API_KEY, FIREWORKS_BASE_URL
# SiliconFlow: SILICONFLOW_API_KEY, SILICONFLOW_BASE_URL, SILICONFLOW_MODEL
# Arcee: ARCEE_API_KEY, ARCEE_BASE_URL, ARCEE_MODEL
# Moonshot/Kimi: MOONSHOT_API_KEY (or KIMI_API_KEY), MOONSHOT_BASE_URL, MOONSHOT_MODEL
# SGLang: SGLANG_BASE_URL, SGLANG_MODEL, optional SGLANG_API_KEY
# vLLM: VLLM_BASE_URL, VLLM_MODEL, optional VLLM_API_KEY
# Ollama: OLLAMA_BASE_URL, OLLAMA_MODEL, optional OLLAMA_API_KEY
# (or NVIDIA_NIM_BASE_URL / NVIDIA_BASE_URL),
# NVIDIA_NIM_PATH_SUFFIX(or NIM_PATH_SUFFIX / NVIDIA_PATH_SUFFIX), NVIDIA_NIM_MODEL
# OpenAI-compatible: OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_PATH_SUFFIX, OPENAI_MODEL
# Wanjie Ark: WANJIE_ARK_API_KEY (or WANJIE_API_KEY), WANJIE_ARK_BASE_URL,
# WANJIE_ARK_PATH_SUFFIX (or WANJIE_PATH_SUFFIX / WANJIE_MAAS_PATH_SUFFIX), WANJIE_ARK_MODEL
# Volcengine Ark: VOLCENGINE_API_KEY (or VOLCENGINE_ARK_API_KEY / ARK_API_KEY), VOLCENGINE_BASE_URL
# VOLCENGINE_PATH_SUFFIX(or VOLCENGINE_ARK_PATH_SUFFIX / ARK_PATH_SUFFIX), VOLCENGINE_MODEL
# OpenRouter: OPENROUTER_API_KEY, OPENROUTER_BASE_URL, OPENROUTER_PATH_SUFFIX, OPENROUTER_MODEL
# Xiaomi MiMo: XIAOMI_MIMO_API_KEY (or XIAOMI_API_KEY / MIMO_API_KEY), XIAOMI_MIMO_BASE_URL
# XIAOMI_MIMO_PATH_SUFFIX(or MIMO_PATH_SUFFIX), XIAOMI_MIMO_MODEL
# Novita: NOVITA_API_KEY, NOVITA_BASE_URL, NOVITA_PATH_SUFFIX, NOVITA_MODEL
# Fireworks: FIREWORKS_API_KEY, FIREWORKS_BASE_URL, FIREWORKS_PATH_SUFFIX
# SiliconFlow: SILICONFLOW_API_KEY, SILICONFLOW_BASE_URL, SILICONFLOW_PATH_SUFFIX, SILICONFLOW_MODEL
# Arcee: ARCEE_API_KEY, ARCEE_BASE_URL, ARCEE_PATH_SUFFIX, ARCEE_MODEL
# Moonshot/Kimi: MOONSHOT_API_KEY (or KIMI_API_KEY), MOONSHOT_BASE_URL,
# MOONSHOT_PATH_SUFFIX(or KIMI_PATH_SUFFIX), MOONSHOT_MODEL
# SGLang: SGLANG_BASE_URL, SGLANG_MODEL, SGLANG_PATH_SUFFIX, optional SGLANG_API_KEY
# vLLM: VLLM_BASE_URL, VLLM_MODEL, VLLM_PATH_SUFFIX, optional VLLM_API_KEY
# Ollama: OLLAMA_BASE_URL, OLLAMA_MODEL, OLLAMA_PATH_SUFFIX, optional OLLAMA_API_KEY
#
# Custom DeepSeek-compatible APIs usually do not need a new provider table:
# set `provider = "deepseek"` and override [providers.deepseek].base_url/model.
# set `provider = "deepseek"` and override [providers.deepseek].base_url/path_suffix/model.
# For generic OpenAI-compatible gateways, use `provider = "openai"` and the
# [providers.openai] table below. Keep provider/api_key/base_url in user config
# [providers.openai] table below. Keep provider/api_key/base_url/path_suffix in user config
# or environment variables; project overlays are not allowed to set them.

# DeepSeek Platform (https://platform.deepseek.com)
Expand Down Expand Up @@ -371,6 +377,11 @@ max_subagents = 10 # optional (1-20)
# base_url = "http://localhost:11434/v1"
# model = "deepseek-coder:1.3b" # or any local Ollama tag

# Some third-party endpoints not surport url with version
# [providers.foo] # set foo to real provider type
# base_url = "http://www.example.com/"
# path_suffix = "" # set it empty string to disable adding `v1` to base_url without version

# ─────────────────────────────────────────────────────────────────────────────────
# Web Search Provider
# ─────────────────────────────────────────────────────────────────────────────────
Expand Down
11 changes: 11 additions & 0 deletions crates/cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ struct Cli {
api_key: Option<String>,
#[arg(long)]
base_url: Option<String>,
#[arg(long)]
path_suffix: Option<String>,
/// Workspace directory for TUI file tools
#[arg(short = 'C', long = "workspace", alias = "cd", value_name = "DIR")]
workspace: Option<PathBuf>,
Expand Down Expand Up @@ -492,6 +494,7 @@ fn run() -> Result<()> {
model: cli.model.clone(),
api_key: cli.api_key.clone(),
base_url: cli.base_url.clone(),
path_suffix: cli.path_suffix.clone(),
auth_mode: None,
output_mode: cli.output_mode.clone(),
log_level: cli.log_level.clone(),
Expand Down Expand Up @@ -1596,6 +1599,9 @@ fn build_tui_command(
if let Some(base_url) = cli.base_url.as_ref() {
cmd.env("DEEPSEEK_BASE_URL", base_url);
}
if let Some(path_suffix) = cli.path_suffix.as_ref() {
cmd.env("DEEPSEEK_PATH_SUFFIX", path_suffix);
}

Ok(cmd)
}
Expand Down Expand Up @@ -2793,6 +2799,7 @@ mod tests {
api_key: Some("resolved-openai-key".to_string()),
api_key_source: Some(RuntimeApiKeySource::Keyring),
base_url: "https://openai-compatible.example/v4".to_string(),
path_suffix: None,
auth_mode: Some("api_key".to_string()),
output_mode: None,
log_level: None,
Expand Down Expand Up @@ -2852,6 +2859,7 @@ mod tests {
api_key: Some("config-file-key".to_string()),
api_key_source: Some(RuntimeApiKeySource::ConfigFile),
base_url: "https://api.deepseek.com/beta".to_string(),
path_suffix: None,
auth_mode: Some("api_key".to_string()),
output_mode: None,
log_level: None,
Expand Down Expand Up @@ -2907,6 +2915,7 @@ mod tests {
api_key: Some("resolved-kimi-key".to_string()),
api_key_source: Some(RuntimeApiKeySource::Keyring),
base_url: "https://api.moonshot.ai/v1".to_string(),
path_suffix: None,
auth_mode: Some("api_key".to_string()),
output_mode: None,
log_level: None,
Expand Down Expand Up @@ -2973,6 +2982,7 @@ mod tests {
api_key: None,
api_key_source: None,
base_url: "https://openai-compatible.example/v4".to_string(),
path_suffix: None,
auth_mode: None,
output_mode: None,
log_level: None,
Expand Down Expand Up @@ -3068,6 +3078,7 @@ mod tests {
api_key: Some("test-key".to_string()),
api_key_source: Some(RuntimeApiKeySource::Keyring),
base_url: "http://localhost:8000/v1".to_string(),
path_suffix: None,
auth_mode: Some("api_key".to_string()),
output_mode: None,
log_level: None,
Expand Down
Loading
Loading