Back to Openviking

OpenViking 动态查询配置变更与测试报告

examples/openclaw-plugin/docs/openviking-dynamic-query-config-test-report.md

0.4.318.1 KB
Original Source

OpenViking 动态查询配置变更与测试报告

日期:2026-06-04 分支:feat/sharClawWithOpenViKing 仓库:iaasng/arkclaw-openviking-plugin 结论:本次动态查询配置能力、URI 详情 API、最近 ov_search 简化清单 API 已完成实现与二次验收;全量测试、类型检查、生产构建、生产风格稳定性模拟均通过。

1. 本次变更总结

本次变更围绕 OpenViking 插件的“查询参数运行期动态配置”展开,目标是支持不重启 OpenClaw 即可调整召回数量、候选数量、阈值、资源范围和排序权重,并支持 claw 与 session 两级粒度。整体能力由新增运行期配置存储、召回链路接入、命令入口、Gateway 查询接口和测试保障共同组成。

1.1 核心能力

能力说明关键实现位置
运行期动态配置新增 RuntimeQueryConfigStore,负责参数归一化、分层合并、持久化、热加载、异常容错query-config.ts:173
分层优先级合并顺序为 request > session > claw > static config > default,并输出字段来源 sourcesquery-config.ts:263
claw / session 粒度claw 以 agentId 为 key;session 优先 ovSessionId,其次 sessionId,再次 sessionKeyquery-config.ts:158query-config.ts:367
自动召回接入assemble 阶段获取有效查询配置,传入自动召回链路context-engine.ts:891
显式工具接入memory_recallov_search 使用运行期有效配置作为默认值,请求参数仍可覆盖index.ts:1218
排序权重参数化rankingWeightscategoryWeightsresourceTypeWeights 参与客户端侧排序memory-ranking.ts
CLI 管理入口新增 /ov-query-config get/set/unset/resetindex.ts:1225index.ts:1748
Gateway URI 详情新增只读详情接口,不重新触发搜索index.ts:945index.ts:1132
Gateway 最近 ov_search 清单从 recall trace 中扁平化最近一次 ov_search 结果index.ts:1019index.ts:1133
安装脚本修复修复 resource-only recall 自动配置的 JSON 传参,以及 env 单引号转义scripts/install.sh:242scripts/install.sh:404

1.2 本次重点修复

问题影响修复说明测试覆盖
session 只设置 recallLimit 时错误覆盖 claw 显式 candidateLimit低优先级显式候选数被高优先级派生值覆盖applyLayer() 增加 candidateLimitExplicit 跟踪tests/ut/query-config.test.ts:78
/ov-query-config 不能设置权重参数用户无法运行期调整排序权重增加 --weight--categoryWeight--resourceTypeWeight--recallPreferAbstract 解析tests/ut/tools.test.ts:415
空 patch 覆盖已有配置用户传未知参数会把已有 scope 配置清空空归一化结果直接报错,不落库tests/ut/tools.test.ts:443
install.sh JSON 转义错误openclaw config set 收到非法 JSON 字符串改为传入 '["resource"]' 的实际 JSON 文本tests/ut/package-install-contract.test.ts
初始 load 与 set 并发竞态插件注册后首次写入可能被旧文件覆盖写操作等待 in-flight initial loadtests/ut/query-config.test.ts:116
持久化队列失败后不可恢复一次磁盘/权限错误会让后续写入永久失败rejected queue 自动恢复,当前失败仍向调用方抛出tests/ut/query-config.test.ts:141
env 文件单引号转义错误包含单引号的 API key / URL 可能生成不可 source 的 env 文件使用 shell 单引号规范转义 '\\'' 等价片段(实际输出为 '\''tests/ut/package-install-contract.test.ts

2. 新增动态配置规则

2.1 生效优先级

每次自动召回、memory_recallov_search 执行前都会生成一次有效配置。字段级优先级如下:

text
request 覆盖参数
  > session 运行期配置
  > claw 运行期配置
  > plugins.entries.openviking.config 静态配置
  > 代码默认值

说明:

  • request 级参数只影响当前调用,不写入运行期配置。
  • session 级配置只影响当前会话,优先匹配 ovSessionId,再匹配 sessionId,最后匹配 sessionKey
  • claw 级配置以当前 agentId 为作用域,影响该 claw 下后续所有 session。
  • sources 会标记字段来源,便于排查“为什么当前召回数量/阈值/权重是这个值”。

2.2 字段合并规则

类型规则
标量字段高优先级覆盖低优先级,如 recallLimitscoreThreshold
数组字段整体覆盖,不拼接,如 resourceTypes
对象字段浅合并,如 rankingWeightscategoryWeightsresourceTypeWeights
candidateLimit显式设置优先于 recallLimit * candidateMultiplier 派生值;且最终保证 candidateLimit >= recallLimit
非法数值归一化时 clamp 到允许范围;非法 targetUri 会报错
持久化文件损坏保留 last known-good 内存配置,不阻断查询链路

2.3 支持字段与范围

字段语义范围/约束默认来源
recallLimit最终注入或展示结果数1-50静态 recallLimit
candidateLimit每个 target URI 的候选检索数1-200派生值
candidateMultiplier候选数倍数,候选数 = recallLimit * candidateMultiplier1-204
scoreThreshold客户端后处理分数阈值0-1静态 recallScoreThreshold
maxInjectedChars自动召回注入字符预算100-50000静态 recallMaxInjectedChars
recallPreferAbstract是否优先使用 abstract 注入boolean静态 recallPreferAbstract
resourceTypes默认搜索范围resource / user / agent静态 recallTargetTypes
targetUri强制搜索单一 URI必须以 viking:// 开头
ovSearchLimitov_search 默认返回数1-10010
rankingWeights.baseScore语义分权重0-21
rankingWeights.leaf叶子节点加权0-20.12
rankingWeights.event事件类加权0-20.1
rankingWeights.preference偏好类加权0-20.08
rankingWeights.lexicalOverlapMax词面重叠最大加权0-20.2
resourceTypeWeights按资源类型加权-1 到 2空对象
categoryWeights按 category 加权-1 到 2空对象

2.4 持久化与热加载

运行期配置可以配置持久化路径:

json
{
  "plugins": {
    "entries": {
      "openviking": {
        "config": {
          "runtimeQueryConfigPath": "/path/to/runtime-query-config.json"
        }
      }
    }
  }
}

文件结构:

json
{
  "schemaVersion": "1.0",
  "updatedAt": 1780520000000,
  "claws": {
    "main": {
      "params": { "recallLimit": 8, "candidateLimit": 80 },
      "updatedAt": 1780520000000,
      "updatedBy": "command",
      "agentId": "main"
    }
  },
  "sessions": {
    "session:oc-session-123": {
      "params": { "scoreThreshold": 0.08 },
      "updatedAt": 1780520000000,
      "updatedBy": "command",
      "agentId": "main"
    }
  }
}

3. 使用方式

3.1 查看当前有效配置

text
/ov-query-config get --scope session

返回内容包含:

  • scope:当前查看的作用域。
  • effective:合并后的最终配置。
  • effective.sources:字段来源,如 session / claw / static / default
  • effective.warnings:归一化或降级警告。

3.2 设置 claw 级默认召回策略

text
/ov-query-config set --scope claw \
  --recallLimit 4 \
  --candidateLimit 40 \
  --scoreThreshold 0.2 \
  --resourceTypes user,agent

效果:当前 claw 下所有 session 默认继承该配置;session 级配置仍可覆盖。

3.3 设置 session 级临时策略

text
/ov-query-config set --scope session \
  --recallLimit 10 \
  --candidateLimit 80 \
  --scoreThreshold 0.08 \
  --resourceTypes resource,user

效果:仅当前 session 生效,不影响同 claw 下其他 session。

3.4 调整排序权重

text
/ov-query-config set --scope claw \
  --weight baseScore=0.8,leaf=0.2,preference=0.18,event=0.04,lexicalOverlapMax=0.25 \
  --categoryWeight preferences=0.3,events=-0.1 \
  --resourceTypeWeight user=0.2,resource=0.1

说明:

  • --weight 对应 rankingWeights
  • --categoryWeight 对应 categoryWeights
  • --resourceTypeWeight 对应 resourceTypeWeights
  • 权重只影响插件客户端侧排序,不改变 OpenViking 服务端搜索算法。

3.5 清理字段覆盖

text
/ov-query-config unset recallLimit scoreThreshold rankingWeights --scope session

效果:删除当前 session 的指定字段覆盖,下一次查询回退到 claw 或静态配置。

3.6 重置作用域配置

text
/ov-query-config reset --scope session
/ov-query-config reset --scope claw

效果:删除该作用域整条运行期配置。

4. API 接口整理

4.1 GET /api/openviking/uri-detail

用途:按完整 viking:// URI 查询详情和正文片段。该接口只调用读取能力,不重新发起搜索。

请求示例

bash
curl --get 'http://127.0.0.1:<gateway-port>/api/openviking/uri-detail' \
  --data-urlencode 'uri=viking://resources/project/spec.md' \
  --data 'includeContent=true' \
  --data 'contentLimit=12000' \
  --data 'offset=0'

Query 参数

参数类型必填默认值说明
uristring完整 viking:// URI,必须 URL encode
includeContentbooleantrue是否读取正文
offsetnumber0内容分页起始偏移
contentLimitnumber20000返回正文最大字符数,范围 1-100000
agentIdstring当前上下文 agent读取时的 agent 路由
sessionIdstring当前上下文 sessiontrace / session 上下文关联
sessionKeystring当前上下文 sessionKeytrace / session 上下文关联
ovSessionIdstring当前上下文 ovSessionIdtrace / session 上下文关联
traceIdstring用于从指定 trace 补充摘要、分数、category 等元信息
preferTracePreviewbooleantrue是否优先复用 trace 预览信息

响应字段

字段说明
ok是否成功
uri请求的完整 URI
uriTypeURI 类型,如 resource / session / user_memory / agent_memory / skill / archive / unknown
abstractPreviewtrace 或读取结果摘要预览
metadatacategory、score、level、resultType、sourceTraceId、source 等展示元信息
content.text正文片段
content.offset本次分页起始偏移
content.limit本次分页限制
content.returnedChars本次返回字符数
content.totalChars正文总字符数
content.hasMore是否还有后续内容
readStatusnot_requested / ok / read_failed
warnings非致命警告
error错误码和错误消息

状态码

状态码场景
200URI 合法且读取成功,或 includeContent=false 只返回元信息
400URI 缺失、非 viking://、URI 被展示截断、分页参数非法
502OpenViking read 调用失败

4.2 GET /api/openviking/recall-traces/latest-ov-search-list

用途:获取当前会话最近一次 ov_search trace 的扁平化 URI 清单,方便前端展示“上次搜索到了哪些资源”。该接口不会重新发起 ov_search

请求示例

bash
curl --get 'http://127.0.0.1:<gateway-port>/api/openviking/recall-traces/latest-ov-search-list' \
  --data-urlencode 'sessionId=oc-session-123' \
  --data 'limit=20' \
  --data 'includeSelected=true' \
  --data 'dedupe=true'

Query 参数

参数类型必填默认值说明
sessionIdstring当前上下文 sessionOpenClaw sessionId
sessionKeystring当前上下文 sessionKeyOpenClaw sessionKey
ovSessionIdstring当前上下文 ovSessionIdOpenViking storage session id
agentIdstring当前上下文 agent过滤同 session 下不同 agent 的 trace
limitnumber20返回条数,范围 1-100
lookupstringauto当前响应会回显;trace 查询走内存/持久化 fallback
includeSelectedbooleantrue是否合并 selected/displayed 结果
dedupebooleantrue是否按 URI 去重;selected 优先
includeSkillsbooleantrue是否包含 skill 结果
strictbooleanfalse未找到 trace 时是否返回 404

响应字段

字段说明
ok是否成功;非 strict 且无 trace 时仍为 true
lookupLayer查询来源:memory / persistent / none
fallbackUsed是否使用持久化 fallback
query回显查询条件
trace.traceId命中的 trace ID
trace.ts / trace.isoTimetrace 时间
trace.triggerQuery触发 ov_search 的 query
items[]扁平化条目
items[].uri完整 URI
items[].abstractPreview摘要预览
items[].resourceType资源类型
items[].resultTypememory / resource / skill / archive_match
items[].category记忆或资源 category
items[].score相关性分数
items[].sourcesearch_result / selected
items[].targetUri来源搜索 target URI
items[].detailUrl可直接打开 URI 详情的 Gateway URL
totalItems返回条目数
warnings非致命警告

状态码

状态码场景
200查询成功;默认未找到 trace 也返回空列表加 warning
400limit 等参数非法
404strict=true 且未找到最近 ov_search trace

5. 本次测试范围

5.1 覆盖范围

范围覆盖内容
单元测试参数归一化、clamp、分层合并、字段来源、持久化、热加载、unset/reset、session alias 匹配
命令测试/ov-query-config set/get/unset/reset、权重参数、空 patch 拒绝
工具链路测试session 配置影响后续 memory_recallov_search 默认 limit/targetUri
自动召回场景测试context engine assemble 阶段使用 session 有效配置
排序测试rankingWeights、categoryWeights、resourceTypeWeights 对入选排序生效
Gateway API 测试URI detail route、latest ov_search list route、skill 过滤、detailUrl 生成
安装脚本契约测试standalone package contract、resource-only recall 配置、JSON 传参、env 单引号转义
类型检查tsc -p tsconfig.json
生产构建tsc -p tsconfig.build.json
稳定性模拟in-flight load serialization、100 session 并发写入、配置文件损坏恢复、写队列失败恢复

5.2 未执行范围说明

仓库中的 Python e2e 脚本依赖真实 OpenClaw Gateway、OpenViking 服务、LLM 后端和有效 token。当前本地验收环境未提供这些外部运行前提,因此本次未执行会访问真实外部服务的 Python e2e。对应风险已通过全量 Vitest、真实 server 单测、生产风格稳定性模拟和 install dry-run 覆盖本次变更相关链路。

6. 测试用例执行情况

6.1 聚焦回归测试

命令结果
npm test -- tests/ut/query-config.test.ts通过:9 tests passed
npm test -- tests/ut/tools.test.ts -t "ov-query-config"通过:4 tests passed
npm test -- tests/ut/package-install-contract.test.ts通过:6 tests passed
bash -n scripts/install.sh通过:无语法错误

6.2 全量测试 / 类型 / 构建

命令结果
npm test通过:29 test files passed,562 tests passed
npm run typecheck通过
npm run build通过

6.3 生产风格稳定性模拟

验证命令覆盖以下行为:

  1. load()set() 并发时,写操作等待初始加载,不会被旧文件覆盖。
  2. 100 个 session 并发写入后,session 与 claw 配置仍按优先级正确合并。
  3. 配置文件被破坏为非法 JSON 后,reloadIfChanged({ force: true }) 保留 last known-good 内存配置。
  4. 持久化路径临时不可写导致一次写入失败后,修复路径后下一次写入可以恢复。
  5. install.sh dry-run 对包含单引号的 URL/API key 不崩溃,resource-only recall 配置输出正确。

执行结果:

text
production-style runtime config stability check passed: in-flight load serialization + 100 concurrent session writes + corrupt-file recovery + write-queue recovery

7. 质量与风险结论

7.1 已关闭风险

  • 动态配置优先级已通过单测与场景测试验证。
  • candidateLimit 显式配置优先级已修复并回归。
  • 权重参数 CLI 设置已补齐。
  • 空 patch 不再覆盖已有配置。
  • 持久化写入采用临时文件 + rename,写队列失败后可恢复。
  • 配置文件损坏时保留 last known-good,不影响查询链路。
  • install.sh 的 JSON 参数与 env 单引号转义均已覆盖。

7.2 后续建议

建议优先级说明
增加 Gateway query-config 写接口P2当前已实现 CLI 与内部 store;如前端需要可继续补齐 GET/PUT/DELETE /api/openviking/query-config
支持 TTL/过期清理P2设计文档预留 expiresAt,当前主要覆盖 set/unset/reset,不做自动 TTL 管理
增加真实环境 e2e 流水线P2需要 OpenClaw Gateway、OpenViking、LLM、token 的稳定测试环境
多实例集中配置P3当前为单进程/本地文件模型;多 gateway 实例可后续接远程配置服务

8. 最终结论

本次变更已完成“OpenViking 查询参数动态配置”主链路:支持 claw/session 粒度、支持运行期即时生效、支持配置持久化与热加载、支持召回数量/候选数量/阈值/资源类型/排序权重调整,并新增 URI 详情与最近 ov_search 简化清单 API。经过二次验收和追加复审后,发现的问题均已修复,当前自动化验证全部通过,可以进入提测/评审阶段。