上下文迁移 · 任务交接(context-handoff)
解决"上下文满 → 任务怎么办"的通用方案。 窗口不变、历史不删、上下文清零重算、记忆靠文件交接。
何时使用
- 提示"已达到输出 token 上限"、回答被截断
- 用户说:交接一下 / 上下文满了 / 换新对话继续 / 续命 / 保存进度 / 开新对话
- 感觉上下文将满(长任务进行到后半段)
- 后台任务在跑、需要跨会话延续(如数据下载)
核心机制(先讲清楚,执行才不走偏)
| 概念 | 事实 |
|---|---|
| 对话窗口 | 同一个,不换(DSH 在原窗口续命=开新 session) |
| 旧对话记录 | 磁盘 session 文件永久保留,可回看,不占新上下文 |
| 新 session 上下文 | 从 0 token 重新计算 |
| 新 session 的记忆 | 空白——必须靠交接文档恢复 |
| 后台任务 | 照常跑,归属旧 session;新 session 用 job_list / 日志文件确认状态 |
| 禁忌 | 绝不读旧 session.jsonl.zstd(几万条消息会瞬间撑爆新上下文) |
工作流(5 步)
1. 保存交接文档 → 写 <工作区>/docs/任务交接-新对话引导.md(模板见下)
2. 汇报后台任务 → job_list + 日志 tail,说明哪些在跑、归属哪个会话
3. 生成引导消息 → 按模板生成可复制粘贴的一段话(含文档路径+优先任务)
4. 交还给用户 → 用户在新对话/原窗口续命时粘贴引导消息
5. 新对话接管 → 读交接文档 → 逐项汇报状态 → 继续执行
交接文档模板(<工作区>/docs/任务交接-新对话引导.md)
# 任务交接 · 新对话引导(<日期>)
## 一、工作区速览
| 项 | 位置 |
|----|------|
| 工作区根目录 | <绝对路径> |
| 关键数据/产物 | <路径清单> |
| 配置 | <config 路径> |
| 技能/依赖 | <相关技能名> |
## 二、当前状态快照(<日期时间>)
- <正在进行的任务:后台任务 id、日志路径、预计时长>
- <已完成的关键成果,1-3 条>
- <环境/网络等注意事项>
## 三、待办清单(按优先级)
- [ ] 1. ...
- [ ] 2. ...
## 四、常用命令
```powershell
<工作区关键命令,每行一条>
五、新对话引导消息(复制粘贴到新对话)
<见下方模板>
## 新对话引导消息模板
我是从<工作区名>上一段对话交接过来的。请先读:
- <工作区>/docs/任务交接-新对话引导.md
- <若有补充文档,列出>
当前优先任务(按序): A. 确认后台任务状态(job_list;日志 <路径>),完成后校验<关键产物> B. <待用户确认的事项> C. <每日/定期任务>
工作区根目录:<绝对路径> <关键约束/依赖说明,如数据源、只能本地执行等> 请先读完交接文档,然后逐项汇报当前状态。
## 执行规范(铁律)
1. **交接文档 ≤ 几百 token**:状态+待办+命令精炼成摘要,细节一律指向文件,禁止大段复制旧对话内容
2. **产物全部落文件**:脚本/配置/报告/日志在工作区,新 session 靠文件恢复上下文,不靠记忆
3. **禁止读旧 session 文件**:`<DSH_HOME>/sessions/<会话>/session.jsonl.zstd` 只做磁盘档案,不加载进新上下文
4. **后台任务先确认再动手**:新 session 先 job_list;任务归属旧会话时用日志文件(而非 job_output)查进度,避免"跨会话读不到"的困惑,也避免重复启动任务(如两个下载抢限流)
5. **交接即存档**:交接文档本身就是进度档案,多次交接可累积(新文档覆盖旧文档,但历史内容留档在旧文档或改名为带日期版本)
6. **完成后确认**:新对话接管后应汇报"状态已恢复",并逐项确认待办,用户点头再执行
## 触发示例
- 用户:"上下文满了,交接一下" → 执行工作流
- 用户:"换新对话继续" → 保存交接+给引导消息
- 输出被截断时 → 尽快把当前状态写进交接文档,再给引导消息
## 自动模式(模型感知 · 本地小上下文模型专用)
> 适用:Qwen3.6-35B-IQ3_S(128k)等本地模型——上下文小,容易对话到 80 轮就逼近上限。
### 模型上下文预算表(来自 settings.yaml)
| 模型 | contextWindow | 预警 70% | 完成即交接 80% | 立即交接 90% |
|------|--------------|---------|---------------|-------------|
| Qwen3.6-35B-IQ3_S (文本) | **131072** | ~92k | ~105k | ~118k |
| Ornith-1.5 9B | 262144 | ~183k | ~210k | ~236k |
| Qwen3.5-9B | 262144 | ~183k | ~210k | ~236k |
### 自动检查(每轮或每 N 轮执行一次)
```powershell
python "<skill 目录>\scripts\check_context.py" --window 131072
# 输出 CONTEXT: used≈x tokens | 轮数=n | action=OK/WARN/FINISH_THEN_HANDOFF/HANDOFF_NOW
action 处理规则
| action | 处理 |
|---|---|
| OK | 继续正常对话 |
| WARN | 提醒用户上下文将满,后续回答尽量精简 |
| FINISH_THEN_HANDOFF | 当前任务若能在剩余预算内完成(估算 ≤ 5k token)→ 完成任务后立即执行本技能交接流程;否则视同 HANDOFF_NOW |
| HANDOFF_NOW | 立即执行交接(保存状态 → 生成引导消息 → 交还用户) |
触发轮数(80轮规律,用户实测)
- 轮数 ≥ 80 或 用量 ≥80% → 任务完成后立即交接(这正是"90~100k 能完成对话→完成后再交接"的需求)
- 轮数 ≥ 100 或 用量 ≥90% → 立即交接(不再等任务完成,防硬截断)
如何"只要调用该模型就自动生效"
DSH 技能系统按"描述匹配+用户触发"加载,没有"每次调用模型即强制注入"的系统级 hook(Modelfile SYSTEM 会被 DSH 的 agent 系统提示覆盖,不生效)。最接近"自动"的三种做法:
- 会话开启即启用(推荐):在 Qwen3.6 会话的第一条消息说"开启自动续命"→ 本技能被加载,agent 每轮开始跑 check_context.py 自查,到阈值自动交接
- 技能描述自触发:本技能 description 已写明"本地小上下文模型(128k)自动续命"场景,agent 在 qwen3.6 会话中遇到上下文相关提问时会自动加载
- 每轮自查纪律:agent 一旦加载本技能,默认每轮开头运行一次检查(成本极低,一条命令),无需用户反复提醒
交接时务必带上的信息(自动模式)
- 当前轮数/用量(check_context 输出)
- 后台任务状态(job_list + 日志路径)
- 完成到哪一步、下一步做什么(待办清单)
关联
hermes-memory(跨会话持久记忆方法论,可叠加)- 各工作区自身技能(交接文档里的"常用命令"来自对应工作区技能)
scripts/check_context.py(本技能自带:上下文用量/轮数检查,自动模式的执行器)