Skip to content

Systemprompt-Aufbau

源码版本v0.73.1

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

  1. Default-Prompt zusammenbauen: buildSystemPrompt geht ohne customPrompt den default-Pfad und erzeugt den kompletten Prompt mit "You are an expert coding assistant operating inside pi". Siehe packages/coding-agent/src/core/system-prompt.ts:28-80, packages/coding-agent/src/core/system-prompt.ts:131-171.
  2. custom-Prompt-Pfad: Wenn customPrompt angegeben ist, wird das default-Template übersprungen und nur contextFiles, skills, Datum, cwd angehängt. Siehe packages/coding-agent/src/core/system-prompt.ts:53-80.
  3. Werkzeugliste und guidelines: selectedTools entscheidet, welche Werkzeuge sichtbar sind, und die Werkzeugkombination generiert dynamisch guidelines (z. B. bei bash+grep "bevorzuge grep"). Siehe packages/coding-agent/src/core/system-prompt.ts:89-129.
  4. prompt snippet-Injektion: promptSnippet jedes Werkzeugs ist eine einzeilige Kurzbeschreibung, die in die "Available tools"-Liste eingefügt wird, anhand derer der LLM den Zweck eines Werkzeugs erkennt. Siehe packages/coding-agent/src/core/system-prompt.ts:89-92.
  5. Skills-Anhängen: formatSkillsForPrompt wickelt sichtbare Skills (ohne disableModelInvocation) in einen <available_skills>-XML-Abschnitt. Siehe packages/coding-agent/src/core/system-prompt.ts:162-165.
  6. 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

Dynamische Generierung der guidelines, dedupliziert über ein Set:

typescript
// 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:

typescript
// 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

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.