76 lines
2.7 KiB
TypeScript
76 lines
2.7 KiB
TypeScript
import { isOpenAIResponsesStoreEnabled } from "@/lib/providers/requestDefaults";
|
|
import {
|
|
DEFAULT_RESPONSES_PREVIOUS_RESPONSE_ID_MODE,
|
|
RESPONSES_PREVIOUS_RESPONSE_ID_MODES,
|
|
type ResponsesPreviousResponseIdMode,
|
|
} from "@/shared/constants/responsesPreviousResponseId";
|
|
import { FORMATS } from "../translator/formats.ts";
|
|
|
|
type JsonRecord = Record<string, unknown>;
|
|
|
|
type ApplyResponsesPreviousResponseIdPolicyOptions = {
|
|
mode: unknown;
|
|
sourceFormat?: unknown;
|
|
targetFormat?: unknown;
|
|
credentials?: unknown;
|
|
};
|
|
|
|
const MODE_SET = new Set<string>(RESPONSES_PREVIOUS_RESPONSE_ID_MODES);
|
|
|
|
function toRecord(value: unknown): JsonRecord {
|
|
return value && typeof value === "object" && !Array.isArray(value) ? (value as JsonRecord) : {};
|
|
}
|
|
|
|
export function normalizeResponsesPreviousResponseIdMode(
|
|
value: unknown
|
|
): ResponsesPreviousResponseIdMode {
|
|
if (typeof value === "string" && MODE_SET.has(value)) {
|
|
return value as ResponsesPreviousResponseIdMode;
|
|
}
|
|
return DEFAULT_RESPONSES_PREVIOUS_RESPONSE_ID_MODE;
|
|
}
|
|
|
|
export function shouldStripPreviousResponseId({
|
|
mode,
|
|
sourceFormat,
|
|
targetFormat,
|
|
credentials,
|
|
}: ApplyResponsesPreviousResponseIdPolicyOptions): boolean {
|
|
const normalizedMode = normalizeResponsesPreviousResponseIdMode(mode);
|
|
if (normalizedMode === "preserve") return false;
|
|
if (normalizedMode === "strip") return true;
|
|
|
|
const isResponsesSource = sourceFormat === FORMATS.OPENAI_RESPONSES;
|
|
const isResponsesTarget = targetFormat === FORMATS.OPENAI_RESPONSES;
|
|
if (!isResponsesSource && !isResponsesTarget) return false;
|
|
|
|
// `previous_response_id` is only safe when the upstream actually keeps
|
|
// Responses state. OmniRoute defaults to stateless upstream calls, so auto
|
|
// strips unless the connection explicitly opts into OpenAI Responses storage.
|
|
const providerSpecificData = toRecord(toRecord(credentials).providerSpecificData);
|
|
return !isOpenAIResponsesStoreEnabled(providerSpecificData);
|
|
}
|
|
|
|
export function applyResponsesPreviousResponseIdPolicy(
|
|
body: unknown,
|
|
options: ApplyResponsesPreviousResponseIdPolicyOptions
|
|
): { body: unknown; stripped: boolean; mode: ResponsesPreviousResponseIdMode } {
|
|
const mode = normalizeResponsesPreviousResponseIdMode(options.mode);
|
|
if (!body || typeof body !== "object" || Array.isArray(body)) {
|
|
return { body, stripped: false, mode };
|
|
}
|
|
|
|
const record = body as JsonRecord;
|
|
if (!Object.hasOwn(record, "previous_response_id")) {
|
|
return { body, stripped: false, mode };
|
|
}
|
|
|
|
if (!shouldStripPreviousResponseId({ ...options, mode })) {
|
|
return { body, stripped: false, mode };
|
|
}
|
|
|
|
const next = { ...record };
|
|
delete next.previous_response_id;
|
|
return { body: next, stripped: true, mode };
|
|
}
|