From c5df2f12e49ba8e733ef753b3a2ecb8c576c38b9 Mon Sep 17 00:00:00 2001 From: "shentong.martin" Date: Tue, 20 Jan 2026 15:30:56 +0800 Subject: [PATCH] docs: clarify GraphTools are compatible with any tool wrapper - Add 'Composable Tool Wrappers' section explaining GraphTools implement standard interfaces - List example wrappers: InvokableApprovableTool, InvokableReviewEditTool, FollowUpTool - Clarify nested interrupts work with any interrupt-based wrapper, not just InvokableApprovableTool Change-Id: Ic3156bf0d28bb30b11dcd61092972bc2d12faccb --- adk/common/tool/graphtool/README.md | 18 ++++++++++++++---- go.mod | 2 +- go.sum | 4 ++++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/adk/common/tool/graphtool/README.md b/adk/common/tool/graphtool/README.md index 5beeac0..ad8eca1 100644 --- a/adk/common/tool/graphtool/README.md +++ b/adk/common/tool/graphtool/README.md @@ -116,13 +116,23 @@ The tool automatically: 2. Wraps the interrupt with `CompositeInterrupt` for proper propagation 3. Restores state and resumes execution when `runner.ResumeWithParams` is called +### Composable Tool Wrappers + +GraphTools implement standard `tool.InvokableTool` or `tool.StreamableTool` interfaces, making them compatible with any tool wrapper in the ecosystem. Examples of wrappers you can use: + +- **`InvokableApprovableTool`**: Adds human approval before tool execution +- **`InvokableReviewEditTool`**: Allows users to review and edit tool arguments +- **`FollowUpTool`**: Asks users follow-up questions during execution +- Custom wrappers you create + ### Nested Interrupts -GraphTools can be wrapped with `InvokableApprovableTool` for two-level approval: -1. **Outer interrupt**: Tool-level approval (via `InvokableApprovableTool`) -2. **Inner interrupt**: Workflow-level approval (via `StatefulInterrupt` inside nodes) +When a GraphTool with internal interrupts is wrapped by another interrupt-based wrapper (e.g., `InvokableApprovableTool`), both interrupt layers work independently: + +1. **Outer interrupt**: Wrapper-level interrupt (e.g., approval via `InvokableApprovableTool`) +2. **Inner interrupt**: Workflow-level interrupt (via `StatefulInterrupt` inside graph nodes) -Both interrupts work independently due to distinct interrupt state types. +This works because each layer uses distinct interrupt state types, preventing conflicts. ## Tool Options diff --git a/go.mod b/go.mod index 22aeaa8..f0389cd 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/alicebob/miniredis/v2 v2.35.0 github.com/bytedance/sonic v1.14.2 github.com/chromedp/chromedp v0.9.5 - github.com/cloudwego/eino v0.7.22-0.20260119120351-c3d518fff972 + github.com/cloudwego/eino v0.7.22 github.com/cloudwego/eino-ext/callbacks/cozeloop v0.1.6 github.com/cloudwego/eino-ext/components/document/parser/html v0.0.0-20251117090452-bd6375a0b3cf github.com/cloudwego/eino-ext/components/document/parser/pdf v0.0.0-20251117090452-bd6375a0b3cf diff --git a/go.sum b/go.sum index cfe05ac..bc21f9c 100644 --- a/go.sum +++ b/go.sum @@ -129,8 +129,12 @@ github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= github.com/cloudwego/eino v0.7.14 h1:Ff62Z3dhdaGMFKG0cAVjcWfY7lb6mTkkBv4WFfdDU2k= github.com/cloudwego/eino v0.7.14/go.mod h1:nA8Vacmuqv3pqKBQbTWENBLQ8MmGmPt/WqiyLeB8ohQ= +github.com/cloudwego/eino v0.7.21 h1:kkq7hlHYzwkGOAMbY4ffym4oBT7e9g5hXpJTsZbhsik= +github.com/cloudwego/eino v0.7.21/go.mod h1:nA8Vacmuqv3pqKBQbTWENBLQ8MmGmPt/WqiyLeB8ohQ= github.com/cloudwego/eino v0.7.22-0.20260119120351-c3d518fff972 h1:qxtj2YY+Z0aMzBCyzeD/S9grWDguOJinAjyadlsXsaU= github.com/cloudwego/eino v0.7.22-0.20260119120351-c3d518fff972/go.mod h1:nA8Vacmuqv3pqKBQbTWENBLQ8MmGmPt/WqiyLeB8ohQ= +github.com/cloudwego/eino v0.7.22 h1:GiDt+MHoOsgjIN3rI6ECiQ+NX1UIr0NzLKMdjOltHBc= +github.com/cloudwego/eino v0.7.22/go.mod h1:nA8Vacmuqv3pqKBQbTWENBLQ8MmGmPt/WqiyLeB8ohQ= github.com/cloudwego/eino-ext/callbacks/cozeloop v0.1.6 h1:gS4nAOpQQC5WItt1k32yjZt9O2UWMpnbgF6vkMQAWhg= github.com/cloudwego/eino-ext/callbacks/cozeloop v0.1.6/go.mod h1:ZniRkgN+9FUFxtN60X7yzD6UOruqrKQusjrOiGcH4I8= github.com/cloudwego/eino-ext/components/document/parser/html v0.0.0-20251117090452-bd6375a0b3cf h1:Uwh3VT+xPrfDjM677dj1pSidCzBFoTrYlC274kEci5w=