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
2 changes: 0 additions & 2 deletions .github/scripts/release_verify.py
Original file line number Diff line number Diff line change
Expand Up @@ -271,8 +271,6 @@ def _sdk_core_changelog_entries(
"run",
"--quiet",
"-p",
"temporalio-sdk-core",
"--bin",
"changelog-release-notes",
"--",
"--from",
Expand Down
34 changes: 30 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,24 +20,49 @@ to include examples, links to docs, or any other relevant information.

### Added

- Added the `temporalio.contrib.gcp.cloud_run.id` module with the `CloudRunIdPlugin` client plugin to set the worker identity on Cloud Run.
### Changed

### Deprecated

### :boom: Breaking Changes

### Fixed

- Current workflow and activity payload converter accessors now return the configured converter
without SDK-internal transfer type conversion.

### Security

## [1.33.0] - 2026-09-14

### Added

#### Standalone Activity operator commands

- `ActivityHandle` now supports operator commands for standalone activities: `pause`,
`unpause`, `update_options` and `restore_original_options`.
- Added GCP Cloud Run serverless-worker OpenTelemetry plugin in `temporalio.contrib.opentelemetry`.
- Added new options to ActivityHandle.describe() to retrieve associated payloads, such as activity input and outcome.
- New properties and methods in ActivityExecution and ActivityExecutionDescription.
- Added experimental `temporalio.converter.NexusSerializationContext` support for Nexus callers
and handlers. Callers use it for inputs, results, and failures; handlers use it for inputs,
synchronous results, and failures. Asynchronous handler results and detached standalone handles
are not yet supported. Standalone `USE_EXISTING` handles use their start request's context.

### Changed

- Standalone Activities are now generally available (GA). (Standalone Activities as Nexus operations
and Standalone Activities operator commands remain experimental. Operator commands are `pause`,
`unpause`, `updateOptions`, `restoreOriginal`.)
- System Nexus Signal-with-Start Workflow operations now use the typed
`WorkflowOutboundInterceptor.start_signal_with_start_workflow` interception point instead of
the generic `WorkflowOutboundInterceptor.start_nexus_operation` method.
- System Nexus Signal-with-Start Workflow operations now invoke
`WorkflowOutboundInterceptor.start_system_nexus_operation` after their typed interception
point. They continue not to invoke `WorkflowOutboundInterceptor.start_nexus_operation`.

### Deprecated
- The experimental `GetNexusOperationResultInput` now includes the Nexus endpoint, service, and
operation.

### :boom: Breaking Changes

Expand All @@ -56,6 +81,9 @@ to include examples, links to docs, or any other relevant information.

### Fixed

- `temporalio.contrib.google_genai` now requires `google-genai` 2.21.0 or later
and supports its file download API, including video inputs and download
destinations.
- `temporalio.contrib.deepagents` no longer dedups repeated identical tool,
model, and backend-op calls: each dispatch runs its own Activity, and the
continue-as-new result cache is retired for new executions (a continued run
Expand Down Expand Up @@ -87,8 +115,6 @@ to include examples, links to docs, or any other relevant information.
or callbacks to attach.
- The workflow sandbox now passes `pydantic_core` through by default, alongside `pydantic`.

### Security

## [1.32.0] - 2026-08-24

### Added
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "temporalio"
version = "1.32.0"
version = "1.33.0"
description = "Temporal.io Python SDK"
authors = [{ name = "Temporal Technologies Inc", email = "sdk@temporal.io" }]
requires-python = ">=3.10"
Expand Down Expand Up @@ -55,7 +55,7 @@ cloud-run-worker-otel = [
"protobuf<7",
]
aioboto3 = ["aioboto3>=10.4.0", "types-aioboto3[s3]>=10.4.0"]
google-genai = ["google-genai>=2.10.0,<3.0.0"]
google-genai = ["google-genai>=2.21.0,<3.0.0"]
strands-agents = ["strands-agents>=1.39.0"]

[project.urls]
Expand Down
4 changes: 3 additions & 1 deletion temporalio/activity.py
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,9 @@ def payload_converter() -> temporalio.converter.PayloadConverter:
The returned converter has :py:class:`temporalio.converter.ActivitySerializationContext` set.
This is often used for dynamic activities to convert payloads.
"""
return _Context.current().payload_converter
return _TemporalTransferTypePayloadConverter.unwrap(
_Context.current().payload_converter
)


def metric_meter() -> temporalio.common.MetricMeter:
Expand Down
51 changes: 5 additions & 46 deletions temporalio/client/_activity.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,6 @@ class ActivityExecutionAsyncIterator:
"""Asynchronous iterator for activity execution values.

You should typically use ``async for`` on this iterator and not call any of its methods.

.. warning::
This API is experimental.
"""

def __init__(
Expand Down Expand Up @@ -168,11 +165,7 @@ async def __anext__(self) -> ActivityExecution:

@dataclass(frozen=True, eq=False, kw_only=True)
class ActivityExecution:
"""Info for an activity execution not started by a workflow, from list response.

.. warning::
This API is experimental.
"""
"""Info for an activity execution not started by a workflow, from list response."""

activity_id: str
"""Activity ID."""
Expand Down Expand Up @@ -265,11 +258,7 @@ def _from_raw_info(

@dataclass(frozen=True, eq=False, kw_only=True)
class ActivityExecutionDescription(ActivityExecution):
"""Detailed information about an activity execution not started by a workflow.

.. warning::
This API is experimental.
"""
"""Detailed information about an activity execution not started by a workflow."""

attempt: int
"""Current attempt number."""
Expand Down Expand Up @@ -563,9 +552,6 @@ async def outcome_failure(self) -> BaseException | None:
class ActivityExecutionStatus(IntEnum):
"""Status of an activity execution.

.. warning::
This API is experimental.

See :py:class:`temporalio.api.enums.v1.ActivityExecutionStatus`.
"""

Expand Down Expand Up @@ -598,9 +584,6 @@ class ActivityExecutionStatus(IntEnum):
class PendingActivityState(IntEnum):
"""Detailed state of an activity execution that is in ACTIVITY_EXECUTION_STATUS_RUNNING.

.. warning::
This API is experimental.

See :py:class:`temporalio.api.enums.v1.PendingActivityState`.
"""

Expand Down Expand Up @@ -782,11 +765,7 @@ def _from_proto(

@dataclass(frozen=True)
class ActivityExecutionCount:
"""Representation of a count from a count activities call.

.. warning::
This API is experimental.
"""
"""Representation of a count from a count activities call."""

count: int
"""Total count matching the filter, if any."""
Expand All @@ -809,11 +788,7 @@ def _from_raw(

@dataclass(frozen=True)
class ActivityExecutionCountAggregationGroup:
"""A single aggregation group from a count activities call.

.. warning::
This API is experimental.
"""
"""A single aggregation group from a count activities call."""

count: int
"""Count for this group."""
Expand Down Expand Up @@ -985,11 +960,7 @@ def with_context(self, context: SerializationContext) -> Self:


class ActivityHandle(Generic[ReturnType]):
"""Handle representing an activity execution not started by a workflow.

.. warning::
This API is experimental.
"""
"""Handle representing an activity execution not started by a workflow."""

def __init__(
self,
Expand Down Expand Up @@ -1040,9 +1011,6 @@ async def result(
) -> ReturnType:
"""Wait for result of the activity.

.. warning::
This API is experimental.

The result may already be known if this method has been called before,
in which case no network call is made. Otherwise the result will be
polled for until it is available.
Expand Down Expand Up @@ -1133,9 +1101,6 @@ async def cancel(
) -> None:
"""Request cancellation of the activity.

.. warning::
This API is experimental.

Requesting cancellation of an activity does not automatically transition the activity to
canceled status. If the activity is heartbeating, a :py:class:`exceptions.CancelledError`
exception will be raised when receiving the heartbeat response; if the activity allows this
Expand Down Expand Up @@ -1166,9 +1131,6 @@ async def terminate(
) -> None:
"""Terminate the activity execution immediately.

.. warning::
This API is experimental.

Termination does not reach the worker and the activity code cannot react to it.
A terminated activity may have a running attempt and will be requested to be
canceled by the server when it heartbeats.
Expand Down Expand Up @@ -1348,9 +1310,6 @@ async def describe(
) -> ActivityExecutionDescription:
"""Describe the activity execution.

.. warning::
This API is experimental.

Args:
include_input: Include activity input in the response if available.
include_outcome: Include activity outcome in the response if available.
Expand Down
27 changes: 0 additions & 27 deletions temporalio/client/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -1487,9 +1487,6 @@ async def start_activity(
) -> ActivityHandle[ReturnType]:
"""Start an activity and return its handle.

.. warning::
This API is experimental.

Args:
activity: String name or callable activity function to execute.
arg: Single argument to the activity.
Expand Down Expand Up @@ -1741,9 +1738,6 @@ async def execute_activity(
) -> ReturnType:
"""Start an activity, wait for it to complete, and return its result.

.. warning::
This API is experimental.

This is a convenience method that combines :py:meth:`start_activity` and
:py:meth:`ActivityHandle.result`.

Expand Down Expand Up @@ -1943,9 +1937,6 @@ async def start_activity_class(
) -> ActivityHandle[Any]:
"""Start an activity from a callable class.

.. warning::
This API is experimental.

See :py:meth:`start_activity` for parameter and return details.
"""
return await self.start_activity(
Expand Down Expand Up @@ -2137,9 +2128,6 @@ async def execute_activity_class(
) -> Any:
"""Start an activity from a callable class and wait for completion.

.. warning::
This API is experimental.

This is a shortcut for ``await`` :py:meth:`start_activity_class`.
"""
return await self.execute_activity(
Expand Down Expand Up @@ -2286,9 +2274,6 @@ async def start_activity_method(
) -> ActivityHandle[Any]:
"""Start an activity from a method.

.. warning::
This API is experimental.

See :py:meth:`start_activity` for parameter and return details.
"""
return await self.start_activity(
Expand Down Expand Up @@ -2435,9 +2420,6 @@ async def execute_activity_method(
) -> Any:
"""Start an activity from a method and wait for completion.

.. warning::
This API is experimental.

This is a shortcut for ``await`` :py:meth:`start_activity_method`.
"""
return await self.execute_activity(
Expand Down Expand Up @@ -2474,9 +2456,6 @@ def list_activities(
) -> ActivityExecutionAsyncIterator:
"""List activities not started by a workflow.

.. warning::
This API is experimental.

This does not make a request until the first iteration is attempted.
Therefore any errors will not occur until then.

Expand Down Expand Up @@ -2517,9 +2496,6 @@ async def count_activities(
) -> ActivityExecutionCount:
"""Count activities not started by a workflow.

.. warning::
This API is experimental.

Args:
query: A Temporal visibility filter for activities.
rpc_metadata: Headers used on the RPC call. Keys here override
Expand Down Expand Up @@ -2563,9 +2539,6 @@ def get_activity_handle(

The activity must not have been started by a workflow.

.. warning::
This API is experimental.

To get a handle to an activity execution that you control for manual completion and
heartbeating, see :py:meth:`Client.get_async_activity_handle`.

Expand Down
6 changes: 1 addition & 5 deletions temporalio/client/_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,11 +104,7 @@ def __init__(self) -> None:


class ActivityFailureError(temporalio.exceptions.TemporalError):
"""Error that occurs when an activity is unsuccessful.

.. warning::
This API is experimental.
"""
"""Error that occurs when an activity is unsuccessful."""

def __init__(self, *, cause: BaseException) -> None:
"""Create activity failure error."""
Expand Down
Loading