Files
memind/docs/architecture/context-planner-v1.md
T
john 212ff3ff80 Add User Model Service and Temporal Recall for MeMind V0.1.
Introduce UMS ingest/snapshot pipeline, Context Planner with multi-source recall, runtime context injection, canonical user mapping, and session snapshot loading on auth/me.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-03 23:25:18 +08:00

3.9 KiB
Raw Blame History

Context Planner API v1

字段
状态 FrozenV0.1
建议 Base URL MeMind Portal 同域 /api/v1/context/*
输出契约 schemas/context-plan.schema.json

1. 职责

将用户自然语言解析为 ContextPlan AST,决定:

  • 需要哪些上下文域(User Model / Temporal Recall / Memory V2
  • 多源检索权重与 expanded queries
  • 时间范围与 Temporal Mode

不做单选 intent 分类。


2. POST /v1/context/plan

请求

{
  "query": "我昨天有什么重要的事情安排吗?",
  "user_id": "a70ff537-8908-486e-9b6c-042e07cc25db",
  "now": "2026-09-03T22:00:00+08:00",
  "session_id": "optional-session-uuid",
  "locale": "zh-CN",
  "planner_level": "auto"
}
字段 必填 说明
query 用户原句
user_id 当前用户
now 解析相对时间的锚点,默认服务端当前时间
session_id 用于 Chat 上下文
planner_level auto / cheap_only / semantic

响应

{
  "plan": {
    "query_type": "personal_temporal_recall",
    "temporal_mode": "AMBIGUOUS",
    "time": {
      "mention_range": {
        "start": "2026-09-02T00:00:00+08:00",
        "end": "2026-09-03T00:00:00+08:00"
      },
      "event_range": {
        "start": "2026-09-02T00:00:00+08:00",
        "end": "2026-09-03T00:00:00+08:00"
      },
      "relative_label": "yesterday"
    },
    "targets": [
      { "type": "commitment", "weight": 1.0 },
      { "type": "calendar_event", "weight": 0.85 },
      { "type": "todo", "weight": 0.9 }
    ],
    "sources": {
      "calendar": 0.85,
      "chat": 0.80,
      "meinput": 0.75,
      "memory_v2": 0.45
    },
    "retrievals": [
      {
        "source": "meinput",
        "query_type": "important_mentions",
        "expanded_queries": ["重要", "安排", "会议", "明天", "截止"],
        "weight": 0.75
      },
      {
        "source": "chat",
        "query_type": "commitments_and_decisions",
        "expanded_queries": ["安排", "确认", "跟进", "记得"],
        "weight": 0.80
      }
    ],
    "filters": { "importance_min": 0.6, "status": "any" },
    "output": { "group_by": "importance", "dedupe": true, "timeline": true, "wide_recall": true },
    "context_needs": {
      "user_snapshot": "OPTIONAL",
      "temporal_recall": "REQUIRED",
      "memory_retrieval": "OPTIONAL"
    },
    "planner_meta": {
      "level": "cheap_router",
      "rule_hits": ["time:yesterday", "keyword:重要", "keyword:安排"],
      "confidence": 0.82
    }
  }
}

错误

HTTP code 说明
400 invalid_query 空 query
401 unauthenticated 未登录
422 time_unparseable 时间词无法解析且无 fallback

3. 解析管线(实现约束)

1. deterministic time parser     → mention_range / event_range / relative_label
2. keyword rule matcher          → sources 权重 + rule_hits
3. target inference (rules)      → targets[]
4. merge → ContextPlan
5. [v0.2] semantic planner patch → 仅 cheap_router confidence < 0.6 时

V0.1 默认 cheap_onlysemantic 返回 501 not_implemented


4. 与 Task Intent Router 边界

组件 用途
chat-intent-router 聊天 → Agent 升级、tool 路由
Context Planner 回答需要哪些检索上下文

Context Planner 不决定是否启动 Agent Run。


5. Runtime 集成

Agent 每轮开始前:

plan = POST /v1/context/plan { query: user_message }
if plan.context_needs.user_snapshot != SKIP → load snapshot
if plan.context_needs.temporal_recall != SKIP → POST /v1/temporal-recall/query { plan }
if plan.context_needs.memory_retrieval != SKIP → memory-v2 retrieve

V0.1 Runtime hook 可仅在 temporal_recall = REQUIRED 时启用。