HoRain云--DeepSeek Harness 会话日志与轮次生命周期
会话日志唯一真源Session 是一份由类型化 SessionEvent 组成的仅追加日志。它是 agent 完整交互历史的唯一真源LLM 消息历史从日志派生而来从不单独存储。回放就是重新从同一组事件派生历史。日志里的每个事件都有单调递增的seqseq log.length和 epoch 毫秒的time。事件基于type做真正的可辨识联合因此switch (event.type)能直接收窄event.data无需类型断言。所有event.data都必须能无损序列化为 JSONSession.append会在源头强制这一点。模型可见即已记录。抵达模型请求的一切都必须能从日志重建并由一项运行时不变量断言这一点。因此新增一项模型可见输入就需要新增一个会话事件扩展 SessionEventMap 并从日志渲染。需要可回放 transcript 数据的 SDK 用户应当消费session/event事件流。deriveMessages从日志投影模型历史Session.deriveMessages()把事件日志投影成模型看到的Message[]。它是缓存的每个 surface 节点在首次出现时投影一次surface 重写时重建。它返回的是冻结的消息数组通过投影修改已记录的历史在类型上不可表达。投影规则很直接事件投影为说明user/message一条 user 消息携带确切 content可选 envelope 只作为日志展示元数据assistant/message一条 assistant 消息包含提供方、模型与可选回放状态assistant/chunk跳过属于回放/UI 数据组装后的消息才是权威tool/result一条带 tool-result 块的 user 消息工具结果以 user 角色回到模型turn/*、step/*跳过结构信息不投影为消息一个细节内容为空的assistant/message也会被跳过。因 max-tokens 截断且无内容的步骤仍会记录一条 assistant/message 来保存用量、提供方与模型但无内容的 assistant 轮次不得进入提供方 transcript。事件三域选对事件域是大多数改动的第一个决定。官方文档把事件分成三域各有各的用途事件域代表事件特性什么时候用会话事件turn/start、step/start、user/message、assistant/*、tool/call、tool/result追加进日志并广播持久事实某个事实必须在重新加载后仍然存在Agent 事件agent/pre-step、agent/request、agent/status、agent/turn-stopping携带活跃 Agent实时控制与状态观察或拦截进行中的工作能力事件tools/*、fs/*、llm/stream无导入循环地向 seam 附加策略给能力 seam 挂策略与适配器其中agent/pre-step、agent/request、llm/stream和三个tools/*事件是 waterfall监听器必须调用next()才能委托下去。agent/turn-stopping是 serial 事件没有next()。轮次与步骤的定义一个步骤step是一次模型请求加上它调用的工具。一个轮次turn包含零个或多个步骤它在领取首条输入之前打开在不再欠下任何工作时关闭。注意轮次包围一次模型循环执行而不是整个会话日志。官方时序图把完整流程画成turn/start → agent/pre-step → step/start → llm/stream → 工具 → step/end → turn/end。输入通过同一个 inbox 到达驱动器。有些消息会立即唤醒驱动器注入的上下文会留在 inbox 中直到另一条消息将其唤醒。agent/pre-step决定模型看到什么监听器可以改写已领取的消息也可以直接拒绝它们。首次领取被拒绝或被改写为空时仍会关闭一个不含步骤的持久轮次因此日志会记录这次尝试。turn 与 step 的关键事件日志里每个边界都有对应的事件下面列出最常用的一批。事件携带的数据说明turn/start{ turn }在 loop 认领排队输入或运行 pre-step 之前打开轮次turn/end{ turn, reason }以 TurnEndReason 关闭轮次completed / aborted / blocked / error / max-tokens / interruptedstep/start{ turn, step }打开某轮次里的一个步骤step/end{ turn, step }关闭该步骤user/messageUserMessage直接提示词、注入上下文、steering 与实时收件箱事件共享的带标识值assistant/chunk{ turn, step, chunk }原始流式分片token 级回放保真assistant/message{ turn, step, message, usage? }组装后的 assistant 消息派生历史用它tool/call{ turn, step, callId, name, arguments }模型请求的一次工具调用arguments 是模型产出的原始 JSON 字符串tool/result{ turn, step, message, error?, meta? }一次完成的工具调用的模型可见结果一个有用的语义assistant/message事件会记录每次成功的提供方调用包括返回空内容或以 max-tokens 结束的调用。空内容不会进入派生历史但该持久事件仍会保留用量。它通过sourceEventSeqs精确列出对应的assistant/chunk事件包括显式空列表。动手示例解析一份 JSONL 会话日志下面是一小段会话日志JSONL 的规范打包行布局来自一次「修复 runoob 仓库 typo」的任务。每一行是一个 SessionEvent包含 type、seq、time 与 data。{type:turn/start,seq:0,time:1755000000000,data:{turn:1}} {type:step/start,seq:1,time:1755000000010,data:{turn:1,step:1}} {type:user/message,seq:2,time:1755000000020,data:{role:user,content:[{type:text,text:Fix the typo in the runoob README.}]},surfaceOp:append,sourceEventSeqs:[0]} {type:assistant/chunk,seq:3,time:1755000000030,data:{turn:1,step:1,chunk:{type:text-delta,text:Ill }}} {type:assistant/chunk,seq:4,time:1755000000040,data:{turn:1,step:1,chunk:{type:tool-call-delta,name:bash,arguments:{\command\:\grep runoob README.md\}}}} {type:assistant/message,seq:5,time:1755000000050,data:{turn:1,step:1,message:{role:assistant,content:[{type:text,text:Ill search},{type:tool_use,id:call_1,name:bash,input:{command:grep runoob README.md}}]},usage:{inputTokens:12,outputTokens:4}},surfaceOp:append,sourceEventSeqs:[3,4]} {type:tool/call,seq:6,time:1755000000060,data:{turn:1,step:1,callId:call_1,name:bash,arguments:{\command\:\grep runoob README.md\}}} {type:tool/result,seq:7,time:1755000000070,data:{turn:1,step:1,message:{role:tool,toolName:bash,content:runoob,isError:false}},surfaceOp:append,sourceEventSeqs:[6]} {type:step/end,seq:8,time:1755000000080,data:{turn:1,step:1}} {type:turn/end,seq:9,time:1755000000090,data:{turn:1,reason:{kind:completed}}}注意user/message、assistant/message、tool/result三种 surface 事件带有surfaceOp标记说明它们如何加入派生 surface。turn/start、step/start等边界事件不携带 surfaceOp也不会投影成模型消息。下面用 Python 重放这份日志重建对话并标出 turn/step 边界。实例# 文件路径examples/parse_session_log.py# 解析一份 JSONL 会话日志重建模型可见的对话并标出 turn/step 边界。# 这是 Session.deriveMessages() 的一个简化教学模型真实实现是缓存的且返回冻结消息。import jsonimport sysdef derive_messages(events):只投影 surface 事件模拟 deriveMessages 的投影规则。user/message - user 消息assistant/message - assistant 消息tool/result - 携带 tool-result 块的 user 消息turn/*, step/*, assistant/chunk, tool/call 不投影为消息messages []for ev in events:t ev[type]d ev[data]if t user/message:messages.append({role: user, content: d[content]})elif t assistant/message:messages.append({role: assistant, content: d[message][content]})elif t tool/result:messages.append({role: tool, name: d[message][toolName], content: d[message][content]})return messagesdef main(path):with open(path, encodingutf-8) as f:events [json.loads(line) for line in f if line.strip()]# 第一遍打印执行边界理解 turn 与 step 的嵌套关系。for ev in events:d ev[data]if ev[type] turn/start:print(f[turn/start] turn{d[turn]})elif ev[type] turn/end:print(f[turn/end] turn{d[turn]} reason{d[reason]})elif ev[type] step/start:print(f [step/start] turn{d[turn]} step{d[step]})elif ev[type] step/end:print(f [step/end] turn{d[turn]} step{d[step]})elif ev[type] assistant/chunk:print(f chunk: {d[chunk][type]})elif ev[type] tool/call:print(f tool/call: {d[name]} args{d[arguments]})# 第二遍重建模型可见的派生历史。print(\n模型可见的派生消息)for m in derive_messages(events):if m[role] tool:print(f [tool] {m[name]}: {m[content]})else:print(f [{m[role]}] {m[content]})if __name__ __main__:main(sys.argv[1])用这份日志跑一遍输出大致是[turn/start] turn1 [step/start] turn1 step1 chunk: text-delta chunk: tool-call-delta tool/call: bash args{command:grep runoob README.md} [step/end] turn1 step1 [turn/end] turn1 reason{kind: completed} 模型可见的派生消息 [user] [{type: text, text: Fix the typo in the runoob README.}] [assistant] [{type: text, text: Ill search}, {type: tool_use, ...}] [tool] bash: runoob原始assistant/chunk在派生时被跳过组装后的assistant/message才是权威。这就是「模型可见即已记录」模型看到的每一条消息都能从这份日志原样重建。小结自测会话日志是模型所见上下文的唯一来源轮次与步骤是日志上的执行边界事件三域帮你选择正确的扩展点。自测题问题参考想保存「重新加载后仍然存在」的事实用哪类事件会话事件持久追加进日志模型看到的历史是从哪来的Session.deriveMessages()从日志派生从不单独存储一个轮次可以包含多少个步骤零个或多个领取首条输入之前打开不再欠工作时关闭

相关新闻

移动网络智能体决策新范式:贝叶斯推理与主动推理融合架构

移动网络智能体决策新范式:贝叶斯推理与主动推理融合架构

1. 项目概述:当移动网络学会“主动思考”最近几年,AI领域的热词从“大模型”逐渐蔓延到“具身智能”和“智能体”。大家可能都注意到了,无论是自动驾驶汽车在复杂路况下的决策,还是一个家庭服务机器人如何规划清扫路线&#xff0c…

2026/8/22 12:27:13 阅读更多 →
Python构建比特币行情分析工具:从数据获取到可视化实战

Python构建比特币行情分析工具:从数据获取到可视化实战

这次我们来看一个比特币行情分析的技术实现项目。这个项目的核心不是预测市场,而是如何通过技术手段获取、分析并可视化比特币行情数据,为交易决策提供参考。对于开发者、量化交易爱好者或对加密货币数据分析感兴趣的技术人员来说,能够本地化…

2026/8/22 13:07:02 阅读更多 →
基于多智能体强化学习的主动协同感知系统:延迟感知与不确定性驱动的无人机跟踪

基于多智能体强化学习的主动协同感知系统:延迟感知与不确定性驱动的无人机跟踪

1. 项目概述:当无人机集群来袭,我们如何协同“看”得更准?在反无人机(Counter-UAS)这个领域待了十几年,我见过太多方案从实验室的“完美”走向实战的“骨感”。一个核心的痛点在于:面对高速、低…

2026/8/22 11:41:30 阅读更多 →

最新新闻

Leaf 号段快取完时 DB 抖了 200ms,发号 RT 从 1ms 拉到 1.2s:雪花、号段、Leaf 的 3 个发号瓶颈

Leaf 号段快取完时 DB 抖了 200ms,发号 RT 从 1ms 拉到 1.2s:雪花、号段、Leaf 的 3 个发号瓶颈

title: Leaf 号段快取完时 DB 抖了 200ms,发号 RT 从 1ms 拉到 1.2s:雪花、号段、Leaf 的 3 个发号瓶颈 date: 2026-08-22 category: 分布式ID tags: [Java, 后端, 分布式ID, 架构]我们的订单号、物流单号、支付流水号都来自一个统一的发号服务。早期用雪…

2026/8/22 16:15:32 阅读更多 →
详解AUTOSAR:专栏总述

详解AUTOSAR:专栏总述

目录 1、理论篇 2、工具篇 3、环境配置篇 4、实践篇 5、项目篇 6、拓展篇 本专栏主要介绍汽车嵌入式系统软件规范AUTOSAR以及符合AUTOSAR规范的车用控制器软件开发方法。 在编写过程中尽可能以通俗易懂的语言和形象的图解来展现AUTOSAR中一些复杂的概念问题,…

2026/8/22 16:15:32 阅读更多 →
spring boot 连接emqx并实现发布订阅

spring boot 连接emqx并实现发布订阅

1、安装依赖 <dependency><groupId>org.springframework.integration</groupId><artifactId>spring-integration-mqtt</artifactId><version>7.1.0</version><scope>compile</scope></dependency><!-- Source:…

2026/8/22 16:15:32 阅读更多 →
运维手动改了一行数据,Seata 回滚时把它覆盖了:AT 模式全局锁和 undo_log 的 3 个被忽略的边界

运维手动改了一行数据,Seata 回滚时把它覆盖了:AT 模式全局锁和 undo_log 的 3 个被忽略的边界

title: 运维手动改了一行数据&#xff0c;Seata 回滚时把它覆盖了&#xff1a;AT 模式全局锁和 undo_log 的 3 个被忽略的边界 date: 2026-08-22 category: 分布式事务 tags: [Java, 后端, 分布式事务, Seata, 微服务]我们订单和库存两个服务用 Seata AT 模式做分布式事务。AT …

2026/8/22 16:15:32 阅读更多 →
看门狗每 10 秒续一次期,业务却跑了 40 秒:Redisson 锁续期源码里藏着的 2 个默认陷阱

看门狗每 10 秒续一次期,业务却跑了 40 秒:Redisson 锁续期源码里藏着的 2 个默认陷阱

title: 看门狗每 10 秒续一次期&#xff0c;业务却跑了 40 秒&#xff1a;Redisson 锁续期源码里藏着的 2 个默认陷阱 date: 2026-08-22 category: 分布式锁 tags: [Java, 后端, Redis, Redisson, 并发编程]我们订单服务用 Redisson 做分布式锁&#xff0c;锁一段「扣减库存 生…

2026/8/22 16:15:32 阅读更多 →
设计模式结构型——桥接模式

设计模式结构型——桥接模式

目录 什么是桥接模式 桥接模式的实现 桥接模式角色 桥接模式类图 桥接模式举例 桥接模式代码实现 桥接模式的特点 优点 缺点 使用场景 注意事项 什么是桥接模式 桥接&#xff08;Bridge&#xff09;模式是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化…

2026/8/22 16:14:32 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域&#xff0c;PCB&#xff08;印制电路板&#xff09;的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡&#xff0c;如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目&#xff0c;选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具&#xff0c;而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说&#xff0c;电路分析是专业课的重中之重&#xff0c;也是拉开分差的关键。进入8月&#xff0c;复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好&#xff0c;我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时&#xff0c;你是否也遇到过这样的困扰&#xff1a;生成的代码功能上没问题&#xff0c;但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者&#xff0c;最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent&#xff0c;从本地部署到云端API&#xff0c;我们正处在一个技术栈快速重构的节点。然而&#xff0c;面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/22 8:09:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →