Files
mini-openclaw/backend/graph/prompt_builder.py
T
NathanAlex7 42ce992a0f chore: mini-openclaw 初始版本
Next.js 前端 + FastAPI/LangChain 后端透明 agent平台
- 含 .gitignore, 敏感文件(sessions数据/.env/venv等)已排除
- 待后续添加 trajectory 自进化机制
2026-09-01 16:40:10 +08:00

61 lines
2.1 KiB
Python

"""Prompt Builder — Assemble system prompt from 6 Markdown files."""
from pathlib import Path
MAX_COMPONENT_LENGTH = 20000
def _read_component(path: Path) -> str:
"""Read a file, truncating if it exceeds MAX_COMPONENT_LENGTH."""
if not path.exists():
return ""
content = path.read_text(encoding="utf-8")
if len(content) > MAX_COMPONENT_LENGTH:
content = content[:MAX_COMPONENT_LENGTH] + "\n...[truncated]"
return content
RAG_GUIDANCE = """注意:长期记忆(MEMORY.md)已切换为RAG检索模式。
系统会根据用户的问题自动检索相关记忆片段并注入上下文。
如果检索到了相关记忆,它们会以"[记忆检索结果]"标记呈现在你的上下文中。"""
def build_system_prompt(base_dir: Path, rag_mode: bool = False) -> str:
"""Build the full system prompt by concatenating components in order.
Order:
1. SKILLS_SNAPSHOT.md — available skills listing
2. workspace/SOUL.md — persona, tone, boundaries
3. workspace/IDENTITY.md — name, style, emoji
4. workspace/USER.md — user profile
5. workspace/AGENTS.md — operation instructions & memory/skill protocols
6. memory/MEMORY.md — cross-session long-term memory (skipped in RAG mode)
When rag_mode=True, MEMORY.md is excluded and a RAG guidance note is appended.
"""
components = [
("Skills Snapshot", base_dir / "SKILLS_SNAPSHOT.md"),
("Soul", base_dir / "workspace" / "SOUL.md"),
("Identity", base_dir / "workspace" / "IDENTITY.md"),
("User Profile", base_dir / "workspace" / "USER.md"),
("Agents Guide", base_dir / "workspace" / "AGENTS.md"),
]
# Only include MEMORY.md when not in RAG mode
if not rag_mode:
components.append(
("Long-term Memory", base_dir / "memory" / "MEMORY.md")
)
parts: list[str] = []
for label, path in components:
content = _read_component(path)
if content:
parts.append(f"<!-- {label} -->\n{content}")
# Append RAG guidance when in RAG mode
if rag_mode:
parts.append(f"<!-- RAG Mode -->\n{RAG_GUIDANCE}")
return "\n\n".join(parts)