Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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 {}),
}

runnable_tools: list[BetaRunnableTool] = []
raw_tools: list[BetaToolUnionParam] = []

for tool in tools:
if isinstance(tool, (BetaFunctionTool, BetaBuiltinFunctionTool)):
runnable_tools.append(tool)
else:
raw_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 runnable_tools], *raw_tools],
"top_k": top_k,
"top_p": top_p,
},
)

if stream:
return BetaStreamingToolRunner[ResponseFormatT](
tools=tools,
tools=runnable_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=runnable_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 {}),
}

runnable_tools: list[BetaAsyncRunnableTool] = []
raw_tools: list[BetaToolUnionParam] = []

for tool in tools:
if isinstance(tool, (BetaAsyncFunctionTool, BetaAsyncBuiltinFunctionTool)):
runnable_tools.append(tool)
else:
raw_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 runnable_tools], *raw_tools],
"top_k": top_k,
"top_p": top_p,
},
)

if stream:
return BetaAsyncStreamingToolRunner[ResponseFormatT](
tools=tools,
tools=runnable_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=runnable_tools,
params=params,
options={
"extra_headers": extra_headers,
Expand Down
Loading