【免费下载链接】OpenCollabA research-friendly, high-performance multi-agent collaboration coding framework.项目地址https://gitcode.com/gh_mirrors/op/OpenCollab点击查看免费下载在长任务中AI 编码 Agent 经常因为上下文窗口被塞满而失忆甚至崩溃。OpenCollab 是一个研究友好的高性能多智能体协作编码框架它通过**上下文整形Context Shaping**和精细的Token 预算分配机制在读取时动态构建有界的上下文视图让 Agent 能在数千步的长任务中稳定运行而不丢失任何原始对话记录。本文带你完整解析这套机制的设计原理与实现细节。为什么长任务容易断气 想象一个持续运行数小时的编码 Agent它不断调用file_read、bash、grep等工具每一步的工具输出都追加进对话历史。到第几百步时上下文窗口context window被工具输出彻底占满模型要么被提供商拒绝请求context overflow要么在记忆里塞满了早已没用的旧文件内容。大多数框架的应对方式是粗暴截断——但这会丢失关键决策。OpenCollab 的做法完全不同整形只发生在发送给模型的那一刻持久化的完整转录transcript永远不动。这意味着压缩、删除、摘要都只是读取时的投影随时可以无损恢复resume整形是分级渐进的压力不大就什么都不做每一层都只处理上一层的输出一旦压力解除后续层自动跳过。整个运行时的分层架构如图所示上图展示了 OpenCollab 的完整运行时从任务/模型/拓扑/Token 与上下文策略的规范层到 Single、Team、Workflow 三种协作模式再到共享的会话循环Session loop。右侧的 Evaluation 列则体现了它对每一次运行在角色、行为、结果、成本上的全程审计能力——而上下文整形正是其中 tokens / context 策略的核心执行者。上下文整形四段流水线ShaperPipeline OpenCollab 的所有整形逻辑集中在 opencollab/application/shaping/ 包中由一个左到右的整形器流水线ShaperPipeline定义于 pipeline.py串联。默认流水线在 container.py 的_build_default_shaper中组装共 4 层层整形器触发条件动作损失程度1PerToolResultBudgetShaper无条件单条工具结果超长则截断 重读指引极低2ToolOutputClearShaper压力触发清空旧的可重建工具输出内容低3OldHistorySnipShaper压力触发整组删除旧的工具交换轮次中4AutoCompactShaper压力触发用模型摘要替换整段历史高最后手段第 1 层单条工具结果预算Per-tool Result Budget实现于 tool_budget.py。任何一条工具结果只要超过预算默认16,000 字符就会被截断为头部内容 重读指针例如附上一条[truncated N chars — re-read a narrower range]的提示告诉模型如何用更窄的offset/limit范围重新读取。这个设计很妙模型永远知道自己看过但没看完可以按需精确回读而不是盲目地整块丢失。第 2 层压力触发清空旧工具输出Layer A0实现在 reactive.py 的ToolOutputClearShaper。只有当上下文估算值越过触发线时才工作它保留最近 5 条可压缩工具结果原样不动把更旧的bash、file_read、grep、git_diff等可重建的只读输出内容替换为一个短占位符[Old tool result content cleared]。注意它只清空内容调用与回答的骨架以及助手轮次的推理完整保留——零孤儿风险零模型调用。编辑/写入类工具的返回则从不被触碰。第 3 层整组删除旧轮次Layer AOldHistorySnipShaper是最便宜的真删除它按最旧优先整组移除旧的工具交换组一个助手的tool_calls轮次连同其所有工具回答直到估算值降回目标线。删除有严格的安全约束系统提示组第 0 组和最近 4 组永远受保护只清理中间地带删除以组为单位绝不会把tool_call_id弄成孤儿提供商要求每次调用都必须有对应回答被删内容仍完整保存在state.messages和持久化转录中恢复会话时可完整重建。第 4 层模型摘要压缩Layer B最后手段AutoCompactShaper是重量级手段默认关闭不注入 summarizer 时恒等不变。当更便宜的层做完压力仍然超限时它把整段可压缩区间交给摘要器替换成一条带可见标记的消息[Context auto-compacted — summary of N earlier messages]而不是伪装成原始历史。摘要提示词compaction_prompt.py刻意保留意图、决策、错误、用户指令、待办工作和下一步动作并带有 LRU 摘要缓存历史不变前缀可以复用旧摘要避免重复付费。一个被刻意移除的直觉方案 值得玩味的是 eager.py 中的EagerToolOutputClearShaper——一个每次调用都无条件清空旧工具输出的整形器。它没有被放进默认流水线因为在低上下文压力时反复改写旧前缀会让原本可复用的 prompt 缓存失效还可能诱发模型重复读取文件代价超过收益。这正是 OpenCollab 压力触发而非预防性清理哲学的实证宁可少做不做无用功。Token 预算分配触发线是怎么算出来的 从模型窗口推导触发线触发/目标阈值不是拍脑袋的常数而是由history_trigger_target见 pipeline.py从当前模型的真实上下文窗口推导有效输入预算 上下文窗口 − 输出预留(20,000) − 安全缓冲(13,000) 触发线 trigger 有效输入预算 目标线 target trigger × 75%输出预留为下一轮模型的总结/回答腾出空间安全缓冲防止估算误差导致真实请求溢出75% 目标比压缩到 75% 而非压到触发线以下一点点留出余量避免下一轮立刻再次触发压缩压缩风暴模型窗口未知时优雅降级为固定默认值120,000 触发 / 90,000 目标。窗口很小时系统还会按比例缩小预留和保留组数affordable_groups保证小窗口模型同样行为合理。用真实 usage 校准估算ContextPressureToken 估算最难的地方在于提供商只报告整个请求的 input token 数不告诉你每条消息各占多少。context_pressure.py 中的ContextPressure用了一个精妙的加性分摊方案每次成功请求后把提供商报告的 input tokens按各消息此前的估算比例分摊回每条消息未改动的消息复用这些权重保持加性供各整形层做增量计算新消息则先用本地估算ASCII 约 3 字符/tokenCJK 约 1 字符/token等下一次真实 usage 再校准加密的推理块不按字节数硬算而是用提供商报告的 output usage 封顶避免高估。这样各层看到的 Token 视图是被真实账单校准过的估算而不是一句空话。优先级保护谁不能被压缩 ️每个上下文来源都带优先级标签定义于 domain/context.py上下文来源默认优先级身份 / 角色提示Identity100团队拓扑Team90技能目录Skill85委托任务Task80项目地图Project30关键常量PIN_FLOOR 70优先级 ≥ 70 的来源身份、团队、技能、任务被钉住永远不会被折叠进摘要项目地图这类低优先级上下文则在压力下可被优先清理。即使进入强制压缩兜底模式提供商真的拒绝了请求后的最后一搏钉住的种子消息也照样受保护。溢出恢复一次重试然后体面停当提供商返回可分类的上下文溢出错误时系统会强制所有反应层全量压缩并重试一次若二次溢出则携带原因优雅停止STOPPED保留所有部分结果——绝不让一个受保护的巨型种子导致死循环也绝不把被限制停止伪装成任务成功。团队场景下的 Token 预算分配 ‍‍多 Agent 团队中Token 预算不只是窗口问题还是分配问题。OpenCollab 按运行构造方式分四种分配规则详见 docs/runtime-design.md模式分配规则预声明团队共享池每个座位累积上限 min(total, c × total / N)座位不预占单轮授权同时受剩余池和座位额度约束动态名单子 Agent 创建时同步预留最多min(total, max(10,000, total // 4))声明角色预算每个角色独立额度必须全员声明WorkflowAgent 调用前从工作流池预留清理后释放未用部分预声明团队的规则让团队池 N 倍单人额度时每个座位与独立 Agent 完全可比还能区分角色没干活和角色额度耗尽两种情况。下图展示了真实运行中的时间线预算耗尽out of budget如何影响团队的行为轨迹——左边采纳者成功收尾右边则因预算枯竭导致 Agent 无法结束自己的轮次会话预检precheck在每次模型调用之间执行 Token 与步数的硬性天花板检查已在飞行中的调用可能超出剩余额度——这些是优雅的执行限制而非实时计费上限这一点在文档中被明确区分体现了框架在研究可复现性上的严谨。如何在团队配置中控制上下文策略 ⚙️普通用户无需读源码就能通过团队配置文件如 configs/team.example.yaml调整上下文策略context: default # 或者 context: { policy: no_history_compaction, tool_result_budget: 20000 }default完整的压力触发历史压缩流水线no_history_compaction只保留单层工具结果预算历史层全部移除——适合希望完整保留历史用于研究审计的场景策略解析见 context_policy.pytool_result_budget直接调大或调小单层工具结果的字符上限。所有实际生效的触发/目标值都会由session.history_compaction追踪记录落盘方便跨实验对比runtime-design.md 中专门强调了用这些记录做比较而不是用代码里的默认值。总结为什么这套机制让长任务稳定 ✅OpenCollab 用不到 5 万行核心代码支撑起 SWE-bench Pro 64.25%、Terminal-Bench 2.1 83.15%、DeepSWE 69.91% 的成绩其上下文工程的要点可以浓缩为四条读取时整形存储时不动——压缩永远可逆恢复永远无损分级渐进损失最小优先——清空内容 → 删整组 → 模型摘要便宜的先上压力解除即停预算来自真实窗口与真实 usage——推导式触发线 提供商账单校准的估算杜绝拍脑袋常量优先级保护 优雅失败——身份/团队/任务永不被折叠二次溢出就体面停止并保留原因。如果你想深入阅读建议从 docs/runtime-design.md 入手它系统性地解释了上下文装配、压力整形、Token 记账与转向steering的全部不变量而 tests/runtime/ 目录下的 shaping、compaction 与 context-overflow 主题测试则是每条设计决策的可执行证据。赞分享【免费下载链接】OpenCollabA research-friendly, high-performance multi-agent collaboration coding framework.项目地址https://gitcode.com/gh_mirrors/op/OpenCollab点击查看免费下载相关推荐ralph-loop-agent长时运行任务的秘密RalphContextManager上下文摘要与Token预算管理全解ralph loop agent长时运行任务的秘密RalphContextManager上下文摘要与Token预算管理全解 ralph loop agenthttpbin 使用教程3 个接口跑通 HTTP接口测试 的 mock 对端httpbin 使用教程3 个接口跑通 HTTP接口测试 的 mock 对端 测一个接口要先写个假的对端 发个请求想确认参数带对了没有总得有个服务把它原开发工具测试API设计OpenMAIC 1.2.0 把课程生成搬上服务器之后它到底是什么OpenMAIC 1.2.0 把课程生成搬上服务器之后它到底是什么 看仓库里的 CHANGELOG.md https://link.gitcode.com/i教育人工智能大模型AI Agent多智能体AI 应用RAG前端后端Agent 工作流上一篇如何为Chat API添加一个新的大模型上游渠道适配器开发实战教程下一篇GitHub_Trending/ssr-benchmark对比分析Remix框架Defer API性能优化效果创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考