
人工智能AI AgentAgent 框架DeepSeek【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址https://gitcode.com/gh_mirrors/de/deepseek-harness点击查看免费下载稳定快照stable snapshot是 DeepSeek Harness 无密钥测试体系的核心资产session.jsonl等 fixture 既要充当回放输入又要充当期望输出因此任何一次行为未发生变化的刷新都不应改写其中的随机值。本篇文章以packages/test-support/session-snapshot为对象深入讲解 ACP/JSON-RPC/Web 录制器在刷新写回时如何识别会话 ID、cwd 别名、spill locator、事件时间、消息 UUID 等易变值并依据消息指纹与记录对齐实现按叶节点保留既有值的稳定化算法。读完本文你将理解normalizeSessionLog的判定职责、stabilizeRefreshLog的两段式写回流程以及为何在结构存在歧义时必须放弃复用、保守保留本次生成的值。问题背景比较已归一化写回却持久化原始值在 DeepSeek Harness 的快照测试体系中一次会话录制会被同时用作两种角色作为回放输入驱动无密钥重放以及作为期望输出与新的运行结果逐行比较。为了让两次运行能够比较dsh-session-snapshot提供了一组纯函数归一化器见 packages/test-support/session-snapshot/src/normalize.tsnormalizeStdout将 JSON-RPC 帧的id重写为首次出现的序号1、2、3…并擦除所有易变字符串normalizeSessionLog将 session header 的createdAt、事件time、打包行的time0、goal/change生命周期时钟、hook/result的durationMs置零同时把本次运行的 session id、cwd 及其别名、spill 路径、UUID 替换为稳定 token{{sessionId}}、{{cwd}}、{{spillLocator:name}}等normalizeSessionSnapshots在多个日志父级 子级之间做保持关系的类型化身份脱敏{{session:1}}、{{message:1}}…再执行重打包与 scrubbing。由此带来的矛盾正是关联文档所描述的问题比较约定把两份日志视为相等但刷新写回时持久化的却是本次运行新生成的原始值。也就是说即便一次刷新什么都没变新的随机 UUID、宿主特有的路径写法仍会被写回 fixture造成无意义的 diff 与噪声提交。另一个微妙点在于消息身份所需的结构前提比记录对齐更弱。无关日志事件比如插入一条session/title会破坏逐条记录的对齐但继承而来的消息去除身份后的值在父级与子级日志之间仍然保持不变因此在消息层面仍有复用空间。决策总览两条独立的稳定化路径关联文档记录的核心决策是在录制或刷新写入会话 fixture 之前共享快照支持层packages/test-support/session-snapshot/src/suite.ts分两步处理结构化消息身份复用stabilizeFixtureMessageIds以会话包的权威 surface 类型谓词识别 surface 载体并识别agent/inbox/spliced中已排队的消息副本移除每条完整消息的顶层id后计算指纹仅当某个 ID 与其指纹在本次生成图和现有图中的度均为 1 时才复用既有 UUID。叶节点级易变值保留stabilizeRefreshLog以normalizeSessionLog作为对齐叶值是否易变的判定依据递归比较本次生成记录与现有记录的叶节点——归一化后等价的叶保留现有原始值归一化后不同的叶保留本次生成的语义值。两条路径刻意互不干扰surface/inbox 载体中的完整消息 ID 不参与第二条路径以避免按位置复用与结构复用各自独立分配同一个已提交 UUID。第一段写回按消息指纹复用已提交 UUID识别 surface 载体与 inbox 排队副本在 suite.ts 中completeMessage定义了完整消息的最小结构前提id为 UUID 形态的字符串、存在role、content为数组、source为对象。随后recordMessages依据两条来源收集消息surface 事件通过isSurfaceEligibleType来自deepseek-ai/dsh-session/surface判定权威类型。user/message直接取data为消息assistant/message与tool/result取data.message遇到未知 surface 形态时显式抛错保证权威谓词不认识的新形态不会静默漏检。agent/inbox/spliced事件data.inserted数组中结构完整的消息副本同样视为该载体关联的已排队消息。双轴度唯一性ID 与指纹必须一一对应uniqueMessageIdssuite.ts对场景内全部日志建立两张索引fingerprintsById每个 ID 对应的指纹集合指纹是去掉id后按键排序的 canonical JSONidsByFingerprint每个指纹对应的 ID 集合。一个候选要被复用必须满足两个方向都唯一某个 ID 的所有出现必须是同一条指纹fingerprints.size 1且该指纹在整张图中也只对应这一个 IDidsByFingerprint.get(fingerprint)?.size 1。随后fixtureMessageIdReplacements把本次生成图中唯一、现有图中唯一、且指纹相同的 ID 对映射起来——新出现、发生变化、内容重复、格式错误或存在冲突的消息全部保留本次生成的 ID。之所以要求具有相同 ID、重复出现的继承消息仍算作一个候选项是因为父级与子级日志可能通过agent/inbox/spliced与 surface 事件同时携带同一条继承消息它们共享同一个 ID 与同一指纹应当被视作同一个候选项整体复用。只改写验证过的消息 id 字段applyFixtureMessageIdssuite.ts在写回时逐行解析 JSONL仅通过recordMessages识别出的完整消息位置改写id字段其余文本中的相同 UUID 字符串比如模型 prose 中恰好出现的 UUID保持原样避免越界替换。类型化身份脱敏则发生在最后一步redactSessionSnapshotIdspackages/test-support/session-snapshot/src/identity.ts按首次出现的类型化 token{{session:N}}、{{message:N}}、{{approval:N}}、{{workflow:N}}、{{command:N}}、{{rpc:N}}、{{retry:N}}、{{id:N}}统一改写父子日志从而让跨日志保持相等关系成为提交时的不变量identity.spec.ts 验证了同一消息 ID 在父日志agent/inbox/spliced与子日志user/message中被映射为同一个{{message:1}}且parentSession指向{{session:1}}。第二段写回以归一化结果为准的叶节点保留字面量替换session id、cwd、spill 路径写回前refreshFixtureReplacementssuite.ts先从每条日志与对应既有 fixture 的 header 中提取字面量替换对本次运行的id→ 既有 fixture 的id本次运行的cwd→ 既有 fixture 的cwdspill 路径用extractSnapshotSpillPathsnormalize.ts按文件名后缀匹配快照模式 spill 路径dsh-acp-snap-*/dsh-acp-snapshot-spill实现文件名不变则路径不换。stabilizeRefreshLog首先用applyFixtureReplacements完成这批字面量替换。归一化后等价即保留语义变化才写回这是整篇文章最关键的一步。stabilizeRefreshLogsuite.ts对每条记录做如下处理构建日志级字符串双射normalizedStringMappings要求两条日志逐记录类型对齐打包行按packedTimes展开为逻辑assistant/chunk成员session/title允许插入标题这一例外并对所有归一化后等价但原文不同的字符串建立 forward/reverse 双向映射。任何一处记录类型对不上、数组长度不一致、映射发生冲突或字符串同时包含语义变化与易变变化整个日志即停用归一化字符串复用返回undefined。递归保留叶节点preserveNormalizedVolatiles遵循对象按键对齐、数组仅当长度全部一致才对位、字符串始终是不可拆分叶节点的规则只有当某叶节点的normalizeSessionLog以本次运行的 id、cwd 及全部 cwd 别名归一化与既有 fixture以 fixture 自身 header 上下文归一化结果相等时才把既有原始值写回否则保留本次生成的语义值。fixture 易变字段回填preserveFixtureVolatiles直接回填 session 的id/createdAt/cwd/parentSession、事件time、hook/result.durationMspreservePackedMemberTimes则把既有打包行的逻辑成员时间映射回新的time0与dt间隙保持持久化布局稳定。fixtureContextsuite.ts负责从既有 fixture 自身的 header 提取归一化上下文——因为已提交 fixture 的 id 与 cwd 必然不同于本次运行必须各自以自己的上下文归一化后才可比。布局对齐的例外打包分片与插入标题复用前必须确保完整逻辑记录布局对齐但有两个既有的等价情形例外打包分片计时text-chunks/reasoning-chunks/tool-call-chunks这类打包行其物理行数与成员数无关logicalRecords会将其展开为逻辑事件后再对齐因此持久化 flush 边界不影响复用插入标题session/title记录在本次生成图中新出现时沿用前一条事件的时间戳不破坏后续记录的对位。这两条路径对齐的是逻辑事件而非单条记录内的值因此与叶节点保留互不干扰。为何不选更简单的方案关联文档记录了三类被否决的替代方案理解它们有助于把握当前设计的边界在快照部署中使用确定性 UUID 和 spill 文件名替换生产环境的随机性会削弱测试真正要验证的安全属性UUID 不可预测、路径不可枚举或者迫使存储与审批实现引入仅测试可见的特殊行为得不偿失。提交归一化后的 fixturetoken 化后的会话日志不再是原始回放输入会引发与写回缺陷无关的大范围 fixture 迁移且降低了 fixture 的可读性与可审计性。整条记录归一化形式未变就整条保留实现更简单但同一记录中另一个字段发生语义变化时会连带改写其中本应保持稳定的随机字段按叶节点保留让是否保留的决策彼此独立。后果与保守策略这项改动带来的可验证收益关联文档后果一节 测试套件确认无论录制由 ACP、JSON-RPC 还是 Web 负责只要周边记录布局因无关事件改变未变化且唯一的消息 UUID 都不会被改写重复刷新会保留规范化器归类为易变值的已对齐 fixture 值未来在规范化器normalize.ts中新增易变值类别也会自动继承同样的写回行为聚焦的单元测试覆盖了surface 消息全部形态、持久 inbox/surface 关联、场景内父子消息关联、带 cwd 的可写 fixture 消息匹配、无关事件插入、格式错误消息隔离、ID 与指纹双轴歧义、单一处理方写回、对象/数组递归、映射冲突、本次运行 cwd 别名、易变字符串与语义字段并存等情形见 packages/test-support/session-snapshot/tests/无密钥刷新测试证明审批 UUID、cwd 别名、spill 路径与事件读取中的易变值不会改变已提交 fixture 的任何字节。结构存在歧义时系统始终选择保守记录无法匹配、字符串映射冲突、数组尺寸变化、字符串同时含语义变化与易变变化、消息格式错误、消息图中 ID 或指纹不唯一均使用本次生成的值绝不冒险复用未对齐的数据。这一宁可不复用不可错复用的原则是稳定快照刷新机制能够安全服务于test:snapshot:refresh无密钥刷新流程的根本保障。延伸阅读dsh-session-snapshot 包说明记录/回放/刷新三种模式的完整用法、header 固定pin机制与 fixture 守护规则normalize.tsnormalizeSessionLog、normalizeSessionSnapshots、tokenizeSessionFixtureCwd、scrubSessionSnapshot等全部归一化器实现identity.ts跨父子日志保持关系的类型化身份脱敏identity.spec.ts 与 normalize.spec.ts聚焦的身份映射与归一化行为测试测试策略文档无密钥快照分层在何时被要求以及 fixture 的归属规则。赞分享人工智能AI AgentAgent 框架DeepSeek【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址https://gitcode.com/gh_mirrors/de/deepseek-harness点击查看免费下载相关推荐DeepSeek Harness 消息身份与不可变值架构createMessage/freezeMessage 的识别边界设计DeepSeek Harness 消息身份与不可变值架构 createMessage / freezeMessage 的识别边界设计 导读 DeepSeek人工智能AI AgentAgent 框架DeepSeekDeepSeek Harness 可寻址队列操作为每条排队消息建立唯一身份与权威快照DeepSeek Harness 可寻址队列操作为每条排队消息建立唯一身份与权威快照 导读 本文基于 DeepSeek Harness 仓库中的设计记录 2人工智能AI AgentAgent 框架DeepSeekChatDev 2.0 Passthrough 节点详解消息透传、上下文保留与图结构理线实战ChatDev 2.0 Passthrough 节点详解消息透传、上下文保留与图结构理线实战 Passthrough 节点是 ChatDev 2.0 工作AI AgentAgent 框架Agent 工作流低代码工作流自动化OpenBMB创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考