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
drew/english
shentong.martin 4 months ago committed by shentongmartin
parent 44e0085eae
commit c5df2f12e4

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

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

@ -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=

Loading…
Cancel
Save