mirror of
https://github.com/karakeep-app/karakeep.git
synced 2026-10-30 13:15:12 +01:00
97 lines
2.8 KiB
TypeScript
97 lines
2.8 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
import { z } from "zod";
|
|
|
|
import { OpenAIInferenceClient } from "./inference";
|
|
import type { OpenAIInferenceConfig } from "./inference";
|
|
|
|
const capturedBodies: Record<string, unknown>[] = [];
|
|
const tagSchema = z.object({ tags: z.array(z.string()) });
|
|
|
|
vi.mock("openai", () => {
|
|
const OpenAIMock = vi.fn().mockImplementation(function () {
|
|
return {
|
|
chat: {
|
|
completions: {
|
|
create: vi.fn(async (body: Record<string, unknown>) => {
|
|
capturedBodies.push(body);
|
|
return {
|
|
choices: [{ message: { content: "{}" } }],
|
|
usage: { total_tokens: 1 },
|
|
};
|
|
}),
|
|
},
|
|
},
|
|
};
|
|
});
|
|
|
|
return { default: OpenAIMock };
|
|
});
|
|
|
|
vi.mock("openai/helpers/zod", () => ({
|
|
zodResponseFormat: (schema: unknown, name: string) => ({
|
|
type: "json_schema",
|
|
json_schema: { name, schema },
|
|
}),
|
|
}));
|
|
|
|
function makeConfig(
|
|
outputSchema: OpenAIInferenceConfig["outputSchema"],
|
|
): OpenAIInferenceConfig {
|
|
return {
|
|
apiKey: "test-key",
|
|
textModel: "test-text-model",
|
|
imageModel: "test-image-model",
|
|
contextLength: 2048,
|
|
maxOutputTokens: 1024,
|
|
useMaxCompletionTokens: false,
|
|
outputSchema,
|
|
};
|
|
}
|
|
|
|
describe("OpenAIInferenceClient response_format", () => {
|
|
beforeEach(() => {
|
|
capturedBodies.length = 0;
|
|
});
|
|
|
|
it("omits response_format for schema-less text inference in json mode", async () => {
|
|
const client = new OpenAIInferenceClient(makeConfig("json"));
|
|
|
|
await client.inferFromText("summarize this text", { schema: null });
|
|
|
|
expect(capturedBodies).toHaveLength(1);
|
|
expect(capturedBodies[0].response_format).toBeUndefined();
|
|
});
|
|
|
|
it("keeps json_object for schema-backed text inference in json mode", async () => {
|
|
const client = new OpenAIInferenceClient(makeConfig("json"));
|
|
|
|
await client.inferFromText("infer tags as json", { schema: tagSchema });
|
|
|
|
expect(capturedBodies).toHaveLength(1);
|
|
expect(capturedBodies[0].response_format).toEqual({ type: "json_object" });
|
|
});
|
|
|
|
it("omits response_format for schema-less image inference in json mode", async () => {
|
|
const client = new OpenAIInferenceClient(makeConfig("json"));
|
|
|
|
await client.inferFromImage("describe this image", "image/png", "BASE64", {
|
|
schema: null,
|
|
});
|
|
|
|
expect(capturedBodies).toHaveLength(1);
|
|
expect(capturedBodies[0].response_format).toBeUndefined();
|
|
});
|
|
|
|
it("keeps structured response_format for schema-backed text inference in structured mode", async () => {
|
|
const client = new OpenAIInferenceClient(makeConfig("structured"));
|
|
|
|
await client.inferFromText("infer tags", { schema: tagSchema });
|
|
|
|
expect(capturedBodies).toHaveLength(1);
|
|
expect(capturedBodies[0].response_format).toMatchObject({
|
|
type: "json_schema",
|
|
json_schema: { name: "schema" },
|
|
});
|
|
});
|
|
});
|