Files
openclaw/extensions/openai/memory-embedding-adapter.test.ts
2026-04-27 11:25:40 +01:00

77 lines
2.2 KiB
TypeScript

import type { MemoryEmbeddingProvider } from "openclaw/plugin-sdk/memory-core-host-engine-embeddings";
import { beforeEach, describe, expect, it, vi } from "vitest";
const mocks = vi.hoisted(() => ({
createOpenAiEmbeddingProvider: vi.fn(),
runOpenAiEmbeddingBatches: vi.fn(async () => new Map([["0", [1, 0]]])),
}));
vi.mock("./embedding-provider.js", () => ({
DEFAULT_OPENAI_EMBEDDING_MODEL: "text-embedding-3-small",
createOpenAiEmbeddingProvider: mocks.createOpenAiEmbeddingProvider,
}));
vi.mock("./embedding-batch.js", () => ({
OPENAI_BATCH_ENDPOINT: "/v1/embeddings",
runOpenAiEmbeddingBatches: mocks.runOpenAiEmbeddingBatches,
}));
import { openAiMemoryEmbeddingProviderAdapter } from "./memory-embedding-adapter.js";
const provider: MemoryEmbeddingProvider = {
id: "openai",
model: "text-embedding-3-small",
embedQuery: async () => [1, 0],
embedBatch: async (texts) => texts.map(() => [1, 0]),
};
describe("OpenAI memory embedding adapter", () => {
beforeEach(() => {
mocks.createOpenAiEmbeddingProvider.mockReset();
mocks.runOpenAiEmbeddingBatches.mockClear();
mocks.createOpenAiEmbeddingProvider.mockResolvedValue({
provider,
client: {
baseUrl: "https://embeddings.example/v1",
headers: {},
model: "text-embedding-3-small",
inputType: "passage",
documentInputType: "document",
},
});
});
it("sends document input_type in OpenAI batch embedding requests", async () => {
const result = await openAiMemoryEmbeddingProviderAdapter.create({
config: {} as never,
provider: "openai",
model: "text-embedding-3-small",
fallback: "none",
});
await result.runtime?.batchEmbed?.({
agentId: "main",
chunks: [{ text: "doc one" }],
wait: true,
concurrency: 1,
pollIntervalMs: 1000,
timeoutMs: 60_000,
debug: () => {},
});
expect(mocks.runOpenAiEmbeddingBatches).toHaveBeenCalledWith(
expect.objectContaining({
requests: [
expect.objectContaining({
body: {
model: "text-embedding-3-small",
input: "doc one",
input_type: "document",
},
}),
],
}),
);
});
});