## 背景 #363 里 Mneme-Bridge(DeepSeek 网页端桥接)为了「按话题回注」自建了一套 pins 启发式——从记忆库挑条目、排优先级、拼上下文。这条链路实质是在复刻宿主的注入管线,而自建副本会随上游迭代漂移。 daemon(`dsh-mneme-serve`)解决的是「不开 DSH 怎么挂载」;但第三方目前拿到的只有 `/search`(显式检索)与 `/memories`(读写)。「这个话题该注入什么」——注入管线的数据等价物——没有官方端点。 ## 提案 新增 `GET /context`,落点 `src/api-standalone.js` 一个路由分支,复用 service 已有的 `injectCandidates`(service.js:1494)。DSH 的外部访问与 daemon 共用这段路由,同时受益,零装配改动。 **参数**(与 `/search` 命名惯例对齐): | 参数 | 默认 | 说明 | |---|---|---| | `q` | 空 | 当前话题。空 = 纯规则档(与宿主首轮 lastUserQuery 缺失同构);非空时先 `embedSingle(q)` 得查询向量再进 `injectCandidates`,吃到完整 hybrid 语义路(向量 → 召回缓存 → BM25 兜底,#198)。宿主注入因渲染必须同步、只能异步 prefetch 给下一轮;HTTP 端点没有这个约束,首次调用即走语义路 | | `topK` | 5 | 注入条数上限(对齐宿主 `maxInjectedItems` 默认) | | `threshold` | 3 | **importance 阈值**——与 `/search` 的相似度 threshold 同名不同义,文档写死这个区分 | | `agent_scope` / `workspace_scope` | 不传 | 显式声明调用方身份。不传 = 不解析 scope:软加权不激活、strictScope 硬过滤不触发(injectCandidates 既有门控,service.js:1663——与宿主「会话身份取不到时两维为 null」完全同构);传了就走既有 `isVisibleInScope` 语义,不发明新规则 | **响应**(结构化条目,不含渲染文本): ```json { "profile": "用户画像原文(空串表示无)", "rules": ["行为规则"], "items": [ "…toApiList 行;pin 条目前置…" ], "pinnedCount": 1 } ``` profile / rules 取自 `settings.getProfile()` / `getRules()`(宿主注入里画像 + 规则块本就在记忆块之前,inject.js:340-348;standalone 已有 `/profile` `/rules` 端点,这里是一站式聚合)。 ## 明确不做(v1) - **不返回渲染好的 prompt 文本**:render 的语言、时间前缀、热记忆都是宿主会话概念;调用方自行渲染。 - **不做跨轮轮换**(#205):daemon 无会话状态;调用方有需要可自管。 - **不含热记忆**(会话轮次缓存,宿主专属)与时间前缀。 - **不改 `/search` 语义**(scope 透传除外,见下)。 ## 设计取舍(按 #363 讨论定,欢迎再议) 1. **recall_runs 不记**:宿主注入不计入 recall_runs(那是显式召回的复用统计),`/context` 同口径;若第三方想要复用统计,可加 `record=true` 显式参数,另议。 2. **`/search` 顺手补 scope 透传**:`searchMemories` 本就收 scope,现状 `/search` 没传——随本 PR 一行带过,两端点 scope 语义保持一致。 3. **`pinnedInjectBudget` 在 standalone 下维持 0**(行为开关 opt-in 默认关):bridge 想要 pin 语义就在自己的 daemon/面板配置里显式开。 ## 测试 - `test/standalone-api.test.js`:响应形状锁(profile/rules/items/pinnedCount 四键);空 q 规则档;pin 前置(预算开时);scope 透传(strictScope 开 + 他者 scope 标注行不泄);threshold 的 importance 语义锁。 - `test/serve.test.js`:daemon 冒烟一条(/context 经 daemon 全链路可用)。 ## 交付 随下个 release 发布(daemon 与宿主外部访问同时携带);#363 一并知会。
Activity
modusensus commentedon Oct 5, 2026
更正「设计取舍」第 1 条的前提,实现 PR 已开:#371。
recall_runs 的前提有误:宿主注入并不是不计 recall_runs——#217(2026-09-19 拍板)已把注入落成
mode='inject'的曝光型访问事件,与检索命中同表分账,且记账就在injectCandidates尾部内建(recall-stats按mode='inject'单独计数出注入命中率)。因此
/context的口径修正为:记账随injectCandidates内建,与宿主注入自动同口径(recallRecorder 在位即记,query=''/mode='inject'),不需要record参数,也无需 opt-out。daemon 侧第三方桥接的注入行为由此在复用统计里不缺数——与/search落 recall_runs 的既有承诺同构。其余两条取舍照 issue 落地:
/searchscope 透传随实现 PR 一并带上;pinnedInjectBudget在 standalone 维持 0(opt-in 纪律)。Merge pull request #371 from slow-stack/feat/standalone-context
feat(standalone-api): GET /context 注入候选端点 + /search scope 透传(slow-sta…
feat(standalone): /context 补 embed-dimension 档位并把 tier 扫进文档(slow-stac…