Skip to content
Open
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
4 changes: 4 additions & 0 deletions src/anthropic/types/beta/parsed_beta_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
from .beta_server_tool_use_block import BetaServerToolUseBlock
from .beta_container_upload_block import BetaContainerUploadBlock
from .beta_redacted_thinking_block import BetaRedactedThinkingBlock
from .beta_tool_search_tool_result_block import BetaToolSearchToolResultBlock
from .beta_web_fetch_tool_result_block import BetaWebFetchToolResultBlock
from .beta_web_search_tool_result_block import BetaWebSearchToolResultBlock
from .beta_code_execution_tool_result_block import BetaCodeExecutionToolResultBlock
from .beta_bash_code_execution_tool_result_block import BetaBashCodeExecutionToolResultBlock
Expand Down Expand Up @@ -43,6 +45,8 @@ class ParsedBetaTextBlock(BetaTextBlock, Generic[ResponseFormatT]):
BetaRedactedThinkingBlock,
BetaToolUseBlock,
BetaServerToolUseBlock,
BetaToolSearchToolResultBlock,
BetaWebFetchToolResultBlock,
BetaWebSearchToolResultBlock,
BetaCodeExecutionToolResultBlock,
BetaBashCodeExecutionToolResultBlock,
Expand Down
37 changes: 37 additions & 0 deletions tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
from anthropic._utils import PropertyInfo
from anthropic._compat import PYDANTIC_V1, parse_obj, model_dump, model_json
from anthropic._models import DISCRIMINATOR_CACHE, BaseModel, construct_type
from anthropic.types.beta.parsed_beta_message import ParsedBetaContentBlock
from anthropic.types.beta.beta_tool_search_tool_result_block import BetaToolSearchToolResultBlock
from anthropic.types.beta.beta_web_fetch_tool_result_block import BetaWebFetchToolResultBlock


class BasicModel(BaseModel):
Expand Down Expand Up @@ -687,6 +690,40 @@ class B(BaseModel):
assert m.data == 100 # type: ignore[comparison-overlap]


def test_parsed_beta_content_block_accepts_tool_search_result_blocks() -> None:
block = construct_type(
value={
"type": "tool_search_tool_result",
"tool_use_id": "toolu_123",
"content": {
"type": "tool_search_results",
"tool_search_results": [],
},
},
type_=cast(Any, ParsedBetaContentBlock),
)

assert isinstance(block, BetaToolSearchToolResultBlock)


def test_parsed_beta_content_block_accepts_web_fetch_result_blocks() -> None:
block = construct_type(
value={
"type": "web_fetch_tool_result",
"tool_use_id": "toolu_123",
"content": {
"type": "web_fetch",
"url": "https://example.com",
"title": "Example",
"content": "hello",
},
},
type_=cast(Any, ParsedBetaContentBlock),
)

assert isinstance(block, BetaWebFetchToolResultBlock)


def test_discriminated_unions_unknown_variant() -> None:
class A(BaseModel):
type: Literal["a"]
Expand Down