fix(ai): clamp OpenAI prompt cache keys

closes #4720
This commit is contained in:
Mario Zechner
2026-05-19 10:51:11 +02:00
parent 725e2b7b2a
commit 7be75baded
10 changed files with 128 additions and 5 deletions

View File

@@ -11,14 +11,20 @@ interface CapturedAzureClientOptions {
baseURL: string;
}
interface CapturedAzureResponsesPayload {
prompt_cache_key?: string;
}
const azureMock = vi.hoisted(() => ({
constructorCalls: [] as CapturedAzureClientOptions[],
lastParams: undefined as CapturedAzureResponsesPayload | undefined,
}));
vi.mock("openai", () => {
class AzureOpenAI {
responses = {
create: () => {
create: (params: CapturedAzureResponsesPayload) => {
azureMock.lastParams = params;
throw new Error("mock create");
},
};
@@ -42,6 +48,7 @@ const originalAzureOpenAIApiKey = process.env.AZURE_OPENAI_API_KEY;
beforeEach(() => {
azureMock.constructorCalls.length = 0;
azureMock.lastParams = undefined;
delete process.env.AZURE_OPENAI_BASE_URL;
delete process.env.AZURE_OPENAI_RESOURCE_NAME;
delete process.env.AZURE_OPENAI_API_VERSION;
@@ -126,6 +133,17 @@ describe("azure-openai-responses base URL normalization", () => {
expect(result.errorMessage).toContain("Invalid Azure OpenAI base URL");
});
it("clamps prompt_cache_key to OpenAI's 64-character limit", async () => {
const model = getModel("azure-openai-responses", "gpt-4o-mini");
await streamAzureOpenAIResponses(model, context, {
apiKey: "test-api-key",
azureBaseUrl: "https://my-resource.openai.azure.com",
sessionId: "x".repeat(67),
}).result();
expect(azureMock.lastParams?.prompt_cache_key).toBe("x".repeat(64));
});
it("builds correct default URL from AZURE_OPENAI_RESOURCE_NAME", async () => {
process.env.AZURE_OPENAI_RESOURCE_NAME = "my-resource";
const model = getModel("azure-openai-responses", "gpt-4o-mini");