const GUIDANCE_OPEN = "";
const GUIDANCE_CLOSE = "";
const MAX_GUIDANCE_CHARS = 10_000;
export const KNOWN_GUIDANCE_APIS = [
"openai-completions",
"openai-responses",
"azure-openai-responses",
"openai-codex-responses",
"anthropic-messages",
"bedrock-converse-stream",
"google-generative-ai",
"google-vertex",
"mistral-conversations",
"pi-messages",
] as const;
export type KnownGuidanceApi = typeof KNOWN_GUIDANCE_APIS[number];
export type ProviderGuidanceFailureReason = "invalid_guidance" | "unsupported_api" | "known_api_shape_mismatch" | "conflicting_guidance";
export type ProviderGuidanceResult =
| { ok: true; payload: unknown; changed: boolean }
| { ok: false; reason: ProviderGuidanceFailureReason };
type RecordValue = Record;
function isRecord(value: unknown): value is RecordValue {
return !!value && typeof value === "object" && !Array.isArray(value);
}
function guidanceBlock(guidance: unknown): string | undefined {
if (typeof guidance !== "string") return undefined;
const value = guidance.trim();
if (!value || value.length > MAX_GUIDANCE_CHARS || value.includes(GUIDANCE_OPEN) || value.includes(GUIDANCE_CLOSE)) return undefined;
return `\n\n${GUIDANCE_OPEN}\n${value}\n${GUIDANCE_CLOSE}`;
}
function appendString(value: unknown, block: string): { ok: true; value: string; changed: boolean } | { ok: false; conflict: boolean } {
if (typeof value !== "string" || !value) return { ok: false, conflict: false };
if (value.includes(block)) return { ok: true, value, changed: false };
if (value.includes(GUIDANCE_OPEN) || value.includes(GUIDANCE_CLOSE)) return { ok: false, conflict: true };
return { ok: true, value: `${value}${block}`, changed: true };
}
function appendRoleArray(payload: RecordValue, key: "messages" | "input", block: string): ProviderGuidanceResult {
const rows = payload[key];
if (!Array.isArray(rows)) return { ok: false, reason: "known_api_shape_mismatch" };
const matches = rows
.map((row, index) => ({ row, index }))
.filter(({ row }) => isRecord(row) && (row.role === "system" || row.role === "developer") && typeof row.content === "string");
if (matches.length !== 1) return { ok: false, reason: "known_api_shape_mismatch" };
const { row, index } = matches[0] as { row: RecordValue; index: number };
const appended = appendString(row.content, block);
if (!appended.ok) return { ok: false, reason: appended.conflict ? "conflicting_guidance" : "known_api_shape_mismatch" };
if (!appended.changed) return { ok: true, payload, changed: false };
const nextRows = rows.slice();
nextRows[index] = { ...row, content: appended.value };
return { ok: true, payload: { ...payload, [key]: nextRows }, changed: true };
}
function structuredSystemAlreadyContains(system: unknown[], block: string): "same" | "conflict" | "absent" {
// Structured Anthropic/Bedrock system entries store the framing block without
// the leading separator used when appending to an existing string field.
for (const item of system) {
if (!isRecord(item) || typeof item.text !== "string") continue;
if (item.text.includes(block.trimStart())) return "same";
if (item.text.includes(GUIDANCE_OPEN) || item.text.includes(GUIDANCE_CLOSE)) return "conflict";
}
return "absent";
}
export function appendHabitGuidanceToProviderPayload(api: unknown, payload: unknown, guidance: unknown): ProviderGuidanceResult {
const block = guidanceBlock(guidance);
if (!block) return { ok: false, reason: "invalid_guidance" };
if (!KNOWN_GUIDANCE_APIS.includes(api as KnownGuidanceApi)) return { ok: false, reason: "unsupported_api" };
if (!isRecord(payload)) return { ok: false, reason: "known_api_shape_mismatch" };
switch (api as KnownGuidanceApi) {
case "openai-completions":
case "mistral-conversations":
return appendRoleArray(payload, "messages", block);
case "openai-responses":
case "azure-openai-responses":
return appendRoleArray(payload, "input", block);
case "openai-codex-responses": {
const appended = appendString(payload.instructions, block);
if (!appended.ok) return { ok: false, reason: appended.conflict ? "conflicting_guidance" : "known_api_shape_mismatch" };
return appended.changed ? { ok: true, payload: { ...payload, instructions: appended.value }, changed: true } : { ok: true, payload, changed: false };
}
case "anthropic-messages": {
if (!Array.isArray(payload.system)) return { ok: false, reason: "known_api_shape_mismatch" };
const existing = structuredSystemAlreadyContains(payload.system, block);
if (existing === "conflict") return { ok: false, reason: "conflicting_guidance" };
if (existing === "same") return { ok: true, payload, changed: false };
return { ok: true, payload: { ...payload, system: [...payload.system, { type: "text", text: block.trimStart() }] }, changed: true };
}
case "bedrock-converse-stream": {
if (!Array.isArray(payload.system)) return { ok: false, reason: "known_api_shape_mismatch" };
const existing = structuredSystemAlreadyContains(payload.system, block);
if (existing === "conflict") return { ok: false, reason: "conflicting_guidance" };
if (existing === "same") return { ok: true, payload, changed: false };
return { ok: true, payload: { ...payload, system: [...payload.system, { text: block.trimStart() }] }, changed: true };
}
case "google-generative-ai":
case "google-vertex": {
if (!isRecord(payload.config)) return { ok: false, reason: "known_api_shape_mismatch" };
const appended = appendString(payload.config.systemInstruction, block);
if (!appended.ok) return { ok: false, reason: appended.conflict ? "conflicting_guidance" : "known_api_shape_mismatch" };
return appended.changed
? { ok: true, payload: { ...payload, config: { ...payload.config, systemInstruction: appended.value } }, changed: true }
: { ok: true, payload, changed: false };
}
case "pi-messages": {
if (!isRecord(payload.context)) return { ok: false, reason: "known_api_shape_mismatch" };
const appended = appendString(payload.context.systemPrompt, block);
if (!appended.ok) return { ok: false, reason: appended.conflict ? "conflicting_guidance" : "known_api_shape_mismatch" };
return appended.changed
? { ok: true, payload: { ...payload, context: { ...payload.context, systemPrompt: appended.value } }, changed: true }
: { ok: true, payload, changed: false };
}
}
}