Repository navigation
Releases: temporalio/sdk-python
Release list
1.34.0
Notable Changes
Added
-
Added
WorkflowAlreadyStartedError.first_run_idfor the first execution run
ID when provided by the server. -
Experimental:
temporalio.contrib.google_adk_agentsnow supports ADK v2
graph workflows, dynamic@nodeworkflows, and durable HITL. -
Experimental: Experimental support for Event Groups. Event Groups is a new form of
Workflow-level metadata that allows for improved visibility into a Workflow execution's history
by grouping logically related Events together based on user-defined or system-inferred criteria.
workflow.create_event_group(...)takes the Event Group's ID as its first and only required
argument; the user-provided ID is used verbatim and should not contain sensitive information.
The label is optional and passed as a keyword argument; it is a codec-encoded Payload. -
Added
workflow.Info.original_execution_run_id, the run ID recorded on the workflow
execution started event. Unlikerun_id, this value is preserved across workflow resets. -
Experimental:
temporalio.contrib.strandsnow supports durable,
Workflow-isolated Strands sandboxes throughTemporalSandboxand
worker-side factories registered withStrandsPlugin(sandboxes=...). -
Added the
temporalio.contrib.gcp.cloud_run.idmodule with theCloudRunIdPluginclient plugin to set the worker identity on Cloud Run.
Changed
- The
deepagentsextra now requiresdeepagents>=0.7,<0.8(was<0.7). Because
deepagents 0.7 requireslangsmith>=0.10.9, thelangsmithextra now allows
langsmith<0.13(was<0.9).
💥 Breaking Changes
- The
google-adkextra now requiresgoogle-adk>=2.8.0,<3, up from>=2.2.0. temporalio.contrib.google_adk_agents: ADK-generated ids and retry jitter now draw from the
workflow's deterministic random stream. A workflow started under an earlier release that calls
workflow.random()orworkflow.uuid4()after ADK code may not replay deterministically
across the upgrade; drain such workflows or use worker versioning.
Fixed
-
temporalio.contrib.deepagentsnow preserves model binding options such as
response_formatandtool_choicewhen tools are also bound. -
Workflow handles returned when a start attaches to a running workflow now use
the server-provided first execution run ID with Temporal Server 1.32.0 or
later. -
Restore
frozensetvalues when decoding JSON payloads with afrozensettype hint,
including nested frozen sets. -
Ordinary absolute imports of already-loaded modules in sandboxed workflows no longer go through
importlib's module locks, fixing intermittentFailed validating workflowerrors on Python 3.10
caused by aKeyErrorinimportlib._bootstrap._ModuleLock.acquirewhen a garbage-collection
finalizer importedwarningsduring a workflow load
(#585). -
temporalio.contrib.deepagents.TemporalBackendis fixed for deepagents 0.7 compatibility
(e.g., addingdelete/adelete). -
temporalio.contrib.deepagents.TemporalBackendnow forwards the per-commandtimeoutof
deepagents'executetool for a wrapped sandbox backend such asLocalShellBackend. -
GoogleAdkPluginnow passes the optionalanthropic,litellm, andopenaiSDKs through
the workflow sandbox. -
GoogleAdkPluginnow passes OpenTelemetry modules through the workflow sandbox so ADK 2.9
graph workflows can load their context support during execution. -
contrib.deepagents: prevent duplicate input messages after continue-as-new. -
DataConverter.payload_converterand current workflow and activity payload converter accessors
now return the configured converter without SDK-internal transfer type conversion. -
Restore pickling of Pydantic data converters, preserving the type adapter cache
size limit while excluding cached adapters. -
Current workflow and activity payload converter accessors now return the configured converter
without SDK-internal transfer type conversion. -
A Nexus operation's user metadata is now serialized with
NexusSerializationContext, the same way
workflow and activity user metadata are serialized with theirs. This covers the static summary
sent when starting an operation, and the summary and details read back from a description.
SDK Core
Changelog
Added
- External workflow signal and cancellation resolution activations now include the typed server
failure cause alongside the existing failure.
Fixed
- Task-poll targets no longer decrease after cancelled or timed-out polls. Affected pollers still
retain their slot during backoff, while resource-exhaustion errors still reduce the target. - Replay now preserves which local activity results were delivered together for newly recorded
histories. This prevents local activity scheduling which was conditional on local activity
resolution order from assigning recorded results to different handles. Older markers keep their
existing behavior. - Workflow poll balancing now lets non-sticky pollers use capacity after sticky pollers reach their
configured or autoscaled polling limit. - Every path that fails a workflow task now only reports the failure to server
on the task's first attempt, and later attempts are left to time out. PreviouslyPayloadsTooLarge
failures and history fetch failures were re-reported on every attempt. - The
workflow_task_execution_failedmetric is now recorded for every failed workflow task
attempt, including attempts whose failure was not sent to the server, and itsfailure_reason
tag distinguishesGrpcMessageTooLarge,PayloadsTooLarge, andRequestTooLargeon every path.
Commits
88af5c87chore(sdk): make serialization context extensible (#1553)b804c0bachore(sdk): rename include_arguments_into_marker to include_arguments_in_marker (#1554)a38b8b4fchore(sdk): automate crate release (#1550)0ee46047Fix flaky post-cancel abandoned child test (#1555)eea75f41Stabilize Nexus async outcome deadlines (#1556)8ccec71dAdd named deterministic workflow random streams (#1557)37d747ddfeat(sdk): gate experimental APIs behind feature (#1395)85bf431fUse context-sensitive randomness for workflow views (#1558)173afc02Make SdkWakeGuard thread-bound (#1562)98bf1639Synchronize cgroup memory test refresh (#1559)2f7ef345chore(sdk): make publish idempotent (#1561)207acc16chore(sdk): prepare for 0.8.0 release (#1560)9f1acdb9chore(sdk): resolve some doc(hidden) APIs (#1563)f3bf104bchore(sdk): limit macro exports (#1564)5db7e2efdocs: update API WIT documentation (#1573)a94ca631chore(sdk): use correct repo in cargo toml (#1567)139d2e8fchore(sdk): mark remaining error enums as non exhaustive (#1568)078f7fe5feat(sdk): add not found variant for signal/cancel external wf (#1569)8cab93dachore(sdk): mark pub test utilities as experimental (#1570)c8551672chore(core): remove doc hidden from runtime opts ([#1572](https://github.com/...
1.33.0
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)- [
f5d05758](https://github.com/temporalio/sdk-r...
1.32.0
Notable Changes
Added
-
Added
temporalio.converter.create_payload_validation_errorto create the
non-retryable application error used when a converted payload fails validation. -
Added experimental
temporalio.contrib.opentelemetry.ReplaySafeMeterProviderand
ReplaySafeLoggerProvider(and exportedReplaySafeTracerProvider): wrap an
OpenTelemetry provider so metrics and log events recorded from workflow code (e.g. by
Google ADK) are not duplicated on replay.GoogleAdkPluginwarns when a global OTel
provider is not replay-safe. -
Added
LoggingConfig.formatto select compact, pretty, or newline-delimited JSON output for
Core logs written to the console. -
Added the
Runtime(disable_environment_info=...)option to control whether
runtime, hosting, and platform information is included in worker heartbeats. -
temporalio.workflow.uuid7()generates a determinism-safe, time-sortable
UUIDv7 (RFC 9562) from workflow time and the workflow's deterministic random
generator, complementing the existingworkflow.uuid4()
(#1450). The
workflow sandbox now also restricts the non-deterministicuuid.uuid7()
added to the standard library in Python 3.14, matching the existing
uuid.uuid1()/uuid.uuid4()restrictions. -
Experimental:
TemporalOperationHandlercan now use Standalone Activities as asynchronous
Nexus Operation backing executions throughTemporalNexusClient.start_activity. -
Experimental:
temporalio.contrib.openai_agents.temporal_worker_env_refnames an environment
variable the worker reads for a hosted tool credential, keeping it out of workflow history. -
Experimental:
temporalio.contrib.openai_agents.TemporalWorkerEnvValuenames an environment
variable the worker reads for a sandbox environment value, keeping it out of workflow history. -
Experimental:
OpenAIAgentsPlugin(resolvable_worker_env_vars=...)allowlists the environment
variable names a worker will read. -
Experimental:
temporalio.contrib.openai_agents.AllowAllWorkerEnvVarsallowlists every
environment variable name on the worker.
Changed
- The
opentelemetryandlambda-worker-otelextras now require
opentelemetry-api/opentelemetry-sdk>= 1.26, matching what
temporalio.contrib.opentelemetryalready required in practice. temporalio.contrib.pydanticconverters now reuse Pydantic type adapters
for repeated type hints instead of rebuilding their schemas for every
payload, greatly speeding up decode of non-model hints such as discriminated
unions (#1695). Up
to 1024 type adapters are cached per converter instance by default, with
least-recently-used eviction. To change the bound, pass
max_cached_type_adapterstoPydanticPayloadConverter(or
PydanticJSONPlainPayloadConverter) from a nullary subclass used as the
DataConverter.payload_converter_class;Nonemakes the cache
unbounded and zero disables caching.- A data converter can now report that it understood a Nexus operation's input
but considers it invalid by raising a non-retryableApplicationErrorof type
PayloadValidationErrorwhile decoding it. Such a failure is reported to the
caller as aBAD_REQUESTNexus handler error with the message
Invalid operation input, retaining the original error as its cause. Raised
from a payload codec, that replaces a handler-sideINTERNALerror; raised
from a payload converter, the type was alreadyBAD_REQUESTand only the
message becomes specific to validation. Any other decode failure, and a
retryablePayloadValidationError, keep their existing treatment.
💥 Breaking Changes
- The
openai-agentsextra now requiresopenai-agents>=0.19.2,<0.20, up from>=0.17.5with no
upper bound. temporalio.contrib.openai_agentsnow rejects a sandboxSandboxPathGrantbound to a
host_path.temporalio.contrib.openai_agentsnow rejectsrun_config.sandbox.session.
Fixed
create_payload_validation_error(None)now creates an application error with no
details instead of encodingNoneas a detail.- Client header encoding no longer mutates interceptor-provided payloads, preventing
update-with-start from encoding a shared header twice when
HeaderCodecBehavior.CODECis enabled (#1769). temporalio.contrib.opentelemetryreplay-safe spans now delegate
Span.add_linkto the wrapped span. Previously the wrapper inherited
OpenTelemetry's non-abstract no-op default, silently dropping links added
after span creation.- Standalone activity start requests now include a unique request ID so RPC retries are deduplicated.
- OpenTelemetry trace and span IDs propagated by concurrent workers no longer
interfere with each other, preserving the correct parent-child hierarchy. - The
google-adkextra now depends onmcp, so fresh installs of
temporalio[google-adk]can importtemporalio.contrib.google_adk_agents
without separately installingmcp. Previously the import failed with an
ImportErrorbecausegoogle.adk.tools.mcp_toolonly exportsMcpToolset
whenmcpis installed. temporalio.contrib.openai_agentsno longer crashes when a plaindict
is passed forrun_config. (openai-agents >= 0.19.0 acceptsdictrun
configs at its public runner API)
SDK Core
Changelog
Added
- Core console logs can now be emitted as newline-delimited JSON when an SDK selects the JSON log
format. Configured log filters continue to apply to JSON output. - Worker heartbeats now report the SDK runtime, hosting environments, operating system, and
architecture once per worker, retrying until the first successful delivery. Runtime options can
disable the reporting. - Workers now log a
[TMPRL1104]warning when a workflow task takes longer than 5 seconds. Set
TEMPORAL_WORKFLOW_TASK_DURATION_WARN_SECONDSto change the threshold.
Breaking Changes 💥
- Activity failures now include the latest heartbeat details atomically instead of force-flushing a
throttled heartbeat first. Temporal Server 1.16.0 or newer is required to guarantee those details
are preserved on failure; workers warn when the server does not advertise support.
Fixed
- Workers no longer send worker heartbeats or appear in centralized heartbeat reports before they
begin polling. - Ephemeral server processes no longer leak on failed start.
- Local activity resolutions are now delivered to workflows as each activity completes instead of
waiting for every local activity in the workflow task. This allows sequences of short local
activities to make progress while a long-running local activity executes in parallel, while
preserving the resolution ordering recorded in existing histories during replay. - Try-cancel child workflows no longer cause nondeterminism when they complete or fail after their
cancellation was requested. - Nexus tasks are now timed out locally even when the server sends a
request-timeoutheader that
falls outside the Nexus duration grammar, such as a negative value for a task whose deadline has
already elapsed, a sub-millisecond unit, or a multi-unit value like1m30s. Previously such a
header was ignored entirely, so the handler was never told the task had timed out, and a task
left unanswered could block worker shutdown indefinitely.
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 https://github.com/tempora...
1.31.0
Notable Changes
Added
-
Added the
Workermax_eager_activity_reservations_per_workflow_taskoption for configuring
the number of activity slots reserved for eager execution per workflow task. Configured values
must be positive; usedisable_eager_activity_executionto disable eager activity execution. -
Added experimental SDK payload converter support for values and type hints
decorated with@transfer_type_convertible(...)using aTransferTypeConverterclass.
This lets types with transfer type converters delegate their wire representation to the
configured payload converter, preserving SDK behavior such as serialization
contexts. -
Added
TLSConfig.verification_server_nameto verify the server certificate against a fixed name
instead of the connection's server name. Unlikedomain, it does not change the TLS SNI or
HTTP/2 authority values, which keep following the connected host, so it can be used when the
server's certificate does not carry the dialed name but on-path infrastructure (e.g. an
SNI-inspecting egress proxy) needs the SNI to remain resolvable. Requires
server_root_ca_cert. -
Added the experimental
Workerpatch_activation_callbackoption, allowing workers
to decide whether a first non-replayworkflow.patchedcall should activate a patch
during rolling deployments.
Changed
- Prepared replay-safe workflow activation scheduling that prevents cancellation
from being lost when another event becomes ready in the same workflow task. The
behavior is guarded by internal workflow logic flag 2 and remains disabled by
default during its compatibility rollout.
Maintainer reminder: keep flag 2 default-disabled for the first two published
SDK releases that recognize it; enable it in the third release, remove the explicit
overrides for this flag fromtests/worker/test_workflow.py, and replace this rollout
note with aFixedentry announcing the behavior change.
💥 Breaking Changes
- Custom workflow runners that construct
WorkflowInstanceDetailsmust now pass
payload_converter_factoryinstead ofpayload_converter_class. The factory
returns the already wrapped payload converter that workflow instances should
use. - System Nexus payload converter helpers added for generated bindings are now
private implementation details, and the remaining publictemporalio.nexus.system
APIs are marked experimental and subject to change. - Payload size limits have moved from
DataConvertertoClient.connect. Pass
payload_limits=PayloadLimitsConfig(...)(now exported from
temporalio.client) instead of settingpayload_limitsonDataConverter.
Config fields were renamed topayloads_warn_sizeandmemo_warn_size, and
the deprecatedPayloadSizeWarningwas removed.
Fixed
- Marked system Nexus envelope payloads so nested payloads can be detected and
visited after the envelope is already stored as a payload.
SDK Core
db902171cleanup changelog (#1374)353fd3b8chore: limit wasm test concurrency (#1375)5df57f6dfix(otel): install subscriber on PeriodicReader thread (#1378)467e871aUpdate api upstream (#1367)d96b1eb4feat(sdk): switch to rich search attributes from all getters (#1373)9b9325cdfix(client): correctly handle Node gRPC style unimplemented method message (#1379)8e21d5bcchore(ci): use mise for installing protoc (#1382)afb5251ffeat(schedules): provide typed accessor to schedule action (#1372)2cf2c103Test Cloud gzip support for GetSystemInfo and HealthCheck (#1362)03a6d123chore(sdk): reject#[workflow(name=...)]for overriding workflow name (#1390)95e97686fix: use worker hearbeat interval for heartbeat system info poller (#1393)6f75de52Fix workflow executor cooperative budget livelock (#1396)6a0a5bc3docs: update contributing guide (#1397)208ca8bcchore: add dev tools to mise.toml, remove redundant CI installs (#1386)207194c9Fix task slots used metric (#1391)16452094feat(sdk): remove remaining raw protos in APIs (#1398)e72c031ffeat(sdk): provide typed accessor for workflow count group (#1410)1b6e4e38Allow resource controllers to be shared across tuners (#1407)3dac9013feat: payload limit enforcement (#1363)846ac2c5chore: extract composite action for CI setup, add selective mise installs (#1387)47d3a40echore(ci): use github backend for temporal cli (#1414)a9bdead4Add patch activation callback (#1394)5f94631dReplace unmaintained backoff crate with backon (#1411)aeb102efOnly set worker control task queue field in polls when appropriate (#1418)71f46055feat(sdk): addrandomanduuid4in workflow context (#1412)52aa5ed7fix(sdk): respect forced failure over completion in same poll (#1417)19123894chore(sdk): rename start_activity to execute_activity (#1416)25de75e1don't use versioning for internal nexus poller (#1420)eb004c78Integrate Temporal API 1.63.4 (#1423)d2769368Make eager activity reservation limit configurable (#1424)
What's Changed
- fix(activity): do not mutate caller-provided extra dict in LoggerAdapter by @1fanwang in #1513
- Update sdk-core to incorporate time-skipping api changes by @GregoryTravis in #1633
- Fix flaky TMPRL1104 duration-log assertions in test_extstore by @DABH in #1628
- Add dynamic node/task summaries to LangGraph plugin by @DABH in #1612
- ...
1.30.0
Notable Changes
Added
- Nexus operation link propagation for signals. When a Nexus operation handler signals a workflow
(including signal-with-start), the inbound Nexus request links are now forwarded onto the signaled
workflow so its history events link back to the caller, and the link the server returns for the
signaled event is attached to the caller workflow's Nexus operation history event. This makes the
caller and callee mutually navigable in the UI for signal-based Nexus operations. - Exposed
backoff_start_intervalfor continue-as-new, to allow the new workflow to start after a delay.
Changed
- AWS Lambda worker
configureparameter supports sync, async, and async
generator style functions. This callback is invoked on the asyncio event
loop. - Relaxed the protobuf dependency bounds to allow protobuf 7 where compatible
with the selected optional dependencies. - Standalone Nexus operation links are now forwarded on start workflow and signal requests.
Breaking Changes
- AWS Lambda worker
configureparameter has been changed to be invoked
per-invocation of the worker instead of only at startup. It is advised that
any shared, heavy-weight operations are performed outside of the callback
beforerun_workeris invoked.
SDK Core
6bd00e83fix(c-bridge): prefix enum variants with type name (#1319)7d8d61ffupgrade on CAN (#1316)92bf1a1fFix activity_cancel_delivered_without_heartbeat test (#1322)f7448bfd[feat(sdk)] Add client() and workflow_handle() to ActivityContext (#1324)95c0175bAdd backoff start for CAN (#1325)29d3bd04feat(sdk): remove usage ofanyhowfrom public error types (#1326)4c971f63feat(visitor): payload limits validation visitor (#1327)ab5f1365feat(sdk): error type for signal external workflow (#1329)e5d1a404docs(sdk): remove warning over use of workflow apis (#1331)681b8badWait for in-progress ephemeral server download by progress, not fixed deadline (#1332)19827291Feature-select OTLP exporter TLS backend (#1333)f213db85fix(sdk): do not apply codec when decoding search attributes (#1336)d79f8681Bring Core worker_may_ignore event behavior in line with Java/Go (#1339)22667b0efix(macros): remove redundant.into_iter()call (#1349)0689f769feat(sdk): move signal payload decoding to happen before dispatch (#1352)d936c6ccGuard the Nexus operation result future against false nondeterminism on replay (#1353)286baac5fix(sdk-core): rewrite while_let_loop in polling_tests to satisfy clippy (#1354)213a62a9feat(client): add workflow input support to ScheduleAction::StartWorkflow (#1347)ad76ca59chore: bump otel minor (#1358)4cbf147aVLN-1616: fix checkout-below-v7 (#1359)b9e20dadchore: bump crates to 0.5.0 (#1360)3389e429feat(sdk): add UntypedActivity (#1361)9758355dchore: bump unit test timeouts across the board (#1364)5126dad7feat: add typed search attributes API (#1346)95d3a76dFix/finalize shutdown arc race (#1365)98602c71chore(client): use json payload converter (#1368)9f83b7e3Respect SDK flags in history & gzip downgrade (#1370)
What's Changed
- Retry release smoke package install by @tconley1428 in #1608
- Generate release note additions by @tconley1428 in #1609
- 💥 Enable lambda worker async configure callback by @jmaeagle99 in #1604
- Add release preparation script by @tconley1428 in #1611
- Allow protobuf 7 by @tconley1428 in #1610
- Propagate OTEL trace id across client-workflow boundary by @brianstrauch in #1601
- Expose continue-as-new backoff start interval by @Sushisource in #1613
- Fix continue-as-new handling in workflow_streams subscribe by @brianstrauch in #1581
- Adding links to Nexus signals by @Evanthx in #1593
- Use endpoint for system Nexus detection by @tconley1428 in #1616
- Update bridge Cargo dependencies by @tconley1428 in #1617
- VLN-1613: remediate checkout-below-v7 by @picatz in #1622
- Send SANO links in requests by @VegetarianOrc in #1621
- Update core submodule and otel lock by @tconley1428 in #1626
- Update uv lock by @tconley1428 in #1627
- Prepare release 1.30.0 by @tconley1428 in #1630
- Update sdk-core submodule by @tconley1428 in #1632
New Contributors
Full Changelog: 1.29.0...1.30.0
1.29.0
Notable Changes
Added
- Added experimental
temporalio.workflow.signal_with_start_workflow, backed by
generated system Nexus bindings for
WorkflowService.SignalWithStartWorkflowExecution. - Added OpenAI Agents plugin support for
CustomTooldispatch, including lazy
tool discovery throughdefer_loading.
Breaking Changes
-
Client connections now use gzip transport-level gRPC compression by default.
Passgrpc_compression=GrpcCompression.NONEtoClient.connector
CloudOperationsClient.connectto disable it. This can cause issues in some proxy scenarios
if the proxy does not implement gRPC compression. Upgrade to version1.30.0if affected,
in which compression downgrading is supported. -
StartWorkflowUpdateWithStartInputnow owns the authoritative
rpc_metadataandrpc_timeoutfields for
OutboundInterceptor.start_update_with_start_workflow. These fields were
removed from the nested update-with-start input objects, so custom
interceptors that accessed them there should read or update the top-level
fields instead.
Fixed
-
Fixed
breakpoint()andpdb.set_trace()inside workflow code when a worker
runs withdebug_mode=TrueorTEMPORAL_DEBUG=1; sandboxed workflows without
debug mode now get a clearer error pointing todebug_mode=True. -
Fixed
start_update_with_start_workflowinterceptor handling so RPC metadata
and timeouts are forwarded to the underlyingexecute_multi_operationcall. -
Fixed OpenAI Agents plugin streamed event serialization when pydantic had not
yet built deferred schemas, and fixed terminal sandbox errors retrying
forever. -
Removed the lazy-connect lock from the per-RPC hot path. It was previously
acquired on every RPC, putting an event-loop-bound primitive on the hot path;
it is now skipped once the client is connected. This reduces the client's
coupling to the event loop it connected on, which can help when reusing a
single long-livedClientacross event loops or threads (e.g. the
dedicated-loop pattern used with gevent/gunicorn and synchronous services).
Note this does not make aClientfully thread- or loop-agnostic; reusing one
long-lived loop is still the recommended pattern.SDK Core
993de3fbdeps: sync api_upstream subtree to temporal-api@6c8bd13 (#1293)d0065e38Rename master to main for API deps (#1309)f57f6f06fix(sdk): no longer expose raw proto for application error category (#1307)40d24ec8bump version (#1317)f1899d23Add gzip compression by default with option to opt-out (#1310)f43520e6Add CHANGELOG and document the update process (#1315)c5a6646eUpdate API Upstream to pull in WIT generation (#1320)
What's Changed
- Add CHANGELOG and document the update process by @cconstable in #1580
- Use ActivitySerializationContext when describing a Standalone Activity by @VegetarianOrc in #1583
- Build streamed OpenAI events before serializing them by @brianstrauch in #1586
- Update core submodule by @tconley1428 in #1590
- AI-249: Support CustomTool in OpenAI Agents plugin tool dispatch by @xumaple in #1570
- 💥 Fix interceptor contract inconsistency for start_update_with_start_workflow by @brucearctor in #1588
- Fix error message for tracer provider initialization by @tconley1428 in #1584
- System Nexus payload handling from WIT by @tconley1428 in #1572
- Gzip compression options by @Sushisource in #1587
- Fix pdb / breakpoint() hang in workflow code by @elidlocke in #1568
- Upgrade PyO3 to 0.29 by @tconley1428 in #1599
- Translate terminal sandbox errors to non-retryable ApplicationError by @xumaple in #1595
- Fix asyncio lock contention in client calls by @Sushisource in #1606
- Bump version to 1.29.0 by @tconley1428 in #1607
New Contributors
- @elidlocke made their first contribution in #1568
Full Changelog: 1.28.0...1.29.0
1.28.0
Experimental Releases
Strands Agents Plugin
This release adds a new Temporal Plugin for running Strands Agents inside Temporal Workflows. Model invocations, tool calls, and MCP tool calls are routed through Temporal Activities, so your agents get durable execution, retries, and timeouts for free.
Workflow Streams support for LangGraph
The LangGraph plugin can now durably stream node output to external consumers. Values written with langgraph.config.get_stream_writer() are published to a Workflow Streams topic.
Standalone Nexus Operations
Standalone Nexus Operations is experimental and currently only supported on pre-release versions of the dev server.
Added support for Standalone Nexus Operations, allowing clients to start and manage Nexus operations directly outside of a Workflow. Documentation, Samples, and instructions to request enablement in Temporal Cloud will be linked here when available.
⚠️ Possible Local Activity Behavioral Difference
This release includes a bugfix in the Core library that changes incorrect behavior that may have unintentionally worked previously. Specifically, local activities that start running, and continue running while their associated workflow was evicted from the cache, could possibly be "re-attached" to the workflow if it was recreated before they finished. This behavior was unsound. Now, any running local activities are invalidated when a workflow is evicted. This change was really only likely to be encountered if you were running with the workflow cache disabled, which we never recommend doing.
What's Changed
- Bump ruff to 0.15 and reformat by @brianstrauch in #1507
- Format LangSmith tracing env override test by @tconley1428 in #1531
- Fix swallowed CancelledError in start_child_workflow and Nexus operations (Issue #1445) by @yegorske50 in #1472
- Use LangSmith runtime override API instead of monkey-patching aio_to_thread by @xumaple in #1477
- (CI) Disable caching cargo binaries by @maciejdudko in #1537
- Refactor client module into package by @tconley1428 in #1530
- Remove exclude-newer-package option by @brianstrauch in #1529
- Refactor
workflow.pyinto package by @tconley1428 in #1488 - Fix documentation link for Workflow Streams by @brianstrauch in #1536
- Integration test for Standalone Activities delayed-start by @eamsden in #1520
- Update banner url by @Sushisource in #1542
- Address Flake in test_workflow_history_info by @VegetarianOrc in #1545
- remove stale nightly tps omes test by @THardy98 in #1544
- Implement Standalone Nexus Operations by @VegetarianOrc in #1461
- Drop macos-intel from CI by @eamsden in #1553
- ci: key Rust cache on resolved Python version by @brianstrauch in #1554
- Enabled frontend.enableCancelWorkerPollsOnShutdown in tests by @tconley1428 in #1555
- Narrow overloads on the SANO client by @VegetarianOrc in #1552
- VLN-1341: remediate missing-dependency-cooldown by @picatz in #1551
- LangGraph streaming with workflow streams by @brianstrauch in #1500
- fix: call task.uncancel() after catching CancelledError in shield loops (Python 3.11+) by @brucearctor in #1523
- Expose JSON type converter unhandled sentinel type by @Lingavasan in #1556
- remove unused omes job by @THardy98 in #1559
- Tolerate OpenAI model schema drift in the agents payload converter by @brianstrauch in #1563
- Add Temporal Operation Handler by @VegetarianOrc in #1503
- Bump langsmith from 0.7.38 to 0.8.0 by @dependabot[bot] in #1521
- Add Strands Agents plugin (contrib) by @brianstrauch in #1539
- Update Core by @Sushisource in #1564
- Swap from TemporalNexus prefix to Temporal by @VegetarianOrc in #1569
- Passthrough
_pydevd_bundleto sandbox when debug mode is enabled by @VegetarianOrc in #1249 - contrib/strands: add cache_tools toggle to TemporalMCPClient by @brianstrauch in #1571
- Add workflow cancellation reason by @Sushisource in #1574
- Bump litellm to 1.85.0 and openai-agents to 0.17.3 by @dependabot[bot] in #1478
- Add trusted publishing release workflow by @tconley1428 in #1575
- Include nexus-operation-token in Nexus callback headers by @VegetarianOrc in #1576
- Bump version to 1.28.0 by @tconley1428 in #1577
New Contributors
- @yegorske50 made their first contribution in #1472
- @brucearctor made their first contribution in #1523
- @Lingavasan made their first contribution in #1556
Core Changes
2026-04-28 - 0f2f1b4c - chore: feature cleanup (temporalio/sdk-rust#1236)
2026-04-28 - 6f7e7536 - Move Core-specific test utilities out of the Common crate (temporalio/sdk-rust#1237)
2026-04-29 - 21263fa1 - 💥 feat(sdk): failure converter + rich error types (temporalio/sdk-rust#1226)
2026-04-29 - 9747e978 - Update cloud-api protos to v0.14.0 (temporalio/sdk-rust#1240)
2026-04-29 - a9481aae - bump versions 0.4.0 (temporalio/sdk-rust#1241)
2026-04-30 - 87162f50 - chore: upgrade doc code to no_run (temporalio/sdk-rust#1242)
2026-05-01 - 3a6efc35 - Fix flaky shutdown test (temporalio/sdk-rust#1243)
2026-05-01 - 9d1bdf90 - fix(macros): drop anyhow dependency from workflow_methods expansion (temporalio/sdk-rust#1246)
2026-05-05 - a22517e4 - chore: remove unnecessary anyhow wrapping (temporalio/sdk-rust#1247)
2026-05-12 - c57f825f - Add grpc-status trailers to fake gRPC responses (temporalio/sdk-rust#1257)
2026-05-13 - 99d6b402 - chore: update readme to mention public preview (temporalio/sdk-rust#1262)
2026-05-14 - 2ed11c8e - Enforce minimum DNS resolution interval (temporalio/sdk-rust#1272)
2026-05-14 - 68665e50 - Bump windows test leg to 20 minutes (temporalio/sdk-rust#1270)
2026-05-14 - a0ad8769 - feat(dns): add DNS load balancer settings to C bridge (temporalio/sdk-rust#1267)
2026-05-14 - eac03fbc - Upgrade cloud-api to v0.15.0 (temporalio/sdk-rust#1253)
2026-05-15 - 3e6ca9ff - VLN-1346: fix missing-dependency-cooldown (temporalio/sdk-rust#1275)
2026-05-15 - 6d2045dd - Make TLS backend feature-selectable in sdk-core and client (temporalio/sdk-rust#1274)
2026-05-18 - 56a4737e - fix: retry transport-sourced Cancelled errors and count them in metrics (temporalio/sdk-rust#1269)
2026-05-18 - 72374ca1 - (CI) Disable caching cargo binaries (temporalio/sdk-rust#1278)
2026-05-18 - de25e0c8 - fix(sdk): no longer error on cancelling fired timer (temporalio/sdk-rust#1268)
2026-05-19 - 179d7608 - refactor(examples): extract saga compensation into a reusable Saga pattern (temporalio/sdk-rust#1279)
2026-05-19 - 68a9661f - build(deps): update ringbuf requirement from 0.4 to 0.5 (temporalio/sdk-rust#1285)
2026-05-19 - 6c4011d1 - Update README & add banner (temporalio/sdk-rust#1280)
2026-05-19 - d6cfb9c7 - build(deps): update lru requirement from 0.16 to 0.18 (temporalio/sdk-rust#1276)
2026-05-21 - 96e0be0f - Add uds support in channel creation (temporalio/sdk-rust#1288)
2026-05-21 - d58edd2d - Add activity execution interceptors (temporalio/sdk-rust#1277)
2026-05-26 - 3839fa94 - feat(client): support custom ServerCertVerifier in TlsOptions (temporalio/sdk-rust#1271)
2026-05-26 - 5aaabd10 - 💥 WASM Workflows (temporalio/sdk-rust#1239)
2026-05-26 - 5d9faa8d - chore(sdk): rename child_workflow -> start_child_workflow (https://github.com/temporalio/sdk-core/...
1.26.1
Fix for worker shutdown ordering
There was an issue with worker shutdown when the frontend.enableCancelWorkerPollsOnShutdown dynamic config flag is enabled on server. The issue was causing shutdown to stall until the full 30s worker shutdown timeout was hit, as server was waiting for a message that the SDK was not sending. This fixes the SDK to send the proper message, allowing shutdown to occur normally.
What's Changed
Full Changelog: 1.26.0...1.26.1
1.25.1
Fix for worker shutdown ordering
There was an issue with worker shutdown when the frontend.enableCancelWorkerPollsOnShutdown dynamic config flag is enabled on server. The issue was causing shutdown to stall until the full 30s worker shutdown timeout was hit, as server was waiting for a message that the SDK was not sending. This fixes the SDK to send the proper message, allowing shutdown to occur normally.
What's Changed
Full Changelog: 1.25.0...1.25.1
1.24.2
Bug Fixes
- Removed upper bound constraint on types-protobuf dependency (#1525). The previous ceiling (<5.29.1) could cause dependency conflicts for users on newer types-protobuf versions. The constraint now matches the protobuf range (>=3.20,<7.0.0).
What's Changed
Full Changelog: 1.24.1...1.24.2
