解析 5 种 Agent CLI 输出流:OpenSquirrel runtime.rs 的 JSON 流解析与多轮会话实现
【免费下载链接】OpenSquirrelFor people who get distracted by agents. A native Rust/GPUI control plane for running Claude Code, Codex, Cursor, and OpenCode side by side — because if youre going to be squirrely, you might as well optimize for it.项目地址https://gitcode.com/gh_mirrors/ope/OpenSquirrel点击查看免费下载OpenSquirrel 是一个基于 Rust GPUI 的原生 AI Agent 控制台,可以把 Claude Code、Codex、Cursor Agent、OpenCode 等 5 种 Agent CLI 并排运行在同一窗口中。这篇文章带你拆解它最核心的工程难题:如何解析 5 种 Agent CLI 的 JSON 输出流,以及如何实现跨 CLI 的多轮会话——全部集中在 src/runtime.rs 这一个文件里完成。为什么 Agent CLI 输出流解析这么棘手每种 AI 编码 CLI 的方言都不一样:有的输出纯文本(直接给人看的 TUI 内容);有的输出一行一条 JSON 事件(stream-json 协议);有的事件里文本是增量片段(delta),有的则是完整段落;Token 统计、会话 ID、错误信息藏的事件类型也各不相同。OpenSquirrel 的做法很直接:为每种 CLI 写一个适配器解析函数,把方言翻译成统一的消息模型。5 种 CLI 输出流速览:谁用 JSON,谁用纯文本RuntimeCLI 命令输出模式解析函数Claude Codeclaudestream-json(JSON 流)parse_claude_jsonCodexcodexJSON 事件流parse_codex_jsonCursor Agentcursor agentJSON 流parse_cursor_jsonOpenCodeopencodeJSON 流parse_opencode_jsonGemini CLIgemini纯文本(无 JSON)逐行直接透传前 4 种走 JSON 流(is_json_mode),Gemini 则按纯文本逐行输出——这也是 README.md 中运行时对照表的核心内容。JSON 流解析核心:逐行读取 事件分发逐行解析,失败即跳过所有解析函数签名几乎一致:输入一行文本,输出本轮是否结束的布尔值。核心套路三步走:serde_json::from_str尝试把整行解析为 JSON;读取顶层type字段判断事件类型;match分发到对应的处理分支。解析失败就静默跳过——这一点对抗CLI 输出的杂音行非常关键。Claude:parse_claude_json(src/runtime.rs)Codex:parse_codex_json(src/runtime.rs)OpenCode:parse_opencode_json(src/runtime.rs)Cursor:parse_cursor_json(src/runtime.rs)四类事件:文本增量、工具调用、Token 统计、错误以 Claude Code 为例,stream-json流里最重要的事件只有 4 类:事件类型含义OpenSquirrel 的处理content_block_delta文本/思考的增量片段追加进缓冲,拼出完整行再上屏assistant助手消息块只提取tool_use(避免文本重复)result本轮结束,附带 usage 与费用解析 Token 统计、成本、session_id,返回 true 结束本轮error出错转发AgentMsg::Error一个典型的result事件长这样(节选):{ type: result, session_id: abc-123, total_cost_usd: 0.012, usage: { input_tokens: 820, output_tokens: 140 } }增量拼行:line_buf 小缓冲的巧思流式输出里,一个词的增量可能被拆成好几个 delta,甚至把一行的前半段单独发出来。OpenSquirrel 在解析函数外维护一个line_buf字符串缓冲:每收到一段text增量就push_str进缓冲;缓冲里一旦出现\n,就把完整的一行drain出去发送;遇到content_block_stop/result时,把缓冲区剩余的最后半行冲刷上屏。这个十几行的机制,解决了流式文本截半行显示的常见毛刺问题。统一消息模型:一切皆 AgentMsg解析器不直接碰 UI,而是往一个async_channel里投递事件。UI 侧在 src/app.rs 定义的AgentMsg枚举中只关心 7 种消息:OutputLine/StderrLine:输出行 / 错误行ToolCall:工具调用(如 Bash、Read、Edit)TokenUpdate:Token 与成本统计Error:错误信息Done { session_id }:本轮结束,并带回会话 IDRemoteCursor:远程 tmux 轮询游标解析(生产者)与渲染(消费者)彻底解耦——换任何一种 CLI,UI 代码都不用动。多轮会话实现:持久进程 vs 一次性续接这是 src/runtime.rs 中agent_thread主循环最精彩的部分:5 种 CLI 用两种不同的策略实现多轮。策略一:claude 的持久多轮模式Claude Code 支持--input-format stream-json --output-format stream-json --verbose全双工流式模式。OpenSquirrel 在 src/lib.rs 的build_persistent_runtime_args中规范化这些参数,然后走专用的agent_thread_claude_persistent(src/runtime.rs):进程只启动一次,stdin 保持打开;每收到一条新提示词,就往 stdin 写一行 JSON:{ type: user, message: { role: user, content: 你的提示词 } }stdout 线程持续跑parse_claude_json,直到result事件才发出Done { session_id };下一轮继续写 stdin,上下文完全保留,无需重启进程。策略二:one-shot CLI 的会话续接Codex、Cursor、OpenCode 是一发一答模式:每轮都要重新起进程,靠会话 ID 续接上下文:OpenCode:追加--session id --continueCursor:追加--resume id会话 ID 从上一轮Done消息带回,存在应用状态里UI 层则用SESSION:id\n提示词的私有前缀把两者打包传递,由 src/lib.rs 的parse_session_prompt统一拆解。值得借鉴的 3 个设计点适配器模式拉平方言差异:4 个解析函数签名完全一致,主循环里一个if/else就能切换 CLI,新增第 6 种 Agent 只需再写一个parse_xxx_json;bool返回值作为轮次结束信号:解析到终止事件就返回true,主循环立即break,不依赖进程退出;解析逻辑在本地与远程复用:SSH 到远端机器跑 Agent 时,OpenSquirrel 用 tmux 快照轮询屏幕,但喂给解析器的函数与本地完全相同(src/runtime.rs)——一套方言翻译,两处使用。项目已归档,作者的经验是终端已经赢了——但 SPEC.md 与这套流式解析代码,依旧是理解多 Agent 编排的好教材。赞分享【免费下载链接】OpenSquirrelFor people who get distracted by agents. A native Rust/GPUI control plane for running Claude Code, Codex, Cursor, and OpenCode side by side — because if youre going to be squirrely, you might as well optimize for it.项目地址https://gitcode.com/gh_mirrors/ope/OpenSquirrel点击查看免费下载相关推荐A2A 流式输出与多轮对话实战基于 LangGraph 的 Currency Agent 深度解析A2A 流式输出与多轮对话实战基于 LangGraph 的 Currency Agent 深度解析 本篇技术指南聚焦 Agent2Agent A2A 协议中人工智能AI AgentAPI设计gpt-computer-assistantUpsonicChat 会话层深度解析多轮会话编排、流式/HITL 与成本观测gpt computer assistantUpsonicChat 会话层深度解析多轮会话编排、流式/HITL 与成本观测 Upsonic 框架的 ups人工智能大模型AI AgentAgent 框架自主智能体工具调用RAGAgent 记忆Agent 编排temporal-ai-agent多轮对话AI Agent与Temporal工作流temporal ai agent多轮对话AI Agent与Temporal工作流 Temporal AI Agent 是一个开源项目通过展示AI Agen创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

POJ 1251 Jungle Roads:最小生成树入门与Kruskal、Prim算法实战解析

POJ 1251 Jungle Roads:最小生成树入门与Kruskal、Prim算法实战解析

最近刷题又碰到了 POJ 1251 Jungle Roads 这道题,当年刚入门算法时就栽在它的输入格式上,现在回头看,它其实是讲清楚最小生成树(MST)最合适的入门题之一。题目本身不绕弯:一堆写着字母的村庄,若…

2026/10/12 20:31:56 阅读更多 →
open-code-review:把代码评审变成可复用的团队工程资产

open-code-review:把代码评审变成可复用的团队工程资产

1. 为什么我把代码评审做成了一场“公开演出”先说一个背景:我之前在某团队负责一个核心基础库的维护,代码库大概几十万行,触达面很广。团队内部一直有评审流程,但说实话,早期就是“走形式”——PR 挂上去,…

2026/10/12 20:31:56 阅读更多 →
S7-200 PLC与组态王四传送带顺序启停控制:从梯形图到动画联调全解析

S7-200 PLC与组态王四传送带顺序启停控制:从梯形图到动画联调全解析

组态群里问“基于S7-200 PLC和组态王做四传送带”的人,十有八九是毕业设计或者课程设计。这个题目太经典了,经典到什么程度呢——几乎每个PLC实验室都有一套四传送带实训台,每条带子配一个小电机、一个光电传感器,启动时按顺序一台…

2026/10/12 20:31:56 阅读更多 →

最新新闻

STM32定时器编码器四倍频原理与配置实战

STM32定时器编码器四倍频原理与配置实战

1. 为什么编码器四倍频值得单独拿出来说做电机控制或者位置检测的朋友,对增量式编码器肯定不陌生。这种编码器一般输出A、B两路正交信号,转一圈输出固定数量的脉冲。但很多人第一次用STM32的定时器接编码器时,会发现读出来的计数值和手册上的…

2026/10/12 21:30:16 阅读更多 →
导弹烟雾火焰数据集解析:VOC与YOLO双格式目标检测训练指南

导弹烟雾火焰数据集解析:VOC与YOLO双格式目标检测训练指南

简介:面向目标检测算法改进实验的导弹发射与爆炸烟雾火焰数据集,聚焦军事/烟火场景中的烟雾(smoke)与火焰(fire)两类目标。压缩包为rar格式,共含2000个文件,以txt格式的YOLO标签、xm…

2026/10/12 21:30:16 阅读更多 →
RK3588平台WiFi芯片BSP移植:aic8800调试全流程解析

RK3588平台WiFi芯片BSP移植:aic8800调试全流程解析

BSP调试#06:WiFi-aic8800(RK3588)这个调试记录适合正在做RK3588平台BSP移植、或者拿到一颗不熟悉型号WiFi芯片需要快速跑通的工程师。这次的调试对象是aic8800,一颗国内厂商推出的WiFi芯片,常见的封装形态有模组和邮票…

2026/10/12 21:30:16 阅读更多 →
老虎目标检测数据集:VOC+YOLO双格式2055张图一键训练

老虎目标检测数据集:VOC+YOLO双格式2055张图一键训练

简介:本资源是一份专为计算机视觉目标检测任务构建的高质量老虎图像数据集,适用于深度学习初学者、算法工程师及科研人员开展模型训练与验证。数据集共2055张JPEG图像,全部配有精确标注——每图对应1个VOC格式XML文件与1个YOLO格式TXT文件&am…

2026/10/12 21:30:16 阅读更多 →
AI 日报 2026-09-07:把 Codex auth.json 改到 TaoToken 的实操记录

AI 日报 2026-09-07:把 Codex auth.json 改到 TaoToken 的实操记录

/* 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 21:30:16 阅读更多 →
基于Python的AI五子棋:Minimax与Alpha-Beta剪枝实战解析

基于Python的AI五子棋:Minimax与Alpha-Beta剪枝实战解析

简介:面向Python初学者的AI五子棋实战项目,以极大极小值搜索与Alpha-Beta剪枝为核心,清晰演示从棋盘初始化、落子校验、胜负判断到AI决策的完整实现思路。项目模块划分明确,game.py处理规则,ai.py实现递归搜索、评估函…

2026/10/12 21:29:15 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器: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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →