Repository Wiki
deepseek-ai/deepseek-harness

提示词组装、请求序列与模型历史

本文说明已验证的 Agent 级提示词组装上下文和事件分发边界,并明确区分尚未从源码核实的请求序列及模型历史机制。

目的与范围

此页聚焦 @deepseek-ai/dsh-agent/dispatch 提供的组装上下文工厂 assembleContextFor,以及在 Agent 范围内协调提示词或工具贡献时使用的 agentEvents。这不是模型调用、消息序列化、历史持久化或历史裁剪的完整实现说明:本次可用源码未展示这些部分的实现细节,因此不推断消息格式、存储结构或调用顺序。有关其他会话能力,请参阅对应会话主题;不要将事件分发等同于历史写入。dispatch.ts dispatch.ts

概述

同一个 Agent 既是组装上下文中的 agent,又是 scope;这保证组装调用携带相同的主体与作用域。可选的本轮 AbortSignal 仅在提供时放入上下文。事件侧通过 agentCarrier 建立范围载体,通过 agentEvents 注入 Agent 主体并调用 Cordis 的分发机制;调用者不必单独维护事件载荷里的 agent。这一耦合旨在避免作用域键和事件主体不一致。dispatch.ts dispatch.ts dispatch.ts

架构

Loading diagram...

Source: dispatch.ts

图中 AssembleContext 是从 @deepseek-ai/dsh-system-prompt 导入的类型;图只表示该文件中已出现的依赖和返回值,不暗示 assemble() 的实现或模型历史持久层已被验证。agentEvents 的三个分支分别是通知、串行事件以及环绕式 waterfall;作用域载体可预先构造并传给分发器,避免重复创建。dispatch.ts dispatch.ts

实现与核心流程

组装上下文:主体和作用域同时设置

assembleContextFor(agent, signal?) 返回 { agent, scope: agent };若 signal 是 undefined,展开的是空对象,不会生成 signal 属性,否则将传入信号原样放入返回对象。代码注释明确将其用于传给 assemble() 的上下文,并指出此设计避免遗漏 Agent 范围内的提示词与工具贡献。此处没有调用 assemble(),因此不能由该函数推断提示词片段的排列规则或最终文本格式。dispatch.ts

Agent 事件:类型筛选、主体注入与三种分发方式

AgentSubjectEvent 从 Events 中筛选满足两个条件的事件:处理器的 this 为 Scoped<Agent>,第一个参数的载荷含有 agent: Agent。PayloadRest 在发射端去掉 agent 字段;fused 再将当前 Agent 注入载荷,并把 agent 写在展开的载荷之后,即使运行时载荷中出现同名字段也会被当前主体覆盖。事件方法均使用同一 carrier,使分发范围与载荷主体保持一致。dispatch.ts dispatch.ts

  • emit:获取过滤后的回调逐个执行;同步抛错、返回 Promise 的拒绝分别记录警告,不阻止后续监听器。它是非阻断通知,而不是等待所有监听器完成的接口。dispatch.ts dispatch.ts
  • serial:将载体、事件名和注入后的载荷传给 Cordis serial 并等待结果;接口注释描述其返回串行链的结果(存在时为第一个 bail 值)。dispatch.ts dispatch.ts
  • waterfall:把附加参数(包含最内层的 next)继续传给 Cordis waterfall,供环绕式监听器组合使用。dispatch.ts dispatch.ts
Loading diagram...

Source: dispatch.ts

该图描述的是事件分发路径,不是向模型发请求的时间线。请求序列构造、历史获取与更新的具体路径:Implementation details not found in source;因此不能据此断言其执行于 emit、serial 或 waterfall 的哪个阶段。

用法示例(源码摘录)

创建本轮组装上下文

typescript
export function assembleContextFor(agent: Agent, signal?: AbortSignal): AssembleContext { return { agent, scope: agent, ...signal === undefined ? {} : { signal } } }

Source: dispatch.ts

这里展示的是实际工厂实现,而非未验证的外部调用示例。省略信号与传入信号两种路径都由同一表达式处理。

构造可复用的 Agent 分发器

typescript
export function agentCarrier(agent: Agent): Scoped<Agent> { return scopeTarget(agent, agent) }

Source: dispatch.ts

agentEvents 接受已有载体作为第三参数;注释建议需要重复分发的循环驱动器在构造时创建并复用,以减少热路径的载体分配。dispatch.ts

一次性通知入口

typescript
1export function emitAgentEvent<K extends AgentSubjectEvent>( 2 ctx: Context, 3 agent: Agent, 4 name: K, 5 payload: PayloadRest<K>, 6): void { 7 agentEvents(ctx, agent).emit(name, payload) 8}

Source: dispatch.ts

此入口为一次通知临时创建分发器;与复用 agentCarrier 的重复分发模式不同。dispatch.ts

配置与 API 参考

此文件没有声明可配置的提示词模板、历史长度、模型参数或环境变量默认值。能在这里确认的是调用参数与默认参数,而不是全局配置。AssembleContext、Events 等契约分别从其他包导入;其完整字段与监听器注册实现未在已读实现中出现。dispatch.ts

参数或选项类型默认值作用
assembleContextFor 的 signalAbortSignal?undefined提供时进入组装上下文;未提供时不生成对应字段。
agentEvents 的 carrierScoped<Agent>agentCarrier(agent)可传入预创建的载体以供重复分发。

以上默认行为见 dispatch.ts 与 dispatch.ts。

API 签名参数与返回已验证的行为
assembleContextFor(agent: Agent, signal?: AbortSignal): AssembleContextAgent 必需,信号可选;返回组装上下文。agent 和 scope 均指向传入 Agent;按条件包含信号。
agentCarrier(agent: Agent): Scoped<Agent>Agent 必需;返回作用域载体。调用 scopeTarget(agent, agent)。
agentEvents(ctx: Context, agent: Agent, carrier: Scoped<Agent> = agentCarrier(agent)): AgentEventDispatchContext 与 Agent 必需,载体可选;返回 emit、serial、waterfall 方法集合。在载荷中注入 Agent 并使用载体进行分发。
emitAgentEvent<K extends AgentSubjectEvent>(ctx: Context, agent: Agent, name: K, payload: PayloadRest<K>): void事件名受 Agent 主体事件类型限制;无返回值。调用临时分发器的 emit。

签名见 dispatch.ts、dispatch.ts、dispatch.ts。emit 的监听器异常被记录而非向调用者抛出;对其他方法、scopeTarget 或组装函数的异常保证,本文件未提供统一契约,不应推断。

故障模式、并发与运行说明

  • 监听器失败隔离:emit 逐个遍历回调,同步异常由 try/catch 记录为警告;异步拒绝经 Promise.resolve(returned).catch(...) 记录为警告。错误不会阻止同一通知的后续观察者。由于不等待回调 Promise,通知完成不代表异步监听器已经完成。dispatch.ts
  • 主体一致性:fused 在展开 payload 后才写入 agent,因此分发器持有的 Agent 优先于潜在的同名运行时载荷字段;此规则配合 carrier 降低事件范围和主体错配的风险。dispatch.ts
  • 分配成本:需要重复分发时可在 Agent 构造期建立载体并复用;一次性 emitAgentEvent 则创建分发器。这里没有性能基准或消息缓存、历史压缩实现的证据。dispatch.ts dispatch.ts
  • 扩展边界:类型筛选出的 Agent 主体事件可通过三个分发模式参与作用域内的行为;但具体有哪些提示词片段提供者、监听器、注册顺序与模型历史适配器,Implementation details not found in source。dispatch.ts dispatch.ts

相关链接

  • Agent 范围的组装上下文与事件入口:当前页面经核实的接入边界。
  • 关于完整的提示词片段排序、模型请求序列及历史存取,请转到各自的提示词、模型调用与会话历史专题;本页不把缺少实现证据的行为写成已确认机制。

Sources

(1 files)