fix: avoid duplicate prompt context

This commit is contained in:
Peter Steinberger
2026-01-08 00:01:40 +00:00
parent 8b4bcc6b7a
commit badc1602c8
3 changed files with 64 additions and 44 deletions

View File

@@ -10,7 +10,6 @@ import type {
} from "@mariozechner/pi-agent-core";
import type { Api, AssistantMessage, Model } from "@mariozechner/pi-ai";
import {
buildSystemPrompt,
createAgentSession,
discoverAuthStorage,
discoverModels,
@@ -492,6 +491,16 @@ export function buildEmbeddedSandboxInfo(
};
}
export function createSystemPromptAppender(
appendPrompt: string,
): (defaultPrompt: string) => string {
const trimmed = appendPrompt.trim();
if (!trimmed) {
return (defaultPrompt) => defaultPrompt;
}
return (defaultPrompt) => `${defaultPrompt}\n\n${appendPrompt}`;
}
const BUILT_IN_TOOL_NAMES = new Set(["read", "bash", "edit", "write"]);
type AnyAgentTool = AgentTool;
@@ -775,28 +784,23 @@ export async function compactEmbeddedPiSession(params: {
params.config?.agent?.userTimezone,
);
const userTime = formatUserTime(new Date(), userTimezone);
const systemPrompt = buildSystemPrompt({
appendPrompt: buildAgentSystemPromptAppend({
workspaceDir: effectiveWorkspace,
defaultThinkLevel: params.thinkLevel,
extraSystemPrompt: params.extraSystemPrompt,
ownerNumbers: params.ownerNumbers,
reasoningTagHint,
heartbeatPrompt: resolveHeartbeatPrompt(
params.config?.agent?.heartbeat?.prompt,
),
runtimeInfo,
sandboxInfo,
toolNames: tools.map((tool) => tool.name),
modelAliasLines: buildModelAliasLines(params.config),
userTimezone,
userTime,
}),
contextFiles,
skills: promptSkills,
cwd: effectiveWorkspace,
tools,
const appendPrompt = buildAgentSystemPromptAppend({
workspaceDir: effectiveWorkspace,
defaultThinkLevel: params.thinkLevel,
extraSystemPrompt: params.extraSystemPrompt,
ownerNumbers: params.ownerNumbers,
reasoningTagHint,
heartbeatPrompt: resolveHeartbeatPrompt(
params.config?.agent?.heartbeat?.prompt,
),
runtimeInfo,
sandboxInfo,
toolNames: tools.map((tool) => tool.name),
modelAliasLines: buildModelAliasLines(params.config),
userTimezone,
userTime,
});
const systemPrompt = createSystemPromptAppender(appendPrompt);
// Pre-warm session file to bring it into OS page cache
await prewarmSessionFile(params.sessionFile);
@@ -1100,28 +1104,23 @@ export async function runEmbeddedPiAgent(params: {
params.config?.agent?.userTimezone,
);
const userTime = formatUserTime(new Date(), userTimezone);
const systemPrompt = buildSystemPrompt({
appendPrompt: buildAgentSystemPromptAppend({
workspaceDir: effectiveWorkspace,
defaultThinkLevel: thinkLevel,
extraSystemPrompt: params.extraSystemPrompt,
ownerNumbers: params.ownerNumbers,
reasoningTagHint,
heartbeatPrompt: resolveHeartbeatPrompt(
params.config?.agent?.heartbeat?.prompt,
),
runtimeInfo,
sandboxInfo,
toolNames: tools.map((tool) => tool.name),
modelAliasLines: buildModelAliasLines(params.config),
userTimezone,
userTime,
}),
contextFiles,
skills: promptSkills,
cwd: effectiveWorkspace,
tools,
const appendPrompt = buildAgentSystemPromptAppend({
workspaceDir: effectiveWorkspace,
defaultThinkLevel: thinkLevel,
extraSystemPrompt: params.extraSystemPrompt,
ownerNumbers: params.ownerNumbers,
reasoningTagHint,
heartbeatPrompt: resolveHeartbeatPrompt(
params.config?.agent?.heartbeat?.prompt,
),
runtimeInfo,
sandboxInfo,
toolNames: tools.map((tool) => tool.name),
modelAliasLines: buildModelAliasLines(params.config),
userTimezone,
userTime,
});
const systemPrompt = createSystemPromptAppender(appendPrompt);
// Pre-warm session file to bring it into OS page cache
await prewarmSessionFile(params.sessionFile);