Architecture

Sidecar Agent

在对话生命周期的每个关键时刻,注入智能

Sidecar 是 Lumina 的侧载 Agent 框架。多个独立 Agent 挂载在对话流程的不同阶段, 在不干扰主对话的前提下,完成记忆注入、技能匹配、标题生成等后台任务。

Core Idea

不改主流程,只加新能力

每个 Sidecar Agent 实现统一的 SidecarAgent 接口,声明名称、启用状态和要挂载的钩子。SidecarManager 负责注册、调度和生命周期管理。

传统做法

  • 记忆、技能逻辑耦合在对话主流程
  • 新增后台功能要改核心代码
  • 一个模块出错可能阻塞整个对话

Sidecar 模式

  • Agent 互相独立,通过钩子挂载
  • 新功能只需实现接口 + 注册
  • 异常隔离,不影响主对话

How It Works

一条消息的旅程

主对话流程是一条直线,Sidecar Agent 在关键节点侧向介入

会话开始
onSessionStart初始化环境
用户发消息
beforeUserMessage注入记忆 · 匹配技能
LLM 推理
助手回复
afterAssistantMessage生成标题 · 后处理
空闲 3 分钟
onIdle提取记忆 · 总结对话

Interface

一个接口
四个钩子

name: string

唯一标识,用于注册和去重追踪

enabled: boolean

运行时开关,可响应设置变更和用户权限动态切换

beforeUserMessage? · afterAssistantMessage?

消息级钩子 — 注入上下文 / 后处理分析

onIdle? · onSessionStart?

会话级钩子 — 空闲提取 / 初始化环境

独立

Agent 之间互不感知,各自运行

容错

任何 Agent 异常不阻塞主对话

去重

injectionIds 跨消息防止重复注入

Lifecycle

对话生命周期
四个关键时刻

关键路径钩子串行执行保证顺序,非关键路径钩子并行执行提升性能

beforeUserMessage

同步 · 关键路径

用户消息发送前触发。收集所有启用 Agent 的注入内容(如相关记忆、匹配的技能文档),拼接到用户消息前方,增强 LLM 的上下文。

sessionId — 会话标识
userMessage — 用户消息内容
historyMessages — 历史消息
alreadyInjected — 去重标识集

afterAssistantMessage

异步 · 非关键路径

助手消息完成后触发。所有 Agent 通过 Promise.allSettled 并行执行,适合后处理任务如自动标题生成。单个 Agent 失败不影响其他。

onIdle

异步 · 定时触发

用户停止发送消息 3 分钟后触发。每个会话维护独立的空闲定时器,新消息自动重置。适合记忆提取、对话总结等耗时后台任务。

onSessionStart

异步 · 初始化

会话创建或恢复时触发。通过 Promise.allSettled 并行执行,用于初始化 Agent 所需的环境和状态。

Built-in

三个内置 Agent
各司其职

Memory Agent

跨会话持久记忆

Pro+

挂载的钩子

beforeUserMessage

分析用户消息,从记忆库中检索相关 domain,注入匹配的用户/Agent 记忆

onIdle

空闲时从最近对话中提取新记忆,支持去重合并和 token 预算控制

关键设计

  • 双类型记忆:用户记忆 + Agent 记忆独立管理
  • 提取冷却:5 分钟内不重复提取,避免浪费算力
  • 会话追踪上限 50 条,自动淘汰最旧条目
  • 权限门控:仅 Pro 及以上套餐启用

Skill Matcher Agent

语义级技能匹配

全版本

挂载的钩子

beforeUserMessage

用轻量 LLM 分析用户意图,从内置技能库中匹配 0-2 个相关技能,将技能文档注入上下文

关键设计

  • LLM 语义匹配替代关键词搜索,更智能
  • 平台感知:自动过滤不适用当前 OS 的技能
  • 套餐感知:按用户等级过滤可用技能
  • 已注入技能不重复匹配,节省 token

Titling Agent

智能会话标题

全版本

挂载的钩子

afterAssistantMessage

第 2 轮对话完成后,用 LLM 基于完整对话上下文生成更准确的标题

关键设计

  • 智能检测:区分自动生成标题和用户手动标题
  • 每个会话只触发一次,已处理会话跳过
  • 失败可重试:异常时清除标记,下次自动重试
  • 优先从 parts 提取纯文本,避免工具调用污染

Data Flow

从注入到重建
三步完成

注入内容从 Agent 产出到最终拼入 prompt,经过去重、持久化、重建三个阶段

注入

Manager 收集各 Agent 的 MessageInjection,通过 injectionIds 跨消息去重

持久化

注入内容随消息保存为「快照」——即使记忆库后续变更,历史注入保持不变

重建

从快照重建注入内容,保持 token 序列一致,命中 prompt cache

为什么是快照不变性?

同一历史消息无论何时重建,产出的 token 序列完全一致。 这让 LLM provider 可以命中 prompt cache,显著降低延迟和成本。 这是 Sidecar 架构最核心的设计约束。

Orchestration

SidecarManager

全局单例,负责 Agent 注册/注销、钩子调度和空闲定时器管理

注册 / 注销

按名称注册,重复注册自动替换旧实例并打印警告日志

空闲定时器

每个会话独立定时器,新消息重置计时,3 分钟空闲后触发

资源清理

dispose() 清除所有定时器和注册的 Agent,防止内存泄漏

Extensibility

最小侵入
最大扩展

任何新的后台智能——情绪分析、对话评分、自动标签—— 都只需要实现 SidecarAgent 接口并注册到 Manager,无需修改主对话流程的任何代码。

返回首页
LuminaLumina

Sidecar Agent · 侧载智能框架