diff --git a/src/services/code-index/__tests__/service-factory.spec.ts b/src/services/code-index/__tests__/service-factory.spec.ts index 1d8f7ba478..5ae12b4e57 100644 --- a/src/services/code-index/__tests__/service-factory.spec.ts +++ b/src/services/code-index/__tests__/service-factory.spec.ts @@ -566,7 +566,7 @@ describe("CodeIndexServiceFactory", () => { qdrantApiKey: "test-key", } mockConfigManager.getConfig.mockReturnValue(testConfig as any) - mockGetModelDimension.mockReturnValue(3072) + mockGetModelDimension.mockReturnValue(768) // Act factory.createVectorStore() @@ -576,7 +576,7 @@ describe("CodeIndexServiceFactory", () => { expect(MockedQdrantVectorStore).toHaveBeenCalledWith( "/test/workspace", "http://localhost:6333", - 3072, + 768, "test-key", ) }) @@ -590,7 +590,7 @@ describe("CodeIndexServiceFactory", () => { } mockConfigManager.getConfig.mockReturnValue(testConfig as any) mockGetDefaultModelId.mockReturnValue("gemini-embedding-001") - mockGetModelDimension.mockReturnValue(3072) + mockGetModelDimension.mockReturnValue(768) // Act factory.createVectorStore() @@ -601,7 +601,7 @@ describe("CodeIndexServiceFactory", () => { expect(MockedQdrantVectorStore).toHaveBeenCalledWith( "/test/workspace", "http://localhost:6333", - 3072, + 768, "test-key", ) }) diff --git a/src/services/code-index/embedders/gemini.ts b/src/services/code-index/embedders/gemini.ts index 7e795875c9..6f032863e4 100644 --- a/src/services/code-index/embedders/gemini.ts +++ b/src/services/code-index/embedders/gemini.ts @@ -11,7 +11,7 @@ import { TelemetryService } from "@roo-code/telemetry" * * Supported models: * - text-embedding-004 (dimension: 768) - * - gemini-embedding-001 (dimension: 2048) + * - gemini-embedding-001 (dimension: 3072) */ export class GeminiEmbedder implements IEmbedder { private readonly openAICompatibleEmbedder: OpenAICompatibleEmbedder diff --git a/src/services/code-index/embedders/openai-compatible.ts b/src/services/code-index/embedders/openai-compatible.ts index 06c4ba5282..9d20b2f179 100644 --- a/src/services/code-index/embedders/openai-compatible.ts +++ b/src/services/code-index/embedders/openai-compatible.ts @@ -278,8 +278,15 @@ export class OpenAICompatibleEmbedder implements IEmbedder { if (typeof item.embedding === "string") { const buffer = Buffer.from(item.embedding, "base64") - // Create Float32Array view over the buffer - const float32Array = new Float32Array(buffer.buffer, buffer.byteOffset, buffer.byteLength / 4) + // Safe approach: Create Float32Array from a properly aligned copy + // This avoids issues with Node.js Buffers that may be views into larger ArrayBuffers + const float32Array = new Float32Array(buffer.length / 4) + const dataView = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength) + + // Read floats with proper byte order handling (little-endian) + for (let i = 0; i < float32Array.length; i++) { + float32Array[i] = dataView.getFloat32(i * 4, true) + } return { ...item,