Codex SDK 移植到 C# 后 codex exec 没有模型可用?TaoToken 这样改 config.toml

发布时间:2026/9/20 0:31:24
Codex SDK 移植到 C# 后 codex exec 没有模型可用?TaoToken 这样改 config.toml 从 TypeScript 到 C#Codex SDK 跨语言移植后 codex exec 找不到模型的排查记录把官方 TypeScript Codex SDK 的Codex / CodexExec / Thread三层结构照搬进 C# 之后克隆、编译、stdout读取都跑通了thread.RunAsync(Summarize this repository.)却一直卡在子进程里报没有可用模型。真正消耗 Token 的是 C# 服务与桌面端背后那个codex exec子进程而它读不到模型通道事件流自然一条都出不来。这篇就把这层config.toml覆盖补上Key 和 Base URL 走 TaoToken事件解析、CancellationToken取消、Kill(entireProcessTree: true)仍然是 C# 侧自己的活。一、原问题与场景C# 侧一切正常卡在子进程的模型通道移植思路本身没问题C# 里用System.Diagnostics.Process拉起codex exec --experimental-json再按 JSONL 事件流解析ThreadEvent。CodexExec负责进程生命周期Thread负责RunAsync / RunStreamedAsyncEventParser用System.Text.Json.JsonDocument把每一行 JSON 映射成record事件类型。这套结构在 TypeScript 里跑得好好的搬到 C# 之后stdout也能读到但读到的第一类事件往往是错误事件或者干脆没有任何turn.completed。原因不在事件解析而在子进程里的codex找不到可用的模型通道。TypeScript SDK 在 Node 环境下会继承process.env很多示例默认你已经codex login过或者环境里已经有官方凭据。C# 这边是纯 .NET 进程ProcessStartInfo默认不继承你期望的那套环境config.toml里也没有指向任何可用的 Base URL于是codex exec启动后拿不到模型ThreadEvent流里只有失败信息。原文「配置序列化的保持」那节已经保证 JSON 配置能转成 Codex CLI 认的 TOML 覆盖本条要补的正是这层覆盖里缺失的模型通道部分Key 从哪来、Base URL 写什么、怎么交给codex子进程读取。二、TaoToken 前置注册、创建 Key、确认 Base URL这一步替代通常去官方控制台申请 Key 的流程。打开 TaoToken 官网 注册账号进入控制台创建 API Key拿到形如YOUR_API_KEY的字符串。这个 Key 就是后面要交给codex子进程读取的凭据。Base URL 固定写https://taotoken.net/api注意两点不带/v1不加任何 UTM 参数。Codex CLI 的config.toml里模型通道的base_url就填这个值多一个斜杠或者多一段路径都可能导致请求打到错误端点。需要说清楚边界TaoToken 只提供 Key 和 Base URL 这两样东西。事件解析、CancellationToken取消、Kill(entireProcessTree: true)这些仍然是 C# 侧自己的活跟 Key 无关。移植代码里的EventParser、CodexThread、OutputSchemaTempFile都不需要因为换 Key 而改动。如果你还没创建 Key可以直接去 API Keys 页面 生成接入细节可以对照 接入文档。三、可复制配置config.toml 覆盖与 C# 进程环境Codex CLI 认的是 TOML 覆盖。C# SDK 里CodexOptions会把 JSON 配置序列化成 TOML 传给子进程我们要做的是确保模型通道这一段被正确写入。一个最小可用的config.toml片段如下model gpt-5-codex model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api responses关键字段说明base_url就是前面确认的https://taotoken.net/apienv_key指定从哪个环境变量读取 Key这里用TAOTOKEN_API_KEYwire_api按 Codex CLI 当前版本支持的协议填不确定时保持与官方示例一致。C# 侧要做的是在ProcessStartInfo里把这个环境变量传进去而不是依赖父进程继承var startInfo new ProcessStartInfo { FileName _executablePath, RedirectStandardInput true, RedirectStandardOutput true, RedirectStandardError true, UseShellExecute false, CreateNoWindow true, }; startInfo.Environment[TAOTOKEN_API_KEY] apiKey; startInfo.Environment[CODEX_HOME] codexHomePath;CODEX_HOME指向存放config.toml的目录这样codex exec启动时就能读到我们写入的模型通道配置。如果 C# SDK 的CodexOptions.Env已经支持完全覆盖进程环境也可以走那条路径效果一致。CodexPathOverride或CODEX_EXECUTABLE环境变量用来指定codex可执行文件路径这跟模型通道是两件事别混在一起排查。四、验证请求从 C# 到 codex exec 再到 TaoToken配置写好后回到原文的使用示例验证。第一步跑非流式var codex new Codex(); var thread codex.StartThread(); var result await thread.RunAsync(Summarize this repository.); Console.WriteLine(result.FinalResponse);如果FinalResponse能返回内容说明 Token 确实从 C# →codex exec→ TaoToken 走通了。第二步跑流式确认Usage有值await foreach (var event in thread.RunStreamedAsync(Analyze the code.)) { switch (event) { case TurnCompletedEvent completed: Console.WriteLine($Tokens: in{completed.Usage.InputTokens}); break; } }TurnCompletedEvent里的Usage能打印出输入 Token 数就说明模型通道和计费链路都正常。如果只返回FinalResponse但Usage为空通常是wire_api或事件解析字段对不上不是 Key 的问题。想单独确认模型通道是否可用可以到 模型对话 里用同一个 Key 发一条消息能正常返回就说明 Key 和 Base URL 没问题问题在 C# 侧的进程环境或 TOML 覆盖。五、本篇常见错排查错误一codex exec报没有可用模型。最常见的原因是config.toml没被读到。检查CODEX_HOME是否指向正确目录以及ProcessStartInfo.Environment里是否真的写入了这个变量。C# 的Process默认不继承你手动set的 shell 环境必须显式赋值。错误二Key 读不到报 401 或未授权。确认env_key指定的变量名和 C# 里startInfo.Environment[...]的键名完全一致大小写敏感。另外确认 Key 没有多余空格从控制台复制时容易带上换行。错误三Base URL 写错。写成https://taotoken.net/api/v1或者带 UTM 参数都会导致请求失败。正确值就是https://taotoken.net/api不带/v1、不加 UTM。错误四事件流解析不到turn.completed。这通常不是模型通道问题而是EventParser里type字段匹配失败。用JsonDocument解析时注意root.Clone()否则文档释放后元素失效。可以先打印原始 JSONL 行确认事件类型。错误五取消时子进程残留。CancellationToken触发后要调用process.Kill(entireProcessTree: true)否则codex exec的子进程可能继续跑。这跟 Key 无关是 C# 进程管理的活。错误六wire_api与 CLI 版本不匹配。不同版本的 Codex CLI 支持的协议字段可能不同报错信息里通常会提示。对照官方示例调整不要凭记忆填。排查顺序建议先用 模型对话 确认 Key 可用再检查config.toml是否被读到最后看 C# 进程环境变量。这样能快速定位是 Key 问题、配置问题还是代码问题。六、语义一致 CTA这篇的核心是补上 C# 移植后codex exec缺失的模型通道覆盖Key 从 API Keys 创建Base URL 写https://taotoken.net/api通过config.toml的model_providers段和 C# 进程环境变量交给子进程读取。事件解析、取消、进程清理仍然是 C# 侧自己的活。如果你在接入过程中遇到settings或环境变量相关的问题可以对照 接入文档 逐项核对。长期在 C# 服务或桌面端里跑编码 Agent可以考虑 Coding Plan把 Key 和额度管理从代码里抽出来。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询