Skip to content

standalone API:GET /context —— 把注入管线开放给第三方(#363 承诺) #370

Closed

Description

@modusensus

背景

#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 语义,不发明新规则

响应(结构化条目,不含渲染文本):

{
  "profile": "用户画像原文(空串表示无)",
  "rules": ["行为规则"],
  "items": [ "…toApiList 行;pin 条目前置…" ],
  "pinnedCount": 1
}

profile / rules 取自 settings.getProfile() / getRules()(宿主注入里画像 + 规则块本就在记忆块之前,inject.js:340-348;standalone 已有 /profile /rules 端点,这里是一站式聚合)。

明确不做(v1)

设计取舍(按 #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

  1. modusensus commented on Oct 5, 2026

    @modusensus
    MemberAuthor

    更正「设计取舍」第 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 落地:/search scope 透传随实现 PR 一并带上;pinnedInjectBudget 在 standalone 维持 0(opt-in 纪律)。

  2. added a commit that references this issue on Oct 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions