BigPizzaV3/CodexPlusPlus · error · anyhow::Error
config.toml TOML 解析失败:{error}
Error message
config.toml TOML 解析失败:{error} What it means
parse_toml_document 是库内所有 TOML 解析的统一出口:剥 BOM、空文本返回空 Document,否则用 toml_edit 解析,失败时把 toml_edit 的错误信息(含行号/列号)包进「config.toml TOML 解析失败:{error}」。任何 config 文本入口(apply_context_limits、upsert_context_entry、set_experimental_bearer_token 等)解析失败都会冒出此错误。
Source
Thrown at crates/codex-plus-core/src/relay_config.rs:1284
fn is_custom_provider_id(provider: &str) -> bool {
!provider.is_empty() && !RESERVED_MODEL_PROVIDER_IDS.contains(&provider)
}
fn provider_table_exists(doc: &DocumentMut, provider_id: &str) -> bool {
doc.get("model_providers")
.and_then(Item::as_table)
.and_then(|table| table.get(provider_id))
.is_some()
}
fn parse_toml_document(contents: &str) -> anyhow::Result<DocumentMut> {
let contents = contents.trim_start_matches('\u{feff}');
if contents.trim().is_empty() {
Ok(DocumentMut::new())
} else {
contents
.parse::<DocumentMut>()
.map_err(|error| anyhow::anyhow!("config.toml TOML 解析失败:{error}"))
}
}
fn remove_provider_specific_common_keys(table: &mut dyn TableLike) {
for key in PROVIDER_SPECIFIC_COMMON_ROOT_KEYS {
table.remove(key);
}
let sensitive_keys: Vec<String> = table
.iter()
.map(|(key, _)| key.to_string())
.filter(|key| is_provider_credential_root_key(key))
.collect();
for key in sensitive_keys {
table.remove(&key);
}
table.remove("model_providers");
}
View on GitHub (pinned to 1f431ae49b)
Solutions
- 按错误信息中的行列号定位并修复语法
- 用 TOML linter / 编辑器语法高亮校验后再提交
- 调用前先 toml::from_str::<toml::Value>(text) 自检,给用户即时的编辑器反馈
Example fix
# before model_provider = "openrouter model = "gpt-5" # after model_provider = "openrouter" model = "gpt-5"
Defensive patterns
Strategy: validation
Validate before calling
fn validate_toml(text: &str) -> anyhow::Result<()> {
let text = text.trim_start_matches('\u{feff}');
if !text.trim().is_empty() {
text.parse::<toml_edit::DocumentMut>()
.map_err(|e| anyhow::anyhow!("config.toml TOML 解析失败:{e}"))?;
}
Ok(())
}
// 提交前调用,可拿到与库一致的行列错误信息 Try / catch
match apply_relay_config_file_to_home(&home, &contents) {
Ok(r) => {}
Err(err) if err.to_string().contains("TOML 解析失败") => {
// 把 {error} 里的行列信息透传给编辑器定位,不让用户重试同一份坏文本
}
Err(err) => return Err(err),
} Prevention
- 编辑器侧接入实时 TOML 校验(toml_edit 解析一次即可)
- 拼接生成 TOML 时用 toml_edit 构建而非字符串相加
- 粘贴配置后先高亮校验再保存
When it happens
Trigger: 传入的 config.toml 文本有语法错误:未闭合的引号/括号、重复键、非法字符、把字符串值写成裸 token、表头格式错误等。错误串中 {error} 部分带具体行列位置。
Common situations: 手工编辑 config.toml 引入语法错误;用字符串拼接生成 TOML 而未转义;粘贴含全角引号/中文标点的配置;上游其他工具写坏的 config 被 backfill 读回再重新解析。
Related errors
- {key} must be a TOML table
- config.toml TOML parse failed: {error}
- config.toml 内容不能为空
- {table_name} 必须是 TOML 表
- model_providers.{provider_id} 必须是 TOML table
AI-assisted analysis of BigPizzaV3/CodexPlusPlus@1f431ae49b (2026-08-16).
Data as JSON: /api/errors/684f1b8d75003fc6.
Report an issue: GitHub.