
OpenViking Context Takeover让 Pi Coding Agent 的长期上下文由 OpenViking 接管【免费下载链接】OpenVikingSelf-evolving Context Database for AI Agents. Unify Agent Memory, Knowledge RAG and Skills.项目地址: https://gitcode.com/GitHub_Trending/op/OpenViking本文深入解析 OpenViking 为 Pi Coding Agent 提供的Context Takeover上下文接管机制它让 OpenViking 成为 pi 会话的权威长期上下文存储通过contexthook 把已提交的历史对话压缩为一份合成档案概览[OpenViking Session Context]同时保留最近几轮完整对话。文章以 TAKEOVER.md 为核心结合 takeover-core.mjs、sync.ts、index.ts 等源码与测试说明其状态模型、运行时流程、配置参数、失败模式与 E2E 验证方式帮助你理解并调优这一无限上下文实现。什么是 Context Takeover在 pi-coding-agent-extension 中pi 的会话消息默认保存在本地而 OpenViking 负责长期记忆的归档与检索。Context takeover 把两者打通pi 仍保留最近的活动轮次active turns保证当前对话的实时性已提交的历史由 OpenViking 的档案概览archive overview代表每次构建 provider 请求时扩展通过 pi 的contexthook 把已被覆盖的对话消息替换为一条合成的用户消息其内容以[OpenViking Session Context]开头包含 OpenViking 生成的档案摘要。这样模型看到的上下文不再随会话无限膨胀而是一份概览 最近 N 轮完整对话长期上下文由 OpenViking 统一托管。该设计源自对多个 OpenViking agent 插件的经验总结完整设计说明见 DESIGN.md。状态模型扩展如何在分支上记账Takeover 的核心是一套可持久化的状态机实现在 lib/takeover-core.mjs 的TakeoverCore类中。它跟踪以下字段字段含义coveredUserTurns已被 OpenViking 档案概览覆盖的真实用户轮次数overview最近一次通过GET /sessions/{id}/context获取的档案概览fingerprint最后一条被覆盖消息的稳定指纹用于分支失配检测pendingTokens自上次成功推进边界以来累计的待同步 token 压力syncedEntryCountpi 分支水位watermark跨pi -p/pi -c进程恢复lastSeenUserTurns最近一次transformContext观察到的用户轮次数状态通过 pi 的自定义条目持久化takeover-core.mjspi.appendEntry(ov-takeover, state)启动时扩展从分支末尾向前扫描恢复最新一条ov-takeover条目并调用sync.restoreWatermark(takeover.state.syncedEntryCount)恢复SyncManager的水位见 index.ts这样pi -c续接会话时不会把同一批分支条目重复发送给 OpenViking。指纹与边界fingerprintMessage用角色 文本长度 前 200 字符生成指纹takeover-core.mjstransformContext在注入概览前校验最后一条被覆盖消息的指纹若与持久化的指纹不一致说明分支发生了改写如回滚、编辑此时边界重置为 0完整历史重新可见takeover-core.mjs。指纹检测、边界查找、概览消息构造等核心逻辑都有对应单元测试见 tests/takeover-core.test.mjs。运行时流程从捕获到边界推进Takeover 的完整运行时流程原文档所述 7 步在 index.ts 的各事件处理器中落地turn_end捕获sync.syncBranch(branch)提取分支新增条目写入 OpenViking 会话随后调用takeover.onTurnSynced(result.tokens)累积 token 压力index.ts。磁盘待发队列OpenViking 临时不可达时可重试的addMessage进入磁盘 pending 队列enqueueOnRetryable: true见 sync.ts 与 shared/pending-queue.mjs。阈值触发pendingTokens takeover.tokenThreshold且lastSeenUserTurns takeover.keepRecentTurns时尝试推进takeover-core.mjs。Flush 屏障flushForTakeover()先有界排空本会话的addMessage积压时间/批次数双重上限再检查countUndeliveredForSession(pending, sid) 0。pending 中的commitSession条目和其他会话的条目不阻塞屏障sync.ts。同步提交commit({ queueOnFailure: false, keepRecentCount })——延迟提交无法安全推进本地上下文边界因此失败时不入队sync.ts。轮询概览提交后以overviewPollMs间隔轮询GET /sessions/{id}/context直到latest_archive_overview可用最多overviewPollMax次takeover-core.mjs。推进边界成功后边界推进到lastSeenUserTurns - keepRecentTurns注入合成概览消息随后 recall 注入到剩余的最新用户轮次中index.ts 的contexthook。// context hook 中的核心转换简化自 index.ts const afterTakeover config.takeoverEnabled ? takeover.transformContext(event.messages) : event.messages; const messages recall.injectRecall(afterTakeover, idOf); return { messages };字节稳定的概览时间戳概览消息的时间戳取自第一条保留消息的时间戳减 1takeover-core.mjs。这样在两次提交之间 provider payload 保持字节稳定可命中 prompt 前缀缓存如 DeepSeek 等严格前缀缓存提供方。测试transformContext is stable between commits验证了这一点tests/takeover-core.test.mjs。Compaction让 pi 的压缩也由 OpenViking 接管当 pi 触发session_before_compact时index.tstakeover 尝试执行同样的flush → commit → 轮询概览序列handleBeforeCompacttakeover-core.mjs。成功时返回{ compaction: { summary: [OpenViking Session Context]\n..., firstKeptEntryId, tokensBefore, details: { source: openviking } } }pi 会用该返回值作为压缩摘要firstKeptEntryId由 pi 在preparation中提供。若任一步骤失败处理器返回undefinedpi 走默认压缩——这是刻意的 fail-open 行为测试handleBeforeCompact fail-opens覆盖此路径见 tests/takeover-core.test.mjs。Capture Fidelity忠实捕获低信号轮次在 takeover 模式下pi 适配器启用忠实捕获faithful capture见 lib/capture-adapter.mjs简短确认、纯标点轮次等低信号文本仍然捕获——因为这些轮次之后可能从实时模型上下文中消失只存在于 OpenViking 档案里空文本、斜杠命令/xxx、OpenViking 状态消息[openviking-memory]开头继续过滤捕获内容有captureMaxLength默认 24000 字符上限。决策逻辑cfg.faithfulCapture || cfg.takeoverEnabled时走faithfulDecision否则走常规的shouldCaptureText。配置参数默认配置见 config.json完整参数表字段默认值含义takeover.enabledtrue启用上下文接管takeover.tokenThreshold30000提交并推进边界所需的累计同步 token 压力takeover.keepRecentTurns3保留完整保真的最近用户轮次数takeover.overviewBudget3000注入的档案概览 token 预算takeover.overviewPollMs2000概览轮询间隔takeover.overviewPollMax15提交后最多轮询次数以上参数在 config.ts 中从config.json的takeover对象读取并支持旧式扁平键如takeoverEnabled作为兼容回退。加载时经clampInt约束取值config.tstokenThreshold1 1000000keepRecentTurns0 100overviewBudget100 50000overviewPollMs0 60000overviewPollMax1 120TakeoverCore内部takeover-core.mjs还会做二次防御性校验保证非法值回退到默认。概览文本超过预算时通过truncateToTokens截断其中 CJK 字符按 1.5 token、其他字符按 0.25 token 保守估算takeover-core.mjs。与提交相关的相邻参数Takeover 与通用提交共享底层commit通道但语义不同参数默认说明commitTokenThreshold20000非 takeover 模式下客户端驱动的提交阈值commitKeepRecentCount10非 takeover 模式提交后保留的实时尾部条数takeover 模式下提交走takeover.tokenThreshold与takeover.keepRecentTurns非 takeover 模式takeover.enabled: false则回退到commitIfNeeded的客户端提交逻辑sync.ts。失败模式与 fail-open 保证失败场景行为OpenViking 健康检查失败扩展保持断开pi 正常运行Pending addMessage 重放失败不推进边界完整本地历史保持可见Commit 失败不推进边界pending token 压力保留概览未就绪不推进边界token 压力清零等待下次阈值或手动/viking commit重试分支指纹失配边界重置为 0完整历史显示直到下次成功推进Compaction 接管失败返回undefinedpi 默认压缩继续值得注意的设计细节提交成功但概览未就绪时边界不推进绝不注入空概览同时pendingTokens清零——避免每一轮都重复提交、反复生成新档案而是等待下次阈值跨越再重试takeover-core.mjs测试见 tests/takeover-core.test.mjs。并发安全方面commitAndAdvance与handleBeforeCompact都通过committing标志串行化重复触发会返回falsetakeover-core.mjs。观测与手动干预状态行pi 状态栏显示ctx {coveredUserTurns} · ~{pendingTokens}/{threshold}index.ts聊天中执行/viking查看连接与会话信息/viking commit手动同步提交并尝试推进边界排障时可设置OPENVIKING_DEBUG_LOG/tmp/ov-pi.log记录 JSON Lines 调试日志。Live E2E真实链路的验收门禁原文档提供的真实链路验收脚本位于 scripts/e2e-live.sh转发到 e2e-live.mjsOPENVIKING_URL... \ OPENVIKING_API_KEY... \ E2E_LLM_API_KEY... \ bash examples/pi-coding-agent-extension/scripts/e2e-live.sh任何 OpenAI 或 Anthropic 兼容端点均可通过E2E_LLM_BASE_URL、E2E_LLM_MODEL、E2E_LLM_API覆盖E2E_LLM_API为 pi provider api type如anthropic-messages默认openai-completions。脚本会执行三轮真实的pi -p/pi -c回合设置一个极小的 takeover 阈值并断言第三轮 provider payload 包含[OpenViking Session Context]同时第一轮的旧 padding 不再出现在原始会话历史中——从端到端验证历史被概览接管、实时上下文被替换这一核心行为。总结Context takeover 把无限历史与有限上下文这对矛盾统一起来OpenViking 负责归档与摘要pi 保留最近几轮全量对话contexthook 在每次请求时完成边界替换ov-takeover条目让状态跨进程恢复指纹机制保证分支改写后安全回退。配合磁盘 pending 队列、flush 屏障、字节稳定的概览时间戳与 fail-open 的压缩接管它在真实编码会话中提供了一条可观测、可调优、可验证的长期上下文管理路径。若需进一步了解扩展的整体架构、事件流与 recall 机制可继续阅读 README.md 与 DESIGN.md。【免费下载链接】OpenVikingSelf-evolving Context Database for AI Agents. Unify Agent Memory, Knowledge RAG and Skills.项目地址: https://gitcode.com/GitHub_Trending/op/OpenViking创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考