--- name: llm-call-sites description: Stello 框架内所有 LLM 调用位置的消息结构速查。覆盖 Session 对话、compress、consolidate;应用层 reflection 调用由 orchestrator 自行决定。 --- # LLM 调用消息结构 Stello 里所有 LLM 调用的 `messages` 参数构成。Session 同构——root 与 child 走同一套上下文组装规则,差异只在 `meta.label`。 --- ## 1. Session 对话 ``` [ { role: 'system', content: systemPrompt }, // 可能含 块;若非空 { role: 'system', content: }, // 若 meta.label 非空 { role: 'system', content: insight }, // 若非空,消费后清除 { role: 'system', content: compressSummary }, // 仅当触发自动压缩 ...recentL3History, // user / assistant / tool { role: 'user', content: userInput }, ] ``` `tools` 经 `llm.stream(messages, { tools })` 第二参数传入,不进 messages。`Session.stream()` 直接转发文本增量,`Session.send()` 消费同一条 stream 后返回聚合结果。 `` 形态(label 缺省则该消息不注入): ``` 你当前在「{meta.label}」子会话中。 ``` label 改名后下次 send 自动同步,无需重写持久化的 systemPrompt。 `systemPrompt` 在 fork-compress 场景形态: ``` {合成后的 systemPrompt} {父 session 压缩摘要} ``` 所有 Session 同构走这套规则。Root 也是普通 Session,差异只在 `meta.label`。如需在 root 上注入"全局综合",应用层把综合结果通过 `putInsight(rootId, content)` 一次性写入即可。`memory` 槽位**不进入** send() 上下文。 --- ## 2. Compress ``` [ { role: 'system', content: COMPRESS_PROMPT }, { role: 'system', content: }, // 若传入非空 roleContext { role: 'user', content: "对话记录:\n" + messages.map(m => `${m.role}: ${m.content}`).join('\n') }, ] ``` 两种触发: - **对话内自动压缩**(超阈值 80%):`messages` = 待压缩的 L3 头部 - **fork 时父→子**(`context: 'compress'`):`messages` = 父 session 全量 L3 输出:纯文本摘要。 --- ## 3. Consolidate(L3 → memory) ``` [ { role: 'system', content: CONSOLIDATE_PROMPT }, { role: 'system', content: }, // 若传入非空 roleContext { role: 'user', content: [ currentMemory ? `当前摘要:\n${currentMemory}` : null, `对话记录:\n${messages.map(m => `${m.role}: ${m.content}`).join('\n')}`, ].filter(Boolean).join('\n\n') }, ] ``` - `currentMemory` = 本 session 当前 memory 槽位 - `messages` = 本 session 全量 L3 输出:100-150 字摘要,写回本 session memory 槽位。 --- ## 4. Reflection(应用层自行实现) 跨 Session 的"全 memory → 综合 → 定向 insight"循环由应用层自行调用任意 LLM 完成: - 输入:`agent.listSessionDigests({ status: 'active' })` —— `{ id, label, memory, insight }[]` - 输出:派生 per-target `insight`,通过 `agent.putInsight(targetId, content)` 写回 应用层完全掌控 prompt 形态、调用频率、LLM tier。详见 stello-agent-creation §7 与 stello-agent-usage §6.4。 --- ## XML Tag 注入汇总 | Tag | 调用路径 | 数据来源 | 注入位置 | |-----|---------|---------|---------| | `` | Session 对话(仅 fork-compress 场景) | 父 session 压缩摘要 | 合成进 systemPrompt 字段 | | `` | Session 对话 | `SessionMeta.label` | systemPrompt 之后 | | `` | Compress / Consolidate | `DefaultFnOptions.roleContext`(应用层传入) | 任务 prompt 之后、user content 之前 | --- ## 共性 | 维度 | 对话类(1) | 提炼类(2、3) | |------|------------|--------------| | 接口 | `llm.stream(msgs, { tools })` | 内部消费 `llm.stream(msgs)` 后聚合为 `string` | | tools | 有 | 无 | | L3 形态 | 原始 message 数组 | `${role}: ${content}` 字符串拼接进 user content | | 返回 | 结构化(含 tool calls) | 纯文本 | | `` 清洗 | 否 | 是 |