Systemprompt-Aufbau
system-prompt.ts ist die Montage-Werkstatt für pi's default-Systemprompt. Eine Datei, eine buildSystemPrompt-Funktion, die aus Werkzeugliste, guidelines, pi-Dokumentpfaden, Projekt-Kontextdateien, Skills, Datum und cwd den finalen Prompt-String zusammenbaut. createAgentSession ruft es nicht direkt auf - es wird von AgentSession vor jedem prompt basierend auf den aktuell aktivierten Werkzeugen neu gebaut, damit der Prompt nach Werkzeugänderungen synchron bleibt.
Verantwortung
- Default-Prompt zusammenbauen:
buildSystemPromptgeht ohnecustomPromptden default-Pfad und erzeugt den kompletten Prompt mit "You are an expert coding assistant operating inside pi". Siehepackages/coding-agent/src/core/system-prompt.ts:28-80,packages/coding-agent/src/core/system-prompt.ts:131-171. - custom-Prompt-Pfad: Wenn
customPromptangegeben ist, wird das default-Template übersprungen und nur contextFiles, skills, Datum, cwd angehängt. Siehepackages/coding-agent/src/core/system-prompt.ts:53-80. - Werkzeugliste und guidelines:
selectedToolsentscheidet, welche Werkzeuge sichtbar sind, und die Werkzeugkombination generiert dynamisch guidelines (z. B. bei bash+grep "bevorzuge grep"). Siehepackages/coding-agent/src/core/system-prompt.ts:89-129. - prompt snippet-Injektion:
promptSnippetjedes Werkzeugs ist eine einzeilige Kurzbeschreibung, die in die "Available tools"-Liste eingefügt wird, anhand derer der LLM den Zweck eines Werkzeugs erkennt. Siehepackages/coding-agent/src/core/system-prompt.ts:89-92. - Skills-Anhängen:
formatSkillsForPromptwickelt sichtbare Skills (ohnedisableModelInvocation) in einen<available_skills>-XML-Abschnitt. Siehepackages/coding-agent/src/core/system-prompt.ts:162-165. - Dokument-Selbstausweis: Der Prompt nennt die Pfade von pi's eigenen Dokumenten (readme, docs, examples) und weist den LLM an, diese zu lesen, wenn der Nutzer nach pi fragt. Siehe
packages/coding-agent/src/core/system-prompt.ts:141-147.
Entwurfsmotivation
Warum nicht AgentSession direkt den Prompt-String halten lassen? Weil das Werkzeugset dynamisch ist - der Nutzer kann mit /tools mitten in der Session Werkzeuge hinzufügen oder entfernen, Extensions können neue Werkzeuge registrieren. Wenn der Prompt ein statischer String wäre, würde der LLM nach einer Werkzeugänderung noch weiter deaktivierte Werkzeuge aufrufen. buildSystemPrompt wird bei jedem Aufruf neu erzeugt und hält den Prompt streng synchron mit dem aktuell aktivierten Werkzeugset.
Warum zwischen default-Prompt und custom-Prompt-Pfad unterscheiden? Der default-Prompt ist die von pi offiziell getunte Version mit Werkzeugliste, guidelines und Dokument-Selbstausweis; ein custom-Prompt ist eine vom Nutzer oder einer Extension gelieferte, komplett eigene Version, die nur contextFiles und skills angehängt bekommen will. Beide Pfade teilen sich die Anfüge-Logik für contextFiles, skills, Datum und cwd, aber der default-Pfad hat zusätzlich den Zusammenbau von toolsList und guidelines.
Die dynamischen guidelines sind erwähnenswert: Wenn bash und grep/find/ls gleichzeitig aktiv sind, empfiehlt der Prompt "Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore)"; wenn nur bash ohne grep/find/ls vorhanden ist, empfiehlt er "Use bash for file operations like ls, rg, find". So findet der LLM bei verschiedenen Werkzeugsets den effizienten Pfad.
Wichtige Dateien
packages/coding-agent/src/core/system-prompt.ts:8-25—BuildSystemPromptOptions, alle optionalen Eingaben.packages/coding-agent/src/core/system-prompt.ts:28-52— Signatur und Vorverarbeitung vonbuildSystemPrompt, löst cwd, Datum, contextFiles, skills auf.packages/coding-agent/src/core/system-prompt.ts:53-80— custom-Prompt-Pfad.packages/coding-agent/src/core/system-prompt.ts:89-129— Werkzeugliste und dynamische guidelines, inklusivehasBash/hasGrep/hasFind/hasLs-Prüfung.packages/coding-agent/src/core/system-prompt.ts:131-147— default-Prompt-Template-Hauptkörper, inklusive pi-Dokument-Selbstausweis.packages/coding-agent/src/core/system-prompt.ts:149-171— appendSystemPrompt, contextFiles, skills, Datum, cwd werden angehängt.
Dynamische Generierung der guidelines, dedupliziert über ein 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");Am Ende des default-Prompts werden Datum und cwd angehängt, absichtlich ganz am Schluss, damit der LLM sie bemerkt:
// 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;Datenfluss
Ablauf der Prompt-Konstruktion:
Grenzen und Fehler
- toolsList ohne Werkzeuge: Wenn
visibleToolsleer ist, wird(none)angezeigt, statt zu werfen - der LLM weiß, dass aktuell keine eingebauten Werkzeuge vorhanden sind, siehepackages/coding-agent/src/core/system-prompt.ts:91-92. - skills nur angehaengt, wenn read verfuegbar: Da Skill-Dateien das read-Werkzeug benötigen, würde eine Skill-Liste ohne read den LLM verwirren, siehe
packages/coding-agent/src/core/system-prompt.ts:70-73,packages/coding-agent/src/core/system-prompt.ts:162-165. - customPrompt respektiert read-Pruefung:
customPromptHasRead = !selectedTools || selectedTools.includes("read"), siehepackages/coding-agent/src/core/system-prompt.ts:70-73. - cwd-Pfad zu posix:
promptCwd = resolvedCwd.replace(/\\/g, "/"), auch Windows-Pfade nutzen Slash statt Backslash, damit der LLM die Backslashes im Prompt nicht als Escape missversteht, siehepackages/coding-agent/src/core/system-prompt.ts:39-40. - guidelines dedupliziert:
guidelinesSetverhindert, dass diepromptGuidelines-Option doppelte Einträge übergibt, siehepackages/coding-agent/src/core/system-prompt.ts:96-103.
Zusammenfassung
buildSystemPrompt ist die Montage-Werkstatt für den Prompt, generiert guidelines dynamisch nach dem aktuellen Werkzeugset, die beiden Pfade custom und default teilen sich die Anfüge-Logik für contextFiles/skills/Datum/cwd. Wie das Skills-System geladen und formatiert wird, siehe Skills-System; die Nachrichtenkonvertierung siehe Nachrichtentypen und convertToLlm; das Werkzeugset selbst siehe Werkzeugset read/bash/edit/write/grep/find/ls.