Repository: altair-graphql/altair
Pull request #2811: added support gor google gemini and improved prompt
Author: login: imolorhe
Created: 2025-04-19T19:18:26Z | Merged: 2025-04-19T23:45:31Z

### Fixes #
<!-- Mention the issues this PR addresses -->

### Checks

- [ ] Ran `yarn test-build`
- [ ] Updated relevant documentations
- [ ] Updated matching config options in altair-static

### Changes proposed in this pull request:
<!-- Describe the changes being introduced in this PR -->

## Summary by Sourcery

Add support for Google Gemini AI model and improve AI prompt generation in Altair GraphQL Client

New Features:
- Added support for Google Gemini AI model as a new AI provider
- Implemented a more comprehensive prompt generation strategy for AI interactions

Enhancements:
- Updated LangChain and related dependencies to latest versions
- Improved AI service configuration to support multiple AI providers
- Enhanced AI message handling to include GraphQL response in context

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **New Features**
  - Added support for Google AI model provider, allowing users to select Google as an AI provider.
  - Enhanced AI assistance with improved, context-aware prompt generation for GraphQL and Altair-related queries.

- **Improvements**
  - AI queries now include GraphQL response data for more informed and accurate assistance.
  - Updated and expanded support for latest AI model dependencies.

- **Bug Fixes**
  - Minor code style and import source adjustments for improved maintainability.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/packages/altair-api/package.json b/packages/altair-api/package.json
index 1b7eb0c1df..079ecefaa1 100644
--- a/packages/altair-api/package.json
+++ b/packages/altair-api/package.json
@@ -7,10 +7,12 @@
     "@altairgraphql/api-utils": "workspace:*",
     "@altairgraphql/db": "workspace:*",
     "@altairgraphql/emails": "workspace:*",
-    "@langchain/anthropic": "^0.3.7",
-    "@langchain/community": "^0.3.12",
-    "@langchain/core": "^0.3.22",
-    "@langchain/openai": "^0.3.12",
+    "@langchain/anthropic": "^0.3.18",
+    "@langchain/community": "^0.3.41",
+    "@langchain/core": "^0.3.45",
+    "@langchain/google-genai": "^0.2.4",
+    "@langchain/ollama": "^0.2.0",
+    "@langchain/openai": "^0.5.6",
     "@nestjs/common": "^10.4.16",
     "@nestjs/config": "^3.2.3",
     "@nestjs/core": "^10.3.10",
@@ -27,7 +29,7 @@
     "class-validator": "^0.14.0",
     "dedent": "^1.5.3",
     "google-auth-library": "^8.7.0",
-    "langchain": "^0.2.10",
+    "langchain": "^0.3.23",
     "nest-winston": "^1.9.7",
     "nestjs-prisma": "^0.19.0",
     "newrelic": "^12.14.0",
diff --git a/packages/altair-api/src/ai/ai.service.ts b/packages/altair-api/src/ai/ai.service.ts
index 0784ea97c8..011ceadda5 100644
--- a/packages/altair-api/src/ai/ai.service.ts
+++ b/packages/altair-api/src/ai/ai.service.ts
@@ -9,7 +9,6 @@ import { SendMessageDto } from './dto/send-message.dto';
 import { AiChatMessage, AiChatRating, AiChatRole } from '@altairgraphql/db';
 import { PrismaService } from 'nestjs-prisma';
 import { ChatOpenAI } from '@langchain/openai';
-import { ChatOllama } from '@langchain/community/chat_models/ollama';
 import { FakeListChatModel } from '@langchain/core/utils/testing';
 import {
   maxGraphqlQueryChars,
@@ -22,6 +21,9 @@ import { ConfigService } from '@nestjs/config';
 import { Config } from 'src/common/config';
 import dedent from 'dedent';
 import { getAgent } from 'src/newrelic/newrelic';
+import { ChatGoogleGenerativeAI } from '@langchain/google-genai';
+import { ChatOllama } from '@langchain/ollama';
+import { getPrompt } from './prompt';
 
 @Injectable()
 export class AiService {
@@ -271,7 +273,12 @@ export class AiService {
       new SystemMessage({
         content: [
           {
-            text: systemMessageParts.join('\n\n'),
+            text: getPrompt(
+              messageInput.sdl ?? '',
+              messageInput.graphqlQuery ?? '',
+              messageInput.graphqlVariables ?? '',
+              messageInput.graphqlResponse ?? ''
+            ),
             type: 'text',
             cache_control: { type: 'ephemeral' },
           },
@@ -332,6 +339,13 @@ export class AiService {
           ],
         });
       }
+      case 'google': {
+        return new ChatGoogleGenerativeAI({
+          apiKey: this.configService.get('ai.google.apiKey', { infer: true }),
+          model: this.configService.get('ai.google.model', { infer: true }) ?? '',
+          maxOutputTokens: responseMaxTokens,
+        });
+      }
       case 'anthropic':
       default: {
         return new ChatAnthropic({
diff --git a/packages/altair-api/src/ai/dto/send-message.dto.ts b/packages/altair-api/src/ai/dto/send-message.dto.ts
index 2fcafb7941..78f3bf02a7 100644
--- a/packages/altair-api/src/ai/dto/send-message.dto.ts
+++ b/packages/altair-api/src/ai/dto/send-message.dto.ts
@@ -32,4 +32,10 @@ export class SendMessageDto implements ISendMessageDto {
   @IsOptional()
   @MaxLength(maxGraphqlVariablesChars)
   graphqlVariables?: string;
+
+  @IsString()
+  @ApiProperty()
+  @IsOptional()
+  @MaxLength(maxMessageChars)
+  graphqlResponse?: string;
 }
diff --git a/packages/altair-api/src/ai/prompt.ts b/packages/altair-api/src/ai/prompt.ts
new file mode 100644
index 0000000000..57856d16d6
--- /dev/null
+++ b/packages/altair-api/src/ai/prompt.ts
@@ -0,0 +1,53 @@
+const SDL_PLACEHOLDER = '<%SDL%>';
+const QUERY_PLACEHOLDER = '<%QUERY%>';
+const VARIABLES_PLACEHOLDER = '<%VARIABLES%>';
+const RESPONSE_PLACEHOLDER = '<%RESPONSE%>';
+
+const prompt = `
+You are an expert in GraphQL and Altair GraphQL Client (https://altairgraphql.dev). Your task is to answer user questions related to these topics professionally and concisely. Follow these instructions carefully:
+- Review the following SDL (Schema Definition Language) provided on behalf of the user:
+<SDL>${SDL_PLACEHOLDER}</SDL>
+
+- Review the following GraphQL query provided on behalf of the user:
+<QUERY>${QUERY_PLACEHOLDER}</QUERY>
+
+- Review the following GraphQL variables (in JSON format) provided on behalf of the user:
+<VARIABLES>${VARIABLES_PLACEHOLDER}</VARIABLES>
+
+- Review the following GraphQL response (may be truncated) provided on behalf of the user:
+<RESPONSE>${RESPONSE_PLACEHOLDER}</RESPONSE>
+
+- When answering the user's question, follow these guidelines:
+* Read the user's question carefully to understand what they are asking. If the question is unclear, ask for clarification. If you don't know the answer, it's okay to say so.
+* Use the provided SDL, query, variables, and response to inform your answer.
+* If the user asks about a specific part of the SDL, query, variables, or response, refer to that part directly.
+* If the user asks for help with a specific GraphQL query or mutation, provide guidance on how to construct it based on the SDL.
+* If the user asks about a specific feature or functionality of Altair, provide information on how to use that feature effectively.
+* If the user asks for best practices or tips for using GraphQL or Altair, provide relevant advice based on your expertise.
+* If the user asks for troubleshooting help, use the provided SDL, query, variables, and response to diagnose the issue and suggest solutions.
+* Keep your answers as concise as possible while still providing enough detail to be helpful. Avoid unnecessary jargon or overly complex explanations.
+* When appropriate, provide examples to illustrate your points. This can help clarify complex concepts or demonstrate how to use Altair effectively.
+* Maintain a professional tone in all responses. Avoid slang or overly casual language.
+* Write your responses in markdown format.
+* Always wrap GraphQL queries in \`\`\`graphql\`\`\` code blocks.
+* If a SDL schema is provided, only generate GraphQL queries that are valid for the provided schema.
+
+Now, please answer the following user question:
+`.trim();
+
+// <%SDL%> should be replaced with the SDL schema
+// <%QUERY%> should be replaced with the GraphQL query
+// <%VARIABLES%> should be replaced with the GraphQL variables
+// <%RESPONSE%> should be replaced with the GraphQL response
+export const getPrompt = (
+  sdl: string,
+  query: string,
+  variables: string,
+  response: string
+) => {
+  return prompt
+    .replace(SDL_PLACEHOLDER, sdl)
+    .replace(QUERY_PLACEHOLDER, query)
+    .replace(VARIABLES_PLACEHOLDER, variables)
+    .replace(RESPONSE_PLACEHOLDER, response);
+};
diff --git a/packages/altair-api/src/common/config.ts b/packages/altair-api/src/common/config.ts
index b733d25404..225ad8a070 100644
--- a/packages/altair-api/src/common/config.ts
+++ b/packages/altair-api/src/common/config.ts
@@ -1,4 +1,4 @@
-export type AiModelProvider = 'anthropic' | 'openai' | 'ollama' | 'fake';
+export type AiModelProvider = 'anthropic' | 'openai' | 'google' | 'ollama' | 'fake';
 
 const config = {
   nest: {
@@ -37,6 +37,11 @@ const config = {
       // https://docs.anthropic.com/en/docs/about-claude/models#model-names
       model: process.env.ANTHROPIC_MODEL_NAME ?? 'claude-3-haiku-20240307',
     },
+    google: {
+      apiKey: process.env.GOOGLE_GEN_API_KEY,
+      // https://ai.google.dev/gemini-api/docs/models
+      model: process.env.GOOGLE_GEN_MODEL_NAME ?? 'gemini-2.5-flash-preview-04-17',
+    },
   },
   email: {
     resendApiKey: process.env.RESEND_API_KEY,
diff --git a/packages/altair-core/src/ai/types.ts b/packages/altair-core/src/ai/types.ts
index 9cf1be9b89..8d03e312d1 100644
--- a/packages/altair-core/src/ai/types.ts
+++ b/packages/altair-core/src/ai/types.ts
@@ -17,9 +17,9 @@ export interface ISendMessageDto {
   sdl?: string;
   graphqlQuery?: string;
   graphqlVariables?: string;
+  graphqlResponse?: string;
 }
 
 export interface IRateMessageDto {
   rating: number;
 }
-
diff --git a/packages/altair-core/src/plugin/v3/frame-engine.ts b/packages/altair-core/src/plugin/v3/frame-engine.ts
index 1b41c08c41..356451f241 100644
--- a/packages/altair-core/src/plugin/v3/frame-engine.ts
+++ b/packages/altair-core/src/plugin/v3/frame-engine.ts
@@ -1,4 +1,3 @@
-import { v4 as uuid } from 'uuid';
 import { PluginV3Context } from './context';
 import {
   PLUGIN_CREATE_ACTION_EVENT,
@@ -13,6 +12,7 @@ import { PluginWindowState } from '../context/context.interface';
 
 export class PluginFrameEngine {
   private readyPromise: Promise<void>;
+  // eslint-disable-next-line @typescript-eslint/ban-types
   private eventListeners: Record<string, Function[]> = {};
   private ctx?: PluginV3Context;
 
diff --git a/packages/altair-core/src/plugin/v3/panel.ts b/packages/altair-core/src/plugin/v3/panel.ts
index 9effde1c02..695221cb23 100644
--- a/packages/altair-core/src/plugin/v3/panel.ts
+++ b/packages/altair-core/src/plugin/v3/panel.ts
@@ -56,7 +56,7 @@ export abstract class AltairV3Panel {
   }
 
   private injectCSS(css: string) {
-    let el = document.createElement('style');
+    const el = document.createElement('style');
     el.innerText = css.replace(/[\n\r]/g, '');
     document.head.appendChild(el);
     return el;
diff --git a/packages/altair-core/src/plugin/v3/parent-worker.ts b/packages/altair-core/src/plugin/v3/parent-worker.ts
index f978ac8d43..29d5edc796 100644
--- a/packages/altair-core/src/plugin/v3/parent-worker.ts
+++ b/packages/altair-core/src/plugin/v3/parent-worker.ts
@@ -108,6 +108,7 @@ export class PluginParentWorker extends EvaluatorWorker {
         return;
       }
       if (e.data.frameId !== this.opts.id) {
+        // eslint-disable-next-line no-console
         console.error('Invalid frameId in data', e.data.frameId, this.opts.id);
         return;
       }
diff --git a/plugins/ai/src/panel.tsx b/plugins/ai/src/panel.tsx
index 4e346f83c0..521af18f16 100644
--- a/plugins/ai/src/panel.tsx
+++ b/plugins/ai/src/panel.tsx
@@ -77,10 +77,12 @@ const Panel = ({ context }: PanelProps) => {
       let graphqlQuery = '';
       let graphqlVariables = '';
       let sdl = '';
+      let response = '';
       if (windowState) {
         graphqlQuery = windowState.query;
         graphqlVariables = windowState.variables;
         sdl = windowState.sdl;
+        response = windowState.queryResults.join('\n');
       }
 
       // build message input
@@ -89,6 +91,7 @@ const Panel = ({ context }: PanelProps) => {
         graphqlQuery,
         graphqlVariables,
         sdl,
+        graphqlResponse: response,
       };
       return context.sendMessageToAiSession(activeSession.id, input);
     },
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b13f8018d7..4b22207fc9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -153,17 +153,23 @@ importers:
         specifier: workspace:*
         version: link:../transactional
       '@langchain/anthropic':
-        specifier: ^0.3.7
-        version: 0.3.7(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)
+        specifier: ^0.3.18
+        version: 0.3.18(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13)
       '@langchain/community':
-        specifier: ^0.3.12
-        version: 0.3.12(@ibm-cloud/watsonx-ai@1.3.0)(@langchain/anthropic@0.3.7(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13))(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.4)(encoding@0.1.13)(google-auth-library@8.7.0(encoding@0.1.13))(html-to-text@9.0.5)(ibm-cloud-sdk-core@5.1.0)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))
+        specifier: ^0.3.41
+        version: 0.3.41(qeylelmwbkmbwhozrvq2ndf2mi)
       '@langchain/core':
-        specifier: ^0.3.22
-        version: 0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
+        specifier: ^0.3.45
+        version: 0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
+      '@langchain/google-genai':
+        specifier: ^0.2.4
+        version: 0.2.4(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(zod@3.24.1)
+      '@langchain/ollama':
+        specifier: ^0.2.0
+        version: 0.2.0(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))
       '@langchain/openai':
-        specifier: ^0.3.12
-        version: 0.3.12(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)
+        specifier: ^0.5.6
+        version: 0.5.6(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))
       '@nestjs/common':
         specifier: ^10.4.16
         version: 10.4.17(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1)
@@ -213,8 +219,8 @@ importers:
         specifier: ^8.7.0
         version: 8.7.0(encoding@0.1.13)
       langchain:
-        specifier: ^0.2.10
-        version: 0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))
+        specifier: ^0.3.23
+        version: 0.3.23(@langchain/anthropic@0.3.18(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13))(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(@langchain/google-genai@0.2.4(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(zod@3.24.1))(@langchain/ollama@0.2.0(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))))(axios@1.7.4)(encoding@0.1.13)(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))
       nest-winston:
         specifier: ^1.9.7
         version: 1.9.7(@nestjs/common@10.4.17(class-transformer@0.5.1)(class-validator@0.14.0)(reflect-metadata@0.1.13)(rxjs@7.8.1))(winston@3.13.1)
@@ -2151,6 +2157,9 @@ packages:
   '@anthropic-ai/sdk@0.27.3':
     resolution: {integrity: sha512-IjLt0gd3L4jlOfilxVXTifn42FnVffMgDC04RJK1KDZpmkBWLv0XC92MVVmkxrFZNS/7l3xWgP/I3nqtX1sQHw==}
 
+  '@anthropic-ai/sdk@0.37.0':
+    resolution: {integrity: sha512-tHjX2YbkUBwEgg0JZU3EFSSAQPoK4qQR/NFYa8Vtzd5UAyXzZksCw2In69Rml4R/TyHPBfRYaLK35XiOe33pjw==}
+
   '@apollo/client@3.3.20':
     resolution: {integrity: sha512-hS7UmBwJweudw/J3M0RAcusMHNiRuGqkRH6g91PM2ev8cXScIMdXr/++9jo7wD1nAITMCMF4HQQ3LFaw/Or0Bw==}
     peerDependencies:
@@ -2888,12 +2897,27 @@ packages:
   '@briebug/jest-schematic@2.1.1':
     resolution: {integrity: sha512-AZMjSWvfk8NcCR3LuIKuLSN3zHJYnKmWMoFoLR6WATWfRR+WYNKlDLz/OUEKLu8gqSTY0eH0e2WxE3QEICNDJw==}
 
+  '@browserbasehq/sdk@2.5.0':
+    resolution: {integrity: sha512-bcnbYZvm5Ht1nrHUfWDK4crspiTy1ESJYMApsMiOTUnlKOan0ocRD6m7hZH34iSC2c2XWsoryR80cwsYgCBWzQ==}
+
+  '@browserbasehq/stagehand@1.14.0':
+    resolution: {integrity: sha512-Hi/EzgMFWz+FKyepxHTrqfTPjpsuBS4zRy3e9sbMpBgLPv+9c0R+YZEvS7Bw4mTS66QtvvURRT6zgDGFotthVQ==}
+    peerDependencies:
+      '@playwright/test': ^1.42.1
+      deepmerge: ^4.3.1
+      dotenv: ^16.4.5
+      openai: ^4.62.1
+      zod: ^3.23.8
+
   '@bundled-es-modules/cookie@2.0.0':
     resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==}
 
   '@bundled-es-modules/statuses@1.0.1':
     resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==}
 
+  '@cfworker/json-schema@4.1.1':
+    resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==}
+
   '@changesets/apply-release-plan@5.0.3':
     resolution: {integrity: sha512-V15OPq/GyaRB3FA0hEV0V21OhsxXcPAOUeXFF9VKKPl9XkB+nDndvUcqUfr06OeeXczP8+1aCB9N+bazbfa0TQ==}
 
@@ -3751,6 +3775,10 @@ packages:
   '@gar/promisify@1.1.2':
     resolution: {integrity: sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==}
 
+  '@google/generative-ai@0.24.0':
+    resolution: {integrity: sha512-fnEITCGEB7NdX0BhoYZ/cq/7WPZ1QS5IzJJfC3Tg/OwkvBetMiVJciyaan297OvE4B9Jg1xvo0zIazX/9sGu1Q==}
+    engines: {node: '>=18.0.0'}
+
   '@graphql-tools/batch-execute@8.5.1':
     resolution: {integrity: sha512-hRVDduX0UDEneVyEWtc2nu5H2PxpfSfM/riUlgZvo/a/nG475uyehxR5cFGvTEPEQUKY3vGIlqvtRigzqTfCew==}
     peerDependencies:
@@ -4161,30 +4189,32 @@ packages:
     resolution: {integrity: sha512-mNVu1nvkpSd8Q8gMebGbCkDWJ51ODetrFvLKYusej+V0ByD4btqHYnPIzTBLXnQMVUlm/oxVwqmWBY3zQfZilw==}
     engines: {node: '>= 18'}
 
-  '@langchain/anthropic@0.3.7':
-    resolution: {integrity: sha512-MjV7BNPalnG3S6PqXYHRtv3nEML1fFHl9OsqjT5KCPcULxJImnIZrJX5qMTnezM5A+Q6KOZt3e07x7aYCmU3Sg==}
+  '@langchain/anthropic@0.3.18':
+    resolution: {integrity: sha512-+2Pk9AFV4aBUOAqPT0VOaH6YbcVZ/xGoI6/dCW+W4svqcWwW7NExkAHdUAO9q+h2sUBbHs4j9bzLXlRQLvJ03A==}
     engines: {node: '>=18'}
     peerDependencies:
       '@langchain/core': '>=0.2.21 <0.4.0'
 
-  '@langchain/community@0.3.12':
-    resolution: {integrity: sha512-nGj/wyuARf/54JM0ey+MUP2nbuhe9fmdl+pZPCtescveDJL4b+2eaiaNMEYWDgpakSDTymh90wGTYgs9XLzIBg==}
+  '@langchain/community@0.3.41':
+    resolution: {integrity: sha512-i/DQ4bkKW+0W+zFy8ZrH7gRiag3KZuZU15pFXYom7wdZ8zcHJZZh2wi43hiBEWt8asx8Osyx4EhYO5SNp9ewkg==}
     engines: {node: '>=18'}
     peerDependencies:
       '@arcjet/redact': ^v1.0.0-alpha.23
       '@aws-crypto/sha256-js': ^5.0.0
-      '@aws-sdk/client-bedrock-agent-runtime': ^3.583.0
-      '@aws-sdk/client-bedrock-runtime': ^3.422.0
-      '@aws-sdk/client-dynamodb': ^3.310.0
-      '@aws-sdk/client-kendra': ^3.352.0
-      '@aws-sdk/client-lambda': ^3.310.0
-      '@aws-sdk/client-s3': ^3.310.0
-      '@aws-sdk/client-sagemaker-runtime': ^3.310.0
-      '@aws-sdk/client-sfn': ^3.310.0
+      '@aws-sdk/client-bedrock-agent-runtime': ^3.749.0
+      '@aws-sdk/client-bedrock-runtime': ^3.749.0
+      '@aws-sdk/client-dynamodb': ^3.749.0
+      '@aws-sdk/client-kendra': ^3.749.0
+      '@aws-sdk/client-lambda': ^3.749.0
+      '@aws-sdk/client-s3': ^3.749.0
+      '@aws-sdk/client-sagemaker-runtime': ^3.749.0
+      '@aws-sdk/client-sfn': ^3.749.0
       '@aws-sdk/credential-provider-node': ^3.388.0
+      '@aws-sdk/dsql-signer': '*'
       '@azure/search-documents': ^12.0.0
       '@azure/storage-blob': ^12.15.0
       '@browserbasehq/sdk': '*'
+      '@browserbasehq/stagehand': ^1.0.0
       '@clickhouse/client': ^0.2.5
       '@cloudflare/ai': '*'
       '@datastax/astra-db-ts': ^1.0.0
@@ -4198,7 +4228,9 @@ packages:
       '@google-cloud/storage': ^6.10.1 || ^7.7.0
       '@gradientai/nodejs-sdk': ^1.2.0
       '@huggingface/inference': ^2.6.4
+      '@huggingface/transformers': ^3.2.3
       '@ibm-cloud/watsonx-ai': '*'
+      '@lancedb/lancedb': ^0.12.0
       '@langchain/core': '>=0.2.21 <0.4.0'
       '@layerup/layerup-security': ^1.5.12
       '@libsql/client': ^0.14.0
@@ -4226,14 +4258,14 @@ packages:
       '@upstash/ratelimit': ^1.1.3 || ^2.0.3
       '@upstash/redis': ^1.20.6
       '@upstash/vector': ^1.1.1
-      '@vercel/kv': ^0.2.3
-      '@vercel/postgres': ^0.5.0
+      '@vercel/kv': '*'
+      '@vercel/postgres': '*'
       '@writerai/writer-sdk': ^0.40.2
       '@xata.io/client': ^0.28.0
-      '@xenova/transformers': ^2.17.2
       '@zilliz/milvus2-sdk-node': '>=2.3.5'
       apify-client: ^2.7.1
       assemblyai: ^4.6.0
+      azion: ^1.11.1
       better-sqlite3: '>=9.4.0 <12.0.0'
       cassandra-driver: ^4.7.2
       cborg: ^4.1.1
@@ -4250,7 +4282,7 @@ packages:
       dria: ^0.0.3
       duck-duck-scrape: ^2.2.5
       epub2: ^3.0.1
-      faiss-node: ^0.5.1
+      fast-xml-parser: '*'
       firebase-admin: ^11.9.0 || ^12.0.0
       google-auth-library: '*'
       googleapis: '*'
@@ -4267,11 +4299,14 @@ packages:
       lodash: ^4.17.21
       lunary: ^0.7.10
       mammoth: ^1.6.0
+      mariadb: ^3.4.0
+      mem0ai: ^2.1.8
       mongodb: '>=5.2.0'
       mysql2: ^3.9.8
       neo4j-driver: '*'
       notion-to-md: ^3.1.0
       officeparser: ^4.0.4
+      openai: '*'
       pdf-parse: 1.1.1
       pg: ^8.11.0
       pg-copy-streams: ^6.0.5
@@ -4281,19 +4316,18 @@ packages:
       puppeteer: '*'
       pyodide: '>=0.24.1 <0.27.0'
       redis: '*'
-      replicate: ^0.29.4
+      replicate: '*'
       sonix-speech-recognition: ^2.1.1
       srt-parser-2: ^1.2.3
       typeorm: ^0.3.20
       typesense: ^1.5.3
       usearch: ^1.1.1
-      vectordb: ^0.1.4
       voy-search: 0.6.2
       weaviate-ts-client: '*'
       web-auth-library: ^1.0.3
+      word-extractor: '*'
       ws: ^8.14.2
-      youtube-transcript: ^1.0.6
-      youtubei.js: ^9.1.0
+      youtubei.js: '*'
     peerDependenciesMeta:
       '@arcjet/redact':
         optional: true
@@ -4317,6 +4351,8 @@ packages:
         optional: true
       '@aws-sdk/credential-provider-node':
         optional: true
+      '@aws-sdk/dsql-signer':
+        optional: true
       '@azure/search-documents':
         optional: true
       '@azure/storage-blob':
@@ -4349,6 +4385,10 @@ packages:
         optional: true
       '@huggingface/inference':
         optional: true
+      '@huggingface/transformers':
+        optional: true
+      '@lancedb/lancedb':
+        optional: true
       '@layerup/layerup-security':
         optional: true
       '@libsql/client':
@@ -4409,14 +4449,14 @@ packages:
         optional: true
       '@xata.io/client':
         optional: true
-      '@xenova/transformers':
-        optional: true
       '@zilliz/milvus2-sdk-node':
         optional: true
       apify-client:
         optional: true
       assemblyai:
         optional: true
+      azion:
+        optional: true
       better-sqlite3:
         optional: true
       cassandra-driver:
@@ -4449,7 +4489,7 @@ packages:
         optional: true
       epub2:
         optional: true
-      faiss-node:
+      fast-xml-parser:
         optional: true
       firebase-admin:
         optional: true
@@ -4481,6 +4521,10 @@ packages:
         optional: true
       mammoth:
         optional: true
+      mariadb:
+        optional: true
+      mem0ai:
+        optional: true
       mongodb:
         optional: true
       mysql2:
@@ -4521,17 +4565,15 @@ packages:
         optional: true
       usearch:
         optional: true
-      vectordb:
-        optional: true
       voy-search:
         optional: true
       weaviate-ts-client:
         optional: true
       web-auth-library:
         optional: true
-      ws:
+      word-extractor:
         optional: true
-      youtube-transcript:
+      ws:
         optional: true
       youtubei.js:
         optional: true
@@ -4540,29 +4582,31 @@ packages:
     resolution: {integrity: sha512-mPmQi0ecJ81QwhvUQX4cwGVAqsM30ly3ygIlWoeUwDOXv9UW/IB2LAq8KKoVYIHTyEsIWJiyMP9Sv3e0xwjV8g==}
     engines: {node: '>=18'}
 
-  '@langchain/core@0.3.22':
-    resolution: {integrity: sha512-9rwEbxJi3Fgs8XuealNYxB6s0FCOnvXLnpiV5/oKgmEJtCRS91IqgJCWA8d59s4YkaEply/EsZVc2azNPK6Wjw==}
+  '@langchain/core@0.3.45':
+    resolution: {integrity: sha512-4icCMCeuauVvwH43zgCE6Hk2Zbke5OccfVhFpTiIJPo8WoU/ALdaZlS22S+6+qZ9lFzFHsgZ6K33Av9aWhxkQA==}
     engines: {node: '>=18'}
 
-  '@langchain/openai@0.2.2':
-    resolution: {integrity: sha512-1V7GZbRf8srdgfHV8C3W63BlYMf6/hsjTKh5ozZQaQDQ6bWMJwDjauvISvSVA+A0tqLAzf017C4+QVvy1kxjsw==}
+  '@langchain/google-genai@0.2.4':
+    resolution: {integrity: sha512-2w/QZMbSRpo6plKilqXXAmhdq5mB1gaDwOeN1tVpKBOwKtxsH9jOzxukKhs3QvXmfy/xod/WWLajBXxU+63/Dw==}
     engines: {node: '>=18'}
+    peerDependencies:
+      '@langchain/core': '>=0.3.17 <0.4.0'
 
-  '@langchain/openai@0.3.12':
-    resolution: {integrity: sha512-z8y0zdKovjY6bB0D3D+K99bPAN+wFRQcrWDfHfX7yVmYwq1O8GOIzQgCBth0vbhbzeuaJ4dz3+oqN/4Q2PCpHg==}
+  '@langchain/ollama@0.2.0':
+    resolution: {integrity: sha512-jLlYFqt+nbhaJKLakk7lRTWHZJ7wHeJLM6yuv4jToQ8zPzpL//372+MjggDoW0mnw8ofysg1T2C6mEJspKJtiA==}
     engines: {node: '>=18'}
     peerDependencies:
-      '@langchain/core': '>=0.2.26 <0.4.0'
+      '@langchain/core': '>=0.2.21 <0.4.0'
 
-  '@langchain/textsplitters@0.0.3':
-    resolution: {integrity: sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA==}
+  '@langchain/openai@0.5.6':
+    resolution: {integrity: sha512-zN0iyJthPNmcefIBVybZwcTBgcqu/ElJFov42ZntxEncK4heOMAE9lkq9LQ5CaPU/SgrduibrM1oL57+tLUtaA==}
     engines: {node: '>=18'}
+    peerDependencies:
+      '@langchain/core': '>=0.3.39 <0.4.0'
 
-  '@langchain/textsplitters@0.1.0':
-    resolution: {integrity: sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw==}
+  '@langchain/textsplitters@0.0.3':
+    resolution: {integrity: sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA==}
     engines: {node: '>=18'}
-    peerDependencies:
-      '@langchain/core': '>=0.2.21 <0.4.0'
 
   '@leichtgewicht/ip-codec@2.0.4':
     resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==}
@@ -6581,9 +6625,6 @@ packages:
   '@types/node@14.18.23':
     resolution: {integrity: sha512-MhbCWN18R4GhO8ewQWAFK4TGQdBpXWByukz7cWyJmXhvRuCIaM/oWytGPqVmDzgEnnaIc9ss6HbU5mUi+vyZPA==}
 
-  '@types/node@18.17.18':
-    resolution: {integrity: sha512-/4QOuy3ZpV7Ya1GTRz5CYSz3DgkKpyUptXuQ5PPce7uuyJAOR7r9FhkmxJfvcNUXyklbC63a+YvB3jxy7s9ngw==}
-
   '@types/node@18.19.68':
     resolution: {integrity: sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==}
 
@@ -9058,6 +9099,9 @@ packages:
   console-control-strings@1.1.0:
     resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
 
+  console-table-printer@2.12.1:
+    resolution: {integrity: sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ==}
+
   content-disposition@0.5.4:
     resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
     engines: {node: '>= 0.6'}
@@ -13587,175 +13631,23 @@ packages:
     resolution: {integrity: sha512-zYEr/gh7uLW2l4su11bmQ2M9xLgQLjyvx58UyNM/6nuqyWFHPX5ktMjvpev3F8QWdjSsHUpnWew4PBCswBNuMQ==}
     engines: {node: '>=18'}
 
-  langchain@0.2.10:
-    resolution: {integrity: sha512-i0fC+RlX/6w6HKPWL3N5zrhrkijvpe2Xu4t/qbWzq4uFf8WBfPwmNFom3RtO2RatuPnHLm8mViU6nw8YBDiVwA==}
-    engines: {node: '>=18'}
-    peerDependencies:
-      '@aws-sdk/client-s3': ^3.310.0
-      '@aws-sdk/client-sagemaker-runtime': ^3.310.0
-      '@aws-sdk/client-sfn': ^3.310.0
-      '@aws-sdk/credential-provider-node': ^3.388.0
-      '@azure/storage-blob': ^12.15.0
-      '@browserbasehq/sdk': '*'
-      '@gomomento/sdk': ^1.51.1
-      '@gomomento/sdk-core': ^1.51.1
-      '@gomomento/sdk-web': ^1.51.1
-      '@mendable/firecrawl-js': ^0.0.13
-      '@notionhq/client': ^2.2.10
-      '@pinecone-database/pinecone': '*'
-      '@supabase/supabase-js': ^2.10.0
-      '@vercel/kv': ^0.2.3
-      '@xata.io/client': ^0.28.0
-      apify-client: ^2.7.1
-      assemblyai: ^4.0.0
-      axios: '*'
-      cheerio: ^1.0.0-rc.12
-      chromadb: '*'
-      convex: ^1.3.1
-      couchbase: ^4.3.0
-      d3-dsv: ^2.0.0
-      epub2: ^3.0.1
-      faiss-node: '*'
-      fast-xml-parser: '*'
-      handlebars: ^4.7.8
-      html-to-text: ^9.0.5
-      ignore: ^5.2.0
-      ioredis: ^5.3.2
-      jsdom: '*'
-      mammoth: ^1.6.0
-      mongodb: '>=5.2.0'
-      node-llama-cpp: '*'
-      notion-to-md: ^3.1.0
-      officeparser: ^4.0.4
-      pdf-parse: 1.1.1
-      peggy: ^3.0.2
-      playwright: ^1.32.1
-      puppeteer: ^19.7.2
-      pyodide: ^0.24.1
-      redis: ^4.6.4
-      sonix-speech-recognition: ^2.1.1
-      srt-parser-2: ^1.2.3
-      typeorm: ^0.3.20
-      weaviate-ts-client: '*'
-      web-auth-library: ^1.0.3
-      ws: ^8.14.2
-      youtube-transcript: ^1.0.6
-      youtubei.js: ^9.1.0
-    peerDependenciesMeta:
-      '@aws-sdk/client-s3':
-        optional: true
-      '@aws-sdk/client-sagemaker-runtime':
-        optional: true
-      '@aws-sdk/client-sfn':
-        optional: true
-      '@aws-sdk/credential-provider-node':
-        optional: true
-      '@azure/storage-blob':
-        optional: true
-      '@browserbasehq/sdk':
-        optional: true
-      '@gomomento/sdk':
-        optional: true
-      '@gomomento/sdk-core':
-        optional: true
-      '@gomomento/sdk-web':
-        optional: true
-      '@mendable/firecrawl-js':
-        optional: true
-      '@notionhq/client':
-        optional: true
-      '@pinecone-database/pinecone':
-        optional: true
-      '@supabase/supabase-js':
-        optional: true
-      '@vercel/kv':
-        optional: true
-      '@xata.io/client':
-        optional: true
-      apify-client:
-        optional: true
-      assemblyai:
-        optional: true
-      axios:
-        optional: true
-      cheerio:
-        optional: true
-      chromadb:
-        optional: true
-      convex:
-        optional: true
-      couchbase:
-        optional: true
-      d3-dsv:
-        optional: true
-      epub2:
-        optional: true
-      faiss-node:
-        optional: true
-      fast-xml-parser:
-        optional: true
-      handlebars:
-        optional: true
-      html-to-text:
-        optional: true
-      ignore:
-        optional: true
-      ioredis:
-        optional: true
-      jsdom:
-        optional: true
-      mammoth:
-        optional: true
-      mongodb:
-        optional: true
-      node-llama-cpp:
-        optional: true
-      notion-to-md:
-        optional: true
-      officeparser:
-        optional: true
-      pdf-parse:
-        optional: true
-      peggy:
-        optional: true
-      playwright:
-        optional: true
-      puppeteer:
-        optional: true
-      pyodide:
-        optional: true
-      redis:
-        optional: true
-      sonix-speech-recognition:
-        optional: true
-      srt-parser-2:
-        optional: true
-      typeorm:
-        optional: true
-      weaviate-ts-client:
-        optional: true
-      web-auth-library:
-        optional: true
-      ws:
-        optional: true
-      youtube-transcript:
-        optional: true
-      youtubei.js:
-        optional: true
-
-  langchain@0.3.5:
-    resolution: {integrity: sha512-Gq0xC45Sq6nszS8kQG9suCrmBsuXH0INMmiF7D2TwPb6mtG35Jiq4grCk9ykpwPsarTHdty3SzUbII/FqiYSSw==}
+  langchain@0.3.23:
+    resolution: {integrity: sha512-o297nfr78Dm1LxkivJ3ULZoHHC/e5e9ruX1kyIIKUlw1O3lyb8nXCnGKWh96zJRD+BpN0akRRKiJruRYYWTkdw==}
     engines: {node: '>=18'}
     peerDependencies:
       '@langchain/anthropic': '*'
       '@langchain/aws': '*'
+      '@langchain/cerebras': '*'
       '@langchain/cohere': '*'
       '@langchain/core': '>=0.2.21 <0.4.0'
+      '@langchain/deepseek': '*'
       '@langchain/google-genai': '*'
       '@langchain/google-vertexai': '*'
+      '@langchain/google-vertexai-web': '*'
       '@langchain/groq': '*'
       '@langchain/mistralai': '*'
       '@langchain/ollama': '*'
+      '@langchain/xai': '*'
       axios: '*'
       cheerio: '*'
       handlebars: ^4.7.8
@@ -13766,18 +13658,26 @@ packages:
         optional: true
       '@langchain/aws':
         optional: true
+      '@langchain/cerebras':
+        optional: true
       '@langchain/cohere':
         optional: true
+      '@langchain/deepseek':
+        optional: true
       '@langchain/google-genai':
         optional: true
       '@langchain/google-vertexai':
         optional: true
+      '@langchain/google-vertexai-web':
+        optional: true
       '@langchain/groq':
         optional: true
       '@langchain/mistralai':
         optional: true
       '@langchain/ollama':
         optional: true
+      '@langchain/xai':
+        optional: true
       axios:
         optional: true
       cheerio:
@@ -13789,9 +13689,6 @@ packages:
       typeorm:
         optional: true
 
-  langchainhub@0.0.11:
-    resolution: {integrity: sha512-WnKI4g9kU2bHQP136orXr2bcRdgz9iiTBpTN0jWt9IlScUKnJBoD0aa2HOzHURQKeQDnt2JwqVmQ6Depf5uDLQ==}
-
   langsmith@0.1.37:
     resolution: {integrity: sha512-8JgWykdJywdKWs+WeefOEf4Gkz3YdNkvG5u5JPbgXuodTUwuHPwjmblsldt1OGKkPp7iCWfdtCdnc9z9MYC/Dw==}
     peerDependencies:
@@ -13806,16 +13703,8 @@ packages:
       openai:
         optional: true
 
-  langsmith@0.2.11:
-    resolution: {integrity: sha512-rVPUN/jQEHjTuYaoVKGjfb3NsYNLGTQT9LXcgJvka5M0EDcXciC598A+DsAQrl6McdfSJCFJDelgRPqVoF2xNA==}
-    peerDependencies:
-      openai: '*'
-    peerDependenciesMeta:
-      openai:
-        optional: true
-
-  langsmith@0.2.5:
-    resolution: {integrity: sha512-dA+l7ZEh1Q9Q9FcE39PUSSEMfsFo73R2V81fRo5KSlGNcypOEhoQvv6lbjyZP7MHmt3/9pPcfpuRd5Y4RbFYqQ==}
+  langsmith@0.3.19:
+    resolution: {integrity: sha512-NLH1WaGLALiA35TyrGuvO+Yavv1pL7bekPpG5ab7E6h5olbxp/nVmqb5WD6BoK90uM2FpX72EFQ+aQ2cn1LKoQ==}
     peerDependencies:
       openai: '*'
     peerDependenciesMeta:
@@ -15148,6 +15037,7 @@ packages:
   node-domexception@1.0.0:
     resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
     engines: {node: '>=10.5.0'}
+    deprecated: Use your platform's native DOMException instead
 
   node-emoji@1.11.0:
     resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==}
@@ -15402,6 +15292,9 @@ packages:
   obuf@1.1.2:
     resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
 
+  ollama@0.5.15:
+    resolution: {integrity: sha512-TSaZSJyP7MQJFjSmmNsoJiriwa3U+/UJRw6+M8aucs5dTsaWNZsBIGpDb5rXnW6nXxJBB/z79gZY8IaiIQgelQ==}
+
   on-exit-leak-free@0.2.0:
     resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==}
 
@@ -15461,12 +15354,15 @@ packages:
     resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==}
     engines: {node: '>=14.16'}
 
-  openai@4.71.1:
-    resolution: {integrity: sha512-C6JNMaQ1eijM0lrjiRUL3MgThVP5RdwNAghpbJFdW0t11LzmyqON8Eh8MuUuEZ+CeD6bgYl2Fkn2BoptVxv9Ug==}
+  openai@4.95.1:
+    resolution: {integrity: sha512-IqJy+ymeW+k/Wq+2YVN3693OQMMcODRtHEYOlz263MdUwnN/Dwdl9c2EXSxLLtGEHkSHAfvzpDMHI5MaWJKXjQ==}
     hasBin: true
     peerDependencies:
+      ws: ^8.18.0
       zod: ^3.23.8
     peerDependenciesMeta:
+      ws:
+        optional: true
       zod:
         optional: true
 
@@ -17510,6 +17406,9 @@ packages:
     resolution: {integrity: sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==}
     engines: {node: '>=8.10.0'}
 
+  simple-wcswidth@1.0.1:
+    resolution: {integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==}
+
   single-user-cache@0.6.0:
     resolution: {integrity: sha512-uMrANoiybpbsrVDbZ2M7GPzxeqZiirwkVnsDAre1zGhXAAw+2dImTxu7h0l1sIVtwGeJnVsRxgG4I5rZrUX0rw==}
 
@@ -19027,6 +18926,10 @@ packages:
     resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
     hasBin: true
 
+  uuid@11.1.0:
+    resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
+    hasBin: true
+
   uuid@3.3.3:
     resolution: {integrity: sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==}
     deprecated: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
@@ -19456,6 +19359,9 @@ packages:
     resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
     engines: {node: '>=12'}
 
+  whatwg-fetch@3.6.20:
+    resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
+
   whatwg-mimetype@3.0.0:
     resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
     engines: {node: '>=12'}
@@ -19714,11 +19620,6 @@ packages:
     resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
     engines: {node: '>= 6'}
 
-  yaml@2.4.5:
-    resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==}
-    engines: {node: '>= 14'}
-    hasBin: true
-
   yaml@2.7.0:
     resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
     engines: {node: '>= 14'}
@@ -19814,12 +19715,14 @@ packages:
     peerDependencies:
       zod: ^3.23.3
 
+  zod-to-json-schema@3.24.5:
+    resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==}
+    peerDependencies:
+      zod: ^3.24.1
+
   zod@3.20.6:
     resolution: {integrity: sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA==}
 
-  zod@3.23.8:
-    resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==}
-
   zod@3.24.1:
     resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==}
 
@@ -20204,7 +20107,7 @@ snapshots:
   '@angular/animations@17.0.8(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))':
     dependencies:
       '@angular/core': 18.2.13(rxjs@7.8.1)(zone.js@0.14.10)
-      tslib: 2.6.3
+      tslib: 2.8.1
     optional: true
 
   '@angular/animations@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))':
@@ -20393,7 +20296,19 @@ snapshots:
 
   '@anthropic-ai/sdk@0.27.3(encoding@0.1.13)':
     dependencies:
-      '@types/node': 18.17.18
+      '@types/node': 18.19.68
+      '@types/node-fetch': 2.6.11
+      abort-controller: 3.0.0
+      agentkeepalive: 4.5.0
+      form-data-encoder: 1.7.2
+      formdata-node: 4.4.1
+      node-fetch: 2.7.0(encoding@0.1.13)
+    transitivePeerDependencies:
+      - encoding
+
+  '@anthropic-ai/sdk@0.37.0(encoding@0.1.13)':
+    dependencies:
+      '@types/node': 18.19.68
       '@types/node-fetch': 2.6.11
       abort-controller: 3.0.0
       agentkeepalive: 4.5.0
@@ -21381,6 +21296,34 @@ snapshots:
       '@schematics/angular': 8.3.29
       rxjs: 6.4.0
 
+  '@browserbasehq/sdk@2.5.0(encoding@0.1.13)':
+    dependencies:
+      '@types/node': 18.19.68
+      '@types/node-fetch': 2.6.11
+      abort-controller: 3.0.0
+      agentkeepalive: 4.5.0
+      form-data-encoder: 1.7.2
+      formdata-node: 4.4.1
+      node-fetch: 2.7.0(encoding@0.1.13)
+    transitivePeerDependencies:
+      - encoding
+
+  '@browserbasehq/stagehand@1.14.0(@playwright/test@1.31.2)(bufferutil@4.0.6)(deepmerge@4.3.1)(dotenv@16.4.7)(encoding@0.1.13)(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))(utf-8-validate@5.0.9)(zod@3.24.1)':
+    dependencies:
+      '@anthropic-ai/sdk': 0.27.3(encoding@0.1.13)
+      '@browserbasehq/sdk': 2.5.0(encoding@0.1.13)
+      '@playwright/test': 1.31.2
+      deepmerge: 4.3.1
+      dotenv: 16.4.7
+      openai: 4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)
+      ws: 8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)
+      zod: 3.24.1
+      zod-to-json-schema: 3.24.5(zod@3.24.1)
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - utf-8-validate
+
   '@bundled-es-modules/cookie@2.0.0':
     dependencies:
       cookie: 0.5.0
@@ -21389,6 +21332,8 @@ snapshots:
     dependencies:
       statuses: 2.0.1
 
+  '@cfworker/json-schema@4.1.1': {}
+
   '@changesets/apply-release-plan@5.0.3':
     dependencies:
       '@babel/runtime': 7.25.0
@@ -21677,8 +21622,8 @@ snapshots:
       micromatch: 4.0.8
       ts-pattern: 4.3.0
       unified: 10.1.2
-      yaml: 2.4.5
-      zod: 3.23.8
+      yaml: 2.7.0
+      zod: 3.24.1
     transitivePeerDependencies:
       - '@effect-ts/otel-node'
       - esbuild
@@ -22367,6 +22312,8 @@ snapshots:
 
   '@gar/promisify@1.1.2': {}
 
+  '@google/generative-ai@0.24.0': {}
+
   '@graphql-tools/batch-execute@8.5.1(graphql@15.5.1)':
     dependencies:
       '@graphql-tools/utils': 8.9.0(graphql@15.5.1)
@@ -23154,32 +23101,36 @@ snapshots:
       koa-compose: 4.1.0
       path-to-regexp: 6.3.0
 
-  '@langchain/anthropic@0.3.7(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)':
+  '@langchain/anthropic@0.3.18(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13)':
     dependencies:
-      '@anthropic-ai/sdk': 0.27.3(encoding@0.1.13)
-      '@langchain/core': 0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
+      '@anthropic-ai/sdk': 0.37.0(encoding@0.1.13)
+      '@langchain/core': 0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
       fast-xml-parser: 4.5.0
-      zod: 3.23.8
-      zod-to-json-schema: 3.23.1(zod@3.23.8)
+      zod: 3.24.1
+      zod-to-json-schema: 3.23.1(zod@3.24.1)
     transitivePeerDependencies:
       - encoding
 
-  '@langchain/community@0.3.12(@ibm-cloud/watsonx-ai@1.3.0)(@langchain/anthropic@0.3.7(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13))(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.4)(encoding@0.1.13)(google-auth-library@8.7.0(encoding@0.1.13))(html-to-text@9.0.5)(ibm-cloud-sdk-core@5.1.0)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))':
+  '@langchain/community@0.3.41(qeylelmwbkmbwhozrvq2ndf2mi)':
     dependencies:
+      '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.31.2)(bufferutil@4.0.6)(deepmerge@4.3.1)(dotenv@16.4.7)(encoding@0.1.13)(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))(utf-8-validate@5.0.9)(zod@3.24.1)
       '@ibm-cloud/watsonx-ai': 1.3.0
-      '@langchain/core': 0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
-      '@langchain/openai': 0.3.12(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)
+      '@langchain/core': 0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
+      '@langchain/openai': 0.5.6(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))
       binary-extensions: 2.3.0
       expr-eval: 2.0.2
       flat: 5.0.2
       ibm-cloud-sdk-core: 5.1.0
       js-yaml: 4.1.0
-      langchain: 0.3.5(@langchain/anthropic@0.3.7(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13))(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.4)(encoding@0.1.13)(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
-      langsmith: 0.2.5(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
+      langchain: 0.3.23(@langchain/anthropic@0.3.18(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13))(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(@langchain/google-genai@0.2.4(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(zod@3.24.1))(@langchain/ollama@0.2.0(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))))(axios@1.7.4)(encoding@0.1.13)(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))
+      langsmith: 0.3.19(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
+      openai: 4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)
       uuid: 10.0.0
-      zod: 3.23.8
-      zod-to-json-schema: 3.23.1(zod@3.23.8)
+      zod: 3.24.1
+      zod-to-json-schema: 3.23.1(zod@3.24.1)
     optionalDependencies:
+      '@browserbasehq/sdk': 2.5.0(encoding@0.1.13)
+      fast-xml-parser: 4.5.0
       google-auth-library: 8.7.0(encoding@0.1.13)
       html-to-text: 9.0.5
       ignore: 5.3.1
@@ -23190,86 +23141,92 @@ snapshots:
     transitivePeerDependencies:
       - '@langchain/anthropic'
       - '@langchain/aws'
+      - '@langchain/cerebras'
       - '@langchain/cohere'
+      - '@langchain/deepseek'
       - '@langchain/google-genai'
       - '@langchain/google-vertexai'
+      - '@langchain/google-vertexai-web'
       - '@langchain/groq'
       - '@langchain/mistralai'
       - '@langchain/ollama'
+      - '@langchain/xai'
       - axios
       - encoding
       - handlebars
-      - openai
       - peggy
 
-  '@langchain/core@0.2.16(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))':
+  '@langchain/core@0.2.16(langchain@0.3.23(@langchain/anthropic@0.3.18(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13))(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(@langchain/google-genai@0.2.4(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(zod@3.24.1))(@langchain/ollama@0.2.0(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))))(axios@1.7.4)(encoding@0.1.13)(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))':
     dependencies:
       ansi-styles: 5.2.0
       camelcase: 6.3.0
       decamelize: 1.2.0
       js-tiktoken: 1.0.12
-      langsmith: 0.1.37(@langchain/core@0.2.16(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
+      langsmith: 0.1.37(i4xyryqhvpp22cfyu6i73bivzu)
       ml-distance: 4.0.1
       mustache: 4.2.0
       p-queue: 6.6.2
       p-retry: 4.6.2
       uuid: 10.0.0
-      zod: 3.23.8
-      zod-to-json-schema: 3.23.1(zod@3.23.8)
+      zod: 3.24.1
+      zod-to-json-schema: 3.24.5(zod@3.24.1)
     transitivePeerDependencies:
       - langchain
       - openai
 
-  '@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))':
+  '@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))':
     dependencies:
+      '@cfworker/json-schema': 4.1.1
       ansi-styles: 5.2.0
       camelcase: 6.3.0
       decamelize: 1.2.0
       js-tiktoken: 1.0.12
-      langsmith: 0.2.11(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
+      langsmith: 0.3.19(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
       mustache: 4.2.0
       p-queue: 6.6.2
       p-retry: 4.6.2
       uuid: 10.0.0
-      zod: 3.23.8
-      zod-to-json-schema: 3.23.1(zod@3.23.8)
+      zod: 3.24.1
+      zod-to-json-schema: 3.23.1(zod@3.24.1)
     transitivePeerDependencies:
       - openai
 
-  '@langchain/openai@0.2.2(encoding@0.1.13)(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))':
+  '@langchain/google-genai@0.2.4(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(zod@3.24.1)':
     dependencies:
-      '@langchain/core': 0.2.16(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
-      js-tiktoken: 1.0.12
-      openai: 4.71.1(encoding@0.1.13)(zod@3.23.8)
-      zod: 3.23.8
-      zod-to-json-schema: 3.23.1(zod@3.23.8)
+      '@google/generative-ai': 0.24.0
+      '@langchain/core': 0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
+      uuid: 11.1.0
+      zod-to-json-schema: 3.23.1(zod@3.24.1)
     transitivePeerDependencies:
-      - encoding
-      - langchain
+      - zod
+
+  '@langchain/ollama@0.2.0(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))':
+    dependencies:
+      '@langchain/core': 0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
+      ollama: 0.5.15
+      uuid: 10.0.0
+      zod: 3.24.1
+      zod-to-json-schema: 3.24.5(zod@3.24.1)
 
-  '@langchain/openai@0.3.12(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)':
+  '@langchain/openai@0.5.6(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))':
     dependencies:
-      '@langchain/core': 0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
+      '@langchain/core': 0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
       js-tiktoken: 1.0.12
-      openai: 4.71.1(encoding@0.1.13)(zod@3.23.8)
-      zod: 3.23.8
-      zod-to-json-schema: 3.23.1(zod@3.23.8)
+      openai: 4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)
+      zod: 3.24.1
+      zod-to-json-schema: 3.23.1(zod@3.24.1)
     transitivePeerDependencies:
       - encoding
+      - ws
 
-  '@langchain/textsplitters@0.0.3(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))':
+  '@langchain/textsplitters@0.0.3(langchain@0.3.23(@langchain/anthropic@0.3.18(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13))(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(@langchain/google-genai@0.2.4(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(zod@3.24.1))(@langchain/ollama@0.2.0(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))))(axios@1.7.4)(encoding@0.1.13)(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))':
     dependencies:
-      '@langchain/core': 0.2.16(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
+      '@langchain/core': 0.2.16(langchain@0.3.23(@langchain/anthropic@0.3.18(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13))(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(@langchain/google-genai@0.2.4(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(zod@3.24.1))(@langchain/ollama@0.2.0(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))))(axios@1.7.4)(encoding@0.1.13)(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
       js-tiktoken: 1.0.12
     transitivePeerDependencies:
       - langchain
       - openai
 
-  '@langchain/textsplitters@0.1.0(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))':
-    dependencies:
-      '@langchain/core': 0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
-      js-tiktoken: 1.0.12
-
   '@leichtgewicht/ip-codec@2.0.4': {}
 
   '@lezer/common@1.2.1': {}
@@ -25452,8 +25409,6 @@ snapshots:
 
   '@types/node@14.18.23': {}
 
-  '@types/node@18.17.18': {}
-
   '@types/node@18.19.68':
     dependencies:
       undici-types: 5.26.5
@@ -28771,6 +28726,10 @@ snapshots:
 
   console-control-strings@1.1.0: {}
 
+  console-table-printer@2.12.1:
+    dependencies:
+      simple-wcswidth: 1.0.1
+
   content-disposition@0.5.4:
     dependencies:
       safe-buffer: 5.2.1
@@ -34959,60 +34918,32 @@ snapshots:
 
   ky@1.7.4: {}
 
-  langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)):
+  langchain@0.3.23(@langchain/anthropic@0.3.18(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13))(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(@langchain/google-genai@0.2.4(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(zod@3.24.1))(@langchain/ollama@0.2.0(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))))(axios@1.7.4)(encoding@0.1.13)(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)):
     dependencies:
-      '@langchain/core': 0.2.16(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
-      '@langchain/openai': 0.2.2(encoding@0.1.13)(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))
-      '@langchain/textsplitters': 0.0.3(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
-      binary-extensions: 2.3.0
+      '@langchain/core': 0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
+      '@langchain/openai': 0.5.6(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))
+      '@langchain/textsplitters': 0.0.3(langchain@0.3.23(@langchain/anthropic@0.3.18(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13))(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(@langchain/google-genai@0.2.4(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(zod@3.24.1))(@langchain/ollama@0.2.0(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))))(axios@1.7.4)(encoding@0.1.13)(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
       js-tiktoken: 1.0.12
       js-yaml: 4.1.0
       jsonpointer: 5.0.1
-      langchainhub: 0.0.11
-      langsmith: 0.1.37(@langchain/core@0.2.16(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
-      ml-distance: 4.0.1
+      langsmith: 0.3.19(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
       openapi-types: 12.1.3
       p-retry: 4.6.2
       uuid: 10.0.0
-      yaml: 2.4.5
-      zod: 3.23.8
-      zod-to-json-schema: 3.23.1(zod@3.23.8)
+      yaml: 2.7.0
+      zod: 3.24.1
+      zod-to-json-schema: 3.24.5(zod@3.24.1)
     optionalDependencies:
+      '@langchain/anthropic': 0.3.18(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13)
+      '@langchain/google-genai': 0.2.4(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(zod@3.24.1)
+      '@langchain/ollama': 0.2.0(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))
       axios: 1.7.4(debug@4.4.0)
-      fast-xml-parser: 4.5.0
-      html-to-text: 9.0.5
-      ignore: 5.3.1
-      jsdom: 20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9)
-      ws: 8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)
     transitivePeerDependencies:
       - encoding
       - openai
+      - ws
 
-  langchain@0.3.5(@langchain/anthropic@0.3.7(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13))(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(axios@1.7.4)(encoding@0.1.13)(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)):
-    dependencies:
-      '@langchain/core': 0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
-      '@langchain/openai': 0.3.12(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)
-      '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))
-      js-tiktoken: 1.0.12
-      js-yaml: 4.1.0
-      jsonpointer: 5.0.1
-      langsmith: 0.2.5(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
-      openapi-types: 12.1.3
-      p-retry: 4.6.2
-      uuid: 10.0.0
-      yaml: 2.4.5
-      zod: 3.23.8
-      zod-to-json-schema: 3.23.1(zod@3.23.8)
-    optionalDependencies:
-      '@langchain/anthropic': 0.3.7(@langchain/core@0.3.22(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(encoding@0.1.13)
-      axios: 1.7.4(debug@4.4.0)
-    transitivePeerDependencies:
-      - encoding
-      - openai
-
-  langchainhub@0.0.11: {}
-
-  langsmith@0.1.37(@langchain/core@0.2.16(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)))(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)):
+  langsmith@0.1.37(i4xyryqhvpp22cfyu6i73bivzu):
     dependencies:
       '@types/uuid': 9.0.8
       commander: 10.0.1
@@ -35020,31 +34951,21 @@ snapshots:
       p-retry: 4.6.2
       uuid: 9.0.1
     optionalDependencies:
-      '@langchain/core': 0.2.16(langchain@0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))
-      langchain: 0.2.10(axios@1.7.4)(encoding@0.1.13)(fast-xml-parser@4.5.0)(html-to-text@9.0.5)(ignore@5.3.1)(jsdom@20.0.3(bufferutil@4.0.6)(utf-8-validate@5.0.9))(openai@4.71.1(encoding@0.1.13)(zod@3.23.8))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))
-      openai: 4.71.1(encoding@0.1.13)(zod@3.23.8)
+      '@langchain/core': 0.2.16(langchain@0.3.23(@langchain/anthropic@0.3.18(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13))(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(@langchain/google-genai@0.2.4(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(zod@3.24.1))(@langchain/ollama@0.2.0(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))))(axios@1.7.4)(encoding@0.1.13)(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)))(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))
+      langchain: 0.3.23(@langchain/anthropic@0.3.18(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(encoding@0.1.13))(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(@langchain/google-genai@0.2.4(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)))(zod@3.24.1))(@langchain/ollama@0.2.0(@langchain/core@0.3.45(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))))(axios@1.7.4)(encoding@0.1.13)(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1))(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))
+      openai: 4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)
 
-  langsmith@0.2.11(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)):
+  langsmith@0.3.19(openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)):
     dependencies:
       '@types/uuid': 10.0.0
-      commander: 10.0.1
-      p-queue: 6.6.2
-      p-retry: 4.6.2
-      semver: 7.6.3
-      uuid: 10.0.0
-    optionalDependencies:
-      openai: 4.71.1(encoding@0.1.13)(zod@3.23.8)
-
-  langsmith@0.2.5(openai@4.71.1(encoding@0.1.13)(zod@3.23.8)):
-    dependencies:
-      '@types/uuid': 10.0.0
-      commander: 10.0.1
+      chalk: 4.1.2
+      console-table-printer: 2.12.1
       p-queue: 6.6.2
       p-retry: 4.6.2
       semver: 7.6.3
       uuid: 10.0.0
     optionalDependencies:
-      openai: 4.71.1(encoding@0.1.13)(zod@3.23.8)
+      openai: 4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1)
 
   latest-version@5.1.0:
     dependencies:
@@ -37263,6 +37184,10 @@ snapshots:
 
   obuf@1.1.2: {}
 
+  ollama@0.5.15:
+    dependencies:
+      whatwg-fetch: 3.6.20
+
   on-exit-leak-free@0.2.0: {}
 
   on-exit-leak-free@2.1.0: {}
@@ -37326,7 +37251,7 @@ snapshots:
       is-inside-container: 1.0.0
       is-wsl: 2.2.0
 
-  openai@4.71.1(encoding@0.1.13)(zod@3.23.8):
+  openai@4.95.1(encoding@0.1.13)(ws@8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9))(zod@3.24.1):
     dependencies:
       '@types/node': 18.19.68
       '@types/node-fetch': 2.6.11
@@ -37336,7 +37261,8 @@ snapshots:
       formdata-node: 4.4.1
       node-fetch: 2.7.0(encoding@0.1.13)
     optionalDependencies:
-      zod: 3.23.8
+      ws: 8.18.0(bufferutil@4.0.6)(utf-8-validate@5.0.9)
+      zod: 3.24.1
     transitivePeerDependencies:
       - encoding
 
@@ -38014,7 +37940,7 @@ snapshots:
   postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2(@swc/core@1.6.13(@swc/helpers@0.5.5))(@types/node@22.10.2)(typescript@5.5.4)):
     dependencies:
       lilconfig: 3.0.0
-      yaml: 2.4.5
+      yaml: 2.7.0
     optionalDependencies:
       postcss: 8.4.39
       ts-node: 10.9.2(@swc/core@1.6.13(@swc/helpers@0.5.5))(@types/node@22.10.2)(typescript@5.5.4)
@@ -38022,7 +37948,7 @@ snapshots:
   postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@9.1.1(typescript@5.5.4)):
     dependencies:
       lilconfig: 3.0.0
-      yaml: 2.4.5
+      yaml: 2.7.0
     optionalDependencies:
       postcss: 8.4.39
       ts-node: 9.1.1(typescript@5.5.4)
@@ -39762,6 +39688,8 @@ snapshots:
     dependencies:
       semver: 7.0.0
 
+  simple-wcswidth@1.0.1: {}
+
   single-user-cache@0.6.0:
     dependencies:
       safe-stable-stringify: 2.4.1
@@ -41640,6 +41568,8 @@ snapshots:
 
   uuid@10.0.0: {}
 
+  uuid@11.1.0: {}
+
   uuid@3.3.3: {}
 
   uuid@7.0.3: {}
@@ -42325,6 +42255,8 @@ snapshots:
     dependencies:
       iconv-lite: 0.6.3
 
+  whatwg-fetch@3.6.20: {}
+
   whatwg-mimetype@3.0.0: {}
 
   whatwg-url@11.0.0:
@@ -42578,8 +42510,6 @@ snapshots:
 
   yaml@1.10.2: {}
 
-  yaml@2.4.5: {}
-
   yaml@2.7.0: {}
 
   yargs-parser@10.1.0:
@@ -42705,13 +42635,15 @@ snapshots:
       compress-commons: 5.0.1
       readable-stream: 3.6.2
 
-  zod-to-json-schema@3.23.1(zod@3.23.8):
+  zod-to-json-schema@3.23.1(zod@3.24.1):
     dependencies:
-      zod: 3.23.8
+      zod: 3.24.1
 
-  zod@3.20.6: {}
+  zod-to-json-schema@3.24.5(zod@3.24.1):
+    dependencies:
+      zod: 3.24.1
 
-  zod@3.23.8: {}
+  zod@3.20.6: {}
 
   zod@3.24.1: {}
 


Reviews:
user: login: gemini-code-assist[bot]
body: Hello @imolorhe, I'm Gemini Code Assist[^1]! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

## Summary of Changes
This pull request introduces support for Google Gemini as an AI model provider within the Altair GraphQL client, alongside improvements to the prompt used for AI interactions. The changes include updates to package dependencies, modifications to the AI service to incorporate Gemini, and adjustments to the message DTO to include GraphQL responses. A new prompt file is added to refine AI interactions, and the configuration is updated to include Google Gemini settings.

### Highlights
* **Google Gemini Support**: Adds Google Gemini as a supported AI model provider, allowing users to leverage Gemini's capabilities within Altair.
* **Prompt Improvement**: Enhances the prompt used for AI interactions, providing more context and guidance for generating relevant responses.
* **GraphQL Response Inclusion**: Modifies the message DTO to include GraphQL responses, enabling the AI to consider response data when generating answers.
* **Dependency Updates**: Updates various dependencies, including `@langchain` packages, to their latest versions.

### Changelog
<details>
<summary>Click here to see the changelog</summary>

* **packages/altair-api/package.json**
  * Updates `@langchain` dependencies to newer versions.
  * Adds `@langchain/google-genai` and `@langchain/ollama` as dependencies.
* **packages/altair-api/src/ai/ai.service.ts**
  * Removes `ChatOllama` import from `@langchain/community/chat_models/ollama`.
  * Adds `ChatGoogleGenerativeAI` and `ChatOllama` imports from `@langchain/google-genai` and `@langchain/ollama` respectively.
  * Introduces `getPrompt` function from `./prompt`.
  * Replaces the system message content with the output of `getPrompt` function, passing SDL, query, variables, and response.
  * Adds a case for 'google' to instantiate `ChatGoogleGenerativeAI` with API key, model, and max output tokens.
* **packages/altair-api/src/ai/dto/send-message.dto.ts**
  * Adds `graphqlResponse` property to `SendMessageDto` to include GraphQL response data.
* **packages/altair-api/src/ai/prompt.ts**
  * Creates a new file `prompt.ts` containing the prompt template and `getPrompt` function to generate the prompt based on SDL, query, variables and response.
* **packages/altair-api/src/common/config.ts**
  * Adds 'google' to the `AiModelProvider` type.
  * Adds `google` configuration with `apiKey` and `model` properties.
* **packages/altair-core/src/ai/types.ts**
  * Adds `graphqlResponse` property to `ISendMessageDto` interface.
* **packages/altair-core/src/plugin/v3/frame-engine.ts**
  * Removes unused `uuid` import.
  * Adds eslint disable comment for no-console.
* **packages/altair-core/src/plugin/v3/panel.ts**
  * Changes `let el = document.createElement('style');` to `const el = document.createElement('style');`
* **packages/altair-core/src/plugin/v3/parent-worker.ts**
  * Adds eslint disable comment for no-console.
* **plugins/ai/src/panel.tsx**
  * Adds `response` variable to store query results.
  * Includes `graphqlResponse` in the message input sent to the AI session.
* **pnpm-lock.yaml**
  * Updates versions of `@langchain/*` packages.
  * Adds `@langchain/google-genai` and `@langchain/ollama` to dependencies.
  * Removes some unused packages and updates other dependencies.

</details>


<details>

<summary><b>Using Gemini Code Assist</b></summary>
<br>

The full guide for Gemini Code Assist can be found on our [documentation page](https://developers.google.com/gemini-code-assist/docs/review-github-code), here are some quick tips.

<b>Invoking Gemini</b>

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either `/gemini <command>` or `@gemini-code-assist <command>`. Below is a summary of the supported commands.

Feature | Command | Description
--- | --- | ---
Code Review | `/gemini review` | Performs a code review for the current pull request in its current state.
Pull Request Summary | `/gemini summary` | Provides a summary of the current pull request in its current state.
Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in issue comments and review comments.
Help | `/gemini help` | Displays a list of available commands.

<b>Customization</b>

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a `.gemini/` folder in the base of the repository. Detailed instructions can be found [here](https://developers.google.com/gemini-code-assist/docs/customize-gemini-behavior-github).

<b>Limitations & Feedback</b>

Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with :thumbsup: and :thumbsdown: on @gemini-code-assist comments to provide feedback.

</details>

<b>You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the [Gemini Code Assist IDE Extension](https://cloud.google.com/products/gemini/code-assist).</b>


[^1]: Review the [Privacy Notices](https://policies.google.com/privacy), [Generative AI Prohibited Use Policy](https://policies.google.com/terms/generative-ai/use-policy), [Terms of Service](https://policies.google.com/terms), and learn how to configure Gemini Code Assist in GitHub [here](https://developers.google.com/gemini-code-assist/docs/review-github-code). Gemini can make mistakes, so double check it and [use code with caution](https://support.google.com/legal/answer/13505487).

---

> A schema's a guide,
> For queries to ride,
> With Gemini's gleam,
> It fulfills the dream,
> Of GraphQL, far and wide.


state: COMMENTED
author_association: NONE
submitted_at: 2025-04-19T19:18:36Z
user: login: gemini-code-assist[bot]
body: ## Code Review
The pull request introduces Google Gemini support and improves the prompt for the AI service. The changes include updating dependencies, adding Google Gemini as a provider, and modifying the prompt to include GraphQL response data. Overall, the changes seem well-structured and address the intended functionality.

### Summary of Findings
* **Dependency Updates**: Several dependencies have been updated, including `@langchain` packages. Ensure that these updates are compatible with the existing codebase and that all necessary adjustments have been made to accommodate the new versions.
* **Google Gemini Integration**: The integration of Google Gemini involves adding a new provider option and corresponding configuration. Verify that the API key and model settings are handled securely and that the implementation aligns with the expected behavior of the Gemini API.
* **Prompt Improvement**: The prompt has been modified to include GraphQL response data. Ensure that the prompt is well-formatted and that the AI model can effectively utilize the additional context to provide accurate and relevant responses.

### Merge Readiness
The pull request introduces valuable features and improvements. However, it's crucial to address the identified issues, particularly those related to dependency compatibility and prompt formatting, before merging. I am unable to directly approve the pull request, and I recommend that others review and approve this code before merging. At a minimum, the high severity issues should be addressed before merging.
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-19T19:18:48Z
user: login: sourcery-ai[bot]
body: Hey @imolorhe - I've reviewed your changes - here's some feedback:

**Overall Comments**:
- Consider adding a configuration option to allow users to specify the Ollama model they want to use.
- The prompt template is a good start, but consider making it configurable to allow for further customization.

<details>
<summary>Here's what I looked at during the review</summary>

- 🟢 **General issues**: all looks good
- 🟢 **Security**: all looks good
- 🟢 **Testing**: all looks good
- 🟢 **Complexity**: all looks good
- 🟢 **Documentation**: all looks good
</details>

***

<details>
<summary>Sourcery is free for open source - if you like our reviews please consider sharing them ✨</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20got%20an%20instant%20code%20review%20from%20%40SourceryAI%2C%20and%20it%20was%20brilliant%21%20It%27s%20free%20for%20open%20source%20and%20has%20a%20free%20trial%20for%20private%20code.%20Check%20it%20out%20https%3A//sourcery.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20got%20an%20instant%20code%20review%20from%20%40SourceryAI%2C%20and%20it%20was%20brilliant%21%20It%27s%20free%20for%20open%20source%20and%20has%20a%20free%20trial%20for%20private%20code.%20Check%20it%20out%20https%3A//sourcery.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https://sourcery.ai)
- [Facebook](https://www.facebook.com/sharer/sharer.php?u=https://sourcery.ai)

</details>

<sub>
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
</sub>
state: APPROVED
author_association: NONE
submitted_at: 2025-04-19T19:19:20Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (6)</summary><blockquote>

<details>
<summary>packages/altair-core/src/plugin/v3/frame-engine.ts (1)</summary><blockquote>

`15-16`: **Consider using a more type-safe alternative to `Function`**

While the ESLint disable directive works as a short-term solution, using the generic `Function` type reduces type safety. Consider using a more specific function signature or a union of function types.


```diff
- // eslint-disable-next-line @typescript-eslint/ban-types
- private eventListeners: Record<string, Function[]> = {};
+ private eventListeners: Record<string, Array<(...args: any[]) => any>> = {};
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 Biome (1.9.4)</summary>

[error] 16-16: Don't use 'Function' as a type.

Prefer explicitly define the function shape. This type accepts any function-like value, which can be a common source of bugs.

(lint/complexity/noBannedTypes)

</details>

</details>

</blockquote></details>
<details>
<summary>plugins/ai/src/panel.tsx (1)</summary><blockquote>

`80-80`: **Good addition of GraphQL response data to AI context.**

Adding the GraphQL query results as context for the AI model is a great improvement that will allow the AI to provide more relevant assistance based on actual data.


Consider adding safeguards for large responses to prevent potential performance issues or hitting API limits. For example:

```diff
-      let response = '';
+      let response = '';
+      const MAX_RESPONSE_SIZE = 100000; // Set appropriate size limit
       if (windowState) {
         graphqlQuery = windowState.query;
         graphqlVariables = windowState.variables;
         sdl = windowState.sdl;
-        response = windowState.queryResults.join('\n');
+        response = windowState.queryResults.join('\n').substring(0, MAX_RESPONSE_SIZE);
+        if (windowState.queryResults.join('\n').length > MAX_RESPONSE_SIZE) {
+          response += '\n[Response truncated due to size]';
+        }
       }
```


Also applies to: 85-85, 94-94

</blockquote></details>
<details>
<summary>packages/altair-api/src/ai/ai.service.ts (1)</summary><blockquote>

`342-348`: **Added support for Google's Generative AI model.**

The `getChatModel` method now includes a case for the 'google' provider, properly configured with the API key, model name, and token limit.


Consider adding error handling for cases where the API key might be missing:

```diff
case 'google': {
+  const apiKey = this.configService.get('ai.google.apiKey', { infer: true });
+  if (!apiKey) {
+    this.agent?.incrementMetric('ai.error.missing_api_key.google');
+    throw new Error('Google Generative AI API key is required');
+  }
   return new ChatGoogleGenerativeAI({
-    apiKey: this.configService.get('ai.google.apiKey', { infer: true }),
+    apiKey,
     model: this.configService.get('ai.google.model', { infer: true }) ?? '',
     maxOutputTokens: responseMaxTokens,
   });
}
```

</blockquote></details>
<details>
<summary>packages/altair-api/src/ai/prompt.ts (3)</summary><blockquote>

`6-36`: **Normalize indentation of the prompt string.**  
The current multiline template preserves leading whitespace from code indentation, which will be sent verbatim to the AI. You may integrate a dedent helper (e.g., the `ts-dedent` package) or adjust the template to remove unintended spaces:

```typescript
import dedent from 'ts-dedent';

const prompt = dedent`
You are an expert in GraphQL and Altair GraphQL Client (https://altairgraphql.dev). Your task is to answer user questions related to these topics professionally and concisely. Follow these instructions carefully:
- Review the following SDL (Schema Definition Language) provided on behalf of the user:
<SDL>${SDL_PLACEHOLDER}</SDL>
...
Now, please answer the following user question:
`;
```

---

`38-41`: **Remove or consolidate placeholder comments.**  
Lines 38–41 repeat information already conveyed by the placeholder constants. Consider removing these redundant comments to reduce noise.

---

`42-53`: **Rename parameter and use `replaceAll`.**  
1) Rename the `response` parameter to `graphqlResponse` to match the DTO/interface naming and avoid ambiguity with HTTP responses.  
2) Use `replaceAll` instead of `replace` to guard against multiple occurrences even if placeholders appear more than once:

```diff
-export const getPrompt = (
-  sdl: string,
-  query: string,
-  variables: string,
-  response: string
-) => {
-  return prompt
-    .replace(SDL_PLACEHOLDER, sdl)
-    .replace(QUERY_PLACEHOLDER, query)
-    .replace(VARIABLES_PLACEHOLDER, variables)
-    .replace(RESPONSE_PLACEHOLDER, response);
-};
+export const getPrompt = (
+  sdl: string,
+  query: string,
+  variables: string,
+  graphqlResponse: string
+): string => {
+  return prompt
+    .replaceAll(SDL_PLACEHOLDER, sdl)
+    .replaceAll(QUERY_PLACEHOLDER, query)
+    .replaceAll(VARIABLES_PLACEHOLDER, variables)
+    .replaceAll(RESPONSE_PLACEHOLDER, graphqlResponse);
+};
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 7247a88a80f287199838ceadf5938907186fe362 and 58234749419cc99ef4c0df7c5b531904a33ecfda.

</details>

<details>
<summary>⛔ Files ignored due to path filters (1)</summary>

* `pnpm-lock.yaml` is excluded by `!**/pnpm-lock.yaml`

</details>

<details>
<summary>📒 Files selected for processing (10)</summary>

* `packages/altair-api/package.json` (2 hunks)
* `packages/altair-api/src/ai/ai.service.ts` (3 hunks)
* `packages/altair-api/src/ai/dto/send-message.dto.ts` (1 hunks)
* `packages/altair-api/src/ai/prompt.ts` (1 hunks)
* `packages/altair-api/src/common/config.ts` (2 hunks)
* `packages/altair-core/src/ai/types.ts` (1 hunks)
* `packages/altair-core/src/plugin/v3/frame-engine.ts` (1 hunks)
* `packages/altair-core/src/plugin/v3/panel.ts` (1 hunks)
* `packages/altair-core/src/plugin/v3/parent-worker.ts` (1 hunks)
* `plugins/ai/src/panel.tsx` (2 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (2)</summary>

<details>
<summary>packages/altair-api/src/ai/dto/send-message.dto.ts (1)</summary><blockquote>

<details>
<summary>packages/altair-core/src/ai/constants.ts (1)</summary>

* `maxMessageChars` (9-9)

</details>

</blockquote></details>
<details>
<summary>packages/altair-api/src/ai/ai.service.ts (2)</summary><blockquote>

<details>
<summary>packages/altair-api/src/ai/prompt.ts (1)</summary>

* `getPrompt` (42-53)

</details>
<details>
<summary>packages/altair-core/src/ai/constants.ts (1)</summary>

* `responseMaxTokens` (20-20)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (11)</summary>

* GitHub Check: electron / electron (ubuntu-latest)
* GitHub Check: electron / electron (macos-latest)
* GitHub Check: electron / electron (windows-latest)
* GitHub Check: docker / docker
* GitHub Check: tests / api-e2e-test
* GitHub Check: tests / test (ubuntu-latest)
* GitHub Check: sites / Deploy sites
* GitHub Check: tests / e2e-test (macos-latest)
* GitHub Check: tests / e2e-test (ubuntu-latest)
* GitHub Check: tests / test (macos-latest)
* GitHub Check: build_and_preview

</details>

<details>
<summary>🔇 Additional comments (10)</summary><blockquote>

<details>
<summary>packages/altair-core/src/ai/types.ts (1)</summary>

`20-20`: **Good addition - enhances AI context awareness**

Adding `graphqlResponse` to the `ISendMessageDto` interface allows the AI to access the actual GraphQL query results, which provides crucial context for generating more relevant and accurate responses.

</details>
<details>
<summary>packages/altair-core/src/plugin/v3/parent-worker.ts (1)</summary>

`111-112`: **LGTM: Appropriate use of error logging**

The ESLint directive for this console error is appropriate as this logs a legitimate error condition (frame ID mismatch) that would be important for debugging message routing issues.

</details>
<details>
<summary>packages/altair-core/src/plugin/v3/panel.ts (1)</summary>

`59-59`: **Good practice: Using const for non-reassigned variables**

Changing from `let` to `const` is a good practice when the variable won't be reassigned, which improves code clarity and prevents accidental mutations.

</details>
<details>
<summary>packages/altair-api/src/ai/dto/send-message.dto.ts (1)</summary>

`36-40`: **Well-implemented DTO extension**

The addition of `graphqlResponse` property with appropriate validation and documentation decorators is well-structured and directly supports the PR objective of improved AI prompt generation. The validation constraints ensure the API remains robust.

</details>
<details>
<summary>packages/altair-api/package.json (1)</summary>

`10-15`: <details>
<summary>✅ Verification successful</summary>

**Updated LangChain dependencies and added Google Generative AI support.**

The dependencies have been updated to their newer versions and the necessary packages for Google Generative AI have been added.


Let's verify that the version of Google Generative AI package is the most recent:

---

🏁 Script executed:

```shell
#!/bin/bash
# Check if the used package versions are up-to-date
npm view @langchain/google-genai version
npm view @langchain/ollama version
```

Length of output: 91

---



</details>

**LangChain dependencies are up-to-date**  
The installed versions for @langchain/google‑genai (0.2.4) and @langchain/ollama (0.2.0) match the latest published releases. Google Generative AI support is correctly integrated.

</details>
<details>
<summary>packages/altair-api/src/common/config.ts (2)</summary>

`1-1`: **Added Google AI model provider to the type definition.**

The `AiModelProvider` type has been expanded to include 'google' as a new provider option.

---

`40-44`: <details>
<summary>✅ Verification successful</summary>

**Added Google AI provider configuration with default model.**

The configuration for Google's Generative AI service has been properly structured with environment variable integration for the API key and model name.


---

🌐 Web query:

```web
Is "gemini-2.5-flash-preview-04-17" the most current Gemini model available for developers?
```

💡 Result:

As of April 19, 2025, the model "gemini-2.5-flash-preview-04-17" is the most current Gemini Flash model available to developers through Google AI Studio and Vertex AI in public preview[1][4][8][10]. This model was released on April 17, 2025, and represents the latest advancement in Google's Gemini series, specifically optimized for adaptive thinking, speed, and cost efficiency[1][4][8]. It introduces hybrid reasoning capabilities, allowing developers to turn the “thinking” process on or off and set “thinking budgets” to balance quality, cost, and latency[1][5][6].

Here's a concise overview:

| Model ID                             | Name                       | Release Stage       | Release Date     | Key Features                      |
|--------------------------------------|----------------------------|---------------------|------------------|------------------------------------|
| gemini-2.5-flash-preview-04-17       | Gemini 2.5 Flash           | Public Preview      | April 17, 2025   | Hybrid reasoning, speed, cost      |
| gemini-2.5-pro-preview-03-25         | Gemini 2.5 Pro             | Public Preview      | March 25, 2025   | Most advanced, enhanced reasoning  |

While Gemini 2.5 Pro (last updated March 2025) is also available in preview, "gemini-2.5-flash-preview-04-17" is the latest Flash variant and the most current Gemini Flash model for developers[2][4][7]. No newer Gemini Flash models have been announced or released as of this date[4][8][10].

In summary:  
**"gemini-2.5-flash-preview-04-17" is the most current Gemini Flash model available to developers as of April 19, 2025. Additional updates and a general availability (GA) release are expected in the future, but this is the latest release for now.**[1][4][8][10]

Citations:

- 1: https://developers.googleblog.com/en/start-building-with-gemini-25-flash/
- 2: https://ai.google.dev/gemini-api/docs/models
- 3: https://techcrunch.com/2025/04/09/googles-newest-gemini-ai-model-focuses-on-efficiency/
- 4: https://ai.google.dev/gemini-api/docs/changelog
- 5: https://simonwillison.net/2025/Apr/17/start-building-with-gemini-25-flash/
- 6: https://simonw.substack.com/p/image-segmentation-using-gemini-25
- 7: https://developers.googleblog.com/en/gemini-2-5-flash-pro-live-api-veo-2-gemini-api/
- 8: https://cloud.google.com/vertex-ai/generative-ai/docs/models/gemini/2-5-flash
- 9: https://blog.google/technology/google-deepmind/gemini-model-updates-february-2025/
- 10: https://deepmind.google/technologies/gemini/flash/

---



</details>

**Google AI provider configuration approved**  

Verified that “gemini-2.5-flash-preview-04-17” is the latest Gemini Flash model available as of April 19, 2025. The environment variable fallbacks for both `GOOGLE_GEN_API_KEY` and `GOOGLE_GEN_MODEL_NAME` are correctly implemented.

• File: packages/altair-api/src/common/config.ts (lines 40–44)

</details>
<details>
<summary>packages/altair-api/src/ai/ai.service.ts (2)</summary>

`24-26`: **Updated imports for new AI providers and prompt generation.**

The imports have been updated to include Google Generative AI support and the new prompt generation function.

---

`276-281`: **Improved prompt generation with GraphQL response context.**

The system message now uses the `getPrompt` function to incorporate the GraphQL response data, enhancing the AI's ability to provide context-aware assistance.

</details>
<details>
<summary>packages/altair-api/src/ai/prompt.ts (1)</summary>

`1-4`: **Constants for placeholders are clear and self-explanatory.**  
The placeholder constants provide a clean way to identify injection points in the prompt template.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-19T19:21:09Z

Review comments:
diff_hunk: @@ -271,7 +273,12 @@ export class AiService {
       new SystemMessage({
         content: [
           {
-            text: systemMessageParts.join('\n\n'),
+            text: getPrompt(
+              messageInput.sdl ?? '',
+              messageInput.graphqlQuery ?? '',
+              messageInput.graphqlVariables ?? '',
+              messageInput.graphqlResponse ?? ''
+            ),
path: packages/altair-api/src/ai/ai.service.ts
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

Consider adding a comment explaining the purpose of passing these values to `getPrompt`. This will improve readability and maintainability.
created_at: 2025-04-19T19:18:47Z
author_association: NONE
diff_hunk: @@ -332,6 +339,13 @@ export class AiService {
           ],
         });
       }
+      case 'google': {
+        return new ChatGoogleGenerativeAI({
+          apiKey: this.configService.get('ai.google.apiKey', { infer: true }),
+          model: this.configService.get('ai.google.model', { infer: true }) ?? '',
path: packages/altair-api/src/ai/ai.service.ts
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

It's good to provide a default model, but consider making this configurable via an environment variable to allow users to easily switch between different Gemini models without modifying the code. Also, consider adding a comment that the empty string is intentional, to avoid future confusion.

```suggestion
          model: this.configService.get('ai.google.model', { infer: true }) ?? '' /* intentionally left blank, see comment */,
```
created_at: 2025-04-19T19:18:47Z
author_association: NONE
diff_hunk: @@ -77,10 +77,12 @@ const Panel = ({ context }: PanelProps) => {
       let graphqlQuery = '';
       let graphqlVariables = '';
       let sdl = '';
+      let response = '';
       if (windowState) {
         graphqlQuery = windowState.query;
         graphqlVariables = windowState.variables;
         sdl = windowState.sdl;
+        response = windowState.queryResults.join('\n');
path: plugins/ai/src/panel.tsx
user: login: gemini-code-assist[bot]
body: ![medium](https://img.shields.io/badge/priority-medium-yellow)

Consider adding a check to ensure `windowState.queryResults` is not null or undefined before joining it to prevent potential errors.

```typescript
        response = windowState.queryResults?.join('\n') ?? '';
```
created_at: 2025-04-19T19:18:48Z
author_association: NONE

PR comments:
user: login: sourcery-ai[bot]
created_at: 2025-04-19T19:18:30Z
body: <!-- Generated by sourcery-ai[bot]: start review_guide -->

## Reviewer's Guide by Sourcery

This pull request introduces support for Google Gemini and Ollama as AI model providers, improves the prompt sent to the AI model, and updates dependencies to newer versions. The changes involve modifications to the configuration, AI service, DTOs, and panel components.

#### Sequence diagram for sendMessageToAiSession with Google Gemini

```mermaid
sequenceDiagram
  participant Client
  participant AltairApi
  participant GoogleGemini

  Client->>AltairApi: sendMessageToAiSession(sessionId, messageInput)
  AltairApi->>AltairApi: getAiModel(google, responseMaxTokens)
  AltairApi->>GoogleGemini: new ChatGoogleGenerativeAI(apiKey, model, maxOutputTokens)
  AltairApi->>GoogleGemini: call(messageInput)
  GoogleGemini-->>AltairApi: response
  AltairApi-->>Client: response
```

#### Sequence diagram for sendMessageToAiSession with Ollama

```mermaid
sequenceDiagram
  participant Client
  participant AltairApi
  participant Ollama

  Client->>AltairApi: sendMessageToAiSession(sessionId, messageInput)
  AltairApi->>AltairApi: getAiModel(ollama, responseMaxTokens)
  AltairApi->>Ollama: new ChatOllama(apiKey, model, maxOutputTokens)
  AltairApi->>Ollama: call(messageInput)
  Ollama-->>AltairApi: response
  AltairApi-->>Client: response
```

### File-Level Changes

| Change | Details | Files |
| ------ | ------- | ----- |
| Introduced support for Google Gemini as an AI model provider, allowing users to leverage Gemini's capabilities within the application. | <ul><li>Added '@langchain/google-genai' as a project dependency.</li><li>Added 'google' as a valid option for the AiModelProvider type.</li><li>Added configuration options for Google Gemini, including API key and model name.</li><li>Implemented the logic to instantiate and use the ChatGoogleGenerativeAI model from Langchain when 'google' is selected as the provider.</li></ul> | `pnpm-lock.yaml`<br/>`packages/altair-api/src/ai/ai.service.ts`<br/>`packages/altair-api/src/common/config.ts` |
| Enhanced the prompt sent to the AI model with additional context, including the GraphQL response, to improve the quality and relevance of AI-generated suggestions. | <ul><li>Added a 'graphqlResponse' field to the SendMessageDto to capture the GraphQL response.</li><li>Modified the prompt template to include the GraphQL response.</li><li>Updated the panel component to include the response in the message to the AI session.</li></ul> | `packages/altair-api/src/ai/dto/send-message.dto.ts`<br/>`plugins/ai/src/panel.tsx`<br/>`packages/altair-core/src/ai/types.ts`<br/>`packages/altair-api/src/ai/ai.service.ts`<br/>`packages/altair-api/src/ai/prompt.ts` |
| Updated dependencies to newer versions, including '@langchain/anthropic', '@langchain/community', '@langchain/core', '@langchain/openai', and 'langchain'. | <ul><li>Updated the version of '@langchain/anthropic' from 0.3.7 to 0.3.18.</li><li>Updated the version of '@langchain/community' from 0.3.12 to 0.3.41.</li><li>Updated the version of '@langchain/core' from 0.3.22 to 0.3.45.</li><li>Updated the version of '@langchain/openai' from 0.3.12 to 0.5.6.</li><li>Updated the version of 'langchain' from 0.2.10 to 0.3.23.</li></ul> | `pnpm-lock.yaml`<br/>`packages/altair-api/package.json` |
| Introduced support for Ollama as an AI model provider. | <ul><li>Added '@langchain/ollama' as a project dependency.</li><li>Added 'ollama' as a valid option for the AiModelProvider type.</li><li>Implemented the logic to instantiate and use the ChatOllama model from Langchain when 'ollama' is selected as the provider.</li></ul> | `pnpm-lock.yaml`<br/>`packages/altair-api/src/ai/ai.service.ts`<br/>`packages/altair-api/src/common/config.ts` |

---

<details>
<summary>Tips and commands</summary>

#### Interacting with Sourcery

- **Trigger a new review:** Comment `@sourcery-ai review` on the pull request.
- **Continue discussions:** Reply directly to Sourcery's review comments.
- **Generate a GitHub issue from a review comment:** Ask Sourcery to create an
  issue from a review comment by replying to it. You can also reply to a
  review comment with `@sourcery-ai issue` to create an issue from it.
- **Generate a pull request title:** Write `@sourcery-ai` anywhere in the pull
  request title to generate a title at any time. You can also comment
  `@sourcery-ai title` on the pull request to (re-)generate the title at any time.
- **Generate a pull request summary:** Write `@sourcery-ai summary` anywhere in
  the pull request body to generate a PR summary at any time exactly where you
  want it. You can also comment `@sourcery-ai summary` on the pull request to
  (re-)generate the summary at any time.
- **Generate reviewer's guide:** Comment `@sourcery-ai guide` on the pull
  request to (re-)generate the reviewer's guide at any time.
- **Resolve all Sourcery comments:** Comment `@sourcery-ai resolve` on the
  pull request to resolve all Sourcery comments. Useful if you've already
  addressed all the comments and don't want to see them anymore.
- **Dismiss all Sourcery reviews:** Comment `@sourcery-ai dismiss` on the pull
  request to dismiss all existing Sourcery reviews. Especially useful if you
  want to start fresh with a new review - don't forget to comment
  `@sourcery-ai review` to trigger a new review!
- **Generate a plan of action for an issue:** Comment `@sourcery-ai plan` on
  an issue to generate a plan of action for it.

#### Customizing Your Experience

Access your [dashboard](https://app.sourcery.ai) to:
- Enable or disable review features such as the Sourcery-generated pull request
  summary, the reviewer's guide, and others.
- Change the review language.
- Add, remove or edit custom review instructions.
- Adjust other review settings.

#### Getting Help

- [Contact our support team](mailto:support@sourcery.ai) for questions or feedback.
- Visit our [documentation](https://docs.sourcery.ai) for detailed guides and information.
- Keep in touch with the Sourcery team by following us on [X/Twitter](https://x.com/SourceryAI), [LinkedIn](https://www.linkedin.com/company/sourcery-ai/) or [GitHub](https://github.com/sourcery-ai).

</details>

<!-- Generated by sourcery-ai[bot]: end review_guide -->
author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-04-19T19:18:33Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

This update introduces support for Google Generative AI as a new AI model provider in the Altair GraphQL Client ecosystem. It adds the necessary configuration, dependencies, and logic to enable interactions with Google-based AI models. The AI prompt generation has been refactored into a dedicated module to provide more context-aware responses. Additionally, the data transfer objects and types have been extended to include an optional `graphqlResponse` field, allowing the AI to access GraphQL query results. Several dependency versions were updated, and minor code cleanups were performed across the codebase.

## Changes

| File(s)                                                                                                  | Change Summary                                                                                                                      |
|----------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------|
| `packages/altair-api/package.json`                                                                       | Updated `@langchain` dependencies to newer versions; added `@langchain/google-genai` and `@langchain/ollama` as new dependencies.   |
| `packages/altair-api/src/ai/ai.service.ts`                                                               | Refactored imports for Ollama; added Google Generative AI support; integrated new dynamic prompt logic using `getPrompt`.           |
| `packages/altair-api/src/ai/prompt.ts`                                                                   | Added new module for generating context-aware AI prompts tailored to GraphQL and Altair.                                            |
| `packages/altair-api/src/ai/dto/send-message.dto.ts`<br>`packages/altair-core/src/ai/types.ts`           | Added optional `graphqlResponse` property to DTO and interface for AI message payloads.                                             |
| `packages/altair-api/src/common/config.ts`                                                               | Added configuration for Google AI provider; extended provider type to include `'google'`.                                           |
| `plugins/ai/src/panel.tsx`                                                                               | Added logic to include `graphqlResponse` (query results) in messages sent to the AI session.                                        |
| `packages/altair-core/src/plugin/v3/frame-engine.ts`                                                     | Removed unused `uuid` import; added ESLint directive for function type usage.                                                       |
| `packages/altair-core/src/plugin/v3/panel.ts`                                                            | Changed variable declaration from `let` to `const` in the `injectCSS` method.                                                       |
| `packages/altair-core/src/plugin/v3/parent-worker.ts`                                                    | Added ESLint directive to allow `console.error` usage for error logging.                                                            |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant PluginPanel
    participant APIService
    participant GoogleGenAI
    participant OpenAI
    participant Anthropic
    participant Ollama

    User->>PluginPanel: Sends question/query
    PluginPanel->>APIService: sendToAI({ query, variables, graphqlResponse })
    APIService->>APIService: getChatModel(provider)
    alt Provider is "google"
        APIService->>GoogleGenAI: Send prompt and context
        GoogleGenAI-->>APIService: AI response
    else Provider is "openai"
        APIService->>OpenAI: Send prompt and context
        OpenAI-->>APIService: AI response
    else Provider is "anthropic"
        APIService->>Anthropic: Send prompt and context
        Anthropic-->>APIService: AI response
    else Provider is "ollama"
        APIService->>Ollama: Send prompt and context
        Ollama-->>APIService: AI response
    end
    APIService->>PluginPanel: Returns AI response
    PluginPanel->>User: Displays AI answer
```

## Poem

> In the warren of code where the queries grow,
> A new AI hops in, with a Gemini glow!
> Now Google can answer, with context in tow,
> Thanks to prompts that adapt, and responses that flow.
> With fresh dependencies and types that expand,
> Altair’s AI helpers are smarter and grand.
> 🐇✨

<!-- walkthrough_end -->
<!-- This is an auto-generated comment: all tool run failures by coderabbit.ai -->

> [!WARNING]
> There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.
> 
> <details>
> <summary>🔧 ESLint</summary>
> 
> > If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.
> 
> <details>
> <summary>packages/altair-api/src/ai/ai.service.ts</summary>
> 
> 
> Oops! Something went wrong! :(
> 
> ESLint: 8.18.0
> 
> ESLint couldn't find the plugin "@typescript-eslint/eslint-plugin".
> 
> (The package "@typescript-eslint/eslint-plugin" was not found when loaded as a Node module from the directory "/packages/altair-api".)
> 
> It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:
> 
>     npm install @typescript-eslint/eslint-plugin@latest --save-dev
> 
> The plugin "@typescript-eslint/eslint-plugin" was referenced from the config file in "packages/altair-api/.eslintrc.js".
> 
> If you still can't figure out the problem, please stop by https://eslint.org/chat/help to chat with the team.
> 
> 
> </details>
> 
> <details>
> <summary>packages/altair-api/src/ai/prompt.ts</summary>
> 
> 
> Oops! Something went wrong! :(
> 
> ESLint: 8.18.0
> 
> ESLint couldn't find the plugin "@typescript-eslint/eslint-plugin".
> 
> (The package "@typescript-eslint/eslint-plugin" was not found when loaded as a Node module from the directory "/packages/altair-api".)
> 
> It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:
> 
>     npm install @typescript-eslint/eslint-plugin@latest --save-dev
> 
> The plugin "@typescript-eslint/eslint-plugin" was referenced from the config file in "packages/altair-api/.eslintrc.js".
> 
> If you still can't figure out the problem, please stop by https://eslint.org/chat/help to chat with the team.
> 
> 
> </details>
> 
> <details>
> <summary>packages/altair-api/src/ai/dto/send-message.dto.ts</summary>
> 
> 
> Oops! Something went wrong! :(
> 
> ESLint: 8.18.0
> 
> ESLint couldn't find the plugin "@typescript-eslint/eslint-plugin".
> 
> (The package "@typescript-eslint/eslint-plugin" was not found when loaded as a Node module from the directory "/packages/altair-api".)
> 
> It's likely that the plugin isn't installed correctly. Try reinstalling by running the following:
> 
>     npm install @typescript-eslint/eslint-plugin@latest --save-dev
> 
> The plugin "@typescript-eslint/eslint-plugin" was referenced from the config file in "packages/altair-api/.eslintrc.js".
> 
> If you still can't figure out the problem, please stop by https://eslint.org/chat/help to chat with the team.
> 
> 
> </details>
> 
> + 6 others
> 
> </details>

<!-- end of auto-generated comment: all tool run failures by coderabbit.ai -->

<!-- announcements_start -->

> [!TIP]
> <details>
> <summary>⚡💬 Agentic Chat (Pro Plan, General Availability)</summary>
> 
> - We're introducing multi-step agentic chat in review comments and issue comments, within and outside of PR's. This feature enhances review and issue discussions with the CodeRabbit agentic chat by enabling advanced interactions, including the ability to create pull requests directly from comments and add commits to existing pull requests.
> 
> </details>

<!-- announcements_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details>
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=altair-graphql/altair&utm_content=2811):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-19T19:22:32Z
body: Visit the preview URL for this PR (updated for commit 5823474):

[https://altair-gql--pr2811-imolorhe-add-gemini-gctlsmlx.web.app](https://altair-gql--pr2811-imolorhe-add-gemini-gctlsmlx.web.app)

<sub>(expires Sat, 26 Apr 2025 19:22:26 GMT)</sub>

<sub>🔥 via [Firebase Hosting GitHub Action](https://github.com/marketplace/actions/deploy-to-firebase-hosting) 🌎</sub>

<sub>Sign: 02d6323d75a99e532a38922862e269d63351a6cf</sub>
author_association: NONE