diff --git a/.changeset/tidy-waves-play.md b/.changeset/tidy-waves-play.md new file mode 100644 index 0000000000000000000000000000000000000000..e68ee871e4f194c1683a31fbe4a67b609e13d710 --- /dev/null +++ b/.changeset/tidy-waves-play.md @@ -0,0 +1,6 @@ +--- +"@llamaindex/community": patch +"@llamaindex/google": patch +--- + +feat: use google's new gen ai library to support multimodal output diff --git a/packages/community/src/llm/bedrock/amazon/utils.ts b/packages/community/src/llm/bedrock/amazon/utils.ts index 51833c6ed0458c535ee3c8965df782f120e89362..6fc35813c7b1c977564b8854307c57ac599a4061 100644 --- a/packages/community/src/llm/bedrock/amazon/utils.ts +++ b/packages/community/src/llm/bedrock/amazon/utils.ts @@ -10,12 +10,10 @@ import type { MessageContentDetail, ToolCallLLMMessageOptions, } from "@llamaindex/core/llms"; -import { - extractDataUrlComponents, - mapMessageContentToMessageContentDetails, -} from "../utils"; +import { extractDataUrlComponents } from "../utils"; import type { JSONObject } from "@llamaindex/core/global"; +import { mapMessageContentToMessageContentDetails } from "../../utils"; import type { AmazonMessage, AmazonMessages } from "./types"; const ACCEPTED_IMAGE_MIME_TYPES = [ diff --git a/packages/community/src/llm/bedrock/anthropic/utils.ts b/packages/community/src/llm/bedrock/anthropic/utils.ts index ac841e543c7a805dddf5bdb5f8e6fe9d3f7a1eb7..ba53dedea2d835559e1fa105c9eba8594a10eff3 100644 --- a/packages/community/src/llm/bedrock/anthropic/utils.ts +++ b/packages/community/src/llm/bedrock/anthropic/utils.ts @@ -6,10 +6,8 @@ import type { MessageContentDetail, ToolCallLLMMessageOptions, } from "@llamaindex/core/llms"; -import { - extractDataUrlComponents, - mapMessageContentToMessageContentDetails, -} from "../utils"; +import { mapMessageContentToMessageContentDetails } from "../../utils"; +import { extractDataUrlComponents } from "../utils"; import type { AnthropicContent, AnthropicImageContent, diff --git a/packages/community/src/llm/bedrock/index.ts b/packages/community/src/llm/bedrock/index.ts index 1e491247f797093a64cba8e4670de4a949a5a068..f282b443ce04c48f0c9e13aa14db66a4d4838057 100644 --- a/packages/community/src/llm/bedrock/index.ts +++ b/packages/community/src/llm/bedrock/index.ts @@ -22,9 +22,9 @@ import { type BedrockChatStreamResponse, Provider, } from "./provider"; -import { mapMessageContentToMessageContentDetails } from "./utils"; import { wrapLLMEvent } from "@llamaindex/core/decorator"; +import { mapMessageContentToMessageContentDetails } from "../utils"; import { AmazonProvider } from "./amazon/provider"; import { AnthropicProvider } from "./anthropic/provider"; import { MetaProvider } from "./meta/provider"; diff --git a/packages/community/src/llm/bedrock/utils.ts b/packages/community/src/llm/bedrock/utils.ts index 9e90c14dd85ccd8ee4cb21b68bf5bf94e1cc8779..b60bc8257eeb4bb15dc0cea0970e74a72bf6092d 100644 --- a/packages/community/src/llm/bedrock/utils.ts +++ b/packages/community/src/llm/bedrock/utils.ts @@ -1,14 +1,3 @@ -import type { - MessageContent, - MessageContentDetail, -} from "@llamaindex/core/llms"; - -export const mapMessageContentToMessageContentDetails = ( - content: MessageContent, -): MessageContentDetail[] => { - return Array.isArray(content) ? content : [{ type: "text", text: content }]; -}; - export const toUtf8 = (input: Uint8Array): string => new TextDecoder("utf-8").decode(input); diff --git a/packages/community/src/llm/utils.ts b/packages/community/src/llm/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..b375a32b3438610bbe5d20eda4fa3d3b3db1f9cf --- /dev/null +++ b/packages/community/src/llm/utils.ts @@ -0,0 +1,10 @@ +import type { + MessageContent, + MessageContentDetail, +} from "@llamaindex/core/llms"; + +export const mapMessageContentToMessageContentDetails = ( + content: MessageContent, +): MessageContentDetail[] => { + return Array.isArray(content) ? content : [{ type: "text", text: content }]; +}; diff --git a/packages/providers/google/package.json b/packages/providers/google/package.json index 664f2dfad5ca7eea9b07bdb2407d3349960e5266..b67f7936fefcfe995cc6ead7ee2a65eb11a435d4 100644 --- a/packages/providers/google/package.json +++ b/packages/providers/google/package.json @@ -34,6 +34,7 @@ }, "dependencies": { "@google-cloud/vertexai": "1.9.0", + "@google/genai": "^0.4.0", "@google/generative-ai": "0.21.0", "@llamaindex/core": "workspace:*", "@llamaindex/env": "workspace:*" diff --git a/packages/providers/google/src/base.ts b/packages/providers/google/src/base.ts index ea5eb40599307f5ec4cf3429cefde0799d39f261..2e074a69445401c157f81d8eda27bfd06af8e68d 100644 --- a/packages/providers/google/src/base.ts +++ b/packages/providers/google/src/base.ts @@ -63,7 +63,7 @@ export const GEMINI_MODEL_INFO_MAP: Record<GEMINI_MODEL, GeminiModelInfo> = { [GEMINI_MODEL.GEMINI_2_0_PRO_EXPERIMENTAL]: { contextWindow: 2 * 10 ** 6 }, }; -const SUPPORT_TOOL_CALL_MODELS: GEMINI_MODEL[] = [ +export const SUPPORT_TOOL_CALL_MODELS: GEMINI_MODEL[] = [ GEMINI_MODEL.GEMINI_PRO, GEMINI_MODEL.GEMINI_PRO_VISION, GEMINI_MODEL.GEMINI_PRO_1_5_PRO_PREVIEW, @@ -79,7 +79,7 @@ const SUPPORT_TOOL_CALL_MODELS: GEMINI_MODEL[] = [ GEMINI_MODEL.GEMINI_2_0_PRO_EXPERIMENTAL, ]; -const DEFAULT_GEMINI_PARAMS = { +export const DEFAULT_GEMINI_PARAMS = { model: GEMINI_MODEL.GEMINI_PRO, temperature: 0.1, topP: 1, diff --git a/packages/providers/google/src/index.ts b/packages/providers/google/src/index.ts index 64e1b16e1327a34c0e156d03e1bc7c65f031124c..202d496e497785e581dc7a311b8e6d40a4cd6789 100644 --- a/packages/providers/google/src/index.ts +++ b/packages/providers/google/src/index.ts @@ -3,4 +3,10 @@ export * from "./types"; export * from "./utils"; export * from "./vertex"; +export { + GoogleStudio, + Modality, + getGoogleStudioInlineData, +} from "./studio/index.js"; + export * from "./GeminiEmbedding"; diff --git a/packages/providers/google/src/studio/index.ts b/packages/providers/google/src/studio/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..b7f2301b8ca63996a9cb8452c91e2ee9b21d863c --- /dev/null +++ b/packages/providers/google/src/studio/index.ts @@ -0,0 +1,262 @@ +import { + GenerateContentResponse, + GoogleGenAI, + Modality, + type Blob, + type GenerateContentConfig, + type GoogleGenAIOptions, +} from "@google/genai"; +import { + ToolCallLLM, + type ChatResponse, + type ChatResponseChunk, + type CompletionResponse, + type LLMChatParamsNonStreaming, + type LLMChatParamsStreaming, + type LLMCompletionParamsNonStreaming, + type LLMCompletionParamsStreaming, + type LLMMetadata, + type ToolCall, + type ToolCallLLMMessageOptions, +} from "@llamaindex/core/llms"; +export { Modality }; + +import { streamConverter } from "@llamaindex/core/utils"; + +import { wrapLLMEvent } from "@llamaindex/core/decorator"; +import type { JSONObject } from "@llamaindex/core/global"; +import { DEFAULT_GEMINI_PARAMS, SUPPORT_TOOL_CALL_MODELS } from "../base"; +import type { GEMINI_MODEL } from "../types"; +import { + mapChatMessagesToGoogleFunctions, + mapChatMessagesToGoogleMessages, + mapMessageContentDetailToGooglePart, + mapMessageContentToMessageContentDetails, +} from "./utils"; + +export type GoogleAdditionalChatOptions = { config: GenerateContentConfig }; + +export type GoogleChatStreamResponse = AsyncIterable< + ChatResponseChunk< + ToolCallLLMMessageOptions & { + data?: Blob[]; + } + > +>; + +export type GoogleChatParamsStreaming = LLMChatParamsStreaming< + GoogleAdditionalChatOptions, + ToolCallLLMMessageOptions +>; + +export type GoogleChatParamsNonStreaming = LLMChatParamsNonStreaming< + GoogleAdditionalChatOptions, + ToolCallLLMMessageOptions +>; + +export type GoogleChatNonStreamResponse = + ChatResponse<ToolCallLLMMessageOptions>; + +export const getGoogleStudioInlineData = ( + response: GenerateContentResponse, +): Blob[] => { + return response.candidates + ?.flatMap((candidate) => candidate.content?.parts) + .map((part) => part?.inlineData) + .filter((data) => data) as Blob[]; +}; + +export type GoogleModelParams = { + model: GEMINI_MODEL; + temperature?: number; + topP?: number; + maxTokens?: number; +}; + +export type GoogleParams = GoogleGenAIOptions & GoogleModelParams; + +export class GoogleStudio extends ToolCallLLM<GoogleAdditionalChatOptions> { + client: GoogleGenAI; + model: GEMINI_MODEL; + temperature: number; + topP: number; + maxTokens?: number | undefined; + topK?: number; + + constructor({ + temperature, + topP, + maxTokens, + model, + ...params + }: GoogleParams) { + super(); + this.model = model; + this.maxTokens = maxTokens ?? DEFAULT_GEMINI_PARAMS.maxTokens; + this.temperature = temperature ?? DEFAULT_GEMINI_PARAMS.temperature; + this.topP = topP ?? DEFAULT_GEMINI_PARAMS.topP; + this.client = new GoogleGenAI(params); + } + + get supportToolCall(): boolean { + return SUPPORT_TOOL_CALL_MODELS.includes(this.model); + } + + get metadata(): LLMMetadata { + return { + model: this.model, + temperature: this.temperature, + topP: this.topP, + maxTokens: this.maxTokens, + contextWindow: 128000, + tokenizer: undefined, + structuredOutput: false, + }; + } + + getToolCallsFromResponse(response: GenerateContentResponse): ToolCall[] { + if (!response.functionCalls) return []; + return response.functionCalls.map((call) => ({ + id: call.id ?? "", + name: call.name ?? "", + input: call.args as JSONObject, + })); + } + + protected async nonStreamChat( + params: GoogleChatParamsNonStreaming, + ): Promise<GoogleChatNonStreamResponse> { + if (!this.supportToolCall && params.tools?.length) { + console.warn(`The model "${this.model}" doesn't support ToolCall`); + } + + const config: GenerateContentConfig = + params.additionalChatOptions?.config ?? {}; + if (params.tools?.length) { + if (config.responseModalities?.includes(Modality.IMAGE)) { + console.warn("Tools are currently not supported with Modality.IMAGE"); + } else { + config.tools = mapChatMessagesToGoogleFunctions(params.tools); + } + } + const response = await this.client.models.generateContent({ + model: this.model, + contents: mapChatMessagesToGoogleMessages(params.messages), + config, + }); + + if (this.supportToolCall) { + const tools = this.getToolCallsFromResponse(response); + if (tools.length) { + return { + raw: response, + message: { + role: "assistant", + content: "", + options: { toolCall: tools }, + }, + }; + } + } + return { + raw: response, + message: { + role: "assistant", + content: response.text ?? "", + options: { + inlineData: getGoogleStudioInlineData(response), + }, + }, + }; + } + + protected async *streamChat( + params: GoogleChatParamsStreaming, + ): GoogleChatStreamResponse { + if (!this.supportToolCall && params.tools?.length) { + console.warn(`The model "${this.model}" doesn't support ToolCall`); + } + const config: GenerateContentConfig = + params.additionalChatOptions?.config ?? {}; + if (params.tools?.length) { + if (config.responseModalities?.includes(Modality.IMAGE)) { + console.warn("Tools are currently not supported with Modality.IMAGE"); + } else { + config.tools = mapChatMessagesToGoogleFunctions(params.tools); + } + } + const response = await this.client.models.generateContentStream({ + model: this.model, + contents: mapChatMessagesToGoogleMessages(params.messages), + config, + }); + yield* streamConverter(response, (response) => { + if (response.functionCalls?.length) { + return { + delta: "", + raw: response, + options: { + toolCall: this.getToolCallsFromResponse(response), + }, + }; + } + + return { + delta: response.text ?? "", + raw: response, + options: { + inlineData: getGoogleStudioInlineData(response), + }, + }; + }); + } + + chat(params: GoogleChatParamsStreaming): Promise<GoogleChatStreamResponse>; + chat( + params: GoogleChatParamsNonStreaming, + ): Promise<GoogleChatNonStreamResponse>; + @wrapLLMEvent + async chat( + params: GoogleChatParamsStreaming | GoogleChatParamsNonStreaming, + ): Promise<GoogleChatStreamResponse | GoogleChatNonStreamResponse> { + if (params.stream) { + return this.streamChat(params); + } + return this.nonStreamChat(params); + } + + complete( + params: LLMCompletionParamsStreaming, + ): Promise<AsyncIterable<CompletionResponse>>; + complete( + params: LLMCompletionParamsNonStreaming, + ): Promise<CompletionResponse>; + async complete( + params: LLMCompletionParamsStreaming | LLMCompletionParamsNonStreaming, + ): Promise<CompletionResponse | AsyncIterable<CompletionResponse>> { + const contents = mapMessageContentToMessageContentDetails( + params.prompt, + ).map(mapMessageContentDetailToGooglePart); + if (params.stream) { + const response = await this.client.models.generateContentStream({ + model: this.model, + contents, + }); + return streamConverter(response, (response) => { + return { + text: response.text ?? "", + raw: response, + }; + }); + } + const response = await this.client.models.generateContent({ + model: this.model, + contents, + }); + + return { + text: response.text || "", + raw: response, + }; + } +} diff --git a/packages/providers/google/src/studio/utils.ts b/packages/providers/google/src/studio/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..924bdb7c3dd653f018be65157b10dedcb79e5203 --- /dev/null +++ b/packages/providers/google/src/studio/utils.ts @@ -0,0 +1,136 @@ +import type { + ContentListUnion, + ContentUnion, + Part, + Schema, + ToolListUnion, +} from "@google/genai"; +import type { + BaseTool, + ChatMessage, + MessageContentDetail, + ToolCallLLMMessageOptions, +} from "@llamaindex/core/llms"; +import { extractDataUrlComponents } from "@llamaindex/core/utils"; + +import type { MessageContent } from "@llamaindex/core/llms"; + +export const mapMessageContentToMessageContentDetails = ( + content: MessageContent, +): MessageContentDetail[] => { + return Array.isArray(content) ? content : [{ type: "text", text: content }]; +}; + +const ACCEPTED_IMAGE_MIME_TYPES = ["image/jpeg", "image/png"]; + +export const mapTextPart = (text: string): Part => { + return { text }; +}; + +export const mapImagePart = (imageUrl: string): Part => { + if (!imageUrl.startsWith("data:")) + throw new Error( + "For Google please only use base64 data url, e.g.: data:image/jpeg;base64,SGVsbG8sIFdvcmxkIQ==", + ); + const { mimeType, base64: data } = extractDataUrlComponents(imageUrl); + if (!ACCEPTED_IMAGE_MIME_TYPES.includes(mimeType)) + throw new Error( + `Anthropic only accepts the following mimeTypes: ${ACCEPTED_IMAGE_MIME_TYPES.join("\n")}`, + ); + + return { + inlineData: { + mimeType, + data, + }, + }; +}; + +export const mapMessageContentDetailToGooglePart = < + T extends MessageContentDetail, +>( + detail: T, +): Part => { + let part: Part; + + if (detail.type === "text") { + part = mapTextPart(detail.text); + } else if (detail.type === "image_url") { + part = mapImagePart(detail.image_url.url); + } else { + throw new Error("Unsupported content detail type"); + } + return part; +}; +export const mapChatMessagesToGoogleFunctions = ( + tools: BaseTool[], +): ToolListUnion => { + return [ + { + functionDeclarations: tools.map((tool) => ({ + response: tool.metadata.parameters as Schema, + description: tool.metadata.description, + name: tool.metadata.name, + })), + }, + ]; +}; + +export const mapChatMessagesToGoogleMessages = < + T extends ChatMessage<ToolCallLLMMessageOptions>, +>( + messages: T[], +): ContentListUnion => { + const functionNames: Record<string, string> = {}; + messages.forEach((msg: T) => { + if (msg.options && "toolCall" in msg.options) { + const mapped = msg.options.toolCall.reduce( + (result, item) => { + result[item.id] = item.name; + return result; + }, + {} as Record<string, string>, + ); + + Object.assign(functionNames, mapped); + } + }); + return messages.flatMap((msg: T): ContentListUnion => { + if (msg.options && "toolResult" in msg.options) { + return { + role: "user", + parts: [ + { + functionResponse: { + name: functionNames[msg.options.toolResult.id] ?? "", + response: msg.options.toolResult, + }, + }, + ], + }; + } + + if (msg.options && "toolCall" in msg.options) { + return { + role: "model", + parts: msg.options.toolCall.map((call) => ({ + functionCall: { + name: call.name, + args: call.input as Record<string, unknown>, + }, + })), + }; + } + return mapMessageContentToMessageContentDetails(msg.content) + .map((detail: MessageContentDetail): ContentUnion | null => { + const part = mapMessageContentDetailToGooglePart(detail); + if (!part.text) return null; + + return { + role: msg.role === "assistant" ? "model" : "user", + parts: [part], + }; + }) + .filter((content) => content) as ContentUnion; + }); +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8216154ad66468c94fddc1db653aa32932c66de..21278abca363df3ae26f25b5a209e4ef844c2c70 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -119,7 +119,7 @@ importers: version: 1.6.0(@aws-sdk/credential-provider-web-identity@3.744.0) ai: specifier: ^3.4.33 - version: 3.4.33(openai@4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2))(react@19.0.0)(sswr@2.1.0(svelte@5.19.10))(svelte@5.19.10)(vue@3.5.13(typescript@5.7.3))(zod@3.24.2) + version: 3.4.33(openai@4.86.0(zod@3.24.2))(react@19.0.0)(sswr@2.1.0(svelte@5.19.10))(svelte@5.19.10)(vue@3.5.13(typescript@5.7.3))(zod@3.24.2) class-variance-authority: specifier: ^0.7.0 version: 0.7.1 @@ -791,7 +791,7 @@ importers: version: 2.10.2(@types/react@19.0.10)(react@19.0.0) openai: specifier: ^4 - version: 4.83.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2) + version: 4.83.0(ws@8.18.0)(zod@3.24.2) typedoc: specifier: ^0.26.11 version: 0.26.11(typescript@5.7.3) @@ -843,7 +843,7 @@ importers: version: link:../../../llamaindex openai: specifier: ^4.73.1 - version: 4.83.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2) + version: 4.83.0(ws@8.18.0)(zod@3.24.2) devDependencies: tsx: specifier: ^4.19.3 @@ -1190,6 +1190,9 @@ importers: '@google-cloud/vertexai': specifier: 1.9.0 version: 1.9.0 + '@google/genai': + specifier: ^0.4.0 + version: 0.4.0(bufferutil@4.0.9) '@google/generative-ai': specifier: 0.21.0 version: 0.21.0 @@ -1328,7 +1331,7 @@ importers: version: link:../../env openai: specifier: ^4.86.0 - version: 4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2) + version: 4.86.0(ws@8.18.0)(zod@3.24.2) zod: specifier: ^3.24.2 version: 3.24.2 @@ -1451,7 +1454,7 @@ importers: version: link:../../../env chromadb: specifier: 1.10.3 - version: 1.10.3(cohere-ai@7.14.0)(openai@4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2))(voyageai@0.0.3-1) + version: 1.10.3(cohere-ai@7.14.0)(openai@4.86.0)(voyageai@0.0.3-1) chromadb-default-embed: specifier: ^2.13.2 version: 2.13.2 @@ -3252,6 +3255,10 @@ packages: resolution: {integrity: sha512-8brlcJwFXI4fPuBtsDNQqCdWZmz8gV9jeEKOU0vc5H2SjehCQpXK/NwuSEr916zbhlBHtg/sU37qQQdgvh5BRA==} engines: {node: '>=18.0.0'} + '@google/genai@0.4.0': + resolution: {integrity: sha512-u9KHoIDbnUi6GpH6mtkZjdeVy3FXI0Hfvl5QWZyYPBttXWaJ13Q4OXE+8zynbHvvGh4XUaH5fBvzsuNLQqB+qQ==} + engines: {node: '>=18.0.0'} + '@google/generative-ai@0.21.0': resolution: {integrity: sha512-7XhUbtnlkSEZK15kN3t+tzIMxsbKm/dSkKBFalj+20NvPKe1kBY7mR2P7vuijEn+f06z5+A8bVGKO0v39cr6Wg==} engines: {node: '>=18.0.0'} @@ -14049,6 +14056,16 @@ snapshots: - encoding - supports-color + '@google/genai@0.4.0(bufferutil@4.0.9)': + dependencies: + google-auth-library: 9.15.1 + ws: 8.18.0(bufferutil@4.0.9) + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + '@google/generative-ai@0.21.0': {} '@graphql-typed-document-node/core@3.2.0(graphql@16.10.0)': @@ -16650,10 +16667,10 @@ snapshots: '@types/node': 22.9.0 optional: true - '@typescript-eslint/eslint-plugin@8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3) '@typescript-eslint/scope-manager': 8.24.0 '@typescript-eslint/type-utils': 8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3) '@typescript-eslint/utils': 8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3) @@ -17192,7 +17209,7 @@ snapshots: dependencies: humanize-ms: 1.2.1 - ai@3.4.33(openai@4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2))(react@19.0.0)(sswr@2.1.0(svelte@5.19.10))(svelte@5.19.10)(vue@3.5.13(typescript@5.7.3))(zod@3.24.2): + ai@3.4.33(openai@4.86.0(zod@3.24.2))(react@19.0.0)(sswr@2.1.0(svelte@5.19.10))(svelte@5.19.10)(vue@3.5.13(typescript@5.7.3))(zod@3.24.2): dependencies: '@ai-sdk/provider': 0.0.26 '@ai-sdk/provider-utils': 1.0.22(zod@3.24.2) @@ -17208,7 +17225,7 @@ snapshots: secure-json-parse: 2.7.0 zod-to-json-schema: 3.24.1(zod@3.24.2) optionalDependencies: - openai: 4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2) + openai: 4.86.0(ws@8.18.0)(zod@3.24.2) react: 19.0.0 sswr: 2.1.0(svelte@5.19.10) svelte: 5.19.10 @@ -17802,13 +17819,13 @@ snapshots: transitivePeerDependencies: - bare-buffer - chromadb@1.10.3(cohere-ai@7.14.0)(openai@4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2))(voyageai@0.0.3-1): + chromadb@1.10.3(cohere-ai@7.14.0)(openai@4.86.0)(voyageai@0.0.3-1): dependencies: cliui: 8.0.1 isomorphic-fetch: 3.0.0 optionalDependencies: cohere-ai: 7.14.0 - openai: 4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2) + openai: 4.86.0(ws@8.18.0)(zod@3.24.2) voyageai: 0.0.3-1 transitivePeerDependencies: - encoding @@ -18571,12 +18588,12 @@ snapshots: dependencies: '@next/eslint-plugin-next': 15.1.0 '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.24.0(@typescript-eslint/parser@8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3) '@typescript-eslint/parser': 8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3) eslint: 9.16.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.22.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.22.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.2)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.16.0(jiti@2.4.2)) eslint-plugin-react: 7.37.2(eslint@9.16.0(jiti@2.4.2)) eslint-plugin-react-hooks: 5.1.0(eslint@9.16.0(jiti@2.4.2)) @@ -18596,7 +18613,7 @@ snapshots: eslint: 9.22.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.22.0(jiti@2.4.2)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.22.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.22.0(jiti@2.4.2)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.22.0(jiti@2.4.2)) eslint-plugin-react: 7.37.2(eslint@9.22.0(jiti@2.4.2)) eslint-plugin-react-hooks: 5.1.0(eslint@9.22.0(jiti@2.4.2)) @@ -18625,7 +18642,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.22.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)): + eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.0 @@ -18637,7 +18654,7 @@ snapshots: is-glob: 4.0.3 stable-hash: 0.0.4 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.22.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color @@ -18653,22 +18670,22 @@ snapshots: is-glob: 4.0.3 stable-hash: 0.0.4 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.22.0(jiti@2.4.2)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.22.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.22.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3) eslint: 9.16.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.22.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.22.0(jiti@2.4.2)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.22.0(jiti@2.4.2)))(eslint@9.22.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: @@ -18679,7 +18696,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.22.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.16.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -18690,7 +18707,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.16.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.22.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.16.0(jiti@2.4.2)))(eslint@9.16.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -18702,13 +18719,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.24.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.22.0(jiti@2.4.2)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.22.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -18719,7 +18736,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.22.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.22.0(jiti@2.4.2)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.0(eslint@9.22.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.22.0(jiti@2.4.2)))(eslint@9.22.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -22275,7 +22292,7 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - openai@4.83.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2): + openai@4.83.0(ws@8.18.0)(zod@3.24.2): dependencies: '@types/node': 18.19.75 '@types/node-fetch': 2.6.12 @@ -22290,7 +22307,7 @@ snapshots: transitivePeerDependencies: - encoding - openai@4.86.0(ws@8.18.0(bufferutil@4.0.9))(zod@3.24.2): + openai@4.86.0(ws@8.18.0)(zod@3.24.2): dependencies: '@types/node': 18.19.76 '@types/node-fetch': 2.6.12