From 936319ccba0262bf0d8abfd728f96786d9575b13 Mon Sep 17 00:00:00 2001 From: Eric Gustin <34000337+EricGustin@users.noreply.github.com> Date: Thu, 20 Feb 2025 13:24:03 -0800 Subject: [PATCH] Fix langchain-arcade `SyncOffsetPage` iteration (#262) ## PR Description The `ArcadeToolManager` was retrieving tools from the Arcade client incorrectly as it was only returning the first page of results. This PR removes the use of `SyncOffsetPage`'s `.items` attribute since `.items` only contains the tools in the **current page**. Since `SyncOffsetPage` implements an `__iter__` that iterates over all pages, we can simply drop the `.items`. ## Try it for yourself Run the following code without the changes in this PR and notice that only 25 tools are in the internal tool list, which also happens to be the size of a page. Now run again, but with the changes in this PR and notice that all tools hosted by Arcade are in the internal tool list. ```python import os from langchain_arcade import ArcadeToolManager arcade_api_key = os.environ.get("ARCADE_API_KEY") manager = ArcadeToolManager(api_key=arcade_api_key) tools = manager.init_tools() print(len(manager.tools)) ``` --- contrib/langchain/README.md | 1 - contrib/langchain/langchain_arcade/manager.py | 6 +++--- contrib/langchain/pyproject.toml | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/contrib/langchain/README.md b/contrib/langchain/README.md index 64ec92be..4f48ee5e 100644 --- a/contrib/langchain/README.md +++ b/contrib/langchain/README.md @@ -18,7 +18,6 @@

DocsIntegrations • - CookbookPython ClientJavaScript Client

diff --git a/contrib/langchain/langchain_arcade/manager.py b/contrib/langchain/langchain_arcade/manager.py index 72dc2b14..f13b363a 100644 --- a/contrib/langchain/langchain_arcade/manager.py +++ b/contrib/langchain/langchain_arcade/manager.py @@ -200,14 +200,14 @@ class ArcadeToolManager: if toolkits: for tk in toolkits: # tools.list(...) returns a paginated response (SyncOffsetPage), - # so we iterate over its items to accumulate tool definitions. + # which has an __iter__ method that automatically iterates over all pages. paginated_tools = self.client.tools.list(toolkit=tk) - all_tools.extend(paginated_tools.items) + all_tools.extend(paginated_tools) # If no specific tools or toolkits were requested, retrieve *all* tools. if not tools and not toolkits: paginated_all_tools = self.client.tools.list() - all_tools.extend(paginated_all_tools.items) + all_tools.extend(paginated_all_tools) # Build a dictionary that maps the "full_tool_name" to the tool definition. tool_definitions: dict[str, ToolDefinition] = {} for tool in all_tools: diff --git a/contrib/langchain/pyproject.toml b/contrib/langchain/pyproject.toml index 6d86d8c4..6de4d3df 100644 --- a/contrib/langchain/pyproject.toml +++ b/contrib/langchain/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langchain-arcade" -version = "1.0.0" +version = "1.0.1" description = "An integration package connecting Arcade and LangChain/LangGraph" authors = ["Arcade "] readme = "README.md"