第 6 讲:请求上下文与 Identity 身份

DeepSeek Harness 源码解析 · 第 6 讲

DeepSeek Harness 源码解析系列 第 6 讲:请求上下文与 Identity 身份 基于 DeepSeek Harness 源码 · 2026-08-21 一、本节概述 在基础架构阶段的前五讲中,我们了解了 Cordis 插件框架、Profile/Bundle/Preset 组合、事件系统、Turn flow 与 Agent 生命周期、依赖注入机制。本节聚焦两个关键模块: 🔹 请求上下文(Request Context) :在每次请求进入 Agent Loop 之前,如何向模型注入时间、tmux 位置、工作区指令、跨会话引用等上下文信息 🔹 Identity 身份系统 :匿名用户 ID 的生成、持久化与并发安全机制 这两个模块共同回答了"模型在做出决策前看到了什么"和"系统如何匿名追踪用户行为"的问题。 二、Context 包架构总览 packages/context/ 下包含四个子包,每个都通过 Cordis 插件机制在 agent/pre-step 事件中注入上下文: 📁 packages/context/ 目录结构 packages/context/ ├── time-context/ # 时间戳 + 浏览器时区注入 ├── tmux-context/ # tmux 位置与布局注入 ├── agent-instructions/ # AGENTS.md 工作区指令动态加载 ├── session-reference/ # 跨会话引用与快照 三、Time Context:请求时钟与浏览器时区 核心问题 :大模型本身没有"现在几点"的概念。Time Context 插件在每个请求前注入精确的时间戳、时区信息和距上次消息的间隔,让模型具备时间感知能力。 3.1 插件入口与配置校验 插件通过 apply() 函数注册到 Cordis 上下文,配置项经过 Schemastery 校验: 📄 packages/context/time-context/src/index.ts (第 27-37 行) /** 请求准备时钟格式化与追加调度。无效值导致插件加载失败 */ export interface Config { /** 当当前 turn 没有唯一浏览器时区时的回退显示时区。省略则使用进程时区 */ timeZone?: string /** 同一 session 中两次持久化注入之间的最小毫秒数。设为 0 表示每次 eligible step 都注入 */ refreshIntervalMs?: number } /** Schemastery 校验:确保运行时配置合法 */ export const Config: z<Config> = z.object({ timeZone: z.string(), refreshIntervalMs: z.number(), }) 设计意图: timeZone 允许用户覆盖默认时区, refreshIntervalMs 防止在长对话中重复注入相同的时间上下文,节省 Token 预算。 3.2 时间格式化与紧凑间隔显示 📄 packages/context/time-context/src/index.ts (第 41-55 行) /** 将毫秒数格式化为紧凑的秒级单位(如 "2h 15m 30s") */ function formatDuration(elapsedMs: number): string { let seconds = Math.floor(Math.max(0, elapsedMs) / 1000) // 转为秒,确保非负 const days = Math.floor(seconds / 86_400) // 提取天数 seconds %= 86_400 // 去掉天数后剩余秒数 const hours = Math.floor(seconds / 3600) // 提取小时 seconds %= 3600 // 去掉小时后剩余秒数 const minutes = Math.floor(seconds / 60) // 提取分钟 seconds %= 60 // 最终剩余就是秒 const parts: string[] = [] if (days > 0)…

阅读全文:DeepSeek Harness 源码解析 第 6 讲