Notable Changes
Added
Standalone Activity operator commands
ActivityHandlenow supports operator commands for standalone activities:pause,
unpause,update_optionsandrestore_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.NexusSerializationContextsupport 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. StandaloneUSE_EXISTINGhandles 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 arepause,
unpause,updateOptions,restoreOriginal.) - System Nexus Signal-with-Start Workflow operations now use the typed
WorkflowOutboundInterceptor.start_signal_with_start_workflowinterception point instead of
the genericWorkflowOutboundInterceptor.start_nexus_operationmethod. - System Nexus Signal-with-Start Workflow operations now invoke
WorkflowOutboundInterceptor.start_system_nexus_operationafter their typed interception
point. They continue not to invokeWorkflowOutboundInterceptor.start_nexus_operation. - The experimental
GetNexusOperationResultInputnow includes the Nexus endpoint, service, and
operation.
💥 Breaking Changes
- Experimental external storage:
ExternalStorage.driver_selectoris now called with a
StorageDriverSelectContextinstead of aStorageDriverStoreContext. Update the annotation;
the new type carries the sametargetfield. Since selectors are plain callables, a stale
annotation fails type checking rather than at runtime. client.ActivityExecutionandclient.ActivityExecutionDescriptionhad some fields removed or renamed
to match RPC API.- Dataclass parameters for these types were changed to
frozen=True, eq=False, kw_only=True. scheduled_timewas renamedschedule_time.last_failurewas changed from field to method that runs data converter on demand.state_transition_count,eager_execution_requested,pausedandlong_poll_tokenwere removed.
- Dataclass parameters for these types were changed to
- ActivityHandle.describe() long-poll token was removed. The functionality can still be used manually
through raw gRPC API.
Fixed
-
temporalio.contrib.deepagentsno 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
resumes from the carried transcript and never re-executes prior dispatches,
so a carried cache entry could only serve stale results). Patch-gated
(deepagents.retire-result-cache), so histories recorded before this change
replay unchanged; note that deferring the patch keeps the full legacy dedup
cache — including the stale-result behavior this entry describes — and that
a chain upgraded mid-continue-as-new re-executes rather than reuses a
repeated identical call (the conservative direction). -
contrib.deepagents: summarization middleware configured with a model name string now routes its LLM calls through Activities instead of running them in the Workflow. -
Experimental: External storage metrics now report the wall-clock time storage was in flight.
Previously each batch's duration was summed, over-reporting the time whenever storage operations
ran concurrently. -
System Nexus Signal-with-Start workflow operations now give custom payload
converters the target workflow's serialization context when encoding their
inner request payloads. -
Cancelling an activity from a signal while the workflow itself is cancelled
no longer causes a nondeterminism error from duplicate activity-cancellation
commands. -
StrandsPluginnow disables Botocore retries for its default Bedrock model so
model request retries are handled exclusively by Temporal. -
temporalio.contrib.openai_agentsnow honors theretry-after-msand
retry-afterheaders when OpenAI returnsx-should-retry: true. Previously
the delay the server asked for was discarded on that path and the activity
retried on its configured interval instead. -
Nexus-context workflow/activity starts no longer set
on_conflict_optionswhen there are no links
or callbacks to attach. -
The workflow sandbox now passes
pydantic_corethrough by default, alongsidepydantic.
SDK Core
info: syncing channel updates for 1.94-x86_64-unknown-linux-gnu
info: latest update on 2026-03-26 for version 1.94.1 (e408947bf 2026-03-25)
info: downloading 5 components
warn: the missing active toolchain 1.94-x86_64-unknown-linux-gnu has been auto-installed
warn: this might cause rustup commands to take longer time to finish than expected
info: you may opt out with RUSTUP_AUTO_INSTALL=0 or rustup set auto-install disable
Changelog
Added
- Language SDKs can opt in to recording local activity arguments in the local activity marker's
inputdetail. - Workflow completion-as-cancelled commands can now carry details for recording on the terminal
history event. - Core now supports attaching
EventGroupMarkers to most workflow commands. - The
temporal_activity_execution_failedandtemporal_local_activity_execution_failedworker
metrics now carry afailure_reasonattribute. Each is now split into one time series per
reason, which may affect existing dashboards. - Workflow task completions larger than the gRPC request size limit are now paginated automatically when the namespace supports it. Paginated workflow task completions require Temporal Server 1.32.0 or later.
Breaking Changes 💥
- The following types are now non-exhaustive:
Priority,WorkerDeploymentVersion,
WorkerCallbacks,WorkflowExecutionInfo,ActivityCloseTimeouts,
ActivityExecutionDecodeHint, child-workflow and signal decode hints,
SerializationContext,SerializationContextData,PayloadConverter,IncomingError,
ScheduleSpec, andScheduleOverlapPolicy. Construct structs using their respective builders
or constructors (WorkerCallbacks::new,ActivityExecutionDecodeHint::new, or
SerializationContext::new); useDefaultforPayloadConverter; and add wildcard branches
when matching enums. - Renamed
ActivityCloseTimeouts::BothtoActivityCloseTimeouts::ScheduleAndStartToClose. - Removed the unused
ActExitValuetype. UseActivityError::WillCompleteAsyncto mark an
activity for asynchronous completion. - Removed the test-only
FailOnNondeterminismInterceptorfrom the public API. TaskTokenno longer exposes its underlying bytes directly. UseTaskToken::into_inner()to
consume a token into its bytes.
Fixed
- Worker shutdown now drains activity completions that are still flushing their result to the
server before finishing. Previously such a completion — typically one whose final heartbeat RPC
was still in flight — could be permanently stranded by shutdown: the activity's result was
never reported (the server had to time the attempt out before retrying it), and workers missed
shutdown's slot-permit release deadline, panicking in debug builds. - The Prometheus exporter now appends
_totalto counter metric names when an SDK enables the
counter suffix option. - Update-with-start
ExecuteMultiOperationcalls now use Core's long-poll timeout instead of the
normal RPC timeout, avoiding premature failures while waiting for an update to reach its
requested stage. - An activity failure caused by oversized final heartbeat details is now counted in the
temporal_activity_execution_failedmetric asfailure_reason="PayloadsTooLarge". Previously it
was counted under the reason for the failure the activity itself reported, and was not counted at
all when that failure was benign, even though a payload-limit failure was reported instead. - Workers now warn when autoscaling task polling encounters errors continuously for one minute.
Repeated warnings use exponential backoff up to 15-minute intervals and stop after polling
recovers. - Workers with a small workflow cache no longer briefly stop accepting new workflows. Sticky
workflow-task pollers could consume every workflow-cache permit and starve the non-sticky poller,
so the worker would stop picking up new workflows until a poll timed out (up to ~60s). The poll
balancer now reserves a non-sticky slot against the workflow cache size rather than the slot
supplier size.
Commits
5962c094feat(sdk): add activity and workflow test env (#1492)46c50fc8chore(sdk): release 0.7.0 (#1494)86d5b8e4Expose cancel details on workflow cancel & propagate them in Rust SDK (#1501)74bb7536feat(client): allow setting memo on workflow start (#1443)f5d05758Add warning on worker deployment limits (#1500)56358115Fix CI flake detected by SDK Sentinel (rust) (#1507)c989a542feat(sdk): add WorkflowContext::all_handlers_finished (#1505)d9efc491fix(sdk): typed signal_with_start_workflow (#1508)5fe40e2fchore: remove some trybuild tests (#1510)090afd3cAdd workflow for sentinel comment responses (#1514)5d63f108Preserve Event Group Markers on cancellation commands (#1512)d913b1f0Serialize C-bridge ephemeral server tests (#1513)70a7bb55[SDK Sentinel] Stabilize legacy query integration test ordering (#1511)04ad5462feat(metrics): emitfailure_reasonon existing activity failure metrics (#1517)4e6f71fcMove changelog release notes helper to its own crate (#1519)b860e3f1Update api_upstream (#1520)096387e7chore(ci): let dependabot skip cloud tests (#1528)8bdcb754Thread counters_total_suffix through prometheus exporter (#1531)3037a0bbAllow including LA arguments in marker (#1532)be2be0afRun integration tests against envconfig-backed Cloud namespaces (#1483)8598d5befeat: workflow command pagination (#1515)02f96015build(deps): update base64 requirement from 0.22 to 0.23 (#1525)feb722f5fix(sdk): mark remaining public types withnon_exhaustive(#1536)35e39135Stabilize heartbeat timeout codec test (#1539)3ada2144feat(client): add update-with-start support (#1438)db635f0fFix non-sticky WFT poller starvation with small workflow cache (#1534)97e55aaeFix worker shutdown racing in-flight activity completions (#1538)95b63453feat(sdk): addWorkflowHandle::get_update_handle(#1540)3393e576Use shared changelog workflow (#1535)85b71d7eUpdate api_upstream
What's Changed
- Automate release preparation by @tconley1428 in #1692
- Mark breaking change headers by @tconley1428 in #1694
- Fix flake in test_started_workflow_has_link_to_standalone_nexus_operation by @VegetarianOrc in #1696
- feat(extstore): Add support for Nexus task handling by @jmaeagle99 in #1676
- fix: revert testmodule proto gen to mypy-protobuf 3.3.0 format by @jmaeagle99 in #1699
- test: run integration suite against Cloud by @tconley1428 in #1687
- refactor: move workflow task duration logging to core by @jmaeagle99 in #1698
- chore: update uv lockfile by @tconley1428 in #1700
- test: unskip unfinished update handler cases on time-skipping server by @Sakshamm-Goyal in #1697
- Ensure unique workflow IDs in deployment config test by @VegetarianOrc in #1705
- Add pytest marker to skip nexus extstore tests by @VegetarianOrc in #1702
- Add SAA TemporalNexusOperation handling by @VegetarianOrc in #1689
- Bump OpenAI Agents failure-propagation test timeout by @THardy98 in #1711
- fix: preserve restricted proxies after in-place operations by @Sakshamm-Goyal in #1706
- revert: restore Python workflow task duration logging by @tconley1428 in #1720
- Forward MCP server config through GeminiTestServer.plugin() by @brianstrauch in #1721
- Updating Temporal API protos by @JoshuaFrenchwood in #1719
- fix(contrib): pool and idle-evict MCP connections in google_adk_agents by @wankhede04 in #1664
- Fix duplicate links for Nexus backing SAA by @VegetarianOrc in #1725
- Test Strands with unique task queues by @tconley1428 in #1729
- fix(contrib/pydantic): reuse TypeAdapters across payloads by @nathan-gage in #1703
- Fix race in nexus double start test by @VegetarianOrc in #1728
- Wait for deployment ramp propagation by @tconley1428 in #1730
- test: provision Cloud namespace per CI run by @tconley1428 in #1731
- test: tolerate trace start-run ordering by @tconley1428 in #1714
- Test LangSmith built-in query filtering by @tconley1428 in #1727
- [AI-163] google_adk_agents: support ToolContext session state in activity_tool by @DABH in #1683
- Add mcp dependency to google-adk extra by @DABH in #1736
- contrib/google_adk_agents: rename activity_tool to activity_as_tool by @DABH in #1735
- Accept dict run_config in openai_agents Temporal runner by @DABH in #1739
- docs: clarify AI contribution expectations by @tconley1428 in #1737
- [AI-250] Add Deep Agents plugin by @DABH in #1644
- chore: update sdk-core submodule to latest by @jmaeagle99 in #1738
- Add workflow.uuid7() by @ribhavjain in #1733
- docs: clarify OpenAI Agents tool execution by @jaeyoung0509 in #1741
- chore: update sdk-core submodule to latest by @jmaeagle99 in #1742
- Add missing changelog entry for Nexus invoked SAA by @VegetarianOrc in #1746
- Remove stale references to Python 3.9 by @mjameswh in #1740
- feat: expose runtime environment info option by @tconley1428 in #1747
- Fix OpenInference trace patch lifecycle by @tconley1428 in #1726
- Add SDK Core changelog release notes by @tconley1428 in #1744
- refactor: move workflow task duration logging to core by @jmaeagle99 in #1749
- feat: Add optional FIPS support- #466 by @christiandcucco in #1743
- Expose Core console log format by @Sushisource in #1750
- [SDK Sentinel] Fix concurrent OpenTelemetry ID seed isolation by @sdk-sentinel-bot in #1758
- test: support standalone activity cancellation status change by @tconley1428 in #1762
- Expose failure converter to system Nexus conversion by @VegetarianOrc in #1760
- AI-382: keep hosted tool credentials out of workflow history by @xumaple in #1752
- Report non-retryable PayloadValidationError as BAD_REQUEST by @bergundy in #1756
- Set request ID for SAA by @Quinn-With-Two-Ns in #1761
- Use target serialization context for system Nexus signal-with-start by @tconley1428 in #1672
- Fix the sandbox examples in the OpenAI Agents README by @brianstrauch in #1764
- [AI-383] Add replay-safe OpenTelemetry meter and logger providers by @DABH in #1710
- AI-382: keep sandbox credentials out of workflow history by @xumaple in #1745
- Move Nexus start workflow logic into the Nexus package. by @VegetarianOrc in #1765
- Add payload validation error factory by @bergundy in #1766
- Fix shared header encoding for update-with-start by @tconley1428 in #1770
- Omit null payload validation details by @bergundy in #1774
- Move Nexus workflow update and signal logic into the Nexus package. by @VegetarianOrc in #1771
- Decode system Nexus worker payloads by @VegetarianOrc in #1775
- Prepare release 1.32.0 by @tconley1428 in #1779
- Adding QueryWorkflowResponse Link for Nexus by @JoshuaFrenchwood in #1723
- Fix release changelog verification by @tconley1428 in #1780
- Add SDK Sentinel PR responder by @Sushisource in #1781
- fix: fail task when update handler continues as new by @Sakshamm-Goyal in #1708
- Update sdk-core by @tconley1428 in #1786
- [SDK Sentinel] Fix Nexus TRY_CANCEL cancellation test race by @sdk-sentinel-bot in #1785
- Support payload-free system Nexus roots by @JoshuaFrenchwood in #1783
- Update bridge lockfile security fixes by @tconley1428 in #1789
- Use shared changelog workflow by @Sushisource in #1790
- Fix tests with latest dependencies by @brianstrauch in #1798
- [SDK Sentinel] Stabilize immediate schedule trigger test by @sdk-sentinel-bot in #1802
- fix: only set Nexus start on_conflict_options when there's something to attach by @tekkaya in #1799
- 💥 feat(extstore): pass a dedicated select context to the driver selector by @jmaeagle99 in #1794
- feat: add System Nexus operation interceptors by @tconley1428 in #1791
- Honor retry-after headers when OpenAI requests a retry by @1fanwang in #1796
- Disable Botocore retries for default Strands Bedrock model by @brianstrauch in #1797
- feat: restore generic System Nexus workflow interceptor by @tconley1428 in #1800
- [SDK Sentinel] Remove flaky Gemini replay workflow deadline by @sdk-sentinel-bot in #1816
- Fix duplicate activity cancellation commands by @tconley1428 in #1814
- fix(extstore): report wall-clock duration for storage metrics by @jmaeagle99 in #1815
- Support new API fields in ActivityHandle.describe by @maciejdudko in #1782
- [SDK Sentinel] Stabilize unfinished-handler cancellation test by @sdk-sentinel-bot in #1824
- Add GCP Cloud Run OpenTelemetry support by @seanbollin in #1767
- Add OpenTelemetry metrics exporter built on MetricBuffer by @harsh543 in #1701
- Pass pydantic_core through the workflow sandbox by default by @DABH in #1834
- Run google_genai MCP tests in-memory and close pooled connections by @DABH in #1836
- Remove redundant workflow deadlines from google_genai and openai_agents tests by @DABH in #1835
- Bound workflow task latency metric by wall-clock time in metrics test by @DABH in #1839
- Derive reset point from history in random seed test by @DABH in #1840
- Fix System Nexus payload converter serialization context by @tconley1428 in #1825
- Skip cloud tests for Dependabot by @tconley1428 in #1846
- Standalone Activities operator commands by @GregoryTravis in #1809
- deepagents: route string summarizer models through the durable seam by @DABH in #1843
- Bump aiohttp from 3.14.1 to 3.14.3 by @dependabot[bot] in #1827
- Bump cryptography from 49.0.0 to 50.0.0 by @dependabot[bot] in #1826
- Fix repeated Deep Agents tool calls with identical arguments by @1fanwang in #1806
- Fix OpenTelemetry exporter examples in the openai_agents README by @DABH in #1850
- Remove Experimental tag from Standalone Activities by @GregoryTravis in #1863
- Prepare release 1.33.0 by @tconley1428 in #1864
- [SDK Sentinel] Retry transport-cancelled worker deployment test RPCs by @sdk-sentinel-bot in #1857
- NexusSerializationContext for data/failure converters by @JoshuaFrenchwood in #1828
New Contributors
- @JoshuaFrenchwood made their first contribution in #1719
- @wankhede04 made their first contribution in #1664
- @nathan-gage made their first contribution in #1703
- @ribhavjain made their first contribution in #1733
- @jaeyoung0509 made their first contribution in #1741
- @christiandcucco made their first contribution in #1743
- @sdk-sentinel-bot made their first contribution in #1758
- @tekkaya made their first contribution in #1799
- @seanbollin made their first contribution in #1767
- @harsh543 made their first contribution in #1701
Full Changelog: 1.31.0...1.33.0