Repository: langchain-ai/langchainjs
Pull request #7921: feat(community): Add WatsonxToolkit to IBM implemenation
Author: login: FilipZmijewski
Labels: name: size:XL
description: This PR changes 500-999 lines, ignoring generated files.
Created: 2025-03-28T18:17:02Z | Merged: 2025-03-30T02:09:49Z

<!--
Thank you for contributing to LangChain.js! Your PR will appear in our next release under the title you set above. Please make sure it highlights your valuable contribution.

To help streamline the review process, please make sure you read our contribution guidelines:
https://github.com/langchain-ai/langchainjs/blob/main/CONTRIBUTING.md

If you are adding an integration (e.g. a new LLM, vector store, or memory), please also read our additional guidelines for integrations:
https://github.com/langchain-ai/langchainjs/blob/main/.github/contributing/INTEGRATIONS.md

Replace this block with a description of the change, the issue it fixes (if applicable), and relevant context.

Finally, we'd love to show appreciation for your contribution - if you'd like us to shout you out on Twitter, please also include your handle below!
-->

<!-- Remove if not applicable -->

Introducing toolkit with Watsonx tools


Diff:
diff --git a/docs/core_docs/docs/integrations/toolkits/ibm.ipynb b/docs/core_docs/docs/integrations/toolkits/ibm.ipynb
new file mode 100644
index 000000000000..a563c7a3ea0b
--- /dev/null
+++ b/docs/core_docs/docs/integrations/toolkits/ibm.ipynb
@@ -0,0 +1,308 @@
+{
+ "cells": [
+  {
+   "cell_type": "raw",
+   "id": "afaf8039",
+   "metadata": {
+    "vscode": {
+     "languageId": "raw"
+    }
+   },
+   "source": [
+    "---\n",
+    "sidebar_label: WatsonxToolkit\n",
+    "---"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e49f1e0d",
+   "metadata": {},
+   "source": [
+    "# WatsonxToolkit\n",
+    "\n",
+    "This will help you getting started with the [WatsonxToolkit](/docs/concepts/#toolkits). For detailed documentation of all WatsonxToolkit features and configurations head to the [API reference](https://v03.api.js.langchain.com/classes/_langchain_community.agents_toolkits_ibm.html).\n",
+    "\n",
+    "The toolkit contains following tools:\n",
+    "\n",
+    "| Name | Description |\n",
+    "| ---- | ----------- |\n",
+    "| `GoogleSearch` | Search for online trends, news, current events, real-time information, or research topics. |\n",
+    "| `WebCrawler` | Useful for when you need to summarize a webpage. Do not use for Web search. |\n",
+    "| `PythonInterpreter` | Run Python code generated by the agent model. |\n",
+    "| `SDXLTurbo` | Generate an image from text using Stability.ai |\n",
+    "| `Weather` | Find the weather for a city. |\n",
+    "| `RAGQuery` | Search the documents in a vector index. |\n",
+    "\n",
+    "\n",
+    "### Integration details\n",
+    "\n",
+    "| Class | Package | [PY support](https://python.langchain.com/docs/integrations/tools/ibm_watsonx/) | Package latest |\n",
+    "| :--- | :--- | :---: | :---: |\n",
+    "| [WatsonxToolkit](https://api.js.langchain.com/classes/_langchain_community.agents_toolkits_ibm.WatsonxToolkit.html) | [`@langchain/community`](https://www.npmjs.com/package/@langchain/community) | ✅ |  ![NPM - Version](https://img.shields.io/npm/v/@langchain/community?style=flat-square&label=%20&) |\n",
+    "\n",
+    "## Setup\n",
+    "\n",
+    "If you want to get automated tracing from runs of individual tools, you can also set your [LangSmith](https://docs.smith.langchain.com/) API key by uncommenting below:\n",
+    "\n",
+    "```typescript\n",
+    "process.env.LANGSMITH_TRACING=\"true\"\n",
+    "process.env.LANGSMITH_API_KEY=\"your-api-key\"\n",
+    "```\n",
+    "\n",
+    "### Installation\n",
+    "\n",
+    "This toolkit lives in the `@langchain/community` package:\n",
+    "\n",
+    "```{=mdx}\n",
+    "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n",
+    "import Npm2Yarn from \"@theme/Npm2Yarn\";\n",
+    "\n",
+    "<IntegrationInstallTooltip></IntegrationInstallTooltip>\n",
+    "\n",
+    "<Npm2Yarn>\n",
+    "  @langchain/community @langchain/core\n",
+    "</Npm2Yarn>\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a38cde65-254d-4219-a441-068766c0d4b5",
+   "metadata": {},
+   "source": [
+    "## Instantiation\n",
+    "\n",
+    "Now we can instantiate our toolkit:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "cb09c344-1836-4e0c-acf8-11d13ac1dbae",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[Module: null prototype] { default: {} }"
+      ]
+     },
+     "execution_count": 1,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "import { WatsonxToolkit } from \"@langchain/community/agents/toolkits/ibm\";\n",
+    "import \"dotenv/config\"\n",
+    "\n",
+    "const toolkit = await WatsonxToolkit.init({\n",
+    "  version: '2024-05-31',\n",
+    "  serviceUrl: process.env.WATSONX_AI_SERVICE_URL\n",
+    "});"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5c5f2839-4020-424e-9fc9-07777eede442",
+   "metadata": {},
+   "source": [
+    "## Tools\n",
+    "\n",
+    "View available tools:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "51a60dbe-9f2e-4e04-bb62-23968f17164a",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[\n",
+      "  {\n",
+      "    name: \"GoogleSearch\",\n",
+      "    description: \"Search for online trends, news, current events, real-time information, or research topics.\"\n",
+      "  },\n",
+      "  {\n",
+      "    name: \"WebCrawler\",\n",
+      "    description: \"Useful for when you need to summarize a webpage. Do not use for Web search.\"\n",
+      "  },\n",
+      "  {\n",
+      "    name: \"PythonInterpreter\",\n",
+      "    description: \"Run Python code generated by the agent model.\"\n",
+      "  },\n",
+      "  {\n",
+      "    name: \"SDXLTurbo\",\n",
+      "    description: \"Generate an image from text using Stability.ai\"\n",
+      "  },\n",
+      "  { name: \"Weather\", description: \"Find the weather for a city.\" },\n",
+      "  {\n",
+      "    name: \"RAGQuery\",\n",
+      "    description: \"Search the documents in a vector index.\"\n",
+      "  }\n",
+      "]\n"
+     ]
+    }
+   ],
+   "source": [
+    "const tools = toolkit.getTools();\n",
+    "\n",
+    "console.log(tools.map((tool) => ({\n",
+    "  name: tool.name,\n",
+    "  description: tool.description,\n",
+    "})))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d11245ad-3661-4405-8558-1188896347ec",
+   "metadata": {},
+   "source": [
+    "For detailed info about tools please visit [watsonx.ai API docs](https://cloud.ibm.com/apidocs/watsonx-ai#get-utility-agent-tools)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "dfe8aad4-8626-4330-98a9-7ea1ca5d2e0e",
+   "metadata": {},
+   "source": [
+    "## Use within an agent\n",
+    "\n",
+    "First, ensure you have LangGraph installed:\n",
+    "\n",
+    "```{=mdx}\n",
+    "<Npm2Yarn>\n",
+    "  @langchain/langgraph\n",
+    "</Npm2Yarn>\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "c6d2ca9c",
+   "metadata": {},
+   "source": [
+    "Then, instanciate your LLM to be used in the React agent:\n",
+    "\n",
+    "```{=mdx}\n",
+    "import ChatModelTabs from \"@theme/ChatModelTabs\";\n",
+    "\n",
+    "<ChatModelTabs customVarName=\"llm\" />\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "5af22142",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "// @lc-docs-hide-cell\n",
+    "\n",
+    "import { ChatWatsonx } from \"@langchain/community/chat_models/ibm\";\n",
+    "\n",
+    "const llm = new ChatWatsonx({\n",
+    "  version: '2024-05-31',\n",
+    "  serviceUrl: process.env.WATSONX_AI_SERVICE_URL,\n",
+    "  model: 'ibm/granite-3-8b-instruct',\n",
+    "  projectId: process.env.WATSONX_AI_PROJECT_ID\n",
+    "});"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "310bf18e-6c9a-4072-b86e-47bc1fcca29d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import { createReactAgent } from \"@langchain/langgraph/prebuilt\"\n",
+    "\n",
+    "const agent = createReactAgent({ llm, tools });"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "23e11cc9-abd6-4855-a7eb-799f45ca01ae",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Who won F1 championship in 2022?\n",
+      "[\n",
+      "  {\n",
+      "    name: \"GoogleSearch\",\n",
+      "    args: { input: \"F1 championship 2022\" },\n",
+      "    type: \"tool_call\",\n",
+      "    id: \"chatcmpl-tool-9da3456b9bbc475fb822296fdb8353a8\"\n",
+      "  }\n",
+      "]\n",
+      "[{\"title\":\"2022 DRIVER STANDINGS\",\"description\":\"Official F1® Race Programme · Modern Slavery Statement; Do Not Sell or Share My Personal Information. Formula 1. © 2003-2025 Formula One World Championship ...\",\"url\":\"https://www.formula1.com/en/results/2022/drivers\"},{\"title\":\"2022 Formula One World Championship - Wikipedia\",\"description\":\"2022 Formula One World Championship · Max Verstappen won his second consecutive World Drivers' Championship driving for Red Bull Racing. · Charles Leclerc ...\",\"url\":\"https://en.wikipedia.org/wiki/2022_Formula_One_World_Championship\"},{\"title\":\"2022 Formula One World Championship - Simple English Wikipedia ...\",\"description\":\"Max Verstappen, who was the reigning Drivers' Champion, claimed his second title at the Japanese Grand Prix, while his team, Red Bull Racing, achieved their ...\",\"url\":\"https://simple.wikipedia.org/wiki/2022_Formula_One_World_Championship\"},{\"title\":\"Max Verstappen wins the 2022 F1 Drivers World Championship : r ...\",\"description\":\"Oct 9, 2022 ... One day this guy will win a championship just by finishing the race and celebrating with a world championship lap on the day he won.\",\"url\":\"https://www.reddit.com/r/sports/comments/xzg8pf/max_verstappen_wins_the_2022_f1_drivers_world/\"},{\"title\":\"Red Bull Simulator Championship Edition | F1 Authentics\",\"description\":\"Based on the livery of the 2022 Oracle Red Bull Racing Championship-winning RB18, this F1 simulator has been expertly engineered and manufactured by Memento ...\",\"url\":\"https://www.f1authentics.com/products/red-bull-simulator-championship-edition\"},{\"title\":\"F1 2022 Drivers Championship without Max Verstappen : r/formula1\",\"description\":\"Nov 26, 2022 ... 1.1K votes, 65 comments. 5.2M subscribers in the formula1 community. Welcome to r/Formula1, the best independent online Formula 1 community!\",\"url\":\"https://www.reddit.com/r/formula1/comments/z5cwl7/f1_2022_drivers_championship_without_max/\"},{\"title\":\"F1® Sim Racing World Championship 2022\",\"description\":\"World Championship 2022 Bahrain International Circuit Bahrain International Circuit Race Distance: 29 laps Track Length: 5.412 km\",\"url\":\"https://f1esports.com/world/results/2022\"},{\"title\":\"Our personal F1 2022 Predictions Championship : r/formula1\",\"description\":\"May 5, 2022 ... F1 2025 Driver Predictions from mathematical model. Leclerc and Sainz predicted to beat Hamilton and Albon. r/formula1 - F1 2025 Driver ...\",\"url\":\"https://www.reddit.com/r/formula1/comments/uitbbu/our_personal_f1_2022_predictions_championship/\"},{\"title\":\"Haas F1 Team Esports announces roster for 2022 F1 Esports Series ...\",\"description\":\"Sep 13, 2022 ... Haas F1 Team is ready to commence battle in the 2022 F1 Esports Series Pro Championship featuring an updated line-up for this season.\",\"url\":\"https://www.haasf1team.com/news/haas-f1-team-esports-announces-roster-2022-f1-esports-series-pro-championship\"},{\"title\":\"2022 F1 Deconstructors Championship : r/formula1\",\"description\":\"Nov 22, 2022 ... Congratulations to our 2022 champion Carlos Sainz. Alonso put in a late surge but had to settle for second place. Alfa put in the best effort ...\",\"url\":\"https://www.reddit.com/r/formula1/comments/z1pkkx/2022_f1_deconstructors_championship/\"}]\n",
+      "Max Verstappen won the 2022 F1 Championship, driving for Red Bull Racing. He claimed his second title at the Japanese Grand Prix.\n"
+     ]
+    }
+   ],
+   "source": [
+    "const exampleQuery = \"Who won F1 championship in 2022?\"\n",
+    "\n",
+    "const events = await agent.stream(\n",
+    "  { messages: [{ role: \"user\", content: exampleQuery }]},\n",
+    "  { streamMode: \"values\", }\n",
+    ")\n",
+    "\n",
+    "for await (const event of events) {\n",
+    "  const lastMsg = event.messages[event.messages.length - 1];\n",
+    "  if (lastMsg.tool_calls?.length) {\n",
+    "    console.dir(lastMsg.tool_calls, { depth: null });\n",
+    "  } else if (lastMsg.content) {\n",
+    "    console.log(lastMsg.content);\n",
+    "  }\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3a5bb5ca-c3ae-4a58-be67-2cd18574b9a3",
+   "metadata": {},
+   "source": [
+    "## API reference\n",
+    "\n",
+    "For detailed documentation of all `WatsonxToolkit` features and configurations head to the [API\n",
+    " reference](https://api.js.langchain.com/classes/_langchain_community.agents_toolkits_ibm.html)."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0e50eb1c",
+   "metadata": {},
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Deno",
+   "language": "typescript",
+   "name": "deno"
+  },
+  "language_info": {
+   "codemirror_mode": "typescript",
+   "file_extension": ".ts",
+   "mimetype": "text/x.typescript",
+   "name": "typescript",
+   "nbconvert_exporter": "script",
+   "pygments_lexer": "typescript",
+   "version": "5.6.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/libs/langchain-community/.gitignore b/libs/langchain-community/.gitignore
index 94160f30ea7c..1bee20f7b191 100644
--- a/libs/langchain-community/.gitignore
+++ b/libs/langchain-community/.gitignore
@@ -130,6 +130,10 @@ agents/toolkits/connery.cjs
 agents/toolkits/connery.js
 agents/toolkits/connery.d.ts
 agents/toolkits/connery.d.cts
+agents/toolkits/ibm.cjs
+agents/toolkits/ibm.js
+agents/toolkits/ibm.d.ts
+agents/toolkits/ibm.d.cts
 agents/toolkits/stagehand.cjs
 agents/toolkits/stagehand.js
 agents/toolkits/stagehand.d.ts
diff --git a/libs/langchain-community/langchain.config.js b/libs/langchain-community/langchain.config.js
index 9ebb25d66426..9cffa9169885 100644
--- a/libs/langchain-community/langchain.config.js
+++ b/libs/langchain-community/langchain.config.js
@@ -67,6 +67,7 @@ export const config = {
     "agents/toolkits/aws_sfn": "agents/toolkits/aws_sfn",
     "agents/toolkits/base": "agents/toolkits/base",
     "agents/toolkits/connery": "agents/toolkits/connery/index",
+    "agents/toolkits/ibm": "agents/toolkits/ibm",
     "agents/toolkits/stagehand": "agents/toolkits/stagehand",
     // embeddings
     "embeddings/alibaba_tongyi": "embeddings/alibaba_tongyi",
@@ -293,7 +294,8 @@ export const config = {
     "document_loaders/web/playwright": "document_loaders/web/playwright",
     "document_loaders/web/college_confidential":
       "document_loaders/web/college_confidential",
-    "document_loaders/web/google_cloud_storage": "document_loaders/web/google_cloud_storage",
+    "document_loaders/web/google_cloud_storage":
+      "document_loaders/web/google_cloud_storage",
     "document_loaders/web/gitbook": "document_loaders/web/gitbook",
     "document_loaders/web/hn": "document_loaders/web/hn",
     "document_loaders/web/imsdb": "document_loaders/web/imsdb",
@@ -356,6 +358,7 @@ export const config = {
     "tools/gmail",
     "tools/google_calendar",
     "agents/toolkits/aws_sfn",
+    "agents/toolkits/ibm",
     "agents/toolkits/stagehand",
     "callbacks/handlers/llmonitor",
     "callbacks/handlers/lunary",
diff --git a/libs/langchain-community/package.json b/libs/langchain-community/package.json
index 697315495db1..6fcf0d47c626 100644
--- a/libs/langchain-community/package.json
+++ b/libs/langchain-community/package.json
@@ -80,7 +80,7 @@
     "@gradientai/nodejs-sdk": "^1.2.0",
     "@huggingface/inference": "^2.6.4",
     "@huggingface/transformers": "^3.2.3",
-    "@ibm-cloud/watsonx-ai": "^1.4.0",
+    "@ibm-cloud/watsonx-ai": "^1.6.4",
     "@jest/globals": "^29.5.0",
     "@lancedb/lancedb": "^0.13.0",
     "@langchain/core": "workspace:*",
@@ -1025,6 +1025,15 @@
       "import": "./agents/toolkits/connery.js",
       "require": "./agents/toolkits/connery.cjs"
     },
+    "./agents/toolkits/ibm": {
+      "types": {
+        "import": "./agents/toolkits/ibm.d.ts",
+        "require": "./agents/toolkits/ibm.d.cts",
+        "default": "./agents/toolkits/ibm.d.ts"
+      },
+      "import": "./agents/toolkits/ibm.js",
+      "require": "./agents/toolkits/ibm.cjs"
+    },
     "./agents/toolkits/stagehand": {
       "types": {
         "import": "./agents/toolkits/stagehand.d.ts",
@@ -3393,6 +3402,10 @@
     "agents/toolkits/connery.js",
     "agents/toolkits/connery.d.ts",
     "agents/toolkits/connery.d.cts",
+    "agents/toolkits/ibm.cjs",
+    "agents/toolkits/ibm.js",
+    "agents/toolkits/ibm.d.ts",
+    "agents/toolkits/ibm.d.cts",
     "agents/toolkits/stagehand.cjs",
     "agents/toolkits/stagehand.js",
     "agents/toolkits/stagehand.d.ts",
diff --git a/libs/langchain-community/src/agents/toolkits/ibm.ts b/libs/langchain-community/src/agents/toolkits/ibm.ts
new file mode 100644
index 000000000000..c49fdbffc69d
--- /dev/null
+++ b/libs/langchain-community/src/agents/toolkits/ibm.ts
@@ -0,0 +1,145 @@
+import {
+  WatsonXAI,
+  convertUtilityToolToWatsonxTool,
+} from "@ibm-cloud/watsonx-ai";
+import {
+  BaseToolkit,
+  StructuredTool,
+  StructuredToolInterface,
+} from "@langchain/core/tools";
+import { z } from "zod";
+import {
+  authenticateAndSetInstance,
+  jsonSchemaToZod,
+} from "../../utils/ibm.js";
+import { WatsonxAuth, WatsonxInit } from "../../types/ibm.js";
+
+export interface WatsonxToolParams {
+  name: string;
+  description: string;
+  schema?: Record<string, any>;
+  service?: WatsonXAI;
+  configSchema?: Record<string, any>;
+}
+
+export class WatsonxTool extends StructuredTool implements WatsonxToolParams {
+  name: string;
+
+  description: string;
+
+  service: WatsonXAI;
+
+  schema: z.ZodObject<any>;
+
+  configSchema?: z.ZodObject<any>;
+
+  toolConfig?: Record<string, any>;
+
+  constructor(
+    fields: WatsonXAI.TextChatParameterFunction,
+    service: WatsonXAI,
+    configSchema?: WatsonXAI.JsonObject
+  ) {
+    super();
+
+    this.name = fields?.name;
+    this.description = fields?.description || "";
+    this.schema = jsonSchemaToZod(fields?.parameters);
+    this.configSchema = configSchema
+      ? jsonSchemaToZod(configSchema)
+      : undefined;
+
+    this.service = service;
+  }
+
+  protected async _call(inputObject: Record<string, any>): Promise<string> {
+    const { input } = inputObject;
+    const response = await this.service.runUtilityAgentToolByName({
+      toolId: this.name,
+      wxUtilityAgentToolsRunRequest: {
+        input: input ?? inputObject,
+        tool_name: this.name,
+        config: this.toolConfig,
+      },
+    });
+
+    const result = response?.result.output;
+    return new Promise((resolve) => {
+      resolve(result ?? "Sorry, the tool did not work as expected");
+    });
+  }
+
+  set config(config: Record<string, any>) {
+    if (!this.configSchema) {
+      this.toolConfig = config;
+      return;
+    }
+    const result = this.configSchema.safeParse(config);
+    if (!result.success) console.warn(result.error.message);
+    this.toolConfig = result.data;
+  }
+}
+
+export class WatsonxToolkit extends BaseToolkit {
+  tools: WatsonxTool[];
+
+  service: WatsonXAI;
+
+  constructor(fields: WatsonxAuth & WatsonxInit) {
+    super();
+    const {
+      watsonxAIApikey,
+      watsonxAIAuthType,
+      watsonxAIBearerToken,
+      watsonxAIUsername,
+      watsonxAIPassword,
+      watsonxAIUrl,
+      version,
+      serviceUrl,
+    } = fields;
+
+    const auth = authenticateAndSetInstance({
+      watsonxAIApikey,
+      watsonxAIAuthType,
+      watsonxAIBearerToken,
+      watsonxAIUsername,
+      watsonxAIPassword,
+      watsonxAIUrl,
+      version,
+      serviceUrl,
+    });
+    if (auth) this.service = auth;
+  }
+
+  async loadTools() {
+    const { result: tools } = await this.service.listUtilityAgentTools();
+    this.tools = tools.resources
+      .map((tool) => {
+        const { function: watsonxTool } = convertUtilityToolToWatsonxTool(tool);
+        if (watsonxTool)
+          return new WatsonxTool(watsonxTool, this.service, tool.config_schema);
+        else return undefined;
+      })
+      .filter((item): item is WatsonxTool => item !== undefined);
+  }
+
+  static async init(props: WatsonxAuth & WatsonxInit) {
+    const instance = new WatsonxToolkit({ ...props });
+    await instance.loadTools();
+    return instance;
+  }
+
+  getTools(): StructuredToolInterface[] {
+    return this.tools;
+  }
+
+  getTool(toolName: string, config?: Record<string, any>) {
+    const selectedTool = this.tools.find((item) => item.name === toolName);
+    if (!selectedTool)
+      throw new Error("Tool with provided name does not exist");
+    if (config) {
+      selectedTool.config = config;
+    }
+    return selectedTool;
+  }
+}
diff --git a/libs/langchain-community/src/agents/toolkits/tests/ibm.int.test.ts b/libs/langchain-community/src/agents/toolkits/tests/ibm.int.test.ts
new file mode 100644
index 000000000000..b338e0babad1
--- /dev/null
+++ b/libs/langchain-community/src/agents/toolkits/tests/ibm.int.test.ts
@@ -0,0 +1,192 @@
+/* eslint-disable no-process-env */
+import {
+  convertUtilityToolToWatsonxTool,
+  WatsonXAI,
+} from "@ibm-cloud/watsonx-ai";
+import { WatsonxTool, WatsonxToolkit } from "../ibm.js";
+
+const serviceUrl = process.env.WATSONX_AI_SERVICE_URL as string;
+describe("Tool class tests", () => {
+  describe("Positive tests", () => {
+    test("Invoke tool with json", async () => {
+      const service = WatsonXAI.newInstance({
+        serviceUrl,
+        version: "2024-05-31",
+      });
+      const tool = new WatsonxTool(
+        {
+          name: "Weather",
+          description: "Get the weather for a given location",
+          parameters: {
+            type: "object",
+            properties: {
+              location: {
+                title: "location",
+                description: "Name of the location",
+                type: "string",
+              },
+              country: {
+                title: "country",
+                description: "Name of the state or country",
+                type: "string",
+              },
+            },
+            required: ["location"],
+          },
+        },
+        service
+      );
+
+      const res = await tool.invoke({ location: "Krakow" });
+      expect(res).toBeDefined();
+    });
+    test("Invoke tool with tool_call", async () => {
+      const service = WatsonXAI.newInstance({
+        serviceUrl,
+        version: "2024-05-31",
+      });
+      const tool = new WatsonxTool(
+        {
+          name: "Weather",
+          description: "Get the weather for a given location",
+          parameters: {
+            type: "object",
+            properties: {
+              location: {
+                title: "location",
+                description: "Name of the location",
+                type: "string",
+              },
+              country: {
+                title: "country",
+                description: "Name of the state or country",
+                type: "string",
+              },
+            },
+            required: ["location"],
+          },
+        },
+        service
+      );
+      const toolCall = {
+        name: "Weather",
+        args: {
+          location: "Krakow",
+        },
+        type: "tool_call",
+        id: "ABCD12345",
+      };
+      const res = await tool.invoke(toolCall);
+      expect(res).toBeDefined();
+    });
+    test("Invoke tool with config", async () => {
+      const service = WatsonXAI.newInstance({
+        serviceUrl,
+        version: "2024-05-31",
+      });
+      const configSchema = {
+        title: "config schema for GoogleSearch tool",
+        type: "object",
+        properties: {
+          maxResults: {
+            title: "Max number of results to return",
+            type: "integer",
+            minimum: 1,
+            maximum: 20,
+            wx_ui_name: "Max results",
+            wx_ui_field_type: "numberInput",
+            wx_ui_default: 10,
+          },
+        },
+      };
+
+      const { function: watsonxTool } = convertUtilityToolToWatsonxTool({
+        name: "GoogleSearch",
+        description:
+          "Search for online trends, news, current events, real-time information, or research topics.",
+        agent_description:
+          "Search for online trends, news, current events, real-time information, or research topics.",
+        config_schema: configSchema,
+      });
+      if (!watsonxTool) throw new Error("Could parse a tool");
+
+      const tool = new WatsonxTool(watsonxTool, service, configSchema);
+      tool.config = { maxResults: 2 };
+
+      const res = await tool.invoke({ input: "Who won 2022 World Cup?" });
+      expect(JSON.parse(res).length).toBeLessThanOrEqual(2);
+    });
+  });
+});
+
+describe("Toolkit class tests", () => {
+  describe("Positive tests", () => {
+    test("Toolkit init", async () => {
+      const toolkit = await WatsonxToolkit.init({
+        version: "2024-05-31",
+        serviceUrl,
+      });
+      expect(toolkit).toBeInstanceOf(WatsonxToolkit);
+    });
+    test("Test method getTools", async () => {
+      const toolkit = await WatsonxToolkit.init({
+        version: "2024-05-31",
+        serviceUrl,
+      });
+      const testTools = toolkit.getTools();
+      testTools.map((tool) => expect(tool).toBeInstanceOf(WatsonxTool));
+    });
+    test("Test method getTool", async () => {
+      const toolkit = await WatsonxToolkit.init({
+        version: "2024-05-31",
+        serviceUrl,
+      });
+      const tool = toolkit.getTool("Weather");
+      expect(tool).toBeInstanceOf(WatsonxTool);
+    });
+    test("Tool call with config", async () => {
+      const toolkit = await WatsonxToolkit.init({
+        version: "2024-05-31",
+        serviceUrl,
+      });
+      const tool = toolkit.getTool("GoogleSearch", {
+        maxResults: 2,
+      });
+      const res = await tool?.invoke({
+        input: "Who won F1 in Melbourne 2025?",
+      });
+      const array = JSON.parse(res);
+      expect(array.length).toBeLessThanOrEqual(2);
+    });
+    test("Tool call with tool.config override getTool config", async () => {
+      const toolkit = await WatsonxToolkit.init({
+        version: "2024-05-31",
+        serviceUrl,
+      });
+      const tool = toolkit.getTool("GoogleSearch", {
+        maxResults: 4,
+      });
+      tool.config = {
+        maxResults: 2,
+      };
+      const res = await tool?.invoke({
+        input: "Who won F1 in Melbourne 2025?",
+      });
+      const array = JSON.parse(res);
+      expect(array.length).toBeLessThanOrEqual(2);
+    });
+  });
+  describe("Negative tests", () => {
+    test("getTools with not existing tool", async () => {
+      const toolkit = await WatsonxToolkit.init({
+        version: "2024-05-31",
+        serviceUrl,
+      });
+      try {
+        toolkit.getTool("iDoNotExist");
+      } catch (e: any) {
+        expect(e.message).toBe("Tool with provided name does not exist");
+      }
+    });
+  });
+});
diff --git a/libs/langchain-community/src/agents/toolkits/tests/ibm.test.ts b/libs/langchain-community/src/agents/toolkits/tests/ibm.test.ts
new file mode 100644
index 000000000000..50457ba5e1bf
--- /dev/null
+++ b/libs/langchain-community/src/agents/toolkits/tests/ibm.test.ts
@@ -0,0 +1,87 @@
+/* eslint-disable no-process-env */
+/* eslint-disable no-new */
+import {
+  WatsonXAI,
+  convertUtilityToolToWatsonxTool,
+} from "@ibm-cloud/watsonx-ai";
+import WatsonxAiMlVml_v1 from "@ibm-cloud/watsonx-ai/dist/watsonx-ai-ml/vml_v1.js";
+import { WatsonxTool } from "../ibm.js";
+
+const service = {} as WatsonxAiMlVml_v1;
+
+describe("Tool class tests", () => {
+  describe("Positive tests", () => {
+    test("Init tool", async () => {
+      const tool = new WatsonxTool(
+        {
+          name: "Weather",
+          description: "Get the weather for a given location",
+          parameters: {
+            type: "object",
+            properties: {
+              location: {
+                title: "location",
+                description: "Name of the location",
+                type: "string",
+              },
+              country: {
+                title: "country",
+                description: "Name of the state or country",
+                type: "string",
+              },
+            },
+            required: ["name"],
+          },
+        },
+        service
+      );
+      expect(tool).toBeInstanceOf(WatsonxTool);
+    });
+    test("Pass config to tool", async () => {
+      const configSchema = {
+        title: "config schema for GoogleSearch tool",
+        type: "object",
+        properties: {
+          maxResults: {
+            title: "Max number of results to return",
+            type: "integer",
+            minimum: 1,
+            maximum: 20,
+            wx_ui_name: "Max results",
+            wx_ui_field_type: "numberInput",
+            wx_ui_default: 10,
+          },
+        },
+      };
+      let { function: watsonxTool } = convertUtilityToolToWatsonxTool({
+        name: "GoogleSearch",
+        description:
+          "Search for online trends, news, current events, real-time information, or research topics.",
+        agent_description:
+          "Search for online trends, news, current events, real-time information, or research topics.",
+        config_schema: configSchema,
+      });
+      expect(watsonxTool).toBeDefined();
+      watsonxTool = watsonxTool as WatsonXAI.TextChatParameterFunction;
+      const tool = new WatsonxTool(watsonxTool, service, configSchema);
+      tool.config = { maxResults: 5, invalidResult: 10 };
+      expect(tool.toolConfig).toBeDefined();
+      expect(tool.toolConfig?.maxResults).toBe(5);
+      expect(tool.toolConfig?.invalidResult).toBeUndefined();
+    });
+  });
+  describe("Negative tests", () => {
+    test("Init tool with invalid schema", async () => {
+      try {
+        new WatsonxTool(
+          {
+            name: "Weather",
+          },
+          service
+        );
+      } catch (e: any) {
+        expect(e.message).toBe("Unsupported root schema type");
+      }
+    });
+  });
+});
diff --git a/libs/langchain-community/src/chat_models/ibm.ts b/libs/langchain-community/src/chat_models/ibm.ts
index 61e8ff3ba6df..33eaf0bd10df 100644
--- a/libs/langchain-community/src/chat_models/ibm.ts
+++ b/libs/langchain-community/src/chat_models/ibm.ts
@@ -88,7 +88,7 @@ export interface WatsonxDeltaStream {
 
 export interface WatsonxCallParams
   extends Partial<
-    Omit<TextChatParams, "modelId" | "toolChoice" | "messages" | "headers">
+    Omit<TextChatParams, "modelId" | "toolChoice" | "messages">
   > {}
 
 export interface WatsonxCallDeployedParams extends DeploymentsTextChatParams {}
@@ -115,7 +115,7 @@ export interface ChatWatsonxInput
   extends BaseChatModelParams,
     WatsonxParams,
     WatsonxCallParams,
-    Neverify<Omit<DeploymentsTextChatParams, "signal">> {}
+    Neverify<Omit<DeploymentsTextChatParams, "signal" | "headers">> {}
 
 export interface ChatWatsonxDeployedInput
   extends BaseChatModelParams,
diff --git a/libs/langchain-community/src/load/import_constants.ts b/libs/langchain-community/src/load/import_constants.ts
index 8466bbd3e8ee..de6eaf250b3a 100644
--- a/libs/langchain-community/src/load/import_constants.ts
+++ b/libs/langchain-community/src/load/import_constants.ts
@@ -8,6 +8,7 @@ export const optionalImportEntrypoints: string[] = [
   "langchain_community/tools/gmail",
   "langchain_community/tools/google_calendar",
   "langchain_community/agents/toolkits/aws_sfn",
+  "langchain_community/agents/toolkits/ibm",
   "langchain_community/agents/toolkits/stagehand",
   "langchain_community/embeddings/bedrock",
   "langchain_community/embeddings/cloudflare_workersai",
diff --git a/libs/langchain-community/src/utils/ibm.ts b/libs/langchain-community/src/utils/ibm.ts
index 8786a0263198..d356c74ebdc5 100644
--- a/libs/langchain-community/src/utils/ibm.ts
+++ b/libs/langchain-community/src/utils/ibm.ts
@@ -200,3 +200,55 @@ export class WatsonxToolsOutputParser<
     return tool.args as T;
   }
 }
+
+export function jsonSchemaToZod(obj: WatsonXAI.JsonObject | undefined) {
+  if (obj?.properties && obj.type === "object") {
+    const shape: Record<string, any> = {};
+
+    Object.keys(obj.properties).forEach((key) => {
+      if (obj.properties) {
+        const prop = obj.properties[key];
+
+        let zodType;
+        if (prop.type === "string") {
+          zodType = z.string();
+          if (prop?.pattern) {
+            zodType = zodType.regex(prop.pattern, "Invalid pattern");
+          }
+        } else if (
+          prop.type === "number" ||
+          prop.type === "integer" ||
+          prop.type === "float"
+        ) {
+          zodType = z.number();
+          if (typeof prop?.minimum === "number") {
+            zodType = zodType.min(prop.minimum, {
+              message: `${key} must be at least ${prop.minimum}`,
+            });
+          }
+          if (prop?.maximum)
+            zodType = zodType.lte(prop.maximum, {
+              message: `${key} must be maximum of ${prop.maximum}`,
+            });
+        } else if (prop.type === "boolean") zodType = z.boolean();
+        else if (prop.type === "array")
+          zodType = z.array(jsonSchemaToZod(prop.items));
+        else if (prop.type === "object") {
+          zodType = jsonSchemaToZod(prop);
+        } else throw new Error(`Unsupported type: ${prop.type}`);
+
+        if (prop.description) {
+          zodType = zodType.describe(prop.description);
+        }
+
+        if (!obj.required?.includes(key)) {
+          zodType = zodType.optional();
+        }
+
+        shape[key] = zodType;
+      }
+    });
+    return z.object(shape);
+  }
+  throw new Error("Unsupported root schema type");
+}
diff --git a/yarn.lock b/yarn.lock
index 174b10be9ed5..a53c2061e8cc 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -7224,15 +7224,15 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@ibm-cloud/watsonx-ai@npm:^1.4.0":
-  version: 1.4.0
-  resolution: "@ibm-cloud/watsonx-ai@npm:1.4.0"
+"@ibm-cloud/watsonx-ai@npm:^1.6.4":
+  version: 1.6.4
+  resolution: "@ibm-cloud/watsonx-ai@npm:1.6.4"
   dependencies:
     "@langchain/textsplitters": ^0.1.0
     "@types/node": ^18.0.0
     extend: 3.0.2
-    ibm-cloud-sdk-core: ^5.0.2
-  checksum: 5250816f9ad93839cf26e3788eeace8155721765c39c65547eff8ebbd5fc8a0dfa107f6e799593f1209f4b3489be24aa674aa92b7ecbc5fc2bd29390a28e84ff
+    ibm-cloud-sdk-core: ^5.3.2
+  checksum: 995638aa134dd54da3694bdc20aab6563a87fb4fcdf5a88e5fe48ca4505c44954bc398f9a82904ef5091db61fa1ebc7b0f17c2a241227f8f37f4b94f202d46d3
   languageName: node
   linkType: hard
 
@@ -8456,7 +8456,7 @@ __metadata:
     "@gradientai/nodejs-sdk": ^1.2.0
     "@huggingface/inference": ^2.6.4
     "@huggingface/transformers": ^3.2.3
-    "@ibm-cloud/watsonx-ai": ^1.4.0
+    "@ibm-cloud/watsonx-ai": ^1.6.4
     "@jest/globals": ^29.5.0
     "@lancedb/lancedb": ^0.13.0
     "@langchain/core": "workspace:*"
@@ -14514,12 +14514,12 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@types/node@npm:^18.0.0":
-  version: 18.19.67
-  resolution: "@types/node@npm:18.19.67"
+"@types/node@npm:^18.0.0, @types/node@npm:^18.19.80":
+  version: 18.19.84
+  resolution: "@types/node@npm:18.19.84"
   dependencies:
     undici-types: ~5.26.4
-  checksum: 700f92c6a0b63352ce6327286392adab30bb17623c2a788811e9cf092c4dc2fb5e36ca4727247a981b3f44185fdceef20950a3b7a8ab72721e514ac037022a08
+  checksum: 2e04e0fb12b21c973412b52afdc6c2a718ec47710c69dc8c9582ec6229b0e1f692acbefd4c4d909f453e901087b62ff4c299a179fdba63a60c0d947e2b818967
   languageName: node
   linkType: hard
 
@@ -16990,6 +16990,17 @@ __metadata:
   languageName: node
   linkType: hard
 
+"axios@npm:^1.8.2":
+  version: 1.8.4
+  resolution: "axios@npm:1.8.4"
+  dependencies:
+    follow-redirects: ^1.15.6
+    form-data: ^4.0.0
+    proxy-from-env: ^1.1.0
+  checksum: e901dc1730bdcd769839b3d93ae6d6457a53d79b19a0eb623ebfea333441259ab51e63ca118baa47a5156567401466ac739f31087b4ee5e6770ab2e227484538
+  languageName: node
+  linkType: hard
+
 "axobject-query@npm:^3.1.1, axobject-query@npm:^3.2.1":
   version: 3.2.1
   resolution: "axobject-query@npm:3.2.1"
@@ -25664,6 +25675,29 @@ __metadata:
   languageName: node
   linkType: hard
 
+"ibm-cloud-sdk-core@npm:^5.3.2":
+  version: 5.3.2
+  resolution: "ibm-cloud-sdk-core@npm:5.3.2"
+  dependencies:
+    "@types/debug": ^4.1.12
+    "@types/node": ^18.19.80
+    "@types/tough-cookie": ^4.0.0
+    axios: ^1.8.2
+    camelcase: ^6.3.0
+    debug: ^4.3.4
+    dotenv: ^16.4.5
+    extend: 3.0.2
+    file-type: 16.5.4
+    form-data: 4.0.0
+    isstream: 0.1.2
+    jsonwebtoken: ^9.0.2
+    mime-types: 2.1.35
+    retry-axios: ^2.6.0
+    tough-cookie: ^4.1.3
+  checksum: b5c85a946d7ad6882a17ed6a01bdbbd5a645ff63daaa721b6641970dd9ac5e76bcb3279d66a9d8537ed38a111d6f9d175a571526667dab601ea61f41ab51cbdf
+  languageName: node
+  linkType: hard
+
 "iconv-lite@npm:0.4, iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.18, iconv-lite@npm:^0.4.24":
   version: 0.4.24
   resolution: "iconv-lite@npm:0.4.24"


Reviews:
user: login: jacoblee93
body: Thanks! I can patch docs nits
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-03-30T01:47:59Z

Review comments:
diff_hunk: @@ -0,0 +1,310 @@
+{
+ "cells": [
+  {
+   "cell_type": "raw",
+   "id": "afaf8039",
+   "metadata": {
+    "vscode": {
+     "languageId": "raw"
+    }
+   },
+   "source": [
+    "---\n",
+    "sidebar_label: __sidebar_label__ Toolkit\n",
+    "---"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e49f1e0d",
+   "metadata": {},
+   "source": [
+    "# WatsonxToolkit\n",
+    "\n",
+    "This will help you getting started with the [WatsonxToolkit](/docs/concepts/#toolkits). For detailed documentation of all WatsonxToolkit features and configurations head to the [API reference](https://v03.api.js.langchain.com/classes/_langchain_community.agents_toolkits_ibm.html).\n",
path: docs/core_docs/docs/integrations/toolkits/ibm.ipynb
user: login: jacoblee93
body: nit: drop the `v03` in the API ref URLs
created_at: 2025-03-30T01:44:20Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,310 @@
+{
+ "cells": [
+  {
+   "cell_type": "raw",
+   "id": "afaf8039",
+   "metadata": {
+    "vscode": {
+     "languageId": "raw"
+    }
+   },
+   "source": [
+    "---\n",
+    "sidebar_label: __sidebar_label__ Toolkit\n",
+    "---"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e49f1e0d",
+   "metadata": {},
+   "source": [
+    "# WatsonxToolkit\n",
+    "\n",
+    "This will help you getting started with the [WatsonxToolkit](/docs/concepts/#toolkits). For detailed documentation of all WatsonxToolkit features and configurations head to the [API reference](https://v03.api.js.langchain.com/classes/_langchain_community.agents_toolkits_ibm.html).\n",
+    "\n",
+    "The toolkit contains following tools:\n",
+    "\n",
+    "| Name | Description |\n",
+    "| ---- | ----------- |\n",
+    "| `GoogleSearch` | Search for online trends, news, current events, real-time information, or research topics. |\n",
+    "| `WebCrawler` | Useful for when you need to summarize a webpage. Do not use for Web search. |\n",
+    "| `PythonInterpreter` | Run Python code generated by the agent model. |\n",
+    "| `SDXLTurbo` | Generate an image from text using Stability.ai |\n",
+    "| `Weather` | Find the weather for a city. |\n",
+    "| `RAGQuery` | Search the documents in a vector index. |\n",
+    "\n",
+    "\n",
+    "### Integration details\n",
+    "\n",
+    "| Class | Package | [PY support](https://python.langchain.com/docs/integrations/tools/ibm_watsonx/) | Package latest |\n",
+    "| :--- | :--- | :---: | :---: |\n",
+    "| [WatsonxToolkit](https://v03.api.js.langchain.com/classes/_langchain_community.agents_toolkits_ibm.WatsonxToolkit.html) | [`@langchain/community`](https://www.npmjs.com/package/@langchain/community) | ✅ |  ![NPM - Version](https://img.shields.io/npm/v/@langchain/community?style=flat-square&label=%20&) |\n",
path: docs/core_docs/docs/integrations/toolkits/ibm.ipynb
user: login: jacoblee93
body: Here too
created_at: 2025-03-30T01:44:27Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,310 @@
+{
+ "cells": [
+  {
+   "cell_type": "raw",
+   "id": "afaf8039",
+   "metadata": {
+    "vscode": {
+     "languageId": "raw"
+    }
+   },
+   "source": [
+    "---\n",
+    "sidebar_label: __sidebar_label__ Toolkit\n",
+    "---"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e49f1e0d",
+   "metadata": {},
+   "source": [
+    "# WatsonxToolkit\n",
+    "\n",
+    "This will help you getting started with the [WatsonxToolkit](/docs/concepts/#toolkits). For detailed documentation of all WatsonxToolkit features and configurations head to the [API reference](https://v03.api.js.langchain.com/classes/_langchain_community.agents_toolkits_ibm.html).\n",
+    "\n",
+    "The toolkit contains following tools:\n",
+    "\n",
+    "| Name | Description |\n",
+    "| ---- | ----------- |\n",
+    "| `GoogleSearch` | Search for online trends, news, current events, real-time information, or research topics. |\n",
+    "| `WebCrawler` | Useful for when you need to summarize a webpage. Do not use for Web search. |\n",
+    "| `PythonInterpreter` | Run Python code generated by the agent model. |\n",
+    "| `SDXLTurbo` | Generate an image from text using Stability.ai |\n",
+    "| `Weather` | Find the weather for a city. |\n",
+    "| `RAGQuery` | Search the documents in a vector index. |\n",
+    "\n",
+    "\n",
+    "### Integration details\n",
+    "\n",
+    "| Class | Package | [PY support](https://python.langchain.com/docs/integrations/tools/ibm_watsonx/) | Package latest |\n",
+    "| :--- | :--- | :---: | :---: |\n",
+    "| [WatsonxToolkit](https://v03.api.js.langchain.com/classes/_langchain_community.agents_toolkits_ibm.WatsonxToolkit.html) | [`@langchain/community`](https://www.npmjs.com/package/@langchain/community) | ✅ |  ![NPM - Version](https://img.shields.io/npm/v/@langchain/community?style=flat-square&label=%20&) |\n",
+    "\n",
+    "## Setup\n",
+    "\n",
+    "If you want to get automated tracing from runs of individual tools, you can also set your [LangSmith](https://docs.smith.langchain.com/) API key by uncommenting below:\n",
+    "\n",
+    "```typescript\n",
+    "process.env.LANGSMITH_TRACING=\"true\"\n",
+    "process.env.LANGSMITH_API_KEY=\"your-api-key\"\n",
+    "```\n",
+    "\n",
+    "### Installation\n",
+    "\n",
+    "This toolkit lives in the `@langchain/community` package:\n",
+    "\n",
+    "```{=mdx}\n",
+    "import IntegrationInstallTooltip from \"@mdx_components/integration_install_tooltip.mdx\";\n",
+    "import Npm2Yarn from \"@theme/Npm2Yarn\";\n",
+    "\n",
+    "<IntegrationInstallTooltip></IntegrationInstallTooltip>\n",
+    "\n",
+    "<Npm2Yarn>\n",
+    "  @langchain/community @langchain/core\n",
+    "</Npm2Yarn>\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a38cde65-254d-4219-a441-068766c0d4b5",
+   "metadata": {},
+   "source": [
+    "## Instantiation\n",
+    "\n",
+    "Now we can instantiate our toolkit:\n",
+    "\n",
+    "- TODO: Update model instantiation with relevant params."
path: docs/core_docs/docs/integrations/toolkits/ibm.ipynb
user: login: jacoblee93
body: TODO
created_at: 2025-03-30T01:44:34Z
author_association: COLLABORATOR

PR comments:
user: login: vercel[bot]
created_at: 2025-03-28T18:17:06Z
body: [vc]: #9jNmjSgL+V20vPrlKxSQL6jwLIIc2G1267+d3oSzveo=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJsYW5nY2hhaW5qcy1kb2NzIiwicm9vdERpcmVjdG9yeSI6ImRvY3MvY29yZV9kb2NzLyIsImluc3BlY3RvclVybCI6Imh0dHBzOi8vdmVyY2VsLmNvbS9sYW5nY2hhaW4vbGFuZ2NoYWluanMtZG9jcy9BOWZUN3lyZlYyamFTckRyek5NNmhtRkZaNjkxIiwicHJldmlld1VybCI6ImxhbmdjaGFpbmpzLWRvY3MtZ2l0LWZvcmstZmlsaXB6bWlqZXdza2ktbWFpbi1sYW5nY2hhaW4udmVyY2VsLmFwcCIsIm5leHRDb21taXRTdGF0dXMiOiJERVBMT1lFRCJ9LHsibmFtZSI6ImxhbmdjaGFpbmpzLWFwaS1yZWZzIiwicm9vdERpcmVjdG9yeSI6ImRvY3MvYXBpX3JlZnMiLCJsaXZlRmVlZGJhY2siOnsicmVzb2x2ZWQiOjAsInVucmVzb2x2ZWQiOjAsInRvdGFsIjowLCJsaW5rIjoiIn0sImluc3BlY3RvclVybCI6Imh0dHBzOi8vdmVyY2VsLmNvbS9sYW5nY2hhaW4vbGFuZ2NoYWluanMtYXBpLXJlZnMvNG54d1JLd1RLYVA5NTlRRXZka2NQYmk0THF3YyIsIm5leHRDb21taXRTdGF0dXMiOiJJR05PUkVEIn1dfQ==
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)

| Name | Status | Preview | Comments | Updated (UTC) |
| :--- | :----- | :------ | :------- | :------ |
| **langchainjs-docs** | ✅ Ready ([Inspect](https://vercel.com/langchain/langchainjs-docs/A9fT7yrfV2jaSrDrzNM6hmFFZ691)) | [Visit Preview](https://langchainjs-docs-git-fork-filipzmijewski-main-langchain.vercel.app) |  |  Mar 30, 2025 2:07am |

<details><summary>1 Skipped Deployment</summary>

| Name | Status | Preview | Comments | Updated (UTC) |
| :--- | :----- | :------ | :------- | :------ |
| **langchainjs-api-refs** | ⬜️ Ignored ([Inspect](https://vercel.com/langchain/langchainjs-api-refs/4nxwRKwTKaP959QEvdkcPbi4Lqwc)) |  |  | Mar 30, 2025 2:07am |
</details>



author_association: NONE
user: login: FilipZmijewski
created_at: 2025-03-31T06:20:11Z
body: @jacoblee93 Thank you for managing the docs and merging!
author_association: CONTRIBUTOR