From a711d1b3ee59f59a8338689f563b3b15dccae016 Mon Sep 17 00:00:00 2001 From: Dhravya Date: Wed, 12 Jun 2024 19:52:09 -0500 Subject: [PATCH] added zod validation to embedQuery --- apps/cf-ai-backend/src/index.ts | 21 +++++----------- .../cf-ai-backend/src/utils/OpenAIEmbedder.ts | 24 ++++++++++++++----- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/apps/cf-ai-backend/src/index.ts b/apps/cf-ai-backend/src/index.ts index b79d86a6..2dbb2d0c 100644 --- a/apps/cf-ai-backend/src/index.ts +++ b/apps/cf-ai-backend/src/index.ts @@ -100,34 +100,25 @@ app.post( const query = c.req.valid("query"); const body = c.req.valid("json"); - if (body.chatHistory) { - body.chatHistory = body.chatHistory.map((i) => ({ - ...i, - content: i.parts - ? i.parts.length > 0 - ? i.parts.join(" ") - : i.content - : i.content, - })); - } - const sourcesOnly = query.sourcesOnly === "true"; - const spaces = query.spaces?.split(",") ?? [undefined]; - - console.log(spaces); + const spaces = query.spaces?.split(",") ?? [""]; // Get the AI model maker and vector store const { model, store } = await initQuery(c, query.model); const filter: VectorizeVectorMetadataFilter = { user: query.user }; + console.log("Spaces", spaces); // Converting the query to a vector so that we can search for similar vectors const queryAsVector = await store.embeddings.embedQuery(query.query); const responses: VectorizeMatches = { matches: [], count: 0 }; + console.log("hello world", spaces); + // SLICED to 5 to avoid too many queries for (const space of spaces.slice(0, 5)) { - if (space !== undefined) { + console.log("space", space); + if (space !== "") { // it's possible for space list to be [undefined] so we only add space filter conditionally filter.space = space; } diff --git a/apps/cf-ai-backend/src/utils/OpenAIEmbedder.ts b/apps/cf-ai-backend/src/utils/OpenAIEmbedder.ts index 3514f579..be5839b1 100644 --- a/apps/cf-ai-backend/src/utils/OpenAIEmbedder.ts +++ b/apps/cf-ai-backend/src/utils/OpenAIEmbedder.ts @@ -1,3 +1,5 @@ +import { z } from "zod"; + interface OpenAIEmbeddingsParams { apiKey: string; modelName: string; @@ -32,12 +34,22 @@ export class OpenAIEmbeddings { }), }); - const data = (await response.json()) as { - data: { - embedding: number[]; - }[]; - }; + const data = await response.json(); - return data.data[0].embedding; + const zodTypeExpected = z.object({ + data: z.array( + z.object({ + embedding: z.array(z.number()), + }), + ), + }); + + const json = zodTypeExpected.safeParse(data); + + if (!json.success) { + throw new Error("Invalid response from OpenAI: " + json.error.message); + } + + return json.data.data[0].embedding; } }