Spark 配置文档(config.toml)¶
English: docs/en/CONFIG.md 字段的唯一事实来源:
src/spark/config.py(SparkConfig及嵌套模型,含全部默认值与边界)。
配置文件位于 ~/.spark/config.toml(可用 SPARK_HOME 环境变量覆盖目录),由 spark init 生成模板。
部分字段可在网页「设置」面板中修改并保存;具体可写字段与限制见 API.md。默认值以代码为准。
[provider] — 模型服务¶
| 字段 | 默认 | 说明 |
|---|---|---|
name |
openai_compat |
openai_compat / ollama / mock |
base_url |
https://api.deepseek.com/v1 |
OpenAI 兼容接口地址(LiteLLM 承载,支持 100+ 后端) |
model |
deepseek-chat |
主模型名 |
api_key_env |
SPARK_API_KEY |
密钥所在环境变量名 |
api_key |
null |
直接配置的密钥(网页回显打码);require_api_key 优先使用此值,再读取环境变量 |
api_keys |
[] |
凭据池:主密钥失败后逐次轮换的备选密钥(网页只回掩码) |
fallback_models |
[] |
同端点的回退模型链,主模型重试耗尽后依次切换 |
small_model |
"" |
压缩摘要及网页标题/关键词等辅助调用使用的小模型(留空 = 主模型);记忆抽取目前仍使用主模型 |
[agent] — 行为与安全¶
| 字段 | 默认 | 说明 |
|---|---|---|
approval |
suggest |
审批模式:suggest 写类逐项询问 / auto-edit 自动改文件 / full-auto 全自动 |
workdir_only |
true |
限制文件访问在工作目录内 |
sandbox_mode |
workspace |
sandbox-only 只读 / workspace 工作目录内读写 / full-access 可越界(保护路径除外)/ unrestricted 无限制 |
protected_paths |
[] |
永远拒绝写入的额外路径(Spark 自身代码与配置始终受保护) |
shell_timeout_sec |
60 |
单条命令超时(1–3600) |
max_tool_rounds |
30 |
单回合最大工具轮次(1–1000) |
max_repeat_calls |
4 |
同一 (工具, 参数) 签名的熔断阈值(0 = 关闭) |
max_turn_tokens |
0 |
单回合 token 预算(0 = 关闭) |
max_output_chars |
8000 |
工具输出截断长度(200–1,000,000) |
show_thinking / show_tools / show_plan / show_context / show_keywords / show_notices |
true |
前端显示开关 |
status_items |
[] |
TUI 状态栏有序项;空 = 默认(模型/接口/密钥/审批/访问/目录/会话)。合法项:model base_url key approval sandbox workdir session;未知项静默跳过 |
压缩提示词覆盖¶
上下文压缩(compact)的内置提示词可用文件覆盖:项目级
<workdir>/.spark/prompts/compact.md 优先,其次全局
~/.spark/prompts/compact.md,都没有时使用内置 5 段结构化提示词。
空文件视为"未提供",继续向后查找;自定义提示词同时作用于摘要与
多轮合并两条路径。
[context] — 上下文窗口¶
| 字段 | 默认 | 说明 |
|---|---|---|
agents_md |
AGENTS.md |
注入的项目说明文件名(仅裸文件名,防路径逃逸) |
max_fragment_chars |
8000 |
AGENTS.md 注入截断长度 |
history_budget_chars |
96000 |
历史消息字符预算 |
max_context_tokens |
32768 |
上下文窗口上限,超过 compact_threshold 自动压缩 |
compact_threshold |
0.85 |
触发压缩的用量比例(0.1–0.99) |
keep_recent_messages |
8 |
压缩时保留的最近消息数 |
repo_map_enabled |
true |
是否注入 tree-sitter 代码索引 |
repo_map_max_chars |
6000 |
repo-map 注入截断长度(500–60,000) |
knowledge_enabled |
true |
是否每轮检索项目知识库 |
knowledge_top_k |
6 |
知识库检索条数(1–50) |
knowledge_max_chars |
6000 |
知识库片段注入上限(500–60,000) |
[memory] — 长期记忆¶
| 字段 | 默认 | 说明 |
|---|---|---|
enabled |
true |
总开关(ChromaDB 向量持久化 + 关键词检索) |
top_k |
6 |
检索条数(1–50) |
capacity |
500 |
记忆容量上限(1–100,000) |
embedding_model |
text-embedding-3-small |
嵌入模型 |
auto_extract |
true |
每回合后自动抽取事实入记忆 |
embedding_enabled |
false |
向量检索显式开关(多数 chat 端点没有 /embeddings) |
embedding_base_url |
"" |
独立 embedding 服务地址(留空 = 复用 provider.base_url) |
embedding_api_key |
"" |
embedding 密钥;留空时仅当地址与 provider 相同(忽略末尾 /)才复用 provider.api_key,否则使用 ollama 占位值 |
rerank_model |
"" |
重排模型名;需另行安装 FlagEmbedding,不可用或加载失败时保持原顺序 |
配置文件会保存明文密钥,应限制文件访问权限且不要提交;spark config show 脱敏,网页掩码对较长密钥仍显示首尾各四位。网页保存空的 embedding 密钥会保留旧值,不能用空值清除。
[replay] 与 [updater] — 高级设置¶
| 字段 | 默认 | 说明 |
|---|---|---|
replay.enabled |
true |
启用按会话保存的回放记录,可能包含会话内容,需保护本地文件 |
updater.mode |
notify |
notify 提示更新;off 关闭版本检查;显式 spark update 不受影响 |
高级设置中的权限规则与审批档案可在 Web 里直接编辑(写 user 层,走
/api/permissions/rules 与 /api/approval_profiles/*,见 API.md)。
/api/config 展示的是用户规则而非所有作用域的合并视图;permission_scopes 不在该
响应中,也不能通过 /api/settings 写入——/api/settings 对这四个键一律返回 400。
MCP 服务器¶
[[mcp_servers]]
name = "filesystem"
command = "npx" # stdio 传输
args = ["-y", "@modelcontextprotocol/server-filesystem", "."]
readonly_tools = [] # 声明为只读的工具名(免审批)
# 远程传输(SSE / streamable HTTP):
# [[mcp_servers]]
# name = "remote"
# transport = "sse" # stdio | sse | streamable_http
# [mcp_servers.http]
# url = "http://127.0.0.1:3000/sse"
# headers = {}
# timeout_sec = 30
[[hooks]] — 生命周期钩子¶
[[hooks]]
event = "pre_tool" # 见 spark/hooks.py 的 HookRegistry.EVENTS
command = "python"
args = ["check.py"]
timeout_sec = 15
on_deny = "warn" # warn | block
模型 profiles(多模型切换)¶
active_profile_id = "a1b2c3d4"
[[model_profiles]]
id = "a1b2c3d4"
name = "DeepSeek"
provider = "openai_compat"
base_url = "https://api.deepseek.com/v1"
model = "deepseek-chat"
# api_key 字段存在但示例留空:密钥请写入配置或环境变量,勿提交到仓库
网页「设置 → 模型」的增删切换即读写这一节。需要从环境变量读取凭据的档案,可在受信任的全局配置中为每个 [[model_profiles]] 显式添加 api_key_env = "SPARK_API_KEY"(也可使用不同的变量名)。多个档案可以明确指定同一变量;旧档案未声明时不会跨档案继承,即使端点相同,也需手动绑定。指定的变量不存在时不会回退到其他变量。
环境变量¶
- 所有字段都可用
SPARK_前缀 + 双下划线嵌套覆盖:SPARK_AGENT__MAX_TOOL_ROUNDS=50、SPARK_PROVIDER__BASE_URL=… .env只从$SPARK_HOME/.env读取(项目目录内的.env一律忽略——防止克隆来的仓库给自己开 full-auto)SPARK_HOME:覆盖配置/数据目录(默认~/.spark)LITELLM_LOCAL_MODEL_COST_MAP:Spark 默认设为True(使用 LiteLLM 内置模型价格表,跳过 raw.githubusercontent.com 拉取;国内网络拉不到会白等约 9 秒)
项目级配置(.spark.toml)¶
放在工作目录的 .spark.toml 会与全局配置合并,但会经过安全清洗:provider、MCP、hooks 等可执行配置项不允许由项目文件注入(防提示注入提权)。细节见 config.py 的 _sanitize_project_config。
AI生成
P1 新增:供应商韧性配置(v0.9.4+)¶
[provider]
model = "deepseek-chat"
# 凭据池:请求失败逐次轮换(单 key 行为不变)
api_keys = ["sk-backup-1", "sk-backup-2"]
# fallback 链:主模型重试耗尽后依次切换(同端点)
fallback_models = ["deepseek-v4-flash"]
# 小模型分工:压缩/摘要/合并等辅助调用用便宜模型(留空 = 主模型)
small_model = "deepseek-v4-flash"
- usage 真实回填:OpenAI 兼容端点会在流尾上报 token 用量(自动请求,
不支持的端点自动降级估算);
token_usage表source列为reported。 - 模型目录:
spark models [关键词]查询 models.dev 开放目录 (232+ 供应商、价格、上下文长度;24h 本地缓存,离线回退内置快照)。 - repo map git 热度:代码地图按 git 提交频率排序(高频文件优先入图)。
沙箱模式详解¶
| 模式 | 可读 | 可写 | Shell | MCP | 用途 |
|---|---|---|---|---|---|
sandbox-only |
✅ | ❌ | ❌ | ❌ | 只读分析、代码审查 |
workspace |
✅ | ✅ | ✅ | 限制 | 默认模式,平衡安全与能力 |
full-access |
✅ | ✅ | ✅ | ✅ | 高级用户、信任环境 |
unrestricted |
✅ | ✅ | ✅ | ✅ | 开发调试、完全放开 |
审批模式详解¶
| 模式 | 说明 |
|---|---|
suggest |
敏感操作(写文件、shell)弹出确认对话框 |
auto-edit |
只读操作自动放行,写操作需确认 |
full-auto |
全部自动放行,适合 CI/CD 或可信环境 |
plan-only |
只读允许;写/执行一律不执行,仅输出计划(plan mode) |
approve-plan |
先出计划等待批准,批准后按 auto-edit 语义自动执行 |
manual |
写/执行逐条人工确认 |
本地数据文件¶
即 spark uninstall 会清除的全部落点(清单可用 spark uninstall --list 实时查看):
| 路径 | 说明 |
|---|---|
~/.spark/config.toml |
配置文件(含模型档案与密钥) |
~/.spark/.env |
全局环境变量文件 |
~/.spark/sessions.db |
SQLite:会话、消息、工具事件、检查点、后台任务记录 |
~/.spark/checkpoints/*.tar.gz |
工作区快照(回滚用) |
~/.spark/checkpoints.db |
turn 级 checkpointer 存储 |
~/.spark/memory.db + ~/.spark/memory_chroma/ |
长期记忆库(SQLite + ChromaDB 向量目录) |
~/.spark/knowledge/<project_hash>/ |
项目知识库导入文档(按工作目录哈希分目录) |
~/.spark/replays/<session_id>.jsonl |
turn 回放记录 |
~/.spark/backups/*.db |
doctor --backup 的在线快照(VACUUM INTO) |
~/.spark/cache/models-dev.json |
模型目录缓存 |
~/.spark/update-check.json |
最近一次版本检查缓存(24h) |
~/.spark/audit.jsonl |
结构化审计日志(SPARK_AUDIT_LOG 开启时) |
~/.spark/desktop-crash.log |
桌面版崩溃日志(GUI 子系统排障用) |
进程日志走 stderr(由启动方式决定去向),Spark 自身不写运行日志文件。
后台任务(bg_start)记录持久化在 sessions.db 的 bg_jobs 表:服务器重启后
bg_list 仍可列出历史任务(标记为 lost),bg_output 返回最后一次持久化的输出。
HTTP API 与 SSE 事件协议单独成篇:见 API.md。CLI 命令见
INSTALL.md 与 spark --help。