Prompt 组织
在 Mister Morph 主 Loop 中,Prompt 的唯一目的是为 Agent 拼装出合理的状态。
我们人为切分的 skill 也好 identity 也好 soul 也好 todo 也好 memory 也好,本质上都是在维护这个状态,属于 memory 的语法糖。
在 Mister Morph 里,这些语法糖由 agent/prompts/system.md 作为骨架组装。
主循环
静态 Prompt 骨架
这个模板大致长这样:
## Persona
{{ identity }}
## Available Skills
{{ skills }}
## Reference Format
{{ 约定的内部引用格式 }}
## Additional Policies
{{ 附加的大段策略 }}
## Response Format
{{ 约定的输出格式 }}
## Rules
{{ 内置规则 和 附加规则 }}运行时 Prompt
进入某一次具体运行后,runtime 会把当前上下文继续补进去。
常见来源包括:
- 本地 persona 文件,
IDENTITY.md和SOUL.md - 当前启用的 skill 元数据
- 本地脚本说明,例如
SCRIPTS.md - 附加的策略块
- memory summary
会随着当前任务、当前通道和当前本地状态变化。在 CLI、Telegram、Slack 里跑出来的最终 prompt,不一定完全一样。
Prompt 以外的消息编排
准备好最终 system prompt 之后,主 Agent 还会在请求里编排消息栈。
运行时 metadata 会作为一个 user 角色的 JSON envelope 注入,外层 key 是 mister_morph_meta。常见字段包括已有的 trigger / correlation 信息、运行时钟字段 now_utc / now_local / now_local_weekday,以及 host_os 这类宿主环境事实。
顺序可以理解成:
[system] 最终 system prompt
->
[user] 运行时 metadata
->
[history] 历史消息
->
[user] 当前消息或原始 task独立 Prompt
Mister Morph 里还有一类调用不会先拼出主 Agent 的完整 system prompt,也不一定会进入带工具的多步 Loop,而是直接构造一组更小的 prompt,单次调用 llm.Chat。
这类独立 Prompt 会用于:
- 确定如何介入群聊
- 任务规划
- Memory 整理
- 一些语义判断或语义匹配类的小任务
和主 Loop 的关系
可以简单理解成两条路:
主 Agent 主 Loop
-> 完整 system prompt
-> runtime metadata / history / current message
-> 可多步、可调工具
独立 llm.Chat
-> 专用 system prompt / user prompt
-> 单次调用
-> 只解决一个很窄的问题例如,Agent 在判断如何介入群聊时,会检查:
- 这条消息是不是在叫我
- 现在要不要插话
- 需不需要直接轻量回应(发表情)
这个判断发生在主 Loop 之前,所以它更适合走一个更小、更专用的 Prompt,而不是用整套主 system prompt 去判断。