|
14 | 14 | from ...hooks import AfterToolCallEvent, BeforeToolCallEvent |
15 | 15 | from ...telemetry.metrics import Trace |
16 | 16 | from ...telemetry.tracer import get_tracer |
17 | | -from ...types._events import ToolResultEvent, ToolStreamEvent, TypedEvent |
| 17 | +from ...types._events import ToolCancelEvent, ToolResultEvent, ToolStreamEvent, TypedEvent |
18 | 18 | from ...types.content import Message |
19 | 19 | from ...types.tools import ToolChoice, ToolChoiceAuto, ToolConfig, ToolResult, ToolUse |
20 | 20 |
|
@@ -81,6 +81,31 @@ async def _stream( |
81 | 81 | ) |
82 | 82 | ) |
83 | 83 |
|
| 84 | + if before_event.cancel_tool: |
| 85 | + cancel_message = ( |
| 86 | + before_event.cancel_tool if isinstance(before_event.cancel_tool, str) else "tool cancelled by user" |
| 87 | + ) |
| 88 | + yield ToolCancelEvent(tool_use, cancel_message) |
| 89 | + |
| 90 | + cancel_result: ToolResult = { |
| 91 | + "toolUseId": str(tool_use.get("toolUseId")), |
| 92 | + "status": "error", |
| 93 | + "content": [{"text": cancel_message}], |
| 94 | + } |
| 95 | + after_event = agent.hooks.invoke_callbacks( |
| 96 | + AfterToolCallEvent( |
| 97 | + agent=agent, |
| 98 | + tool_use=tool_use, |
| 99 | + invocation_state=invocation_state, |
| 100 | + selected_tool=None, |
| 101 | + result=cancel_result, |
| 102 | + cancel_message=cancel_message, |
| 103 | + ) |
| 104 | + ) |
| 105 | + yield ToolResultEvent(after_event.result) |
| 106 | + tool_results.append(after_event.result) |
| 107 | + return |
| 108 | + |
84 | 109 | try: |
85 | 110 | selected_tool = before_event.selected_tool |
86 | 111 | tool_use = before_event.tool_use |
@@ -123,7 +148,7 @@ async def _stream( |
123 | 148 | # so that we don't needlessly yield ToolStreamEvents for non-generator callbacks. |
124 | 149 | # In which case, as soon as we get a ToolResultEvent we're done and for ToolStreamEvent |
125 | 150 | # we yield it directly; all other cases (non-sdk AgentTools), we wrap events in |
126 | | - # ToolStreamEvent and the last even is just the result |
| 151 | + # ToolStreamEvent and the last event is just the result. |
127 | 152 |
|
128 | 153 | if isinstance(event, ToolResultEvent): |
129 | 154 | # below the last "event" must point to the tool_result |
|
0 commit comments