Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions src/anthropic/lib/tools/_beta_runner.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from __future__ import annotations

import logging
import warnings
from abc import ABC, abstractmethod
from typing import (
TYPE_CHECKING,
Expand Down Expand Up @@ -298,6 +299,14 @@ def _generate_tool_call_response(self) -> BetaMessageParam | None:
for tool_use in tool_use_blocks:
tool = self._tools_by_name.get(tool_use.name)
if tool is None:
warnings.warn(
f"Tool '{tool_use.name}' not found in tool runner. "
f"Available tools: {list(self._tools_by_name.keys())}. "
f"If using a raw tool definition, handle the tool call manually and use `append_messages()` to add the result. "
f"Otherwise, pass the tool using `beta_tool(func)` or a `@beta_tool` decorated function.",
UserWarning,
stacklevel=3,
)
results.append(
{
"type": "tool_result",
Expand Down Expand Up @@ -554,6 +563,14 @@ async def _generate_tool_call_response(self) -> BetaMessageParam | None:
for tool_use in tool_use_blocks:
tool = self._tools_by_name.get(tool_use.name)
if tool is None:
warnings.warn(
f"Tool '{tool_use.name}' not found in tool runner. "
f"Available tools: {list(self._tools_by_name.keys())}. "
f"If using a raw tool definition, handle the tool call manually and use `append_messages()` to add the result. "
f"Otherwise, pass the tool using `beta_async_tool(func)` or a `@beta_async_tool` decorated function.",
UserWarning,
stacklevel=3,
)
results.append(
{
"type": "tool_result",
Expand Down
55 changes: 40 additions & 15 deletions src/anthropic/resources/beta/messages/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,14 @@
from ....lib._parse._response import ResponseFormatT, parse_response
from ....lib._parse._transform import transform_schema
from ....types.beta.beta_message import BetaMessage
from ....lib.tools._beta_functions import BetaRunnableTool, BetaAsyncRunnableTool
from ....lib.tools._beta_functions import (
BetaFunctionTool,
BetaRunnableTool,
BetaAsyncFunctionTool,
BetaAsyncRunnableTool,
BetaBuiltinFunctionTool,
BetaAsyncBuiltinFunctionTool,
)
from ....types.anthropic_beta_param import AnthropicBetaParam
from ....types.beta.beta_message_param import BetaMessageParam
from ....types.beta.beta_metadata_param import BetaMetadataParam
Expand Down Expand Up @@ -1174,7 +1181,7 @@ def tool_runner(
max_tokens: int,
messages: Iterable[BetaMessageParam],
model: ModelParam,
tools: Iterable[BetaRunnableTool],
tools: Iterable[BetaRunnableTool | BetaToolUnionParam],
compaction_control: CompactionControl | Omit = omit,
container: Optional[message_create_params.Container] | Omit = omit,
context_management: Optional[BetaContextManagementConfigParam] | Omit = omit,
Expand Down Expand Up @@ -1208,7 +1215,7 @@ def tool_runner(
max_tokens: int,
messages: Iterable[BetaMessageParam],
model: ModelParam,
tools: Iterable[BetaRunnableTool],
tools: Iterable[BetaRunnableTool | BetaToolUnionParam],
compaction_control: CompactionControl | Omit = omit,
stream: Literal[True],
max_iterations: int | Omit = omit,
Expand Down Expand Up @@ -1242,7 +1249,7 @@ def tool_runner(
max_tokens: int,
messages: Iterable[BetaMessageParam],
model: ModelParam,
tools: Iterable[BetaRunnableTool],
tools: Iterable[BetaRunnableTool | BetaToolUnionParam],
compaction_control: CompactionControl | Omit = omit,
stream: bool,
max_iterations: int | Omit = omit,
Expand Down Expand Up @@ -1275,7 +1282,7 @@ def tool_runner(
max_tokens: int,
messages: Iterable[BetaMessageParam],
model: ModelParam,
tools: Iterable[BetaRunnableTool],
tools: Iterable[BetaRunnableTool | BetaToolUnionParam],
compaction_control: CompactionControl | Omit = omit,
max_iterations: int | Omit = omit,
container: Optional[message_create_params.Container] | Omit = omit,
Expand Down Expand Up @@ -1315,6 +1322,15 @@ def tool_runner(
**(extra_headers or {}),
}

client_side_tools: list[BetaRunnableTool] = []
server_side_tools: list[BetaToolUnionParam] = []
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: this is a bit of a misnomer

Suggested change
client_side_tools: list[BetaRunnableTool] = []
server_side_tools: list[BetaToolUnionParam] = []
runnable_tools: list[BetaRunnableTool] = []
raw_tools: list[BetaToolUnionParam] = []

(not a big fan of raw_tools so fft come up with something else)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changed
I'm ok with raw_tools, it's an internal naming so I wont think so much


for tool in tools:
if isinstance(tool, (BetaFunctionTool, BetaBuiltinFunctionTool)):
client_side_tools.append(tool)
else:
server_side_tools.append(tool)

params = cast(
message_create_params.ParseMessageCreateParamsBase[ResponseFormatT],
{
Expand All @@ -1333,15 +1349,15 @@ def tool_runner(
"temperature": temperature,
"thinking": thinking,
"tool_choice": tool_choice,
"tools": [tool.to_dict() for tool in tools],
"tools": [*[tool.to_dict() for tool in client_side_tools], *server_side_tools],
"top_k": top_k,
"top_p": top_p,
},
)

if stream:
return BetaStreamingToolRunner[ResponseFormatT](
tools=tools,
tools=client_side_tools,
params=params,
options={
"extra_headers": extra_headers,
Expand All @@ -1354,7 +1370,7 @@ def tool_runner(
compaction_control=compaction_control if is_given(compaction_control) else None,
)
return BetaToolRunner[ResponseFormatT](
tools=tools,
tools=client_side_tools,
params=params,
options={
"extra_headers": extra_headers,
Expand Down Expand Up @@ -2821,7 +2837,7 @@ def tool_runner(
max_tokens: int,
messages: Iterable[BetaMessageParam],
model: ModelParam,
tools: Iterable[BetaAsyncRunnableTool],
tools: Iterable[BetaAsyncRunnableTool | BetaToolUnionParam],
compaction_control: CompactionControl | Omit = omit,
max_iterations: int | Omit = omit,
container: Optional[message_create_params.Container] | Omit = omit,
Expand Down Expand Up @@ -2855,7 +2871,7 @@ def tool_runner(
max_tokens: int,
messages: Iterable[BetaMessageParam],
model: ModelParam,
tools: Iterable[BetaAsyncRunnableTool],
tools: Iterable[BetaAsyncRunnableTool | BetaToolUnionParam],
compaction_control: CompactionControl | Omit = omit,
stream: Literal[True],
max_iterations: int | Omit = omit,
Expand Down Expand Up @@ -2889,7 +2905,7 @@ def tool_runner(
max_tokens: int,
messages: Iterable[BetaMessageParam],
model: ModelParam,
tools: Iterable[BetaAsyncRunnableTool],
tools: Iterable[BetaAsyncRunnableTool | BetaToolUnionParam],
compaction_control: CompactionControl | Omit = omit,
stream: bool,
max_iterations: int | Omit = omit,
Expand Down Expand Up @@ -2922,7 +2938,7 @@ def tool_runner(
max_tokens: int,
messages: Iterable[BetaMessageParam],
model: ModelParam,
tools: Iterable[BetaAsyncRunnableTool],
tools: Iterable[BetaAsyncRunnableTool | BetaToolUnionParam],
compaction_control: CompactionControl | Omit = omit,
max_iterations: int | Omit = omit,
container: Optional[message_create_params.Container] | Omit = omit,
Expand Down Expand Up @@ -2962,6 +2978,15 @@ def tool_runner(
**(extra_headers or {}),
}

client_side_tools: list[BetaAsyncRunnableTool] = []
server_side_tools: list[BetaToolUnionParam] = []

for tool in tools:
if isinstance(tool, (BetaAsyncFunctionTool, BetaAsyncBuiltinFunctionTool)):
client_side_tools.append(tool)
else:
server_side_tools.append(tool)

params = cast(
message_create_params.ParseMessageCreateParamsBase[ResponseFormatT],
{
Expand All @@ -2980,15 +3005,15 @@ def tool_runner(
"temperature": temperature,
"thinking": thinking,
"tool_choice": tool_choice,
"tools": [tool.to_dict() for tool in tools],
"tools": [*[tool.to_dict() for tool in client_side_tools], *server_side_tools],
"top_k": top_k,
"top_p": top_p,
},
)

if stream:
return BetaAsyncStreamingToolRunner[ResponseFormatT](
tools=tools,
tools=client_side_tools,
params=params,
options={
"extra_headers": extra_headers,
Expand All @@ -3001,7 +3026,7 @@ def tool_runner(
compaction_control=compaction_control if is_given(compaction_control) else None,
)
return BetaAsyncToolRunner[ResponseFormatT](
tools=tools,
tools=client_side_tools,
params=params,
options={
"extra_headers": extra_headers,
Expand Down
Loading