Skip to content

Commit f42fe82

Browse files
committed
refactor: Validate embeddings and improve Qdrant error logging
1 parent 57db387 commit f42fe82

2 files changed

Lines changed: 21 additions & 6 deletions

File tree

src/lib/ollama.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,15 @@ export async function generateEmbedding(text: string): Promise<number[]> {
114114

115115
// Ensure the embedding is an array of numbers and has the expected dimension
116116
if (!Array.isArray(res.data.embedding) || res.data.embedding.some(isNaN)) {
117-
throw new Error(`Ollama API returned an invalid embedding vector (not an array of numbers or contains NaN) for model ${model}. Length: ${res.data.embedding?.length}`);
117+
logger.error(`Ollama API returned an invalid embedding vector (not an array of numbers or contains NaN) for model ${model}. Length: ${res.data.embedding?.length}`);
118+
throw new Error(`Ollama API returned an invalid embedding vector (contains NaN or not an array of numbers) for model ${model}.`);
118119
}
119120
// ADD THIS CHECK:
120121
const expectedDimension = configService.EMBEDDING_DIMENSION;
122+
if (res.data.embedding.some(v => !isFinite(v))) {
123+
logger.error(`Ollama API returned an embedding vector with non-finite values (Infinity or -Infinity) for model ${model}.`);
124+
throw new Error(`Ollama API returned an embedding vector with non-finite values for model ${model}.`);
125+
}
121126
if (res.data.embedding.length !== expectedDimension) {
122127
logger.error(`Ollama API returned an embedding vector with unexpected dimension for model ${model}. Expected: ${expectedDimension}, Actual: ${res.data.embedding.length}.`);
123128
throw new Error(`Ollama API returned an embedding vector with unexpected dimension. Expected: ${expectedDimension}, Actual: ${res.data.embedding.length}`);

src/lib/qdrant.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,22 @@ export async function batchUpsertVectors(
111111
logger.debug(`Batch upserted ${batch.length} points (total processed: ${Math.min(i + batchSize, points.length)})`);
112112
} catch (error) {
113113
const err = error instanceof Error ? error : new Error(String(error));
114-
let detailedErrorMessage = err.message;
115-
if (axios.isAxiosError(error) && error.response) {
116-
detailedErrorMessage = `Status: ${error.response.status} - ${error.response.statusText}. Data: ${JSON.stringify(error.response.data)}`;
114+
let detailedErrorMessage = `Original error message: ${err.message}`;
115+
let errorDetailsPayload: Record<string, unknown> = {
116+
collectionName,
117+
batchStartIndex: i,
118+
batchSize
119+
};
120+
121+
// Attempt to extract more details if the error object has common fields from HTTP client errors
122+
if (typeof error === 'object' && error !== null) {
123+
if ('status' in error) errorDetailsPayload.qdrantErrorStatus = error.status;
124+
if ('data' in error) errorDetailsPayload.qdrantErrorData = error.data; // Common for some clients
125+
if ('response' in error && typeof (error as {response:unknown}).response === 'object' && (error as {response:object}).response !== null) {
126+
errorDetailsPayload.qdrantErrorResponse = (error as {response:object}).response; // If response is an object
127+
}
117128
}
118-
logger.error(`Failed to batch upsert points: ${detailedErrorMessage}`, { collectionName, batchStartIndex: i, batchSize });
119-
// Depending on requirements, you might want to re-throw or handle partial failures
129+
logger.error(`Failed to batch upsert points. ${detailedErrorMessage}`, errorDetailsPayload);
120130
throw new Error(`Failed to batch upsert points: ${detailedErrorMessage}`);
121131
}
122132
}

0 commit comments

Comments
 (0)