Skip to content

[Bug] 子代理未设置上下文,无自动压缩逻辑,输入超过上下文大小后硬失败,任务整体丢失 #708

Description

@angeiv

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 / 复现步骤

  1. 创建一个小窗口模型(如 32k/64k)的子代理,或对一个已跑过的子代理使用 Task.resume 续跑长链;
  2. 主会话调用 Task,任务要求其连续 Read 大文件 / Grep 大量内容,让子代理上下文逐步接近模型窗口;
  3. 运行一段时间后观察:子代理卡片变为 failed,消息内容为类似“This model's maximum context length is X tokens...”的 provider 错误;
  4. 期间没有任何压缩动作、没有 new_context 工具可自救;主会话上下文不受影响(子代理行被过滤),但委托结果直接丢失。

Expected behavior / 预期行为

  1. 子代理按 model.contextWindow 计算预算(contextBudget: hardLimit=window−输出预留),turn 边界或新任务前自动压缩(摘要/新窗口),与主会话 ADR 0064 行为一致;
  2. 摘要无法生成/装不下时降级:仅保留最近 user/任务消息并丢弃历史,并记录 SUBAGENT_CONTEXT_OVERFLOW 降级标记;
  3. 实在无法恢复时,以明确的 SUBAGENT_CONTEXT_OVERFLOW 失败并给出可操作提示(缩小任务范围 / 换更大窗口模型 / 减少工具读取范围),而不是一串 provider 错误;
  4. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions