一个什么都往里扔的垃圾桶¶
证据等级:F(源码直接证明)
分析基线:4f843556
一句话¶
build_agent_context 将 soul.md、memory.md、skills/、session_context、focus、triggers、enterprise_info 全部压进一个 system message,无分层、无缓存、无优先级。
1. 事实基础¶
# agent_context.py
system_prompt = static_content + dynamic_content
# caller.py:557-559
api_messages = [LLMMessage(
role="system",
content=static_prompt,
dynamic_content=dynamic_prompt,
)]
内容构成¶
| 类型 | 内容 | 处理 |
|---|---|---|
| 静态 | soul.md | 截断到 30K 字符 |
| 静态 | memory.md | 截断到 2K 字符 |
| 静态 | skills/ 索引 | 渐进式披露 |
| 静态 | enterprise_info | 完整加载 |
| 动态 | session_context | 紧凑摘要 |
| 动态 | focus | 当前活跃项 |
| 动态 | triggers | 触发条件 |
| 动态 | 时间戳 | 当前时间 |
全部合并为一个 LLMMessage(role="system")。
2. 后果¶
- 无分层:system / task / memory / tool result 全部混在一起,LLM 无法区分优先级
- 无缓存策略:静态内容(soul.md、skills/、enterprise_info)每次重算,不被缓存
- 截断丢失:memory 截断到 2000 字符,超出部分丢弃
- 无法单独更新:任何一个静态部分变化,整个 system message 都要重建
3. 交互影响¶
与"一根管道"(018)叠加:工具输出(可能是 pip 进度条、npm 依赖树)直通 messages[] → 与 soul.md、memory、skills 挤在同一个上下文窗口 → 关键信息被噪音淹没。
与"伪缓存"(020)叠加:静态内容每次都重算 → 但其中已经混入了会话动态内容 → 即使想缓存也无法缓存。
4. 与 AI Coding 的关系¶
- "全部拼接"是最简单的实现:把所有内容拼成一个大字符串,比设计分层架构快得多
- 无缓存意识:AI 不会主动说"这部分内容几轮都不变,应该缓存"——这需要架构师对性能的整体判断
- 局部合理、全局灾难:每个
_read_file_safe调用本身是正确的——但组合在一起就变成了无法维护的"垃圾桶"
关键代码¶
| 文件 | 行号 | 内容 |
|---|---|---|
agent_context.py |
全文件 | build_agent_context — 全部内容拼成字符串 |
agent_context.py |
467 | memory 截断到 2000 字符 |
agent_context.py |
455 | soul 截断到 30000 字符 |
caller.py |
557-559 | 静态+动态合并为一个 system message |