システムプロンプト構築
system-prompt.ts は pi のデフォルトシステムプロンプトを組み立てる工房だ。一つのファイル、一つの buildSystemPrompt 関数が、ツールリスト、guidelines、pi ドキュメントのパス、プロジェクトのコンテキストファイル、スキル、日付、cwd を最終的なプロンプト文字列に組み上げる。createAgentSession は直接これを呼ばない——AgentSession が毎回のプロンプト送信前に現在アクティブなツールに基づいて再構築し、ツールの増減がプロンプトに即反映されるようにする。
責務
- デフォルトプロンプト組み立て:
buildSystemPromptはcustomPromptなしで呼ばれたときデフォルトパスを通り、「You are an expert coding assistant operating inside pi」で始まる完全なプロンプトを生成する。packages/coding-agent/src/core/system-prompt.ts:28-80、packages/coding-agent/src/core/system-prompt.ts:131-171参照。 - custom prompt パス:
customPromptを渡すとデフォルトテンプレートをスキップし、contextFiles、skills、日付、cwd だけを末尾に追加する。packages/coding-agent/src/core/system-prompt.ts:53-80参照。 - ツールリストと guidelines:
selectedToolsに応じて可視ツールを決め、ツールの組み合わせで guidelines を動的生成する(bash+grep が同時にあるときは grep 優先を推奨するなど)。packages/coding-agent/src/core/system-prompt.ts:89-129参照。 - prompt snippet 注入:各ツールの
promptSnippetは一行の短い説明で、「Available tools」リストに組み込まれ、LLM はこれでツールの用途を判断する。packages/coding-agent/src/core/system-prompt.ts:89-92参照。 - スキル追加:
formatSkillsForPromptが可視スキル(disableModelInvocationでないもの)を<available_skills>XML セクションに組み上げる。packages/coding-agent/src/core/system-prompt.ts:162-165参照。 - ドキュメント自己案内:プロンプト内に pi 自身のドキュメントパス(readme、docs、examples)を明記し、ユーザが pi について質問したときはこれらのファイルを読むよう LLM に指示する。
packages/coding-agent/src/core/system-prompt.ts:141-147参照。
設計動機
なぜ AgentSession にプロンプト文字列を直接持たせないのか?ツール集合が動的だからだ——ユーザは session の途中で /tools してツールを増減できるし、拡張も新たなツールを登録できる。プロンプトが静的文字列だと、ツールが変わった後も LLM は古いプロンプトに従って無効化されたツールを呼ぼうとする。buildSystemPrompt は呼ぶたびに再生成し、プロンプトが現在のアクティブツール集合と厳密に整合するようにする。
なぜデフォルトプロンプトと custom プロンプトのパスを分けるのか?デフォルトプロンプトは pi 公式にチューニングされたバージョンで、ツールリスト、guidelines、ドキュメント自己案内を含む。custom プロンプトはユーザや拡張が提供する完全カスタム版で、contextFiles と skills だけを追加したい。二つのパスは contextFiles、skills、日付、cwd の追加ロジックを共有するが、デフォルトパスだけが toolsList と guidelines の組み立てを余分に持つ。
guidelines の動的化は一見の価値がある:bash と grep/find/ls が同時に有効なら、プロンプトは「Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore)」を推奨する。bash だけで grep/find/ls がない場合は「Use bash for file operations like ls, rg, find」を推奨する。これで LLM はどのツール集合でも効率的なパスを選べる。
主要ファイル
packages/coding-agent/src/core/system-prompt.ts:8-25—BuildSystemPromptOptions、すべて任意の入力。packages/coding-agent/src/core/system-prompt.ts:28-52—buildSystemPrompt関数シグネチャと前処理。cwd、日付、contextFiles、skills を解決。packages/coding-agent/src/core/system-prompt.ts:53-80— custom prompt パス。packages/coding-agent/src/core/system-prompt.ts:89-129— ツールリストと guidelines 動的生成。hasBash/hasGrep/hasFind/hasLs検査を含む。packages/coding-agent/src/core/system-prompt.ts:131-147— デフォルトプロンプトテンプレート本体。pi ドキュメント自己案内セクションを含む。packages/coding-agent/src/core/system-prompt.ts:149-171— appendSystemPrompt、contextFiles、skills、日付、cwd の追加。
guidelines は動的生成され、set で重複除去する:
// packages/coding-agent/src/core/system-prompt.ts:105-129
const hasBash = tools.includes("bash");
const hasGrep = tools.includes("grep");
const hasFind = tools.includes("find");
const hasLs = tools.includes("ls");
if (hasBash && !hasGrep && !hasFind && !hasLs) {
addGuideline("Use bash for file operations like ls, rg, find");
} else if (hasBash && (hasGrep || hasFind || hasLs)) {
addGuideline("Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore)");
}
for (const guideline of promptGuidelines ?? []) {
const normalized = guideline.trim();
if (normalized.length > 0) {
addGuideline(normalized);
}
}
// Always include these
addGuideline("Be concise in your responses");
addGuideline("Show file paths clearly when working with files");デフォルトプロンプトの末尾に日付と cwd を追加する。あえて最後に置くことで LLM の注意を引く:
// packages/coding-agent/src/core/system-prompt.ts:167-171
if (hasRead && skills.length > 0) {
prompt += formatSkillsForPrompt(skills);
}
// Add date and working directory last
prompt += `\nCurrent date: ${date}`;
prompt += `\nCurrent working directory: ${promptCwd}`;
return prompt;データフロー
プロンプト構築の流れ:
境界と失敗
- ツールなし時の toolsList:
visibleToolsが空のときは(none)と表示し、エラーを投げない。LLM は現在組み込みツールがないことを知る。packages/coding-agent/src/core/system-prompt.ts:91-92参照。 - skills は read ツールが使えるときだけ追加:スキルファイルは read ツールで読む必要があるため、read がないときにスキルリストを追加すると LLM が混乱する。
packages/coding-agent/src/core/system-prompt.ts:70-73、packages/coding-agent/src/core/system-prompt.ts:162-165参照。 - customPrompt も read 検査を尊重:
customPromptHasRead = !selectedTools || selectedTools.includes("read")。packages/coding-agent/src/core/system-prompt.ts:70-73参照。 - cwd パスを posix に変換:
promptCwd = resolvedCwd.replace(/\\/g, "/")。Windows パスもスラッシュを正方向にして、プロンプト内のバックスラッシュが LLM にエスケープと誤解されないようにする。packages/coding-agent/src/core/system-prompt.ts:39-40参照。 - guidelines 重複除去:
guidelinesSetがpromptGuidelinesオプションの重複エントリを防ぐ。packages/coding-agent/src/core/system-prompt.ts:96-103参照。
まとめ
buildSystemPrompt はプロンプト組み立て工房で、現在のツール集合に応じて guidelines を動的生成する。custom とデフォルトの二つのパスは contextFiles/skills/日付/cwd 追加ロジックを共有する。スキルシステムのロードとフォーマットは スキルシステム、メッセージ変換は メッセージ型と convertToLlm、ツール集合自体は ツール集合 read/bash/edit/write/grep/find/ls 参照。