What happened? / 问题描述
子代理(Task/explorer/test-runner/自定义)运行过程中,其自身输入上下文一旦超过所选模型的上下文窗口,provider 直接返回 context-length 错误,子代理以 status=failed(CONTEXT_TOO_LARGE)整体结束,父代理只拿到一段 provider 错误文本,没有任何自动压缩、截断重试或降级。
源码定位(v0.15.1):
subagent.ts:214-235 创建 Agent 时只传入 streamFn/getApiKey/convertToLlm/afterToolCall/initialState/toolExecution,没有 pi-agent-core 的 prepareNextTurnWithContext 压缩钩子(主会话在 runtime.ts:1869-1870 接入;全仓库 grep 该钩子仅父会话 1 处,subagent.ts 为 0)。
pi-agent-core(0.85.1)runLoop 中 config.prepareNextTurn = this.prepareNextTurnWithContext || this.prepareNextTurn,两者皆无时为 undefined,循环内永不触发压缩;其自带 prepareCompaction/generateSummaryWithRequest 摘要原语只在宿主 hook 内被调用,Agent 不生效。
输入只增不减:resume 续跑由 delegation-history.ts:311 seedDelegateMessages() 把整条链历史(originalTask+全部 rows)不经截断直接播种;运行期每轮工具结果(toolResult)持续追加,单条有上限(Read 128KB/shell 96KB,spec 16)但聚合无上限(相关 open PR:feat(agent-runtime): tier old tool results when the outgoing view is under pressure #705 )。
子代理连手动压缩工具都没有:SUBAGENT_INHERIT_DENY_TOOLS(subagent-definition.ts:120-128)明确排除 new_context。即使 tools: inherit 也拿不到。
超过上下文后:agent-errors.ts:407(413)与 412/425(CONTEXT_PATTERN)归类 CONTEXT_TOO_LARGE,retriable=false;SubagentRun.run() 直接 result("failed")。唯一后路是定义显式配置更大窗口的 fallbackModels(默认内置子代理没有),且因上下文原样携带,窗口不比目标大的 fallback 也会失败。
主会话同场景有 contextBudget(runtime.ts:5626,hardLimit=window−输出预留)、prompt() 预检压缩(7408)与 turn 边界压缩(5823,ADR 0064)三层保护,子代理三层全缺失。
Steps to reproduce / 复现步骤
创建一个小窗口模型(如 32k/64k)的子代理,或对一个已跑过的子代理使用 Task.resume 续跑长链;
主会话调用 Task,任务要求其连续 Read 大文件 / Grep 大量内容,让子代理上下文逐步接近模型窗口;
运行一段时间后观察:子代理卡片变为 failed,消息内容为类似“This model's maximum context length is X tokens...”的 provider 错误;
期间没有任何压缩动作、没有 new_context 工具可自救;主会话上下文不受影响(子代理行被过滤),但委托结果直接丢失。
Expected behavior / 预期行为
子代理按 model.contextWindow 计算预算(contextBudget: hardLimit=window−输出预留),turn 边界或新任务前自动压缩(摘要/新窗口),与主会话 ADR 0064 行为一致;
摘要无法生成/装不下时降级:仅保留最近 user/任务消息并丢弃历史,并记录 SUBAGENT_CONTEXT_OVERFLOW 降级标记;
实在无法恢复时,以明确的 SUBAGENT_CONTEXT_OVERFLOW 失败并给出可操作提示(缩小任务范围 / 换更大窗口模型 / 减少工具读取范围),而不是一串 provider 错误;
resume 时应按预算截断/分层,而不是整链无限制灌入。
Actual behavior / 实际行为
子代理无上下文预算、无自动压缩、无截断重试;
resume 链与工具结果聚合不受限;
输入超过上下文大小即 CONTEXT_TOO_LARGE 硬失败(CONTEXT_TOO_LARGE 不可重试);
失败报告无任何用户可操作指引;
父代理仅收到 status=failed 与 provider 错误文本。
App version / 应用版本
0.15.1
Operating system / 操作系统
Windows
Extra environment / 其他环境信息
win32 x64 · NSIS · host 0.15.1
Logs / 日志
Screenshots / 截图
No response
What happened? / 问题描述
子代理(Task/explorer/test-runner/自定义)运行过程中,其自身输入上下文一旦超过所选模型的上下文窗口,provider 直接返回 context-length 错误,子代理以 status=failed(CONTEXT_TOO_LARGE)整体结束,父代理只拿到一段 provider 错误文本,没有任何自动压缩、截断重试或降级。
源码定位(v0.15.1):
Steps to reproduce / 复现步骤
Expected behavior / 预期行为
Actual behavior / 实际行为
子代理无上下文预算、无自动压缩、无截断重试;
resume 链与工具结果聚合不受限;
输入超过上下文大小即 CONTEXT_TOO_LARGE 硬失败(CONTEXT_TOO_LARGE 不可重试);
失败报告无任何用户可操作指引;
父代理仅收到 status=failed 与 provider 错误文本。
App version / 应用版本
0.15.1
Operating system / 操作系统
Windows
Extra environment / 其他环境信息
win32 x64 · NSIS · host 0.15.1
Logs / 日志
Screenshots / 截图
No response