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

  1. 按错误信息中的行列号定位并修复语法
  2. 用 TOML linter / 编辑器语法高亮校验后再提交
  3. 调用前先 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

When it happens

Trigger: 传入的 config.toml 文本有语法错误:未闭合的引号/括号、重复键、非法字符、把字符串值写成裸 token、表头格式错误等。错误串中 {error} 部分带具体行列位置。

Common situations: 手工编辑 config.toml 引入语法错误;用字符串拼接生成 TOML 而未转义;粘贴含全角引号/中文标点的配置;上游其他工具写坏的 config 被 backfill 读回再重新解析。

Related errors


AI-assisted analysis of BigPizzaV3/CodexPlusPlus@1f431ae49b (2026-08-16). Data as JSON: /api/errors/684f1b8d75003fc6. Report an issue: GitHub.