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
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
version: '0.9.13'
version: '0.10.2'

- name: Install dependencies
run: uv sync --all-extras
Expand All @@ -46,7 +46,7 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
version: '0.9.13'
version: '0.10.2'

- name: Install dependencies
run: uv sync --all-extras
Expand Down Expand Up @@ -80,7 +80,7 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
version: '0.9.13'
version: '0.10.2'

- name: Bootstrap
run: ./scripts/bootstrap
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/detect-breaking-changes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v5
with:
version: '0.9.13'
version: '0.10.2'
- name: Install dependencies
run: uv sync --all-extras
- name: Detect removed symbols
Expand Down
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.84.0"
".": "0.84.1"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 34
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-60fbf504538934c934f523d456bbf3cd99e7f1e2275041f74d5beb627bf38e19.yml
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-b67d0c7de1f0bf96172a508a9bdc51cb6d766d7e0783a9b986220b369e02949b.yml
openapi_spec_hash: 58021ab18daccd5c45a930ffd7d6ab4d
config_hash: bf86c14604e5705bfb2f351adf702c02
config_hash: a52ab5e81a19280010e599841a123b1a
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# Changelog

## 0.84.1 (2026-02-28)

Full Changelog: [v0.84.0...v0.84.1](https://github.com/anthropics/anthropic-sdk-python/compare/v0.84.0...v0.84.1)

### Bug Fixes

* **tool runner:** propagate container_id for programmatic tool calling ([#1462](https://github.com/anthropics/anthropic-sdk-python/issues/1462)) ([3ae7ff6](https://github.com/anthropics/anthropic-sdk-python/commit/3ae7ff6ff7af8a881706ae8068b1040a23c96fbd))


### Chores

* **ci:** bump uv version ([09656ac](https://github.com/anthropics/anthropic-sdk-python/commit/09656acef77fa459d30d811bd51aa780a567182b))

## 0.84.0 (2026-02-25)

Full Changelog: [v0.83.0...v0.84.0](https://github.com/anthropics/anthropic-sdk-python/compare/v0.83.0...v0.84.0)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "anthropic"
version = "0.84.0"
version = "0.84.1"
description = "The official Python library for the anthropic API"
dynamic = ["readme"]
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion src/anthropic/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "anthropic"
__version__ = "0.84.0" # x-release-please-version
__version__ = "0.84.1" # x-release-please-version
11 changes: 7 additions & 4 deletions src/anthropic/lib/tools/_beta_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,12 @@ class ToolError(Exception):

Example::

raise ToolError([
{"type": "text", "text": "Error details here"},
{"type": "image", "source": {"type": "base64", "data": "...", "media_type": "image/png"}},
])
raise ToolError(
[
{"type": "text", "text": "Error details here"},
{"type": "image", "source": {"type": "base64", "data": "...", "media_type": "image/png"}},
]
)
"""

content: BetaFunctionToolResultType
Expand All @@ -55,6 +57,7 @@ def __init__(self, content: BetaFunctionToolResultType) -> None:
super().__init__(message)
self.content = content


Function = Callable[..., BetaFunctionToolResultType]
FunctionT = TypeVar("FunctionT", bound=Function)

Expand Down
32 changes: 28 additions & 4 deletions src/anthropic/lib/tools/_beta_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,11 @@ def __run__(self) -> Iterator[RunnerItemT]:
message = self._get_last_message()
assert message is not None

# Update container from response for programmatic tool calling support
last_assistant_message = self._get_last_assistant_message()
if last_assistant_message is not None and last_assistant_message.container is not None:
self._params["container"] = last_assistant_message.container.id

self._iteration_count += 1

# If the compaction was performed, skip tool call generation this iteration
Expand Down Expand Up @@ -356,12 +361,19 @@ def _get_last_message(self) -> ParsedBetaMessage[ResponseFormatT] | None:
return self._last_message()
return self._last_message

def _get_last_assistant_message_content(self) -> list[ParsedBetaContentBlock[ResponseFormatT]] | None:
def _get_last_assistant_message(self) -> ParsedBetaMessage[ResponseFormatT] | None:
last_message = self._get_last_message()
if last_message is None or last_message.role != "assistant" or not last_message.content:
return None

return last_message.content
return last_message

def _get_last_assistant_message_content(self) -> list[ParsedBetaContentBlock[ResponseFormatT]] | None:
last_assistant_message = self._get_last_assistant_message()
if last_assistant_message is None:
return None

return last_assistant_message.content


class BetaToolRunner(BaseSyncToolRunner[ParsedBetaMessage[ResponseFormatT], ResponseFormatT]):
Expand Down Expand Up @@ -515,6 +527,11 @@ async def __run__(self) -> AsyncIterator[RunnerItemT]:
message = await self._get_last_message()
assert message is not None

# Update container from response for programmatic tool calling support
last_assistant_message = await self._get_last_assistant_message()
if last_assistant_message is not None and last_assistant_message.container is not None:
self._params["container"] = last_assistant_message.container.id

self._iteration_count += 1

# If the compaction was performed, skip tool call generation this iteration
Expand Down Expand Up @@ -560,12 +577,19 @@ async def _get_last_message(self) -> ParsedBetaMessage[ResponseFormatT] | None:
return await self._last_message()
return self._last_message

async def _get_last_assistant_message_content(self) -> list[ParsedBetaContentBlock[ResponseFormatT]] | None:
async def _get_last_assistant_message(self) -> ParsedBetaMessage[ResponseFormatT] | None:
last_message = await self._get_last_message()
if last_message is None or last_message.role != "assistant" or not last_message.content:
return None

return last_message.content
return last_message

async def _get_last_assistant_message_content(self) -> list[ParsedBetaContentBlock[ResponseFormatT]] | None:
last_assistant_message = await self._get_last_assistant_message()
if last_assistant_message is None:
return None

return last_assistant_message.content

async def _generate_tool_call_response(self) -> BetaMessageParam | None:
content = await self._get_last_assistant_message_content()
Expand Down
Loading