fix(embeddings): guard embed_batch count mismatch in OpenAI and Azure OpenAI (#5966)

This commit is contained in:
Bartok
2026-07-01 18:53:28 +05:30
committed by GitHub
parent bc05fd9623
commit 152d1e66f7
8 changed files with 102 additions and 0 deletions
+5
View File
@@ -52,6 +52,11 @@ export class AzureOpenAIEmbedder implements Embedder {
.map((item) => item.embedding),
);
}
if (allEmbeddings.length !== texts.length) {
throw new Error(
`Azure OpenAI embedBatch() returned ${allEmbeddings.length} embeddings for ${texts.length} texts using model '${this.model}'`,
);
}
return allEmbeddings;
}
}
+5
View File
@@ -47,6 +47,11 @@ export class OpenAIEmbedder implements Embedder {
.map((item) => item.embedding),
);
}
if (allEmbeddings.length !== texts.length) {
throw new Error(
`OpenAI embedBatch() returned ${allEmbeddings.length} embeddings for ${texts.length} texts using model '${this.model}'`,
);
}
return allEmbeddings;
}
}
@@ -134,6 +134,19 @@ describe("AzureOpenAIEmbedder (unit)", () => {
expect(result).toEqual(batch);
});
it("embedBatch() throws when provider returns fewer embeddings than texts", async () => {
// Provider returns only 1 embedding for 2 texts (short-batch response).
mockEmbeddingsCreate.mockResolvedValue({
data: [{ index: 0, embedding: mockEmbedding }],
});
const embedder = new AzureOpenAIEmbedder(baseConfig);
await expect(embedder.embedBatch(["text1", "text2"])).rejects.toThrow(
/returned 1 embeddings for 2 texts/,
);
});
it("uses custom model when provided", async () => {
const embedder = new AzureOpenAIEmbedder({
...baseConfig,
@@ -142,6 +142,21 @@ describe("OpenAIEmbedder (unit)", () => {
expect(result).toEqual(batch);
});
it("embedBatch() throws when provider returns fewer embeddings than texts", async () => {
// Provider returns only 1 embedding for 2 texts (short-batch response).
mockEmbeddingsCreate.mockResolvedValue({
data: [{ index: 0, embedding: mockEmbedding }],
});
const embedder = new OpenAIEmbedder({
apiKey: "test-key",
});
await expect(embedder.embedBatch(["text1", "text2"])).rejects.toThrow(
/returned 1 embeddings for 2 texts/,
);
});
it("uses custom model when provided", async () => {
const embedder = new OpenAIEmbedder({
apiKey: "test-key",