- Notifications
You must be signed in to change notification settings - Fork32
feat(toolbox-langchain): Support per-invocation auth viaRunnableConfig#291
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
base:anubhav-state-li
Are you sure you want to change the base?
Uh oh!
There was an error while loading.Please reload this page.
Conversation
931c9fc to93fd46dCompare93fd46d to336b8d5Compareanubhav756 commentedJun 19, 2025
/gcbrun |
336b8d5 to0f50eb0CompareRunnableConfigUh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
twishabansal commentedJun 23, 2025
In this case, we expect users to use dynamic methods for fetching tokens like getGoogleIdToken. |
e1fd6d1 to22aa329Compareanubhav756 commentedJun 23, 2025
Not necessarily in such a function like this one. For instance the app dev could fetch the user ID token from the frontend through a login button, and the app ID could be injected as an env var. Does that make sense? |
09410c4 tof41566aCompare57fd562 to4e53bc0Compare* Remove client session management from the orchestration class * This is now managed by Toolbox SDK internally* Simplify prompt creation * This is handled by the respective tools* Tools descriptions, params, annotations, etc. are loaded from Toolbox * These are added through `bind_tools` from LangGraph* This enables removal of the custom response message creation (whichwas added as a `TODO`)* Add logged in user's token to the `RunnableConfig`* This is necessary so that the tools that require authentication canread the user's token if available* Simplify tools helper file by removing tools and helpers since thoseare now handled by Toolbox SDK internally* Add a Toolbox URL to connect to through integration tests* Removes `ToolMessage` while inserting ticket. * This was causing an issue with `langchain-google-vertexai` ```google.api_core.exceptions.InvalidArgument: 400 Please ensure that thenumber of function response parts should be equal to number of functioncall parts of the function call turn. ```* Remove unused human and AI messages post book ticket flow.## Diagram> [!IMPORTANT]> This PR depends on a couple of features from Toolbox SDK:> * Support for optional parameters([#290](googleapis/mcp-toolbox-sdk-python#290))> * Self-authenticated tools via `RunnableConfig`([#291](googleapis/mcp-toolbox-sdk-python#291))> [!NOTE]> The failure in the integration test is expected. This PR is part of aseries of changes, and the corresponding fix for this test is in asubsequent PR.> ### Reasoning> We've intentionally split the work into smaller, focused PRs to makethe review process more manageable and efficient.> ### Merge Plan> All related PRs will be merged into the `toolbox-main` branch first.We will ensure all tests are passing on `toolbox-main` before mergingthe entire feature set into `main`.
4e53bc0 to76c6fa4Compare76c6fa4 to5607a2cCompare35f5cf7 todac36c5Compare5607a2c to6f8cbfcCompareThis PR updates the existing workflow to replace the prebuilt tool nodewith a new custom tool node. This new node is designed to intelligentlyhandle tool auth by reading auth headers from the provided`RunnableConfig` by LangGraph.The custom node inspects the auth requirements of the underlying coretool within the `ToolboxTool`. If the tool requires authentication, thenode dynamically creates an authenticated copy of the tool by attachingthe necessary auth token getters using the `add_auth_token_getter` API.This authenticated tool instance is then used for the call andsubsequently discarded. This same auth handling logic has also beenapplied to the node responsible for ticket insertion.> [!NOTE]> The functionality introduced in these custom nodes will be abstractedinto the `ToolboxTool` itself in an upcoming release of the`toolbox-langchain`[#291](googleapis/mcp-toolbox-sdk-python#291).This will simplify the workflow in the future by handling authenticationdirectly within the tool.
Uh oh!
There was an error while loading.Please reload this page.
Summary
This PR introduces a major enhancement to the
toolbox-langchainpackage by adding support for dynamic, per-invocation authentication. This is achieved by readingauth_token_gettersfrom LangChain's standardRunnableConfig, enablingToolboxToolto be used safely and effectively in multi-user environments like LangGraph.Motivation
Currently, authentication tokens can only be provided to a
ToolboxToolat initialization time, either viaToolboxClient.load_tool/load_toolsetor by callingtool.add_auth_token_getters()on the tool instance. This static binding of credentials poses a significant challenge in modern agentic frameworks like LangGraph.Challenge
In LangGraph, a single graph containing tool instances is often created once and then shared across multiple users and requests. It is insecure and impractical to configure these shared tool instances with any single user's credentials. The required credentials must be provided dynamically, on a per-request basis.
Proposed Solution
This PR solves this problem by introducing a third, invocation-time method for providing auth. It leverages LangChain's idiomatic
RunnableConfigas the vehicle for passing request-specific authentication, makingtoolbox-langchainfully compatible with multi-tenant and shared-use patterns.Description of Changes
The core of this change lies in how the
ToolboxToolhandles an invocation:_arun/_run) is updated to accept theconfig: RunnableConfigargument, which is standard in the LangChain.config["configurable"]["auth_token_getters"].auth_token_gettersare found in the config, the tool:a. Introspects its own authentication and authorization requirements (using the properties exposed infix(toolbox-core): Expose authorization token requirements on
ToolboxTool#294).b. Creates a temporary, in-memory copy of the underlying proxied
ToolboxTool. This is critical, as it ensures the original shared tool instance is never mutated.auth_token_gettersfrom theconfigare applied to this new, temporary copy of the tool using itsadd_auth_token_gettersmethod.This mechanism provides a thread-safe and secure way to handle user-specific credentials without affecting the shared state of the primary tool in the graph.
Usage Example