OpenViking

28.9kStar2.3kFork453Issue79Watching

为 DeepSeek Harness 提供 OpenViking 长期语义记忆、自动会话采集与 viking:// 上下文工具,让 DSH 会话自动召回并写入持久记忆。

语言
Python
License
AGPL-3.0
分支
main
agent-memoryagent-pluginsagentic-ragcontext-databasedsh-pluginself-evolving

安装

$ dsh plugin --profile web add github:volcengine/OpenViking

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

一句话定位

为 DeepSeek Harness(DSH)注入 OpenViking 上下文数据库:在每个 agent 步骤前自动召回相关记忆与用户画像,把用户/助手/工具消息实时落盘到 viking:// 虚拟文件系统,并把 viking:// URI 拦在 DSH 本地工具之外。

核心能力

  • agent/pre-step 钩子里用当前步骤输入做语义检索,把命中的 L0/L1/L2 记忆追加为带 source: { kind: 'plugin' } 的 user message
  • 监听 session/event 自动采集 user/assistant/工具结果消息并写入 OpenViking session,达到 commitTokenThreshold 时自动 commit
  • 注册 7 个模型可调用的工具:viking_search / viking_read / viking_browse / viking_remember / viking_forget / viking_add_resource / viking_archive_expand
  • tools/pre-execute 拦截 read/glob/grep/bash/edit/write 等本地工具对 viking:// URI 的错误使用,强制改走 OpenViking 工具
  • 通过 viking_add_resource 异步摄取 HTTP(S)/git 远程资源,自动派生 L0/L1/L2 分层
  • 服务不可达或写失败时进入 OPENVIKING_PENDING_DIR 待写队列,下个会话启动自动 replay
  • 每个 DSH 会话映射为 OpenViking 端的 dsh-<session-id>;默认从工作目录派生 actor peer,可强制覆盖

技术实现

  • 语言: JavaScript (Node.js, ESM *.mjs)
  • 关键依赖: @deepseek-ai/dsh-llmcreateUserMessage)、@deepseek-ai/dsh-toolsdefineTool);运行时无第三方 npm 依赖
  • 架构模式: Cordis 插件组(@deepseek-ai/cordis-plugin-group)—— apply(ctx, input) 注册服务 openvikingMemory,通过 ctx.on 订阅 agent/session-startagent/pre-stepsession/eventsession/flushtools/pre-execute 等生命周期事件;运行时使用 setup-wizard/profile-inject/recall-core/capture-utils/pending-queue 等共享子模块
  • 入口文件: examples/dsh-memory-plugin/index.mjs(导出 name / inject / apply),cordis.patch.yml 声明 Cordis 装载入口

适用场景

需要让 DSH 长期保留项目知识、用户偏好与历史经验的开发者或团队:在多会话、多工作区协作时,让 agent 自动从过去的决策、代码风格与项目文档中检索上下文,避免重复交代;同时把每轮对话异步落入 viking://user/<peer>/memories/,作为后续步骤的 recall 源。

安装方式

dsh plugin --profile web add github:volcengine/OpenViking

配置项

配置类型说明默认值
endpointstringOpenViking 服务地址http://127.0.0.1:1933
apiKeystringBearer 凭证(也可走 OPENVIKING_API_KEY/OPENVIKING_BEARER_TOKEN~/.openviking/ovcli.conf""
accountstringtrusted-mode 账号(X-OpenViking-Account""
userstringtrusted-mode 用户(X-OpenViking-User""
peerIdstring显式 actor peer(覆盖工作区派生)""
workspacePeerboolean是否按 DSH 工作区派生 actor peertrue
recallPeerScope"all" | "actor"召回时是否跨工作区all
recallQueryExpansion"auto" | "off"是否做查询改写auto
recallTokenBudgetnumber (200–50000)召回上下文 token 上限2000
recallMaxContentCharsnumber (100–5000)召回条目 abstract 截断长度500
recallLimitnumber (1–50)召回条数10
scoreThresholdnumber (0–1)召回分数阈值0.35
minQueryLengthnumber (1–64)触发召回的最短 query3
profileTokenBudgetnumber (500–50000)启动注入 profile 的 token 上限10000
commitTokenThresholdnumber (1000–1000000)触发 session commit 的 pending token20000
commitKeepRecentCountnumber (0–1000)commit 时保留的最近消息数10
captureMode"semantic" | "keyword"捕获模式semantic
captureAssistantTurnsboolean是否采集 assistant 消息true
captureToolResultsboolean是否采集工具结果false
captureMaxLengthnumber (200–100000)单条捕获最大长度24000
captureToolMaxCharsnumber (200–1000000)工具结果最大字符1000000
requestTimeoutMsnumber (1000–120000)HTTP 请求超时10000

环境变量(除上表外):OPENVIKING_URL / OPENVIKING_BASE_URL / OPENVIKING_MCP_URL / OPENVIKING_CREDENTIAL_SOURCE / OPENVIKING_CONFIG_FILE / OPENVIKING_CLI_CONFIG_FILE / OPENVIKING_PENDING_DIR / OPENVIKING_PENDING_MAX_RETRIES / OPENVIKING_PENDING_TTL_DAYS / OPENVIKING_PENDING_REPLAY_LIMIT / OPENVIKING_RECALL_QUERY_EXPANSION / OPENVIKING_RECALL_LIMIT / OPENVIKING_RECALL_PEER_SCOPE / OPENVIKING_WORKSPACE_PEER

上手难度

进阶 — 需要先在本机或远端跑一个可访问的 OpenViking 服务(openviking-server),再理解 viking:// URI、L0/L1/L2 分层、actor peer 等概念;DSH 安装本身是单条命令,但调优召回预算、commit 阈值、peer 隔离等行为需要阅读 config.mjs 和 README 中的配置章节。

已知问题与限制

  • 强绑定 DSH 版本:peerDependencies 锁死 @deepseek-ai/dsh-llm@deepseek-ai/dsh-tools 均为 0.1.0-rc.6,pre-release dist-tag 不同步会导致装载失败
  • 强绑定 Node 引擎:^22.19.0 || >=24,更早的 Node 会直接拒绝
  • 若 DSH preset 把 persona 标为 complete: true,pre-step 注入的 recall/profile 仍按 user message 追加,能避开 system prompt 覆盖;但若 DSH 在 agent/pre-step 之后还有 strip-plugin-source 的过滤器,召回上下文会被一并剥掉
  • OpenViking 服务不可达时,所有写操作回落到 OPENVIKING_PENDING_DIR(默认 ~/.openviking/dsh-pending/)排队;如果队列被反复重放失败并超过 OPENVIKING_PENDING_MAX_RETRIES(默认 3)或 OPENVIKING_PENDING_TTL_DAYS,条目会被清理
  • live-recall.test.mjs 端到端用例默认跳过,仅在 OPENVIKING_E2E=1 且有真实服务凭证时才会跑,CI 中未覆盖
  • viking_forget 是不可逆的硬删除(README 明确提示),需模型仅在用户明确请求删除时调用