feat: recipe-based system prompt management (#1293)

This commit is contained in:
Devansh Jain
2026-03-09 17:20:11 -07:00
committed by GitHub
parent c55a1fbd22
commit f148beee5d
8 changed files with 470 additions and 295 deletions

View File

@@ -12,7 +12,6 @@ import { getModelContextWindow } from "./available-models";
import { getClient, getServerUrl } from "./client";
import { getLettaCodeHeaders } from "./http-headers";
import { getDefaultMemoryBlocks } from "./memory";
import { type MemoryPromptMode, reconcileMemoryPrompt } from "./memoryPrompt";
import {
formatAvailableModels,
getDefaultModel,
@@ -20,7 +19,12 @@ import {
resolveModel,
} from "./model";
import { updateAgentLLMConfig } from "./modify";
import { resolveSystemPrompt } from "./promptAssets";
import {
isKnownPreset,
type MemoryPromptMode,
resolveAndBuildSystemPrompt,
swapMemoryAddon,
} from "./promptAssets";
import { SLEEPTIME_MEMORY_PERSONA } from "./prompts/sleeptime";
/**
@@ -351,21 +355,11 @@ export async function createAgent(
(modelUpdateArgs?.context_window as number | undefined) ??
(await getModelContextWindow(modelHandle));
// Resolve system prompt content:
// 1. If systemPromptCustom is provided, use it as-is
// 2. Otherwise, resolve systemPromptPreset to content
// 3. Reconcile to the selected managed memory mode
let systemPromptContent: string;
if (options.systemPromptCustom) {
systemPromptContent = options.systemPromptCustom;
} else {
systemPromptContent = await resolveSystemPrompt(options.systemPromptPreset);
}
systemPromptContent = reconcileMemoryPrompt(
systemPromptContent,
options.memoryPromptMode ?? "standard",
);
// Resolve system prompt content
const memMode: MemoryPromptMode = options.memoryPromptMode ?? "standard";
const systemPromptContent = options.systemPromptCustom
? swapMemoryAddon(options.systemPromptCustom, memMode)
: await resolveAndBuildSystemPrompt(options.systemPromptPreset, memMode);
// Create agent with inline memory blocks (LET-7101: single API call instead of N+1)
// - memory_blocks: new blocks to create inline
@@ -462,6 +456,20 @@ export async function createAgent(
}
}
// Persist system prompt preset — only for non-subagents and known presets or custom.
// Guarded by isReady since settings may not be initialized in direct/test callers.
if (!isSubagent && settingsManager.isReady) {
if (options.systemPromptCustom) {
settingsManager.setSystemPromptPreset(fullAgent.id, "custom");
} else if (isKnownPreset(options.systemPromptPreset ?? "default")) {
settingsManager.setSystemPromptPreset(
fullAgent.id,
options.systemPromptPreset ?? "default",
);
}
// Subagent names: don't persist (no reproducible recipe)
}
// Build provenance info
const provenance: AgentProvenance = {
isNew: true,