本文档详细说明上下文组装结果模型中所有数据结构的字段含义、类型、读写角色、生命周期及设计考量。
| 来源 | 对应内容 | zone 默认值 |
|---|---|---|
MEMORY_INDEX |
MEMORY.md 轻量索引(autoDream 产物) | dynamic |
SESSION_MEMORY |
今日会话记忆(session/{date}.md) | dynamic |
TOOL_CACHE_PLACEHOLDER |
JSON 占位符工具结果 | dynamic |
- 压缩骨架:7 层渐进式压缩(FROZEN → TRIMMED → SUMMARIZED → CONSOLIDATED)
- DYNAMIC_BOUNDARY:保护区(system_prompt + CHACHA.md + USER_MEMORY.md + CHACHA_MEMORY.md + skills)永不被截断
- v2.1 双层永久记忆:USER_MEMORY.md(用户级跨项目)+ CHACHA_MEMORY.md(项目级),均在保护区,永不压缩、永不删除
- v2.0 两阶段工具缓存:Stage 1 Dispatcher → Stage 2 Compressor
class BlockSource(str, Enum):
SYSTEM_PROMPT = "system_prompt" # 系统提示词
STATIC_RULE = "static_rule" # CHACHA.md 静态规范
MEMORY = "memory" # MEMORY.md 记忆 / CHACHA_MEMORY.md 永久记忆
HISTORY = "history" # 对话历史
TOOL_RESULT = "tool_result" # 工具执行结果
SKILL = "skill" # 技能定义
ADDITIONAL_CONTEXT = "additional_context" # 钩子注入| 来源 | 对应内容 | zone 默认值 | 可缓存 |
|---|---|---|---|
SYSTEM_PROMPT |
系统级指令 | protected |
✅ TTL 600s |
STATIC_RULE |
分层 CHACHA.md | protected |
✅ TTL 600s |
MEMORY (global) |
USER_MEMORY.md 用户级永久记忆(跨项目) | protected |
✅ TTL 300s |
MEMORY (permanent) |
CHACHA_MEMORY.md 项目永久记忆 | protected |
✅ TTL 300s |
SKILL |
技能定义、工具 schema | protected |
✅ TTL 1200s |
MEMORY (index) |
MEMORY.md 轻量索引 | dynamic |
❌ |
MEMORY (session) |
今日会话记忆 | dynamic |
❌ |
HISTORY |
用户消息、助手回复 | dynamic |
❌ |
TOOL_RESULT |
工具执行输出(可能为 JSON 占位符) | dynamic |
❌ |
RAG_RESULT |
Code-RAG 检索结果 | dynamic |
✅ TTL 120s |
SUBAGENT_RESULT |
子Agent 任务完成报告 | dynamic |
❌ |
ADDITIONAL_CONTEXT |
钩子注入 | dynamic |
❌ |
| 层级 | 触发 pressure | LLM 成本 | 做法 | 典型压缩率 |
|---|---|---|---|---|
NONE |
< 0.5 | — | 原始内容 | 0% |
FROZEN |
0.5~0.7 | 零 | Stage 2: JSON key 最小化 + 150字符摘要 | 90%+ |
TRIMMED |
0.7~0.85 | 零 | 历史消息首尾裁剪 | 30-60% |
SUMMARIZED |
0.85~0.95 | 一次 | LLM 摘要保留语义 | 70-90% |
CONSOLIDATED |
> 0.95 | 一次 | 多条相关块合并为一条 | 85%+ |
protected zone:
0. SYSTEM_PROMPT
1. CHACHA.md (STATIC_RULE)
2. USER_MEMORY.md(用户级永久记忆,跨项目)
3. CHACHA_MEMORY.md (MEMORY, 项目永久记忆)
4. SKILL
dynamic zone:
10. MEMORY.md 索引
11. 今日会话记忆
20+. 对话历史
30+. 工具结果(含 JSON 占位符)
40+. RAG / SubAgent
50+. 钩子注入
ContextManager 产出 AssembledContext(blocks=25, total_tokens=120000)
│
▼
读取 meta.utilization_ratio → 0.94(>0.8 触发线)
│
├─ needs_compression = True
├─ recommended_level = TRIMMED
│
▼
ContextCompressor 按策略执行:
│
├─ 1. 保护区 BLOCK 跳过
├─ 2. Stage 2 FROZEN: JSON 占位符 → {"t","s","p"} 最小化
├─ 3. Stage 2 FROZEN: 完整结果 → 150字符摘要
├─ 4. TRIMMED: 旧历史消息裁剪
└─ 5. total_tokens 回到安全区
core/context_manager.py 是上下文组装的核心入口,负责将对话状态、记忆、规则、钩子注入组装为 AssembledContext。
from core.context_manager import ContextManager
from core.models.config import ContextConfig
# 使用默认配置(max_tokens=1048576, trigger_ratio=0.8)
mgr = ContextManager()
# 或自定义配置
mgr = ContextManager(ContextConfig(
max_tokens=200_000,
compression_trigger_ratio=0.75,
enable_summarization=True,
))# —— protected zone(永不截断)——
mgr.set_system_prompt("你是 ChachaAgent...")
mgr.set_static_rules(chacha_md_content) # CHACHA.md 宪法
mgr.set_global_permanent_memory(user_memory) # ~/.chacha/USER_MEMORY.md
mgr.set_permanent_memory(project_permanent_memory) # CHACHA_MEMORY.md
mgr.set_skills(tool_schemas) # 工具/技能定义
# —— dynamic zone(可压缩)——
mgr.set_memory_index(memory_md_content) # MEMORY.md 轻量索引
mgr.set_session_memory(today_session_text) # 今日会话记忆from core.models.session import ConversationState
state = ConversationState() # 从对话历史构建
ctx = mgr.assemble(
state=state,
session_id="abc-123",
static_rules=None, # None → 使用已注入的
skills=None,
memory_content=None,
additional_contexts=None, # 钩子注入的额外 ContextBlock
)
# 检查压缩状态
print(f"Token: {ctx.meta.total_tokens}/{ctx.meta.budget_per_request}")
print(f"利用率: {ctx.meta.utilization_ratio:.1%}")
print(f"需压缩: {ctx.needs_compression}")
print(f"推荐级别: {ctx.recommended_level}")
# 转为 OpenAI 消息格式
messages = ContextManager.blocks_to_messages(ctx)from core.context_manager import ContextManager
from core.models.config import ContextConfig
from core.models.session import ConversationState, MessageEvent
# 1. 初始化
mgr = ContextManager(ContextConfig(max_tokens=500_000, compression_trigger_ratio=0.8))
mgr.set_system_prompt("你是 ChachaAgent,一个 AI 助手。")
mgr.set_static_rules("--- 项目宪法 ---\n- 代码风格: PEP 8")
mgr.set_permanent_memory("### 关键决策\n- 使用 SQLite 数据库")
mgr.set_memory_index("### 用户偏好\n- 偏好简洁回复")
# 2. 构建对话状态
state = ConversationState()
state.add_event(MessageEvent(source="user", role="user", content="帮我写一个 hello world"))
# 3. 组装
ctx = mgr.assemble(state, session_id="demo-1")
messages = ContextManager.blocks_to_messages(ctx)
# 4. 发送给 LLM Invoker
# response = await invoker.invoke(messages=messages, session_id="demo-1")快速加载项目的所有静态上下文,不经过完整的 assemble 流程:
from core.context_manager import ContextManager
from core.context.memory_manager import MemoryManager
system_prompt = ContextManager.build_system_prompt(
project_root="/path/to/project",
base_prompt="你是 ChachaAgent...",
memory_manager=MemoryManager(project_root="/path/to/project"),
)
# 返回的 system_prompt 包含:
# 1. base_prompt
# 2. ~/.chacha/CHACHA.md(用户级宪法)
# 3. {project_root}/CHACHA.md(项目级宪法)
# 4. CHACHA_MEMORY.md(项目永久记忆)
# 5. MEMORY.md(轻量索引)# AssembledContext → OpenAI 消息列表
messages = ContextManager.blocks_to_messages(ctx)
# OpenAI 消息列表 → ConversationState(用于恢复对话)
state = ContextManager.messages_to_state(
messages,
session_id="restored-session",
project_id="my-project",
)