Construction du system prompt
system-prompt.ts est l'atelier d'assemblage du system prompt par défaut de pi. Un seul fichier, une seule fonction buildSystemPrompt, qui concatène la liste d'outils, les guidelines, les chemins de docs pi, les fichiers de contexte projet, les skills, la date et le cwd en une chaîne de prompt finale. createAgentSession ne l'appelle pas directement — c'est AgentSession qui la reconstruit avant chaque prompt en fonction des outils actuellement actifs, pour garantir que le prompt reste synchro quand des outils sont ajoutés ou retirés.
Responsabilités
- Assembler le prompt par défaut :
buildSystemPromptsanscustomPromptemprunte la voie par défaut, génère le prompt complet commençant par « You are an expert coding assistant operating inside pi ». Voirpackages/coding-agent/src/core/system-prompt.ts:28-80etpackages/coding-agent/src/core/system-prompt.ts:131-171. - Chemin customPrompt : quand
customPromptest fourni, on saute le template par défaut et on ne fait qu'ajouter contextFiles, skills, date, cwd. Voirpackages/coding-agent/src/core/system-prompt.ts:53-80. - Liste d'outils et guidelines : selon
selectedTools, décide quels outils sont visibles et génère dynamiquement les guidelines (par ex. si bash + grep sont tous deux présents, suggère de privilégier grep). Voirpackages/coding-agent/src/core/system-prompt.ts:89-129. - Injection de prompt snippet : chaque outil a un
promptSnippetd'une ligne, assemblé dans la liste « Available tools » ; le LLM s'en sert pour juger de l'usage de chaque outil. Voirpackages/coding-agent/src/core/system-prompt.ts:89-92. - Ajout des skills :
formatSkillsForPrompttransforme les skills visibles (nondisableModelInvocation) en bloc XML<available_skills>. Voirpackages/coding-agent/src/core/system-prompt.ts:162-165. - Auto-référence à la doc : le prompt indique les chemins de la doc pi elle-même (readme, docs, examples) et demande au LLM d'aller les lire quand l'utilisateur pose une question sur pi. Voir
packages/coding-agent/src/core/system-prompt.ts:141-147.
Motifs de conception
Pourquoi AgentSession ne détient-il pas directement la chaîne de prompt ? Parce que l'ensemble d'outils est dynamique — l'utilisateur peut faire /tools en plein milieu de session pour en ajouter ou en retirer, et les extensions peuvent aussi enregistrer de nouveaux outils. Si le prompt était une chaîne statique, le LLM continuerait à appeler des outils déjà désactivés selon l'ancien prompt. buildSystemPrompt régénère à chaque appel, garantissant un alignement strict entre prompt et ensemble d'outils actifs.
Pourquoi distinguer le prompt par défaut et le chemin customPrompt ? Le prompt par défaut est la version officielle tunée par pi, qui inclut la liste d'outils, les guidelines et l'auto-référence à la doc ; le custom prompt est une version entièrement personnalisée fournie par l'utilisateur ou une extension, qui ne veut qu'ajouter contextFiles et skills. Les deux chemins partagent la logique d'ajout de contextFiles, skills, date, cwd, mais le chemin par défaut ajoute en plus l'assemblage de toolsList et guidelines.
La dynamisation des guidelines mérite une mention : si bash et grep/find/ls sont simultanément activés, le prompt suggère « Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore) » ; si bash est seul sans grep/find/ls, il suggère « Use bash for file operations like ls, rg, find ». Cela permet au LLM de toujours emprunter le chemin efficace quel que soit l'ensemble d'outils.
Fichiers clés
packages/coding-agent/src/core/system-prompt.ts:8-25—BuildSystemPromptOptions, toutes les entrées optionnelles.packages/coding-agent/src/core/system-prompt.ts:28-52— signature debuildSystemPromptet pré-traitement : résolution de cwd, date, contextFiles, skills.packages/coding-agent/src/core/system-prompt.ts:53-80— chemin customPrompt.packages/coding-agent/src/core/system-prompt.ts:89-129— liste d'outils et génération dynamique des guidelines, incluant les vérificationshasBash/hasGrep/hasFind/hasLs.packages/coding-agent/src/core/system-prompt.ts:131-147— corps principal du template par défaut, y compris la section d'auto-référence à la doc pi.packages/coding-agent/src/core/system-prompt.ts:149-171— appendSystemPrompt, contextFiles, skills, ajout de date et cwd.
Génération dynamique des guidelines avec déduplication par 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");La fin du prompt par défaut ajoute date et cwd, placés volontairement en dernier pour attirer l'attention du 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;Flux de données
Construction du prompt :
Limites et cas d'échec
- toolsList sans outil : quand
visibleToolsest vide, on affiche(none)sans lever d'erreur, le LLM sait qu'il n'y a aucun outil intégré pour l'instant. Voirpackages/coding-agent/src/core/system-prompt.ts:91-92. - skills ajoutés seulement si read est dispo : les fichiers de skill nécessitent l'outil read ; sans read, ajouter la liste des skills laisserait le LLM perplexe. Voir
packages/coding-agent/src/core/system-prompt.ts:70-73etpackages/coding-agent/src/core/system-prompt.ts:162-165. - customPrompt respecte aussi le check read :
customPromptHasRead = !selectedTools || selectedTools.includes("read"). Voirpackages/coding-agent/src/core/system-prompt.ts:70-73. - Conversion posix du chemin cwd :
promptCwd = resolvedCwd.replace(/\\/g, "/"), les chemins Windows utilisent aussi des slashes pour éviter que les backslashes du prompt soient interprétés par le LLM comme des échappements. Voirpackages/coding-agent/src/core/system-prompt.ts:39-40. - Déduplication des guidelines :
guidelinesSetempêche l'optionpromptGuidelinesd'introduire des doublons. Voirpackages/coding-agent/src/core/system-prompt.ts:96-103.
Synthèse
buildSystemPrompt est l'atelier d'assemblage du prompt, génère dynamiquement les guidelines selon l'ensemble d'outils courant, et les deux chemins (custom et par défaut) partagent la logique d'ajout de contextFiles/skills/date/cwd. Pour le chargement et le formatage des skills, voir système de skills ; pour la conversion des messages, voir types de messages et convertToLlm ; pour l'ensemble d'outils lui-même, voir ensemble d'outils read/bash/edit/write/grep/find/ls.