AIの人格がどのように構築され、プロンプトがどう組み立てられるか
OpenClawの「パーソナル」な性格は、3層のアイデンティティシステムと、 20以上のセクションから成る巨大なシステムプロンプトによって実現されています。 このセクションでは、AIの人格がどのように定義・構築・注入されるかを詳細に解説します。
src/agents/identity.ts
resolveAgentIdentity() が設定ファイルの config.agents.list[].identity から
アイデンティティ情報を読み取ります。
| フィールド | 用途 |
|---|---|
name | 表示名(メッセージプレフィックスに使用) |
theme | テーマ |
emoji | ACKリアクション(デフォルト: 👀) |
avatar | アバター画像パス |
src/agents/identity-file.ts
ワークスペースの IDENTITY.md ファイルからMarkdown形式で人格情報を読み込みます。
設定ベースよりも拡張されたフィールドを持ちます:
| フィールド | 説明 | 例 |
|---|---|---|
name | 名前 | Clawd |
emoji | 絵文字 | 🦞 |
creature | キャラクター種別 | lobster |
vibe | 雰囲気・性格 | friendly and direct |
avatar | アバター | (画像パス) |
theme | テーマ | ocean |
parseIdentityMarkdown() がMarkdownファイルを解析し、プレースホルダー値("pick something you like" 等)を自動フィルタリングします。
これがOpenClawの人格の核心です。
SOUL.mdテンプレートが定める主要原則:
特筆すべき点:SOUL.mdは「自己進化型」に設計されています。ファイル自体に「This file is yours to evolve(このファイルはあなた自身で進化させるもの)」と記載されています。
src/agents/workspace.ts
BOOTSTRAP.mdの初回オンボーディングフロー:
オンボーディング状態は .openclaw/workspace-state.json に
bootstrapSeededAt と onboardingCompletedAt として記録されます。
src/agents/workspace.ts:412-466
ワークスペースから読み込まれる標準ファイル群:
| ファイル | 用途 | サブエージェントに共有 |
|---|---|---|
AGENTS.md | ワークスペース指示、セッションプロトコル | はい |
SOUL.md | 人格・ペルソナ定義 | いいえ |
TOOLS.md | ツール利用ガイド | はい |
IDENTITY.md | 名前、キャラクター、絵文字 | いいえ |
USER.md | ユーザープロフィール(名前、タイムゾーン、好み) | いいえ |
HEARTBEAT.md | 定期チェックタスク | いいえ |
BOOTSTRAP.md | 初回オンボーディング(使用後削除) | いいえ |
MEMORY.md | 長期メモリ | いいえ |
AGENTS.md と TOOLS.md のみが共有され、
個人情報(USER.md、MEMORY.md等)は漏洩しません。
これは filterBootstrapFilesForSession() で制御されています。
src/agents/pi-embedded-helpers/bootstrap.ts
agents.defaults.bootstrapMaxCharssrc/agents/system-prompt.ts:169-639
buildAgentSystemPrompt() が30以上のパラメータを受け取り、
以下のセクションを順番に組み立てます:
| モード | 用途 | 含まれるセクション |
|---|---|---|
full | メインエージェント | すべて |
minimal | サブエージェント | Tooling, Workspace, Runtimeのみ |
none | 最小 | 基本アイデンティティ行のみ |
メッセージプレフィックスやリアクション絵文字は、多層的な優先度で解決されます:
channels.{channel}.accounts.{id}.ackReaction)channels.{channel}.ackReaction)messages.ackReaction)hasAllowFrom が true → 空文字(プレフィックスなし)[name])[openclaw]src/agents/sanitize-for-prompt.ts
sanitizeForPromptLiteral() はプロンプトインジェクション対策として、
ワークスペースパス等の外部入力値から以下を除去します:
これにより、攻撃者がディレクトリ名にプロンプト命令を埋め込む攻撃を防止します。
src/agents/system-prompt-params.ts
buildSystemPromptParams() が以下を解決します:
agents.defaults.userTimezone からsrc/agents/agent-scope.ts
OpenClawは複数のエージェントを同時に運用できます。各エージェントは独立した設定を持ちます:
~/.openclaw/workspace、他: ~/.openclaw/workspace-{id})