Claude Code的Harness Engineering实现:09-输出解析与结构化返回(Output Parsing)
1. 为什么自由文本解析总在流水线里翻车把 Claude Code 接进自有流水线时最容易被低估的一环就是输出解析。模型明明返回了工具调用你的脚本却拿到一坨自由文本明明该是 JSON结果前面多了一句“好的我来帮你处理”。这类问题在单次对话里不明显一旦进入 CI、批处理或 Agent 循环就会变成随机失败。Output Parsing 要解决的核心问题是当模型通过 Native Tool Calling 返回结果时如何把text、tool_use、tool_result这些内容块稳定地拆出来转成下游能消费的结构化数据。它适合三类人正在写 Claude Code Harness 的开发者、要把模型输出接进数据库或消息队列的工程师、以及做 Agent 编排需要可靠工具调用识别的团队。我试过直接用正则去抠模型返回的 JSON短对话能跑长上下文里模型偶尔会把 JSON 包在 markdown 代码块里或者把多个工具调用拼在一段文本中正则立刻失效。后来改成基于内容块类型分发稳定性才上来。这篇就按 Harness Engineering 的思路把解析配置、验证动作和排障过程完整走一遍endpoint 统一走 TaoToken 的 Key/API 通道方便你复现。2. TaoToken 前置统一 Key 与 API 通道在写解析逻辑之前先把请求通道固定下来。Claude Code 的 Harness 里模型请求最终都指向一个 base URL如果这个地址在多人协作或 CI 环境里各写各的解析实验就没法复现。TaoToken 提供统一的 Key 和 API 通道把模型对话、coding plan、console 和 api-keys 都收在同一个入口下适合做这种需要反复验证的解析实验。你需要先拿到一个 API Key然后确认三件事Base URL 指向https://taotoken.net/apiKey 用刚生成的Model ID 用你实际要调的模型名。这三件套在后面的配置片段里会反复出现尤其是 Claude Code 的 settings 和 Codex 的 auth.json缺一个都会导致 401 或 model not found。这里要强调一点TaoToken 是统一的 API 通道不是让你绕过什么而是把 Key 管理和请求入口标准化。对 Output Parsing 来说通道稳定的意义在于你排障时能确定失败是解析逻辑的问题而不是请求根本没发出去。模型对话入口可以用来手动验证模型是否真的返回了tool_use块接入文档里有完整的请求示例API Keys 页面负责生成和轮换 Key。配置顺序建议这样先在模型对话里发一条带工具的请求确认返回结构再把同样的请求搬到你的 Harness 代码里最后才去调解析函数。很多人一上来就写解析结果模型压根没返回工具调用白调半天。3. 可复制配置settings 与 auth.json 片段这一节给可直接复制的配置。Claude Code 的 settings 文件通常放在项目根目录或用户配置目录路径按你的实际环境来下面片段里的字段名和结构保持一致即可。{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-your-taotoken-key, ANTHROPIC_MODEL: claude-sonnet-4-20250514 }, permissions: { allow: [Read, Write, Bash] } }如果你用的是 Codex 风格的配置auth.json 里同样要写全三件套{ base_url: https://taotoken.net/api, api_key: sk-your-taotoken-key, model: claude-sonnet-4-20250514 }Base URL、Key、Model ID 这三样在任何一种配置里都不能省。我见过有人只改了 base_urlKey 还是旧的结果一直 401也有人 Model ID 写了个不存在的名字返回 reading choices 相关报错。配置写完后先跑一次最小请求验证通道再进解析环节。解析侧的核心配置是工具 schema。Native Tool Calling 依赖模型按 schema 返回tool_use块所以 schema 要写清楚必填字段和类型。下面是一个结构化输出的工具定义片段const outputTool { name: SyntheticOutput, description: Return structured output for downstream pipeline, inputSchema: { type: object, properties: { status: { type: string, enum: [ok, error] }, payload: { type: object }, message: { type: string } }, required: [status, payload] } };把这个工具塞进请求的 tools 数组模型在需要结构化返回时就会走tool_use而不是纯文本。解析函数只需要按内容块类型分发不用去猜文本里有没有 JSON。4. 验证请求与三类返回样例配置好之后用三类返回样例来验证解析是否稳定。第一类是纯文本返回模型没触发工具调用content里只有text块第二类是单个工具调用content里有一个tool_use块第三类是混合返回text和tool_use同时存在甚至多个tool_use并列。先发一个纯文本请求确认解析函数在hasToolCalls为 false 时不会崩function parseAssistantMessage(message: AssistantMessage): ParsedResponse { const textBlocks: TextBlock[] []; const toolUseBlocks: ToolUseBlock[] []; for (const block of message.content) { if (block.type text) textBlocks.push(block); if (block.type tool_use) toolUseBlocks.push(block); } return { text: textBlocks.map(b b.text).join(), toolCalls: toolUseBlocks, hasToolCalls: toolUseBlocks.length 0 }; }再发一个带工具的请求检查toolCalls里是否有id、name、input三个字段。id用来在回传tool_result时对齐name用来找工具input是模型填的参数。如果input是空对象多半是 schema 没写 required模型不知道该填什么。第三类混合返回最容易被忽略。模型可能先说一句“我来查一下”再返回tool_use。解析时要把text和toolCalls分开存下游按需取用。执行完工具后结果要格式化成tool_result块回传function formatToolResults(results: ToolResult[]): ToolResultBlockParam[] { return results.map(result { if (result.error) { return { type: tool_result, tool_use_id: result.toolUseId, content: Error: ${result.error}, is_error: true }; } return { type: tool_result, tool_use_id: result.toolUseId, content: typeof result.data string ? result.data : JSON.stringify(result.data, null, 2) }; }); }验证成功的标志是三类样例都能解析出预期结构tool_result回传后模型能继续下一轮且tool_use_id对得上。如果对不上模型会报找不到对应的工具调用。5. 常见报错排查401、local proxy failed 与 reading choices排障时先看报错类型不同报错指向不同环节。401 基本是 Key 问题检查ANTHROPIC_API_KEY或 auth.json 里的api_key是否和 TaoToken 控制台生成的一致有没有多余空格。如果 Key 刚轮换过旧 Key 会立刻失效。local proxy failed 通常出现在本地起了代理层的情况。检查 base_url 是否被本地代理覆盖环境变量里有没有残留的HTTP_PROXY之类配置。把 base_url 直接指向https://taotoken.net/api绕开本地代理层再试。reading choices 相关报错多半是响应结构不符合预期。模型返回的content不是数组或者tool_use块缺少input字段。这时候打印原始响应确认content的类型。如果模型返回的是纯字符串而不是内容块数组说明请求里没带 tools或者模型不支持 Native Tool Calling。OAuth 报错一般和认证方式有关。如果你用的是 OAuth 流程而不是 API Key检查 token 是否过期。在 Harness 里建议统一用 API Key减少认证环节的变量。还有一个隐蔽的坑tool_use_id在回传时写错。模型返回的id是toolu_xxx格式回传tool_result时必须原样带上。有人自己生成一个 id模型就找不到对应调用表现为下一轮直接报错或忽略结果。排查顺序建议先确认请求发出去了看 HTTP 状态再确认响应结构打印 content最后确认解析逻辑单测三类样例。大部分问题在前两步就能定位。6. 把解析接进流水线的下一步解析稳定之后下一步是把它接进你的流水线。结构化输出可以直接写数据库工具调用结果可以进消息队列错误结果走重试或告警。如果你要长期跑编码或 Agent 任务Coding Plan 适合做持续调用如果只是验证模型返回结构模型对话入口最快接入文档里有完整的请求和响应示例API Keys 页面负责 Key 管理。实际跑下来解析环节最值得投入的是单测。把三类返回样例固化成测试用例每次改 schema 或换模型都跑一遍比在流水线里 debug 便宜得多。另外tool_result的 content 尽量保持简洁太长的内容会挤占上下文模型下一轮可能忽略关键信息。结构化输出工具的名字和描述要写清楚用途模型才会在合适的时候调用它。

相关新闻

GPT-5.6 Sol 降价 33%、Gemini 3.7 Flash 首发价仅上代二十分之一:8 月海外大模型 API 价格战下,TaoToken 统一 Key 怎么配

GPT-5.6 Sol 降价 33%、Gemini 3.7 Flash 首发价仅上代二十分之一:8 月海外大模型 API 价格战下,TaoToken 统一 Key 怎么配

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 10:58:05 阅读更多 →
电商化妆品类目页测试用例设计:从筛选到下单的完整思路

电商化妆品类目页测试用例设计:从筛选到下单的完整思路

做电商项目测试做到第七篇,前面几篇我们依次聊过商城框架、搜索、商品详情、购物车和订单流程,今天把目光收回到类目页里比较特殊的一块——化妆品页面用例设计。这个类目不像手机壳、纸巾那样“标品化”,它有大量需要测的属性筛选、规格组合…

2026/10/12 10:57:04 阅读更多 →
React组件依赖分析利器rea:读懂组件关系,告别连锁故障

React组件依赖分析利器rea:读懂组件关系,告别连锁故障

1. 为什么我会跟"rea"较上劲:组件依赖失真的日常先交代一下背景。我之前在一个维护了三年的中后台项目里,天天跟几百个 React 组件打交道。那段时间最折磨人的不是写新功能,而是改老组件——你永远不知道一个看起来人畜无害的 prop…

2026/10/12 10:57:04 阅读更多 →

最新新闻

AI使用心得(二):用TaoToken统一Key打通Trae与Qwen的Spring Boot开发流

AI使用心得(二):用TaoToken统一Key打通Trae与Qwen的Spring Boot开发流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:37:01 阅读更多 →
医疗健康 AI Agent Harness Engineering:从辅助诊断到个性化治疗

医疗健康 AI Agent Harness Engineering:从辅助诊断到个性化治疗

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:37:01 阅读更多 →
MCP Server接入3D工作流:让AI真正读懂你的场景数据

MCP Server接入3D工作流:让AI真正读懂你的场景数据

1. 我的 3D 工作流里,为什么非要塞进一个 MCP server做 3D 项目做久了,你会发现一个特别拧巴的事:AI 语言模型再聪明,也看不懂我硬盘里的 .blend、.gltf、.fbx。它知道什么是"漫反射贴图",能跟你聊 PBR 材质…

2026/10/12 14:37:01 阅读更多 →
DeepSeek Harness:全插件化Agent运行时与可回放会话日志实战

DeepSeek Harness:全插件化Agent运行时与可回放会话日志实战

做了几年Agent应用,说实话踩过的坑比写出来的代码还多。最近我把自己常用的那套Agent运行骨架重新整理了一遍,抽出了一个内部代号叫 DeepSeek Harness 的轻量级运行时,核心就两件事:全插件化的装配机制,以及一套可回放…

2026/10/12 14:37:01 阅读更多 →
旋转圆盘上的摆动模拟:非惯性系下的动力学建模与数值实现

旋转圆盘上的摆动模拟:非惯性系下的动力学建模与数值实现

“旋转圆盘上的摆动模拟”听起来像个物理课建模题,但真正落地做的时候,你会发现它兼顾了刚体动力学、非惯性系分析和数值稳定性这几件麻烦事。我最早是因为一个同学在某个平台团建展示了一个演示:圆盘转起来,摆锤没有老老实实顺着…

2026/10/12 14:37:01 阅读更多 →
爬虫数据清洗四坑:编码乱码、时区错位、空值与脏字符实战

爬虫数据清洗四坑:编码乱码、时区错位、空值与脏字符实战

1. 第一个坑:编码乱码,不是你代码写错了,是requests猜错了先讲个最典型的场景。你刚装好环境,写了人生第一个爬虫:requests.get一个网页,然后print(response.text)。一运行,控制台吐出一堆“锟斤…

2026/10/12 14:36:00 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →