NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #502 most downloaded on PyPI
Temporal.io Python SDK
Last release 4 days ago
30 Sep 2026
Ships on a steady schedule
a new release about every 3 weeks
Nearly every release is documented
notes for 49 of 49 stable releases
6 versions withdrawn
withdrawn after publishing
5 years old
55 releases · first in 2022
One column per quarter.
Update bridge lockfile security fixes by @tconley1428 in #1789
Added WorkflowAlreadyStartedError.first_run_id for the first execution run
ID when provided by the server.
Experimental: temporalio.contrib.google_adk_agents now supports ADK v2
graph workflows, dynamic @node workflows, 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. Unlike run_id, this value is preserved across workflow resets.
Experimental: temporalio.contrib.strands now supports durable,
Workflow-isolated Strands sandboxes through TemporalSandbox and
worker-side factories registered with StrandsPlugin(sandboxes=...).
Added the temporalio.contrib.gcp.cloud_run.id module with the CloudRunIdPlugin client plugin to set the worker identity on Cloud Run.
deepagents extra now requires deepagents>=0.7,<0.8 (was <0.7). Becauselangsmith>=0.10.9, the langsmith extra now allowslangsmith<0.13 (was <0.9).google-adk extra now requires google-adk>=2.8.0,<3, up from >=2.2.0.temporalio.contrib.google_adk_agents: ADK-generated ids and retry jitter now draw from theworkflow.random() or workflow.uuid4() after ADK code may not replay deterministicallytemporalio.contrib.deepagents now preserves model binding options such as
response_format and tool_choice when 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 frozenset values when decoding JSON payloads with a frozenset type hint,
including nested frozen sets.
Ordinary absolute imports of already-loaded modules in sandboxed workflows no longer go through
importlib's module locks, fixing intermittent Failed validating workflow errors on Python 3.10
caused by a KeyError in importlib._bootstrap._ModuleLock.acquire when a garbage-collection
finalizer imported warnings during a workflow load
(#585).
temporalio.contrib.deepagents.TemporalBackend is fixed for deepagents 0.7 compatibility
(e.g., adding delete / adelete).
temporalio.contrib.deepagents.TemporalBackend now forwards the per-command timeout of
deepagents' execute tool for a wrapped sandbox backend such as LocalShellBackend.
GoogleAdkPlugin now passes the optional anthropic, litellm, and openai SDKs through
the workflow sandbox.
GoogleAdkPlugin now 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_converter and 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.
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
PayloadsTooLargeworkflow_task_execution_failed metric is now recorded for every failed workflow taskfailure_reasonGrpcMessageTooLarge, PayloadsTooLarge, and RequestTooLarge on every path.88af5c87 chore(sdk): make serialization context extensible (#1553)b804c0ba chore(sdk): rename include_arguments_into_marker to include_arguments_in_marker (#1554)a38b8b4f chore(sdk): automate crate release (#1550)0ee46047 Fix flaky post-cancel abandoned child test (#1555)eea75f41 Stabilize Nexus async outcome deadlines (#1556)8ccec71d Add named deterministic workflow random streams (#1557)37d747dd feat(sdk): gate experimental APIs behind feature (#1395)85bf431f Use context-sensitive randomness for workflow views (#1558)173afc02 Make SdkWakeGuard thread-bound (#1562)98bf1639 Synchronize cgroup memory test refresh (#1559)2f7ef345 chore(sdk): make publish idempotent (#1561)207acc16 chore(sdk): prepare for 0.8.0 release (#1560)9f1acdb9 chore(sdk): resolve some doc(hidden) APIs (#1563)f3bf104b chore(sdk): limit macro exports (#1564)5db7e2ef docs: update API WIT documentation (#1573)a94ca631 chore(sdk): use correct repo in cargo toml (#1567)139d2e8f chore(sdk): mark remaining error enums as non exhaustive (#1568)078f7fe5 feat(sdk): add not found variant for signal/cancel external wf (#1569)8cab93da chore(sdk): mark pub test utilities as experimental (#1570)c8551672 chore(core): remove doc hidden from runtime opts (#1572)e7693a2c Add workflow-scoped context storage (#1580)82b24c94 fix(sdk): ensure memo/search attribute keys are determistic (#1576)2b8b3509 chore(sdk): add SDK owned types over using core directly (#1577)4212ee2b chore(sdk): provide concrete types for worker tuning (#1581)b020c53c chore(sdk): limit reexport of core worker and worker config (#1582)fcac7560 chore: add msrv to every crate (#1587)8a155a93 fix(sdk/testing): hide cancellation token from public API (#1588)3d2cb186 chore(sdk): keep proto/core in sync (#1583)e6dc63fa fix(sdk): add sdk owned wrappers for some proto types exposed in client (#1584)edf4d2fe feat(client): allow usage of protox instead of system protoc (#1590)399cb7ad chore: release 1.0.0 (#1586)acac9e3f Run Cloud-eligible integration tests with filtering (#1518)26eeb2f6 Allow normal polling when sticky is saturated (#1579)0c23f718 build(deps): update wit-bindgen requirement from 0.57.1 to 0.61.1 (#1601)24dc2d9b Fix PayloadsTooLarge errors spamming WFT failures (#1604)b33e76e4 Preserve targets after transient errors (#1600)27073b0a Generate payload visitor implementations in a stable order (#1608)2deeab98 Update API definitions (#1607)efa9e671 Standalone Activities samples (#1603)0eb03f21 feat: add RetryPolicy option under ChildWorkflowOptions (#1610)e163abd6 Record order LAs are resolved in WFTs (#1616)Note truncated.
Update bridge lockfile security fixes by @tconley1428 in #1789
ActivityHandle now supports operator commands for standalone activities: pause,unpause, update_options and restore_original_options.temporalio.contrib.opentelemetry.temporalio.converter.NexusSerializationContext support for Nexus callersUSE_EXISTING handles use their start request's context.pause,unpause, updateOptions, restoreOriginal.)WorkflowOutboundInterceptor.start_signal_with_start_workflow interception point instead ofWorkflowOutboundInterceptor.start_nexus_operation method.WorkflowOutboundInterceptor.start_system_nexus_operation after their typed interceptionWorkflowOutboundInterceptor.start_nexus_operation.GetNexusOperationResultInput now includes the Nexus endpoint, service, andExternalStorage.driver_selector is now called with aStorageDriverSelectContext instead of a StorageDriverStoreContext. Update the annotation;target field. Since selectors are plain callables, a staleclient.ActivityExecution and client.ActivityExecutionDescription had some fields removed or renamedfrozen=True, eq=False, kw_only=True.scheduled_time was renamed schedule_time.last_failure was changed from field to method that runs data converter on demand.state_transition_count, eager_execution_requested, paused and long_poll_token were removed.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
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.
StrandsPlugin now disables Botocore retries for its default Bedrock model so
model request retries are handled exclusively by Temporal.
temporalio.contrib.openai_agents now honors the retry-after-ms and
retry-after headers when OpenAI returns x-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_options when there are no links
or callbacks to attach.
The workflow sandbox now passes pydantic_core through by default, alongside pydantic.
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
input detail.EventGroupMarkers to most workflow commands.temporal_activity_execution_failed and temporal_local_activity_execution_failed workerfailure_reason attribute. Each is now split into one time series perPriority, WorkerDeploymentVersion,WorkerCallbacks, WorkflowExecutionInfo, ActivityCloseTimeouts,ActivityExecutionDecodeHint, child-workflow and signal decode hints,SerializationContext, SerializationContextData, PayloadConverter, IncomingError,ScheduleSpec, and ScheduleOverlapPolicy. Construct structs using their respective buildersWorkerCallbacks::new, ActivityExecutionDecodeHint::new, orSerializationContext::new); use Default for PayloadConverter; and add wildcard branchesActivityCloseTimeouts::Both to ActivityCloseTimeouts::ScheduleAndStartToClose.ActExitValue type. Use ActivityError::WillCompleteAsync to mark anFailOnNondeterminismInterceptor from the public API.TaskToken no longer exposes its underlying bytes directly. Use TaskToken::into_inner() to_total to counter metric names when an SDK enables theExecuteMultiOperation calls now use Core's long-poll timeout instead of thetemporal_activity_execution_failed metric as failure_reason="PayloadsTooLarge". Previously it5962c094 feat(sdk): add activity and workflow test env (#1492)46c50fc8 chore(sdk): release 0.7.0 (#1494)86d5b8e4 Expose cancel details on workflow cancel & propagate them in Rust SDK (#1501)74bb7536 feat(client): allow setting memo on workflow start (#1443)f5d05758 Add warning on worker deployment limits (#1500)56358115 Fix CI flake detected by SDK Sentinel (rust) (#1507)c989a542 feat(sdk): add WorkflowContext::all_handlers_finished (#1505)d9efc491 fix(sdk): typed signal_with_start_workflow (#1508)5fe40e2f chore: remove some trybuild tests (#1510)090afd3c Add workflow for sentinel comment responses (#1514)5d63f108 Preserve Event Group Markers on cancellation commands (#1512)d913b1f0 Serialize C-bridge ephemeral server tests (#1513)70a7bb55 [SDK Sentinel] Stabilize legacy query integration test ordering (#1511)04ad5462 feat(metrics): emit failure_reason on existing activity failure metrics (#1517)4e6f71fc Move changelog release notes helper to its own crate (#1519)b860e3f1 Update api_upstream (#1520)096387e7 chore(ci): let dependabot skip cloud tests (#1528)8bdcb754 Thread counters_total_suffix through prometheus exporter (#1531)3037a0bb Allow including LA arguments in marker (#1532)be2be0af Run integration tests against envconfig-backed Cloud namespaces (#1483)8598d5be feat: workflow command pagination (#1515)02f96015 build(deps): update base64 requirement from 0.22 to 0.23 (#1525)feb722f5 fix(sdk): mark remaining public types with non_exhaustive (#1536)35e39135 Stabilize heartbeat timeout codec test (#1539)3ada2144 feat(client): add update-with-start support (#1438)db635f0f Fix non-sticky WFT poller starvation with small workflow cache (#1534)97e55aae Fix worker shutdown racing in-flight activity completions (#1538)95b63453 feat(sdk): add WorkflowHandle::get_update_handle (#1540)3393e576 Use shared changelog workflow (#1535)85b71d7e Update api_upstreamNote truncated.
Mark breaking change headers by @tconley1428 in #1694
Added temporalio.converter.create_payload_validation_error to create the
non-retryable application error used when a converted payload fails validation.
Added experimental temporalio.contrib.opentelemetry.ReplaySafeMeterProvider and
ReplaySafeLoggerProvider (and exported ReplaySafeTracerProvider): wrap an
OpenTelemetry provider so metrics and log events recorded from workflow code (e.g. by
Google ADK) are not duplicated on replay. GoogleAdkPlugin warns when a global OTel
provider is not replay-safe.
Added LoggingConfig.format to 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 existing workflow.uuid4()
(#1450). The
workflow sandbox now also restricts the non-deterministic uuid.uuid7()
added to the standard library in Python 3.14, matching the existing
uuid.uuid1()/uuid.uuid4() restrictions.
Experimental: TemporalOperationHandler can now use Standalone Activities as asynchronous
Nexus Operation backing executions through TemporalNexusClient.start_activity.
Experimental: temporalio.contrib.openai_agents.temporal_worker_env_ref names an environment
variable the worker reads for a hosted tool credential, keeping it out of workflow history.
Experimental: temporalio.contrib.openai_agents.TemporalWorkerEnvValue names 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.AllowAllWorkerEnvVars allowlists every
environment variable name on the worker.
opentelemetry and lambda-worker-otel extras now requireopentelemetry-api/opentelemetry-sdk >= 1.26, matching whattemporalio.contrib.opentelemetry already required in practice.temporalio.contrib.pydantic converters now reuse Pydantic type adaptersmax_cached_type_adapters to PydanticPayloadConverter (orPydanticJSONPlainPayloadConverter) from a nullary subclass used as theDataConverter.payload_converter_class; None makes the cacheApplicationError of typePayloadValidationError while decoding it. Such a failure is reported to theBAD_REQUEST Nexus handler error with the messageInvalid operation input, retaining the original error as its cause. RaisedINTERNAL error; raisedBAD_REQUEST and only thePayloadValidationError, keep their existing treatment.openai-agents extra now requires openai-agents>=0.19.2,<0.20, up from >=0.17.5 with notemporalio.contrib.openai_agents now rejects a sandbox SandboxPathGrant bound to ahost_path.temporalio.contrib.openai_agents now rejects run_config.sandbox.session.create_payload_validation_error(None) now creates an application error with noNone as a detail.HeaderCodecBehavior.CODEC is enabled (#1769).temporalio.contrib.opentelemetry replay-safe spans now delegateSpan.add_link to the wrapped span. Previously the wrapper inheritedgoogle-adk extra now depends on mcp, so fresh installs oftemporalio[google-adk] can import temporalio.contrib.google_adk_agentsmcp. Previously the import failed with anImportError because google.adk.tools.mcp_tool only exports McpToolsetmcp is installed.temporalio.contrib.openai_agents no longer crashes when a plain dictrun_config. (openai-agents >= 0.19.0 accepts dict run[TMPRL1104] warning when a workflow task takes longer than 5 seconds. SetTEMPORAL_WORKFLOW_TASK_DURATION_WARN_SECONDS to change the threshold.request-timeout header that1m30s. Previously such aFull Changelog: 1.31.0...1.32.0
Config fields were renamed to payloads_warn_size and memo_warn_size , and the deprecated PayloadSizeWarning was removed.
Added the Worker max_eager_activity_reservations_per_workflow_task option for configuring
the number of activity slots reserved for eager execution per workflow task. Configured values
must be positive; use disable_eager_activity_execution to disable eager activity execution.
Added experimental SDK payload converter support for values and type hints
decorated with @transfer_type_convertible(...) using a TransferTypeConverter class.
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_name to verify the server certificate against a fixed name
instead of the connection's server name. Unlike domain, 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 Worker patch_activation_callback option, allowing workers
to decide whether a first non-replay workflow.patched call should activate a patch
during rolling deployments.
tests/worker/test_workflow.py, and replace this rolloutFixed entry announcing the behavior change.WorkflowInstanceDetails must now passpayload_converter_factory instead of payload_converter_class. The factorytemporalio.nexus.systemDataConverter to Client.connect. Passpayload_limits=PayloadLimitsConfig(...) (now exported fromtemporalio.client) instead of setting payload_limits on DataConverter.payloads_warn_size and memo_warn_size, andPayloadSizeWarning was removed.db902171 cleanup changelog (#1374)353fd3b8 chore: limit wasm test concurrency (#1375)5df57f6d fix(otel): install subscriber on PeriodicReader thread (#1378)467e871a Update api upstream (#1367)d96b1eb4 feat(sdk): switch to rich search attributes from all getters (#1373)9b9325cd fix(client): correctly handle Node gRPC style unimplemented method message (#1379)8e21d5bc chore(ci): use mise for installing protoc (#1382)afb5251f feat(schedules): provide typed accessor to schedule action (#1372)2cf2c103 Test Cloud gzip support for GetSystemInfo and HealthCheck (#1362)03a6d123 chore(sdk): reject #[workflow(name=...)] for overriding workflow name (#1390)95e97686 fix: use worker hearbeat interval for heartbeat system info poller (#1393)6f75de52 Fix workflow executor cooperative budget livelock (#1396)6a0a5bc3 docs: update contributing guide (#1397)208ca8bc chore: add dev tools to mise.toml, remove redundant CI installs (#1386)207194c9 Fix task slots used metric (#1391)16452094 feat(sdk): remove remaining raw protos in APIs (#1398)e72c031f feat(sdk): provide typed accessor for workflow count group (#1410)1b6e4e38 Allow resource controllers to be shared across tuners (#1407)3dac9013 feat: payload limit enforcement (#1363)846ac2c5 chore: extract composite action for CI setup, add selective mise installs (#1387)47d3a40e chore(ci): use github backend for temporal cli (#1414)a9bdead4 Add patch activation callback (#1394)5f94631d Replace unmaintained backoff crate with backon (#1411)aeb102ef Only set worker control task queue field in polls when appropriate (#1418)71f46055 feat(sdk): add random and uuid4 in workflow context (#1412)52aa5ed7 fix(sdk): respect forced failure over completion in same poll (#1417)19123894 chore(sdk): rename start_activity to execute_activity (#1416)25de75e1 don't use versioning for internal nexus poller (#1420)eb004c78 Integrate Temporal API 1.63.4 (#1423)d2769368 Make eager activity reservation limit configurable (#1424)Full Changelog: 1.30.0...1.31.0
Added the Worker max_eager_activity_reservations_per_workflow_task option for configuring
the number of activity slots reserved for eager execution per workflow task. Configured values
must be positive; use disable_eager_activity_execution to disable eager activity execution.
Added experimental SDK payload converter support for values and type hints
decorated with @transfer_type_convertible(...) using a TransferTypeConverter class.
This lets types with transfer type converters delegate their wire representation to the
configured payload converter, preserving SDK behavior such as serialization
contexts.
Added temporalio.contrib.opentelemetry.MetricsExporter, which drains a
temporalio.runtime.MetricBuffer on a fixed interval and exports through a
real OpenTelemetry MeterProvider, giving SDK/Core metrics access to
standard OTel features (views, resource, exemplars). Experimental.
Added TLSConfig.verification_server_name to verify the server certificate against a fixed name
instead of the connection's server name. Unlike domain, 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 Worker patch_activation_callback option, allowing workers
to decide whether a first non-replay workflow.patched call should activate a patch
during rolling deployments.
Added external storage support to Nexus task handling.
tests/worker/test_workflow.py, and replace this rollout
note with a Fixed entry announcing the behavior change.WorkflowInstanceDetails must now pass
payload_converter_factory instead of payload_converter_class. The factory
returns the already wrapped payload converter that workflow instances should
use.temporalio.nexus.system
APIs are marked experimental and subject to change.DataConverter to Client.connect. Pass
payload_limits=PayloadLimitsConfig(...) (now exported from
temporalio.client) instead of setting payload_limits on DataConverter.
Config fields were renamed to payloads_warn_size and memo_warn_size, and
the deprecated PayloadSizeWarning was removed.Nexus operation link propagation for signals. When a Nexus operation handler signals a workflow (including signal-with-start), the inbound Nexus reque
backoff_start_interval for continue-as-new, to allow the new workflow to start after a delay.configure parameter supports sync, async, and asyncconfigure parameter has been changed to be invokedrun_worker is invoked.6bd00e83 fix(c-bridge): prefix enum variants with type name (#1319)7d8d61ff upgrade on CAN (#1316)92bf1a1f Fix activity_cancel_delivered_without_heartbeat test (#1322)f7448bfd [feat(sdk)] Add client() and workflow_handle() to ActivityContext (#1324)95c0175b Add backoff start for CAN (#1325)29d3bd04 feat(sdk): remove usage of anyhow from public error types (#1326)4c971f63 feat(visitor): payload limits validation visitor (#1327)ab5f1365 feat(sdk): error type for signal external workflow (#1329)e5d1a404 docs(sdk): remove warning over use of workflow apis (#1331)681b8bad Wait for in-progress ephemeral server download by progress, not fixed deadline (#1332)19827291 Feature-select OTLP exporter TLS backend (#1333)f213db85 fix(sdk): do not apply codec when decoding search attributes (#1336)d79f8681 Bring Core worker_may_ignore event behavior in line with Java/Go (#1339)22667b0e fix(macros): remove redundant .into_iter() call (#1349)0689f769 feat(sdk): move signal payload decoding to happen before dispatch (#1352)d936c6cc Guard the Nexus operation result future against false nondeterminism on replay (#1353)286baac5 fix(sdk-core): rewrite while_let_loop in polling_tests to satisfy clippy (#1354)213a62a9 feat(client): add workflow input support to ScheduleAction::StartWorkflow (#1347)ad76ca59 chore: bump otel minor (#1358)4cbf147a VLN-1616: fix checkout-below-v7 (#1359)b9e20dad chore: bump crates to 0.5.0 (#1360)3389e429 feat(sdk): add UntypedActivity (#1361)9758355d chore: bump unit test timeouts across the board (#1364)5126dad7 feat: add typed search attributes API (#1346)95d3a76d Fix/finalize shutdown arc race (#1365)98602c71 chore(client): use json payload converter (#1368)9f83b7e3 Respect SDK flags in history & gzip downgrade (#1370)Full Changelog: 1.29.0...1.30.0
Added experimental temporalio.workflow.signal_with_start_workflow , backed by generated system Nexus bindings for WorkflowService.SignalWithStartWorkf
temporalio.workflow.signal_with_start_workflow, backed byWorkflowService.SignalWithStartWorkflowExecution.CustomTool dispatch, including lazydefer_loading.Client connections now use gzip transport-level gRPC compression by default.
Pass grpc_compression=GrpcCompression.NONE to Client.connect or
CloudOperationsClient.connect to disable it. This can cause issues in some proxy scenarios
if the proxy does not implement gRPC compression. Upgrade to version 1.30.0 if affected,
in which compression downgrading is supported.
StartWorkflowUpdateWithStartInput now owns the authoritative
rpc_metadata and rpc_timeout fields 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 breakpoint() and pdb.set_trace() inside workflow code when a worker
runs with debug_mode=True or TEMPORAL_DEBUG=1; sandboxed workflows without
debug mode now get a clearer error pointing to debug_mode=True.
Fixed start_update_with_start_workflow interceptor handling so RPC metadata
and timeouts are forwarded to the underlying execute_multi_operation call.
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-lived Client across event loops or threads (e.g. the
dedicated-loop pattern used with gevent/gunicorn and synchronous services).
Note this does not make a Client fully thread- or loop-agnostic; reusing one
long-lived loop is still the recommended pattern.
993de3fb deps: sync api_upstream subtree to temporal-api@6c8bd13 (#1293)d0065e38 Rename master to main for API deps (#1309)f57f6f06 fix(sdk): no longer expose raw proto for application error category (#1307)40d24ec8 bump version (#1317)f1899d23 Add gzip compression by default with option to opt-out (#1310)f43520e6 Add CHANGELOG and document the update process (#1315)c5a6646e Update API Upstream to pull in WIT generation (#1320)Full Changelog: 1.28.0...1.29.0
This release adds a new Temporal Plugin for running Strands Agents inside Temporal Workflows. Model invocations, tool calls, and MCP tool calls are ro
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.
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 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.
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.
workflow.py into package by @tconley1428 in #1488_pydevd_bundle to sandbox when debug mode is enabled by @VegetarianOrc in #12492026-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 (temporalio/sdk-rust#1263)
2026-05-26 - 866419a7 - docs: update sdk arch docs to include nexus. (temporalio/sdk-rust#1258)
2026-05-26 - bbad3db9 - Upgrade cloud-api to v0.16.0 (temporalio/sdk-rust#1295)
2026-05-26 - bfb47e33 - fix(shutdown): increase shutdown timeout (temporalio/sdk-rust#1290)
2026-05-27 - 4e6dff34 - fix(sdk): no longer treat unrecognized activity as worker fatal error (temporalio/sdk-rust#1296)
2026-05-27 - a3660f40 - Add activity cancels from nexus (temporalio/sdk-rust#1160)
2026-05-28 - 3e39597b - Caret-bump tonic and related packages to 0.14.6 (temporalio/sdk-rust#1303)
2026-05-28 - df5ca0a9 - fix(metrics): emit workflow_type attribute on temporal_workflow_task_execution_failed (temporalio/sdk-rust#1301)
2026-05-29 - 6a8355ac - 💥 Fix possible panic due to LA completing after an eviction (temporalio/sdk-rust#1304)
2026-05-29 - fae4e5b0 - Fix start-to-close timeout failure caused by short heatbeat timeout (temporalio/sdk-rust#1300)
Full Changelog: 1.27.2...1.28.0
DNS Resolver Load Balancing Configuration
A new load balancing feature was added in temporalio/sdk-rust#1212 which has caused networking issues in certain networking setups. This is now disabled by default via the change listed below.
DNS Resolver Load Balancing Configuration
A new load balancing feature was added in temporalio/sdk-rust#1212 which has caused networking issues in certain networking setups. That can now be disabled via DnsLoadBalancingConfig.
None!
Support for the ability to retrieve references in the old format has been preserved. The prerelease format is deprecated and will be removed in a futu…
External storage reference event history format has been incompatibly changed from prerelease. New storage references are emitted in the new format starting with release. Support for the ability to retrieve references in the old format has been preserved. The prerelease format is deprecated and will be removed in a future release.
This release adds Workflow Streams, a public preview contrib library that gives a workflow a durable, offset-addressed event channel for keeping outside observers updated on workflow and activity progress. It's built on Temporal's existing signals, updates, and queries, with batching, exactly-once deduplication, topic filtering, and continue-as-new helpers layered on top. Intended uses are streaming UIs for long-running AI agents, status for in-flight payment or order processing, and progress for data pipelines. It is not for not ultra-low-latency cases like real-time voice.
is_running() for asyncio loop by @brianstrauch in https://github.com/temporalio/sdk-python/pull/14632026-04-10 - 08adc4a4 - feat(sdk): add typed continue as new (https://github.com/temporalio/sdk-core/pull/1209)
2026-04-14 - 00d3888a - feat(client): ergonomic workflow description (https://github.com/temporalio/sdk-core/pull/1215)
2026-04-14 - c78bfb67 - Support static_summary, static_details and current_details` in the Rust sdk (https://github.com/temporalio/sdk-core/pull/1208)
2026-04-14 - d24a6f77 - chore(ci): bump macos-intel timeout (https://github.com/temporalio/sdk-core/pull/1214)
2026-04-15 - d7ebff81 - Add DNS load balancing (https://github.com/temporalio/sdk-core/pull/1212)
2026-04-16 - 33b86805 - fix(sdk): normalize how user metadata is encoded (https://github.com/temporalio/sdk-core/pull/1216)
2026-04-16 - 33c6c5e2 - Optimize dependencies (https://github.com/temporalio/sdk-core/pull/1219)
2026-04-16 - 72d8c5d3 - Fix test broken on windows by fake server binding to ipv6 (https://github.com/temporalio/sdk-core/pull/1220)
2026-04-16 - 904f4793 - Remove unused parking lot send guard feature (https://github.com/temporalio/sdk-core/pull/1218)
2026-04-17 - 1e67b234 - chore: Update and pin all GHA actions (https://github.com/temporalio/sdk-core/pull/1222)
2026-04-20 - 9171aca4 - 💥 feat(sdk): enforce some activity to close timeout is set (https://github.com/temporalio/sdk-core/pull/1221)
2026-04-21 - 703fe6b2 - Fix NDE when multiple patches in a single WFT exceed SA's 2048-byte limit (https://github.com/temporalio/sdk-core/pull/1225)
2026-04-22 - 984da134 - Set WFT Failed cause on grpc message too large incidents (https://github.com/temporalio/sdk-core/pull/1229)
2026-04-23 - 64cb6ed2 - Shutdown rpc initiate shutdown (https://github.com/temporalio/sdk-core/pull/1224)
2026-04-24 - 6dd29f2d - chore: rename master -> main in docs/crates/workflows (https://github.com/temporalio/sdk-core/pull/1233)
2026-04-25 - 30c4a313 - bump versions to 0.3.0 (https://github.com/temporalio/sdk-core/pull/1235)
2026-04-26 - 2872b536 - Update upstream api to latest (https://github.com/temporalio/sdk-core/pull/1234)
Full Changelog: https://github.com/temporalio/sdk-python/compare/1.26.0...1.27.0
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.
Full Changelog: 1.26.0...1.26.1
This release adds support for the OpenAI Agents SDK's SandboxAgent in Temporal workflows. All sandbox lifecycle and I/O operations (create, exec, read
This release adds support for the OpenAI Agents SDK's SandboxAgent in Temporal workflows. All sandbox lifecycle and I/O operations (create, exec, read, write, PTY, etc.) are automatically routed through Temporal activities, making them durable and replayable. If an agent fails mid-execution, Temporal ensures it picks up right where it left off in its sandbox. To use it, pass sandbox clients (e.g. DaytonaSandboxClient) to OpenAIAgentsPlugin(sandbox_clients=...). This release also updates compatibility with the latest OpenAI Agents SDK.
2026-04-09 - 4f05fc58 - :boom: Record task latency even for WFT failures that were dropped (https://github.com/temporalio/sdk-core/pull/1207) - The temporal_workflow_task_execution_latency metric is slightly more inclusive than it was in the past, and it can now include some WFT failures that may previously have been omitted
2026-04-06 - a4fc7933 - feat(sdk): env config (https://github.com/temporalio/sdk-core/pull/1195) 2026-04-06 - ef57d63f - Correctly convert default_versioning_behavior in C bridge (https://github.com/temporalio/sdk-core/pull/1199) 2026-04-08 - 1f6cfb6c - fix(core): add in scheme port if none present (https://github.com/temporalio/sdk-core/pull/1205) 2026-04-08 - 723c2836 - feat(sdk): add samples (https://github.com/temporalio/sdk-core/pull/1190) 2026-04-08 - d96a8d2f - Move CODEOWNERS under .github/ (https://github.com/temporalio/sdk-core/pull/1198) 2026-04-09 - 630e7795 - Make sure legacy queries are failed if gRPC message too large (https://github.com/temporalio/sdk-core/pull/1206) 2026-04-10 - b544f95d - Expose Nexus Endpoint in a Nexus Operation Handler (https://github.com/temporalio/sdk-core/pull/1211)
Full Changelog: https://github.com/temporalio/sdk-python/compare/1.25.0...1.26.0
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.
Full Changelog: 1.25.0...1.25.1
This release introduces a package which can be used together with upcoming changes to the Temporal server & cloud which allow you to run your worker i
This release introduces a package which can be used together with upcoming changes to the Temporal server & cloud which allow you to run your worker in an AWS Lambda function which the server will invoke as-needed to process Workflow, Activity, and Nexus tasks - allowing you to do away with some of the operational burden of running a fleet of workers. Additional documentation on how to use this feature will be linked here when available.
This release includes the external storage feature, which allows offloading payloads to an external storage system (such as Amazon S3) and passes a small reference token into Event History. This allows your workflows to avoid large payload errors and to avoid growing workflow history size too rapidly.
This release introduces a package which can be used with external storage to offload large payloads to S3 buckets in AWS instead of inlining them into workflow history. See Store and retrieve large payloads with Amazon S3 for more details and how to enable using this driver with external storage.
2026-03-13 - a7611dd8 - Remove system.enableNexus dynamic config flag (https://github.com/temporalio/sdk-core/pull/1151)
2026-03-13 - cf7fcec5 - fix(client): retry WorkflowUpdateHandle::get_result poll (https://github.com/temporalio/sdk-core/pull/1150)
2026-03-16 - 7a6a53f7 - chore(ci): avoid caching rust on PR (https://github.com/temporalio/sdk-core/pull/1159)
2026-03-16 - a039b2d6 - feat(sdk): add schedule handle (https://github.com/temporalio/sdk-core/pull/1132)
2026-03-16 - c6b601de - Fix temporal metrics in C bridge to have temporal_ prefix (https://github.com/temporalio/sdk-core/pull/1156)
2026-03-17 - 2f9d6c8b - fix(core): avoid panic if workflow stream still up during eviction (https://github.com/temporalio/sdk-core/pull/1158)
2026-03-17 - f188eb53 - Add external storage drivers to worker heartbeat (https://github.com/temporalio/sdk-core/pull/1130)
2026-03-18 - db65dd9a - build: make otel opt-in in sdk-core (https://github.com/temporalio/sdk-core/pull/1154)
2026-03-18 - f00f7337 - Allow poller scale-down on timeout when server supports autoscaling (https://github.com/temporalio/sdk-core/pull/1164)
2026-03-18 - f384eeb5 - Fix possible NDE in valid child workflow cancel transition (https://github.com/temporalio/sdk-core/pull/1162)
2026-03-19 - a5e8f7f1 - Update cloud-api protos to v0.12.0 (https://github.com/temporalio/sdk-core/pull/1172)
2026-03-19 - ba203c64 - fix(sdk): re-poll update futures after workflow state changes (https://github.com/temporalio/sdk-core/pull/1153)
2026-03-19 - e49359b2 - chore: bump version to 0.2.0 (https://github.com/temporalio/sdk-core/pull/1169)
2026-03-23 - 4b0d7ed1 - feat(sdk): :boom: add HasWorkflowDefinition trait (https://github.com/temporalio/sdk-core/pull/1173)
2026-03-24 - 31798a48 - rust-toolchain.toml and MSRV checks in CI (https://github.com/temporalio/sdk-core/pull/1175)
2026-03-25 - 18615a7a - fix(sdk): serialize unit as no payloads or null payload (https://github.com/temporalio/sdk-core/pull/1181)
2026-03-25 - acec0e60 - Gate test-only worker telemetry helper (https://github.com/temporalio/sdk-core/pull/1176)
2026-03-26 - 21b65b87 - feat(sdk): :boom: add typed child workflow handle (https://github.com/temporalio/sdk-core/pull/1182)
2026-03-26 - 42e44a75 - feat(metrics): add UpDownCounter metric instrument type (https://github.com/temporalio/sdk-core/pull/1180)
2026-03-27 - 4508ae7d - Update deps & remove unused ones (https://github.com/temporalio/sdk-core/pull/1183)
2026-03-31 - 76f5c9e1 - fix(sdk): implement FusedFuture for wait_condition (https://github.com/temporalio/sdk-core/pull/1192)
2026-03-31 - d03d2ae2 - feat(sdk): external workflow handle (https://github.com/temporalio/sdk-core/pull/1187)
2026-04-01 - 24703da6 - Add standalone activity run id to bridge (https://github.com/temporalio/sdk-core/pull/1189)
2026-04-01 - 5e6b836c - chore(test): add eventually to latency metrics test (https://github.com/temporalio/sdk-core/pull/1193)
2026-04-02 - 71a5caa5 - Fix - provide default (empty) client config when default user config dir does not exist. Create an inner function to inject the default config path easily (https://github.com/temporalio/sdk-core/pull/1194)
2026-04-02 - b3d53ab7 - Validate deployment options and test worker with versioning off and custom build ID (https://github.com/temporalio/sdk-core/pull/1163)
2026-04-02 - ef6e73b8 - Custom async executor for workflows (https://github.com/temporalio/sdk-core/pull/1185)
Full Changelog: https://github.com/temporalio/sdk-python/compare/1.24.0...1.25.0
Removed upper bound constraint on types-protobuf dependency ( #1525 ). The previous ceiling (<5.29.1) could cause dependency conflicts for users on ne
Full Changelog: 1.24.1...1.24.2
There was an issue with worker shutdown when the frontend.enableCancelWorkerPollsOnShutdown dynamic config flag is enabled on server. The issue was ca
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.
Full Changelog: https://github.com/temporalio/sdk-python/compare/1.24.0...1.24.1
Nexus is now generally available and no longer experimental
Span/trace id generation changes in this PR, which means that AgentsSDK workflows which run on both the old version and the new version of the code may have broken span parentage.
INTERNAL.BAD_REQUEST.workflow_id: str for workflow serialization context by @THardy98 in https://github.com/temporalio/sdk-python/pull/13402026-02-18 - c781a610 - Rust SDK Prerelease ([https://github.com/temporalio/sdk-core/pull/1101]) 2026-02-18 - f16f160d - Nexus error types ([https://github.com/temporalio/sdk-core/pull/1109]) 2026-02-19 - 2014f31c - chore: prepare for initial publish ([https://github.com/temporalio/sdk-core/pull/1120]) 2026-02-19 - 21e03c28 - Fix encoding problems in heavy tests ([https://github.com/temporalio/sdk-core/pull/1119]) 2026-02-19 - a0caec42 - chore: exclude github workflows and uml from published crates ([https://github.com/temporalio/sdk-core/pull/1121]) 2026-02-19 - dc127f55 - Fix wait_condition to wake registered wakers on state_mut ([https://github.com/temporalio/sdk-core/pull/1118]) 2026-02-23 - 37d8c1a5 - chore: add test to verify wait_condition futures wake on state_mut ([https://github.com/temporalio/sdk-core/pull/1128]) 2026-02-23 - 7161ed3b - fix(sdk): provide default worker identity ([https://github.com/temporalio/sdk-core/pull/1123]) 2026-02-23 - 78a94de2 - Expose continue_as_new_suggested on WorkflowContext ([https://github.com/temporalio/sdk-core/pull/1126]) 2026-02-23 - 9d678b96 - no longer cancel pending polls on shutdown ([https://github.com/temporalio/sdk-core/pull/1122]) 2026-02-23 - f52b48bd - chore: fix flake in list workflows test ([https://github.com/temporalio/sdk-core/pull/1124]) 2026-02-25 - 8f01a380 - chore: add crates.io links to readme ([https://github.com/temporalio/sdk-core/pull/1125]) 2026-02-26 - c09a2901 - feat(sdk): add workflow_id and run_id to workflow context ([https://github.com/temporalio/sdk-core/pull/1131]) 2026-03-09 - 4d756127 - fix: disable default features for prometheus dependency ([https://github.com/temporalio/sdk-core/pull/1134]) 2026-03-09 - b5297e69 - Add wrappers for futures helpers ([https://github.com/temporalio/sdk-core/pull/1133]) 2026-03-10 - 05077672 - Return ClientWorkerSet from Connection ([https://github.com/temporalio/sdk-core/pull/1147]) 2026-03-11 - 5f79ef28 - Ingest API PR #709: Add target_worker_deployment_version_changed field ([https://github.com/temporalio/sdk-core/pull/1148])
Full Changelog: https://github.com/temporalio/sdk-python/compare/1.23.0...1.24.0
💥 SLIGHT BREAKING CHANGE for those manually expecting non-None fields or manually creating the info for tests
activity.Info modified to make workflow_id, workflow_namespace, workflow_run_id, and workflow_type optional
converter.BaseWorkflowSerializationContext intermediate base class removed
converter.ActivitySerializationContext to make workflow_id and workflow_type optional, updated activity_type and activity_task_queue to be optional and deprecated, and added optional activity_id
Update worker to get memo and payload error limits from Temporal server and enforce those limits by default. The SDK will now eagerly fail a task that has too large payloads instead of uploading them to the server and having the server fail the workflow. If the server doesn't report error limits, error limits are not enforced in the worker.
Full Changelog: https://github.com/temporalio/sdk-python/compare/1.22.0...1.23.0
2026-02-17 - 20a68176 - Poller autoscaler: further refinement of backoff on grpc errors #1111
GPRC_RESOURCE_EXHAUSTED when using poller autoscaling.2026-01-29 - f837d73e - Add CAN versioning and suggested reasons to core protos #1104 2026-02-03 - 5045af35 - Plumb initial versioning behavior #1107 2026-02-03 - cd92f915 - Fix TemporalPatchVersion search attribute type to use KeywordList format #1106 2026-02-04 - 231e21ca - Fix incorrect metric kind repported in Buffered Metrics #1108 2026-02-12 - 7ecb7c05 - Poller autoscaler: add backoff on ResourceExhausted errors #1110 2026-02-13 - fb14d9c3 - Fix recording workflow termination metrics before receiving server response #1112 2026-02-17 - 12c656f7 - Remove extra license file from macros. Causing build failures in Python features tests #1116 2026-02-17 - 20a68176 - Poller autoscaler: further refinement of backoff on grpc errors #1111
Deployment-based Worker Versioning APIs are in General Availability.
poe lint by @tconley1428 in https://github.com/temporalio/sdk-python/pull/1240sdk-core changes2025-12-18 - 12bc359b - Fix wf_task_replay_latency metric recording for non-replay tasks (https://github.com/temporalio/sdk-core/pull/1083) 2026-01-06 - 66ddab4b - Downgrade worker heartbeat log (https://github.com/temporalio/sdk-core/pull/1088) 2026-01-08 - cc1ed609 - Clarifying comment for worker heartbeating's use of latency metric (https://github.com/temporalio/sdk-core/pull/1089) 2026-01-09 - d8a2bf19 - Always send shutdown_worker RPC, fix WorkerStatus state when shutting down worker (https://github.com/temporalio/sdk-core/pull/1082) 2026-01-12 - 372b2708 - Fix bug where we count first WFT as sticky cache hit (https://github.com/temporalio/sdk-core/pull/1091) 2026-01-13 - d104a77d - Update api_upstream to v1.60.0 (https://github.com/temporalio/sdk-core/pull/1090) 2026-01-15 - 5c9bcd10 - Add Request Deadline as timestamp to NexusTask (https://github.com/temporalio/sdk-core/pull/1094) 2026-01-23 - 22cd04bc - Update upstream_api to v1.61.0 (https://github.com/temporalio/sdk-core/pull/1100) 2026-01-23 - 9dedad11 - Update Worker validate to allow SDKs to get namespace limit information (https://github.com/temporalio/sdk-core/pull/1102)
Full Changelog: https://github.com/temporalio/sdk-python/compare/1.21.1...1.22.0
Dynamic handlers now support typing.Sequence and collections.abc.Sequence for their third argument.
typing.Sequence and collections.abc.Sequence for their third argument.2025-12-19 - 772050e - Add backward compatibility for dynamic handler signatures (#1258) 2025-12-19 - f0bd341 - OpenAI - Fix generics is instance (#1261)
Types that were deprecated as of Python 3.9 have been updated to use the recommended alternative for Python 3.10+.
When creating a Client, specifying the api_key option will now automatically enable TLS. Users that wish to use an API Key without TLS enabled must explicitly pass tls=False when creating their client. See Client.connect for a detailed description of configuration options and behavior.
TEMPORAL_POLL_SHUTDOWN_INTERRUPT_WAIT_MS to specify a wait time before interrupting polls during shutdown.Client.config() and Worker.config() now properly return a copy of the config passed during creation instead of the "active" config that may have been modified. Users that wish to get a copy of the config currently in use may pass active_config=True to both methods.api_key is specified.nexus_task_exectuor option for Worker was narrowed from concurrent.futures.Executor to concurrent.futures.ThreadPoolExecutor.static_summary and static_details options in Client.create_schedule have been removed.collections.abc.Sequence instead of typing.Sequence for their third argument.2025-12-02 - 27096aa - Store initial configuration and provide it in config() by default (#1226) 2025-12-02 - cc19379 - 💥 Enable TLS if api key provided (#1229) 2025-12-03 - 90dda94 - Add retrying of workflow validation errors only on python 3.10 (#1223) 2025-12-03 - a48cece - Support RequestIdReference in Nexus Links (#1228) 2025-12-04 - 3400d8c - Remove file exclusions for pyright (#1235) 2025-12-04 - 96e2dab - Doc fixes (#1241) 2025-12-08 - 4439675 - Update for 3.10 best practices (#1236) 2025-12-08 - 6a3385b - upload nightly tps metrics to s3 (#1242) 2025-12-08 - 89fb17f - 💥 Nexus MetricMeter Support (#1233) 2025-12-09 - fd17cdf - 💥 Remove unused metadata from client.create_schedule. Ensure WorkflowHistoryEventAsyncIterator.fetch_next_page uses the provided page_size override when called (#1247) 2025-12-10 - 8ac0a9e - Install built wheel directly in build-binaries (#1245) 2025-12-10 - b0adaae - Nexus interceptors (#1218) 2025-12-16 - 7cfc65b - Update core (#1253) 2025-12-17 - c5eb6e2 - Replace WorkflowIdReusePolicy.TerminateExisting by WorkflowIdConflictPolicy (#1243) 2025-12-18 - 1f9e315 - Update dependency ceiling for OpenAI agents (#1256)
This release adds a new feature called Worker Heartbeating. This feature spins up a single nexus-only worker per Client/Namespace in the background an
This release adds a new feature called Worker Heartbeating. This feature spins up a single nexus-only worker per Client/Namespace in the background and periodically sends some basic metrics over to server for all of the workers registered on the same Client/Namespace.
Server version 1.29.1 and newer supports this feature. This feature will be enabled by default, although this currently requires a server dynamic config flag, --dynamic-config-value frontend.WorkerHeartbeatsEnabled=true to enable. Currently, the only way to interact with this new data is to also enable the flag --dynamic-config-value frontend.ListWorkersEnabled=true, then use CLI commands temporal worker list and temporal worker describe to query the data. If heartbeating is enabled with a server version older or with the config flag off, a single warning log Worker heartbeating configured for runtime, but server version does not support it. on worker startup will emit.
Runtime use across forks now eagerly fails, making it fail in a more obvious way. Specifically, using a Runtime from a different process ID will now eagerly fail.2025-11-17 - 5d1630d - Nexus task cancellation (#1204)
2025-11-17 - ceb7058 - Prevent Runtime use over forks (#1208)
2025-11-21 - 3fd1c7e - Fix up plugin readme (#1211)
2025-11-24 - 6d2924b - Add Summary to Nexus operations (#1219)
2025-11-24 - 77f2346 - use sys.stdlib_module_names in restrictions. Move dynamic import warning to only apply to non-passed through modules (#1222)
2025-11-25 - b5001f9 - Update Core, configure worker types, send plugin names to Core (#1157)
…2025-10-20 - 778fc9a - Support python 3.14 and deprecate python 3.9 (#885) 2025-10-20 - f03ddc2 - Add programming language classifiers to fix badge on…
Modules imported after workflows have been loaded into the sandbox now produce a warning message by default. See the Import Notification Policy docs for more info and customization options.
0.5.0 for openai-agentsPlugin interfaces have been updated to use invocation provided callables instead of initializers.MCPServerProviders now require a name argument.TestModel and TestModelProvider have been moved from temporalio.contrib.openai_agents to temporalio.contrib.openai_agents.test2025-09-30 - 4a70f3d - Update version to 1.18.1 (#1135)
2025-10-01 - a31886d - Serialization context (#1102)
2025-10-02 - 4f08626 - Use type in start/execute activity/workflow to address Pyright Strict mode error (#1137)
2025-10-06 - 26e2e61 - Generate RPC calls in Bridge Client (#1123)
2025-10-06 - 5ca4861 - Provide option to disable activity registration (#1140)
2025-10-07 - 42fe382 - Flaky session test (#1141)
2025-10-07 - 5e93e63 - :boom: Plugin Overhaul (#1139)
2025-10-07 - d27bb11 - Move visitor, bridge client generation, and formatting to poe tasks (#1142)
2025-10-07 - e4df5e7 - Add googleapis-common-protos to fix tests in build-binaries workflow (#1143)
2025-10-09 - cde3427 - Use macOS 15 intel runners (#1148)
2025-10-14 - 162cff7 - :boom: Allow arguments to be provided to MCP Server creation (#1147)
2025-10-14 - 70deb94 - Replace Proto modules with the python path (#1156)
2025-10-14 - 788d391 - Remove experimental notices for worker tuners (#1152)
2025-10-16 - 2ad41ab - Replace tctl references with Temporal CLI (#1165)
2025-10-16 - 2efd9a7 - Add start_update_with_start_workflow to Otel Interceptor (#1150)
2025-10-20 - 4fe685a - Allow h2 error message (#1170)
2025-10-20 - 778fc9a - Support python 3.14 and deprecate python 3.9 (#885)
2025-10-20 - f03ddc2 - Add programming language classifiers to fix badge on next publish (#1151)
2025-10-22 - 5994a45 - Avoid token detaching from different context (#1153)
2025-10-22 - c8cbfe0 - Modify code comment for Worker build_id field #1160 (#1163)
2025-10-24 - 7f794d0 - Update license in pyproject.toml (#1175)
2025-10-24 - 988b12c - Allow openai 0.4, update lock to use it (#1182)
2025-10-25 - 27903f7 - Add nightly throughput stress (#1173)
2025-10-27 - 231cc67 - Adds proper failure decoding in workflow activation (#1192)
2025-10-27 - 630a031 - Match openai logic to retry on >= 500 not == 500 (#1181)
2025-10-27 - 8f754b4 - Opentelemetry baggage propagation fix (#1174)
2025-10-27 - ba3d50f - Add a test for split worker scenario (#1193)
2025-10-27 - e39e8f2 - Add option to run models as local activities (#1183)
2025-10-28 - 0eb96eb - Sandbox importing (#1187)
2025-10-28 - c3448cc - Skip flaky test on versions with importer bug (#1195)
2025-10-29 - 1b70f07 - Tps nightly small improvements (#1200)
2025-10-30 - 35347b9 - Fix: Resolve TypeError in value_to_type on Python 3.13 (issue #1188) (#1189)
2025-10-30 - 5f24792 - 💥 Expose agent testing utils (#1164)
2025-10-30 - 660ac2b - VLN-492: Set explicit permissions for GitHub Actions workflows (#1199)
2025-10-30 - a08250a - refactor: use classmethod in factory methods (#1179)
2025-11-06 - 4156856 - fix: typo in time sandboxed utilities (#1205)
2025-11-06 - e543e8a - fix: typed search contains should work for falsy values (#1206)
Ensure cause fields of Failure protos are encoded with user codecs.
cause fields of Failure protos are encoded with user codecs.2025-10-27 - e4969c05 - Adds proper failure decoding in workflow activation (#1192)
Full Changelog: https://github.com/temporalio/sdk-python/compare/1.18.1...1.18.2
Search attributes on child workflows would fail when using a payload codec
2025-09-24 - 2f04a166 - Fix flaky test: test_workflow_return_is_honored_when_it_precedes_signal_completion_command (#1115) 2025-09-24 - 6dd59dd3 - Fix flaky test: test_workflow_patch_memoized (#1114) 2025-09-25 - fd51efa0 - Fix model replacement on looping handoffs (#1122) 2025-09-29 - 02322adc - pytest and pydoctor QOL improvements (#1124) 2025-09-29 - 1afaa445 - Fix flaky test: test_workflow_cancel_activity (#1119) 2025-09-29 - 47781f75 - Fix Flaky Test: test_custom_slot_supplier (#1126) 2025-09-29 - 4e9cbab0 - Fix search attribute skipping on protos which don't use the SearchAttributes message type (#1131) 2025-09-29 - e92514ab - Extend timeout on test_session execution (#1128) 2025-09-29 - ed1f6cad - Expose strict_json_schema in activity_as_tool (#1094)
Full Changelog: https://github.com/temporalio/sdk-python/compare/1.18.0...1.18.1
Support and new lower bound of version 0.3.0 for openai-agents
0.3.0 for openai-agentsRunnerencode_failure method on PayloadConverter is no longer called in all cases it once was, using encode_payload instead. This only affects custom PayloadConverter implementations which overload encode_failure to work differently from encode_payloadWorkerTuner.create_composite has a new required field: nexus_supplier2025-09-02 - 3f7bd33b - Fix build binaries (#1074)
2025-09-03 - 42135f09 - Delete unused helper (#710)
2025-09-03 - 70e5bea2 - Fix nexus cancellation wait completed test (#1073)
2025-09-03 - a004faa9 - Python support for activity reset (#1065)
2025-09-03 - a3c5370f - Bump tracing-subscriber from 0.3.19 to 0.3.20 in /temporalio/bridge (#1068)
2025-09-03 - a46a7423 - Fix code sample alignment & trim trailing whitespace (#1038)
2025-09-03 - bef76a6d - Even more convenient proto generation (#1039)
2025-09-03 - c643e8af - Tweak .result() doc (#706)
2025-09-03 - c8b0b786 - Reraise workflow failure errors from OpenAI's UserError (#1060)
2025-09-04 - 44412ae5 - Expose Last Completion Result and Previous Run Failure (#1067)
2025-09-04 - 5e9b2ba5 - Minor edits and code cleanup (#609)
2025-09-04 - 7be26da3 - Add a test for output type coercion (#1076)
2025-09-04 - c3426ceb - Fix return type of workflow.wait (#650)
2025-09-04 - e92f391d - Add Summary to LocalActivityConfig and apis (#1061)
2025-09-08 - 9372d474 - Fix openai plugin bug (#1083)
2025-09-09 - 30a6b8d6 - Only set payload converter, fail if already set (#1086)
2025-09-09 - 44f0c42f - Added retry policy to activity info (#1055)
2025-09-10 - 101d89d9 - Don't set error status on otel spans for benign exceptions (#1085)
2025-09-10 - 634c5ec5 - :boom: Add generic payload visitor for WorkflowActivation[Completion] (#1075)
2025-09-10 - 706c89b3 - Changes to adapt to openai version 0.2.11 (#1092)
2025-09-11 - e7821603 - uv.lock (#1096)
2025-09-12 - 9d70d447 - Add support for gRPC binary metadata values (#1070)
2025-09-12 - ce8dc4ad - Remove validatoriterator workarounds (#1046)
2025-09-13 - 84b184ff - Nexus worker concurrency control (#1066)
2025-09-16 - 2a2b83b5 - Update protobuf (#1082)
2025-09-18 - 0e1fa4fb - Make env config TLS disabled field optional (#1105)
2025-09-19 - 76056199 - Rename mcp_servers to mcp_server_providers (#1110)
2025-09-19 - 8c4e2c8b - MCP server support (#1021)
Nexus operation handlers can now use id_conflict_policy=WorkflowIDConflictPolicy.USE_EXISTING so that multiple callers "attach" to the same workflow.
id_conflict_policy=WorkflowIDConflictPolicy.USE_EXISTING so that multiple callers "attach" to the same workflow.WorkflowAlreadyStartedError2025-08-25 - a9c71aa - Support multiple nexus callers attaching to same workflow (#1051) 2025-08-26 - 2affa25 - Python Nexus convert workflow start errors to Nexus errors (#1052) 2025-08-27 - 229fe37 - Fix a few typos in plugin readme (#1062) 2025-08-28 - 7f228d8 - Test workflow outbound nexus interception (#1064) 2025-08-29 - bb90aab - Don't fail on newtype string dict keys (#1059) 2025-09-02 - 251084d - Fix nexus cancellation type test flake (#1057) 2025-09-02 - 85c47f7 - Bump version for release (#1069) 2025-09-02 - 8bb0b80 - Changed openai-agents dependency to <=0.2.9, upgraded uv.lock (#1072)
This release adds support for Task Queue Fairness. Fairness is a new feature of Temporal's task queues that allows for more control over the order tha
This release adds support for Task Queue Fairness. Fairness is a new feature of Temporal's task queues that allows for more control over the order that tasks are dispatched from a backlog. It's intended to address common situations like multi-tenant applications and reserved capacity bands.
A cancellation type can now be set when starting a nexus operation. This determines the behavior of the Nexus operation when the caller workflow initiates cancellation. See the NexusOperationCancellationType enum.
execute_child_workflow APIIn order to align execute_child_workflow with start_child_workflow and make ChildWorkflowConfig usable for both, the summary argument has been replaced with static_summary. See (#1019)
The plugin interface has been changed. Implementors now have to implement each method so as to consider whether they need to make any customizations in those areas. In addition, the plugin has new methods which allow customization of a Replayer. See (#1011)
2025-07-29 - 3244f8b - Fix readme to work with plugins (#1008)
2025-07-29 - 3f93a68 - Update README for OpenAI Agents SDK Integration (#1001)
2025-07-29 - 62604ca - announcement (#1010)
2025-08-04 - 1573433 - make profile optional, necessary for rust core to create fallback profile (#1004)
2025-08-04 - 3777095 - Fix start_activity overloads (#1014)
2025-08-04 - 7e1c725 - :boom: Update activity and workflow config objects. Change execute_child_workflow summary argument to static_summary (#1019)
2025-08-04 - b59c555 - Add plugin to workflowenvironment (#1015)
2025-08-06 - 71ed93c - :boom: Replayer configuration from plugins (#1011)
2025-08-08 - 11c2817 - Nexus: eliminate unused arguments (#1022)
2025-08-12 - e1016bc - Cleanup tests to deduplicate static response construction (#1023)
2025-08-15 - 2cea1a2 - Add first_execution_run_id to workflow info (#1027)
2025-08-15 - e9d8c1a - remove address check (#1030)
2025-08-16 - 49c2400 - Fix circular import: do not import temporalio.client in temporalio.nexus (#973)
2025-08-18 - 916ea3c - Fixes for new metrics interface (#940)
2025-08-18 - e2c0ced - Implement get_task_factory (#1031)
2025-08-19 - 9054679 - Respond to upstream: nexus start sync failure (#1026)
2025-08-19 - a09bb85 - Fairness Keys & Weights (#1036)
2025-08-20 - 2b5de91 - Move model stub creation from RunConfig to Agent (#1029)
2025-08-20 - 3c6fae6 - Bump slab from 0.4.10 to 0.4.11 in /temporalio/bridge (#1034)
2025-08-20 - 5080b68 - Don't add startActivity, etc spans when there is no parent trace in which to nest them (#1037)
2025-08-21 - 55d5d7c - Priority Key None by default (#1044)
2025-08-21 - 826edfd - Extend test timeout to 15 minutes. Macos-intel is running over (#1042)
2025-08-21 - a0147d5 - Nexus cancellation types (#981)
2025-08-21 - eb9097d - Bump version
Plugin support - Plugins are a new way of providing easy configuration of workers and clients
OpenAIAgentsPlugin, the previous method of configuring with set_open_ai_agent_temporal_overrides is no longer exported.workflow.random and OpenAI agents tracing, this could cause an NDE on replay.2025-07-10 - 6fcda0fa - Convert class to module (#958) 2025-07-10 - e73d6b5d - Support Nexus tool calls in OpenAI Agents integration (#949) 2025-07-11 - 28f43f1e - User saner python version syntax (#959) 2025-07-14 - 2443c502 - Type-checking (#962) 2025-07-14 - 808a5f41 - Install nexusrpc from GitHub (#966) 2025-07-14 - 8a003ec1 - Update core env vars (#964) 2025-07-14 - f4ca16d5 - Use links from StartWorkflowExecutionResponse if present (#963) 2025-07-15 - 1fec7234 - Add documentation of interceptors to README (#970) 2025-07-16 - 33b4a43d - Remove UwS experimental notices (#975) 2025-07-16 - c37c69fb - Support for method activities conversion into tools (#968) 2025-07-16 - e6f6f91b - Provide client in activity context (#740) 2025-07-18 - 4949c1e8 - Add tests for type-checker false-negatives (#976) 2025-07-18 - 60f67d95 - Fixing OpenAI tracing issues (#974) 2025-07-21 - 126bcd84 - Plugin Support (#952) 2025-07-21 - 7c57a76e - Fix more type errors (#977) 2025-07-22 - 0f3c577d - :boom: OpenAI/plugin (#956) 2025-07-22 - 8b727e58 - Add argument validation for the types of provided tools (#985) 2025-07-22 - 9e7dc7aa - Update agents sdk dependency to latest. (#983) 2025-07-22 - fe82b077 - Add exception catching logic to model activity (#982) 2025-07-23 - d863f5c9 - Add heartbeat test and fix bug (#984) 2025-07-23 - f8158869 - Add test for chat completions model (#986) 2025-07-24 - 3d9bfeee - Disallow use of sqlite sessions, but pass through others (#993) 2025-07-24 - 79f2900b - Making summary generation more robust (#987) 2025-07-24 - a4571849 - Use an iterator instead of a shared global index in openai agent tests (#991) 2025-07-24 - da6616a9 - Fail if user provides mcp servers (#990) 2025-07-25 - b6b09738 - More builtin OpenAI tool types and test for Lite LLM custom provider (#988) 2025-07-25 - beb9c9d9 - Use the agent's model name if not present in runconfig (#996) 2025-07-25 - e767013a - Add workaround for case where un-picklable types are passed to Runner (#997) 2025-07-25 - fc564c4c - :boom: Move tracing uuids to use a separate Random from the workflow seed (#992) 2025-07-28 - c8bc329f - Add tests for update-with-start reattach behavior (#1000) 2025-07-28 - 6f1d62bc - fix typing when passing loaded config into Client.connect, raise error if 'address' not provided by config (#998) 2025-07-28 - b99782fc - Pin nexus version, revert change depending on latest
Pin nexus-rpc version to prevent accidental upgrade to a breaking version.
nexus-rpc version to prevent accidental upgrade to a breaking version.2025-10-23 - 988ad10 - Lock nexus-rpc to 1.1.0
Full Changelog: https://github.com/temporalio/sdk-python/compare/1.14.1...1.14.2
The second change mentioned is a breaking change to an experimental feature; the release is numbered as a patch release.
❗UPDATE: Please update to latest release: the nexus-rpc version is not pinned in this release. This could cause errors on future nexus-rpc releases.
Fixes a bug related to event links in Nexus Pre-release that resulted in 500 errors in web UI (#953)
The OpenAI Agents Integration module layout has changed, requiring different import paths in user code. All needed types are available off temporalio.contrib.openai_agents or temporalio.contrib.openai_agents.workflow. Additionally, open_ai_data_converter is fully removed, replaced with pydantic_data_converter. (#947)
The second change mentioned is a breaking change to an experimental feature; the release is numbered as a patch release.
2025-07-08 - 61af3ea0 - 💥 Streamline OpenAI module layout (#947) 2025-07-08 - e17146ff - Adding encoding of payload headers, currently defaults to existing behavior, not encoding (#939) 2025-07-09 - 3a27fe8c - Remove wrapping function decorator (#948) 2025-07-10 - 31c1c41f - Nexus: evolve link conversion and query param processing (#953) 2025-07-10 - 5d0e9b1f - 1.14.1 (#957) 2025-07-10 - bdddb076 - Pyright diagnostics (#954)
See README.md#nexus to get started. Please note that all Python Nexus APIs are currently experimental: breaking changes are anticipated.
❗UPDATE: Please update to latest release: the nexus-rpc version is not pinned in this release. This could cause errors on future nexus-rpc releases.
Experimental Nexus support (#813) The SDK now has experimental support for defining Nexus operations, running a Nexus worker, and calling Nexus operations cross-namespace from a workflow. See README.md#nexus to get started. Please note that all Python Nexus APIs are currently experimental: breaking changes are anticipated.
OpenAI Agents SDK integration updates (#923, #942)
sys.modules behavior inside the workflow sandbox (#936). Use disable_lazy_sys_module_passthrough option in sandbox restriction config to opt-out.2025-06-20 - 3e2500c7 - Do not wrap workflow-failure exceptions from converters in workflows (#882) 2025-06-20 - 8bb5935d - Fix cannot access local variable 'extra' where it is not associated with a value (#900) 2025-06-22 - 1a2aca26 - Evolve sandbox documentation (#907) 2025-06-23 - 4a18f1ff - Activity worker: refactoring part 2 (#899) 2025-06-23 - 6bd7256c - Fix a few typos (#910) 2025-06-25 - 40f16240 - Fixing issues with openai integration on python 3.9 (#918) 2025-06-25 - 4cf0697f - Adding named params to openai activity configurations (#917) 2025-06-25 - 56023fad - Update Core (#919) 2025-06-26 - 34bb0506 - Environment configuration (#895) 2025-06-26 - dac2eb2f - Fix bridge clippy warnings with new rust version (#924) 2025-06-27 - 29599e59 - Adding an end to end test which uses an openai service account (#922) 2025-06-27 - 95fc1c9d - Bump core (#926) 2025-06-27 - ac7fcc58 - Use the activity info provided during interceptor construction (#903) 2025-06-30 - 5a95f8e7 - Adding tests for guardrail samples (#929) 2025-06-30 - 61d5072d - Support for more activity tool inputs (#923) 2025-06-30 - 8fc55e7e - Experimental CI entry to run tests with latest dependencies (#920) 2025-07-01 - 47027fc5 - Adding replay and end to end tests for all existing tests (#930) 2025-07-01 - 83d2ae45 - OpenAI trace fixes (#934) 2025-07-02 - 633b90c6 - Making raise on cancellation the default (#935) 2025-07-02 - a98d6fda - Move openai e2e tests to normal server (#937) 2025-07-03 - 9d40e869 - 💥 Lazy passthrough for sys.modules and OpenAI converter/sandbox improvements (#936) 2025-07-07 - 6fbc4c51 - Set default model activity timeout to 60s (#941) 2025-07-07 - e2b23378 - Only run openai e2e tests on one matrix entry (#943) 2025-07-07 - ecfb72fb - OpenAI tool context (#942)
…agents support (#898) 2025-06-18 - 7e4857f - Deprecate VersioningIntent (#902) 2025-06-20 - 7be1ce8 - Add openai-agents to build-binaries
pyo3 to 0.25 in preparation for python 3.14 support2025-06-02 - 520aefd - Swallowed cancellation (#879) 2025-06-05 - 316a528 - Handle case where in_workflow is called in a synchronous activity (#884) 2025-06-05 - 785aca6 - Add handling for datetimes to the default Json Converter (#872) 2025-06-05 - ee6f8d7 - Instantiate interceptors later in workflow instance construction so that more variables are available. Notably, allows signal registration to work (#887) 2025-06-09 - 0e480cc - Update README to not recommend async activities (#876) 2025-06-09 - be4e099 - Use pytest-pretty (#886) 2025-06-10 - 39f8e84 - Adding trace identification numbers (#888) 2025-06-12 - 13b27be - Update pyo3 to 0.25 and convert to pyo3-async-runtimes (#897) 2025-06-17 - 35b1a35 - Fix memo payload metadata memory sharing bug (#901) 2025-06-18 - 53d9ace - OpenAI agents support (#898) 2025-06-18 - 7e4857f - Deprecate VersioningIntent (#902) 2025-06-20 - 7be1ce8 - Add openai-agents to build-binaries (#908)
…typing.Literal (#867) 2025-05-15 - 51af3e69 - 💥 Breaking Change - Make static_details and static_summary lazy on the workflow description (#869) 2025-…
upsert_memo method.temporal activity pause, which will interrupt the activity's execution with a cancel-like exceptionstatic_details and static_summary properties on WorkflowExecutionDescription are now async methodsmax_concurrent_workflow_tasks and max_concurrent_workflow_task_polls (or workflow_task_poller_behavior using SimpleMaximum) must be at least two. Previously this would silently cause issues, now it is a hard error at worker startup time.2025-05-12 - 257f1438 - Upsert memo support (#858)
2025-05-12 - 2864297f - Add a workflow level check for the existence of a local activity (#857)
2025-05-13 - 80b2ad10 - Add new workflow info field for workflow_start_time (#866)
2025-05-14 - b0aae9bf - Fixed serialization of typing.Literal (#867)
2025-05-15 - 51af3e69 - 💥 Breaking Change - Make static_details and static_summary lazy on the workflow description (#869)
2025-05-15 - 8449a350 - Add application category (#853)
2025-05-16 - 5afb1314 - Changed test timeout to 60s (#868)
2025-05-16 - b53be980 - Versioning Override support (#871)
2025-05-17 - e9d3b014 - Activity worker refactor (#860)
2025-05-19 - 1b136a0d - Clean up existing code (#861)
2025-05-28 - b24326cb - 💥 Breaking change - Update core to fix low wft slots/pollers issue (#877)
2025-05-29 - 27cc67f1 - Interrupt heartbeating activity on pause (#854)
This is a patch release fixing a bug that would cause a Worker using the older Build-ID-based versioning APIs to fail to receive tasks.
This is a patch release fixing a bug that would cause a Worker using the older Build-ID-based versioning APIs to fail to receive tasks.
2025-05-08 - 820218c9 - Fix incorrectly set legacy build id options (#859)
Users can now set a priority key when scheduling a workflow, activity or child workflows. The priority key will be used to help prioritize certain tas
Users can now set a priority key when scheduling a workflow, activity or child workflows. The priority key will be used to help prioritize certain tasks over others when there is a backlog. Priority is currently not supported in any OSS Temporal release, but support will be coming soon. To experiment with this feature please see the pre-release development server or if you are a Temporal Cloud customer reach out to your SA.
This release introduces a preview of new APIs that gracefully manage code changes and worker pools that support them. The goal is to better control which workers should execute new, and existing, workflows and activities tasks, based on their code and configuration.
AUTO_UPGRADE and PINNED are two Versioning Behaviors that can be specified on a workflow implementation using the versioning_behavior argument to @workflow.defn. PINNED workflows are typically short lived, and are never affected by new versions, i.e., they do not need to use the patch API for compatibility. AUTO_UPGRADE workflows are mostly long running, but they need to use patching to safely transition to new versions. The choice of PINNED vs AUTO_UPGRADE ultimately depends on your willingness to keep old worker fleets running vs the complexity of patching.
To manage Worker Deployments please use the Temporal CLI, or Client.workflow_service
You can configure Workers to automatically adjust the number of concurrent polls they make for tasks! Set the workflow_task_poller_behavior and activity_task_poller_behavior arguments of the Worker constructor to PollerBehaviorAutoscaling to try it out. You can expect fewer unnecessary polls during low load, and increased polls during high load when they can be used to increase task throughput.
2025-02-19 - 49ca10e4 - uv + maturin migration (#768) 2025-03-26 - b0dfaef0 - Evolve observability documentation (#797) 2025-03-27 - 65b10bf6 - Silence passing test (#804) 2025-03-27 - d2198705 - Check for grpc status details before indexing & unpacking (#801) 2025-03-28 - bf747f11 - Workflow/Activity Priorities (#802) 2025-03-31 - 92b77589 - Expose root workflow execution (#805) 2025-04-04 - 7ffa822c - Improve workflow task deadlock and eviction (#806) 2025-04-07 - dfc6e7fc - Add workflow.in_workflow() utility (#799) 2025-04-10 - 1296cd74 - Allow even-parentless workflow spans to always be created (#817) 2025-04-10 - f5e6d203 - Unskip update tests under java test server (#644) 2025-04-10 - fb3dccda - Treat TimeoutError as workflow/update failure instead of task failure (#800) 2025-04-16 - fd49c4e7 - Worker Deployment Versioning (#821) 2025-04-18 - 127835eb - Expose poller autoscaling options (#830) 2025-04-18 - 4933dc5f - Data converter non-string keys (#833) 2025-04-18 - 52bc5cfe - Investigate test flakes (#832) 2025-04-21 - 3d10ba6d - Enhancement/allow custom metric buckets (#781) 2025-04-21 - 6f315563 - Fix protobuf version in build-binaries wheel test (#836) 2025-04-22 - 2025f079 - Add dynamic config function (#842) 2025-04-23 - bc82930d - Add VERCEL_PROJECT_ID and VERCEL_ORG_ID (#844)
Python 3.13 is now officially supported and Python 3.8 is no longer supported.
Get from PyPI
Python 3.13 is now officially supported and Python 3.8 is no longer supported.
The SDK now contains a data converter that supports conversion of all types supported by Pydantic to and from JSON. In addition to Pydantic models, these include all json.dump-able types, various non-json.dump-able standard library types such as dataclasses, types from the datetime module, sets, UUID, etc, and custom types composed of any of these. Usage:
from temporalio.client import Client
from temporalio.contrib.pydantic import pydantic_data_converter
client = Client(data_converter=pydantic_data_converter, ...)
This data converter supports Pydantic v2 only.
See https://github.com/temporalio/sdk-python?tab=readme-ov-file#data-conversion for details
2025-01-10 - 7af48a74 - Drop Python 3.8, add 3.13 (#694)
2025-01-15 - 7665bf5c - Useful event ordering tests from discarded changes to event loop (#729)
2025-01-16 - 1a68b58c - More precise logging (#734)
2025-01-16 - bd44efa9 - Respond to server changes to Update error (#735)
2025-01-17 - 9da5e69b - Use non-test name for workflow classes (#736)
2025-01-17 - 9e343014 - Add tests of asyncio.Lock and asyncio.Semaphore usage (#567)
2025-01-18 - effc857c - Run-time check for update validator signature (#723)
2025-01-21 - 154aab99 - Fix issue when failing to convert failure (#727)
2025-01-21 - fe46e1ac - Remove "experimental" notices from update APIs (#707)
2025-01-22 - 1d89d758 - Fix some lint errors (#744)
2025-01-23 - 150878fd - Do not include self parameter (#746)
2025-01-23 - 45aa3a2c - Expose http option for OTLP (#741)
2025-01-23 - 4892714b - Support passing through all modules (#737)
2025-01-24 - 044b1dee - Add workflow.instance() API for obtaining current workflow instance (#739)
2025-01-24 - 07d3567c - chore: remove Python < 3.9 support (#728) (#730)
2025-01-25 - 35a0e6c9 - Update core (#745)
2025-01-27 - 51f4b66f - Update schedule search attributes (#753)
2025-02-07 - acde42cc - Accept search attributes for dev server (#562)
2025-02-13 - 77a15028 - Remove experimental warnings from stable APIs (#766)
2025-02-13 - b3f36621 - Pydantic data converter (#757)
2025-02-14 - 83339002 - Conditionally whitelist datetime.datetime and add tests (#767)
2024-10-30 - 0b327b0 - Upgrade tonic to v0.12.3 to fix security vulnerability (#680) 2024-11-06 - 5b897b1 - Update Core / InitializeWorkflow (#683) 20…
Get from PyPI
Update-with-start sends an update request and starts a workflow if necessary. A WorkflowIDConflictPolicy must be specified. If the workflow execution is not running, then a new workflow execution is started and the update is sent in the first workflow task. Alternatively, if the specified workflow execution is running then, if the WorkflowIDConflictPolicy is USE_EXISTING, the update is issued against the specified workflow, and if the WorkflowIDConflictPolicy is FAIL, an error is returned.
See the lazy_initialization sample
When starting workflows (directly, via update with start, via schedules, or via child workflows), users can now set a static_summary and/or static_details option which may appear in the UI/CLI in the future. Similarly, users can provide summary to timers and activity invocations. Finally, users can invoke workflow.set_current_details with a string that can updated be throughout the life of the workflow based on the workflow's state. This value may also appear in the UI/CLI in the future. Values for summary or details can be in limited single-line or multi-line markdown format, respectively. This feature is currently experimental which means future releases can technically update the API in incompatible ways.
Worker tuners can now be created with custom slot suppliers. By providing a class implementing CustomSlotSupplier to a worker tuner, users can now control logic of when slots are available for use by the worker. This allows advanced, dynamic control over in-process tuning for how many concurrent activities, local activities, and workflow tasks can run. This is an advanced feature and is currently experimental which means future releases can technically update the API in incompatible ways.
2024-10-30 - 0b327b0 - Upgrade tonic to v0.12.3 to fix security vulnerability (#680) 2024-11-06 - 5b897b1 - Update Core / InitializeWorkflow (#683) 2024-11-06 - 723d234 - Include update info in logging output (#664) 2024-11-13 - 001ce8b - pyproject.toml: Removed protoc-wheel dependency (#684) 2024-11-20 - 042e088 - Custom slot suppliers (#690) 2024-11-22 - 853889c - Fix logic bug in create_schedule() re. backfills (#693) 2024-11-22 - 97a2b7a - Worker code cleanup (#692) 2024-12-03 - a90f6d4 - Slot info should be optional on release context (#695) 2024-12-06 - 173826f - Add limit to list workflows (#698) 2024-12-16 - 341d949 - User metadata (#701) 2024-12-19 - 540faeb - Update-with-start (#702) 2024-12-19 - 999c8f8 - Set run id in update handle (#705) 2024-12-19 - c44a6d8 - Update bug fix: prevent update from a stale workflow handle (#703)
New @workflow.init decorator allows __init__ to receive the workflow arguments. This can be useful for message handlers, since these may execute befor
Get from PyPI
@workflow.init decorator allows __init__ to receive the workflow arguments. This can be useful for message handlers, since these may execute before the @workflow.run method.2024-09-24 - 0995ae0 - Workflow init (#645) 2024-09-25 - 3cf1b85 - Change client-side default to match server-side default (#649) 2024-09-25 - a1b5d65 - cargo update -p quinn-proto (#651) 2024-09-30 - 2e6d742 - Insert guard clause for workflow.upsert_search_attributes on empty inputs (#630) 2024-10-03 - badbb9e - Add documentation of signal and update handlers (#658)
This is mostly a bugfix release meant to address:
Get from PyPI
This is mostly a bugfix release meant to address:
2024-08-26 - 4e97841 - Create and upload junit-xml artifacts (#617) 2024-08-26 - 927abdc - Start requiring pyright typechecking (#619) 2024-08-27 - 4aef4bf - Stack trace on deadlock detection exception (#626) 2024-08-27 - 7af99d0 - Fix exception-swallowing code path (#623) 2024-09-06 - 59d04a6 - Make client.py typecheck under pyright (#628) 2024-09-06 - a18140f - Pin to 3.12.4 (#635) 2024-09-11 - 09ac120 - Update core and update release version to 1.7.1 (#640)
wait_for_stage=WorkflowUpdateStage.ACCEPTED is now required when starting an update with temporalio.client.WorkflowHandle.start_update. Although no ot
Get from PyPI
start_updatewait_for_stage=WorkflowUpdateStage.ACCEPTED is now required when starting an update with temporalio.client.WorkflowHandle.start_update. Although no other wait_for_stage value is currently valid, making it required emphasizes that an update caller must wait for a response from the worker, whether using start_update or execute_update (in contrast to temporalio.client.Client.start_workflow and temporalio.client.WorkflowHandle.signal).
Workflow code can use await workflow.wait_condition(workflow.all_handlers_finished) to wait for all update and signal handlers to complete. The worker will emit a warning every time a workflow completes or continues-as-new while signal/update handlers are still running. In general workflow code should wait for handlers to finish; an update caller will see an exception if the workflow does not wait for the update to complete.
asyncio.as_completed and asyncio.waitasyncio.as_completed and asyncio.wait are sometimes non-deterministic so must not be used in workflow code. Instead use the drop-in replacements provided by the SDK: workflow.as_completed and workflow.wait. In a future release it will be an error to use non-deterministic versions from asyncio. When applying this change to your workflow code it should be considered backwards-incompatible, so use versioning when making this change for running workflows.
current_update_info()Use temporalio.workflow.current_update_info(), similar to temporalio.workflow.info(), to obtain metadata about the current update. This includes the update ID, which is useful for in-workflow deduplication of updates (necessary when using updates with continue-as-new).
Experimental support for worker tuning has been added along with an implementation for auto-tuning based on available
resources. The temporalio.worker.Worker class now has a temporalio.worker.Tuner field that can be set with an instance of
temporalio.worker.WorkerTuner. This can be a fixed-size based tuner via WorkerTuner.create_fixed or based
on resources via WorkerTuner.create_resource_based. Technically the interface can be manually implemented to return
custom SlotSuppliers, but only fixed-size and resource-based slot suppliers are currently supported, custom slot
suppliers will appear in the future.
This SDK API is experimental and may change in incompatible ways in the future.
2024-05-09 - f96679b - Fix issue with codecs returning passed-in payloads (#526) 2024-05-15 - a52f25d - During eviction, set is_replaying and raise special exception (#524) 2024-05-20 - 11a97d1 - Required wait update stage, update polling improvements, and other update changes (#521) 2024-05-28 - afadc15 - Allow proper stack trace on eviction deadlock (#530) 2024-06-04 - 2061835 - Update core/dependencies and call worker.validate (#541) 2024-06-04 - 365cead - Add deterministic alternatives for asyncio.wait and asyncio.as_completed (#533) 2024-06-06 - 2d65d82 - Fix GHA config for Swatinem/rust-cache@v2 (#546) 2024-06-06 - 58d6951 - Access current update info with ID inside update handler (#544) 2024-06-10 - 927415a - Remove proto wheel and other minor fixes (#547) 2024-06-17 - 18b890e - Server 1.24 related fixes (#551) 2024-06-17 - 2bb211e - Install protoc in run-bench CI job (#550) 2024-06-18 - 4f646c2 - Add __enhanced_stack_trace query to workers (#537) 2024-06-20 - 2331aa4 - Add WorkflowUpdateRPCTimeoutOrCancelledError (#548) 2024-06-26 - 2c1ac54 - New API to wait for handler executions to complete and warnings on unfinished handler executions (#556) 2024-06-26 - 7ac4445 - Expose resource based auto-tuner options (#559) 2024-07-01 - 38d9eef - Use ruff to auto-format code and sort imports. (#566) 2024-07-09 - 530cadf - skip files that are already mapped for enhanced stack traces (#574) 2024-07-10 - bcbacc2 - Experimental cloud operations client (#570) 2024-07-12 - c57df81 - Support for workflow ID conflict policy (#579) 2024-07-17 - 913b4b6 - Support query for listing schedules (#581) 2024-07-17 - e409d32 - Use minimal scope with pytest.raises (#582) 2024-07-18 - 3796ec3 - Use GH ARM runner (#580) 2024-07-19 - c4b1a01 - Update cibuildwheel (#589) 2024-07-24 - a839196 - Updated lazy loaded logger_details (#593) 2024-08-05 - 50914c4 - Honor all non-completion commands (#569) 2024-08-06 - 9142cdd - Add omes image build (#602) 2024-08-08 - 4b93d1a - Switch omes build to post merge (#604) 2024-08-09 - a5b9661 - Create commands after payload conversion (#591) 2024-08-19 - 73a1673 - Support activity retry delay (#571) 2024-08-19 - 97688cc - Unfinished handlers: add rule to warning message; test CAN, dynamic, and late-registered handlers (#612) 2024-08-20 - 185ce8c - Update Core (#605)
The internal eviction logic has been overhauled to make sure that asyncio tasks are completed before a workflow is removed from the cache and garbage
Get from PyPI
The internal eviction logic has been overhauled to make sure that asyncio tasks are completed before a workflow is removed from the cache and garbage collected. For all properly running workflows this should not cause any issues. However, workflows that may have been developed in invalid ways in the past could have a problem being evicted from cache and will log as such. Users should keep an eye out for logs when upgrading to this version.
When a workflow raises an exception that wasn't ApplicationError or bubbled from a Temporal call (e.g. activity failure), it would be a "task failure" which puts the workflow in a suspended state retrying the task until a code fix is deployed. An experimental feature is now available that lets users set which exception types should instead fail the workflow instead of suspending it. Users can now set the per-workflow failure_exception_types on the @workflow.defn decorator or set the worker-level workflow_failure_exception_types when creating the Worker. If an exception extends from one of these when raised, it will fail the workflow when raised.
Python clients now officially support HTTP CONNECT proxies. The http_connect_proxy_config argument can now be set when connecting a Client.
Workers can now have the client they use replaced without shutting down the worker. The client property on the Worker can be set to a different connected client. This is useful for users that need to change options like mTLS client certificate without worker downtime. The worker will not interrupt any polling calls but will start using the new client for subsequent calls.
If you use API keys in your Temporal server (i.e. Bearer tokens on Authorization headers), you can now set api_key when connecting a Client or set the api_key property on an existing client to update it.
Users using metric_meter() directly to create metrics (off of runtime, activity, or workflow) can now create float-based histograms and gauges, and duration-based histograms. Similarly users using MetricBuffer to retrieve metrics can say how they want to retrieve durations (float seconds, int milliseconds, or timedelta). A durations_as_seconds option was added to telemetry options for users that prefer seconds as float-based durations to OpenTelemetry and Prometheus instead of the default of integer milliseconds.
A new count_workflows call has been added to the Client that takes the same query as list_workflows but is optimized just to perform counts.
extra on LogRecord ChangedActivity logs and workflow logs used to set activity_info and workflow_info on LogRecord respectively as the full info dataclasses by default. This was not usable by many third-party logging tools that can only work with dicts and not dataclasses. Therefore the default was changed to set temporal_activity and temporal_workflow on the respective log records to dicts of commonly needed information. temporalio.activity.logger.full_activity_info_on_extra and/or temporalio.workflow.logger.full_workflow_info_on_extra can be set to True to put those info entries back on extra.
This only affects those using advanced log handlers that leverage contextual state. The log messages themselves are unaffected.
2024-03-04 - 477aa31 - Fix execute_child_workflow apidoc (#483) 2024-03-13 - f3d1b85 - API key client option (#486) 2024-03-26 - 36fe961 - Remove experimental flag from start_delay (#492) 2024-04-01 - 13d18ca - Update core and add durations-as-seconds metric option (#498) 2024-04-02 - b07e75e - Change default "extra" contents of activity/workflow logs (#490) 2024-04-05 - 1001653 - HTTP CONNECT proxy support (#501) 2024-04-05 - 466da16 - Safe Eviction (#499) 2024-04-12 - b45447e - Add macOS ARM runner (#506) 2024-04-12 - cf4c7cb - Ensure extra data on task fail logs (#502) 2024-04-18 - 50c2033 - Support float and duration metrics (#508) 2024-04-19 - ecd703d - Add Client.count_workflows (#510) 2024-04-30 - 0bb94f8 - Ability for certain task failure types to fail workflow (#516) 2024-05-03 - 0687151 - Worker client replacement (#517)
This is mostly a bug-fix and small-issue release. There are no large notable highlights.
Get from PyPI
This is mostly a bug-fix and small-issue release. There are no large notable highlights.
2024-01-10 - e3630ef - Fix line number in workflow.logger (#460)
2024-01-11 - 0bff022 - Add wheel to dev-dependencies (#457)
2024-01-12 - 10d099b - Fix typing of methods for pyright (#461)
2024-01-12 - 4904054 - Add build id to workflow info (#458)
2024-01-29 - 02a974c - Modularize gen-protos script (#465)
2024-02-01 - 5fe85be - Prefix some errors with rule identifiers (#464)
2024-02-02 - 50768df - Apply eviction before completing activation (#466)
2024-02-13 - 8dce5b5 - Fix SingleParam types for pyright checking (#471)
2024-02-14 - b0a7b4e - Flag MD5 as non-security related usage for FIPS compatibility (#472)
2024-02-20 - 1cfdaa8 - Add workflow ID on not-found activity error message (#428)
2024-02-22 - f31f927 - Ensure update input and responses are run through converters (#478)
2024-02-27 - 73e832d - Update core, minor README/doc updates, and put delete-workflow on proper service (#480)
Python 3.7 is EOL and is not supported by this library. In addition, we also added CI to confirm 3.12 works properly.
Get from PyPI
Python 3.7 is EOL and is not supported by this library. In addition, we also added CI to confirm 3.12 works properly.
Last release, a bug was introduced that caused an error when upserting search attributes that weren't set on start. This has been fixed.
2023-11-16 - 06cfd03 - Drop Python 3.7 support, ensure 3.12 support, update dependencies, and implement asyncio.timeout (#422) 2023-11-17 - 75e528b - Delete .github/workflows/semgrep.yml (#431) 2023-11-27 - c47e3f1 - Enable Eager Workflow Start (#430) 2023-11-30 - 6f966c7 - Fix bugs in upsert search attribs (#440)
Previously, search attributes were untyped dictionaries with string keys and list values. This causes ambiguity on what types a search attribute key r
Get from PyPI
Previously, search attributes were untyped dictionaries with string keys and list values. This causes ambiguity on what types a search attribute key represents and leads to errors. Also, the way search attributes were created or upserted allowed mistakes to occur and was not clear to the server exactly what was expected.
Among other classes, temporalio.common.TypedSearchAttributes and temporalio.common.SearchAttributeKey have been added. Search attributes are now best used by creating a global SearchAttributeKey (e.g. SearchAttributeKey.for_int("my-key")) and then referencing that key when getting or mutating search attributes. The TypedSearchAttributes collection (and workflow.typed_search_attributes()) should now be used when creating/accessing search attributes or a warning will emitted. Users should use the keys when accessing the collection or call value_set or value_unset on them to build update objects to pass to temporalio.workflow.upsert_search_attributes when upserting.
Previously, metrics were generated and exposed from our Core layer in a way that made them neither reusable nor exportable in a flexible way. We have now both exposed the ability to record metrics via Core and to received buffered metrics from Core.
To record metrics via Core, we have exposed a temporalio.common.MetricMeter via temporalio.activity.metric_meter(), temporalio.workflow.metric_meter(), and temporalio.runtime.Runtime.metric_meter. This meter provides a limited interface to generate metrics. It is not meant to abstract everything one can do with a metric system and users are still encouraged to use their own metrics libraries as needed. The workflow metric meter is built to skip recording meters during replay.
To configure metrics in the SDK, a new runtime must be created with telemetry config. To capture metrics emitted by Core, temporalio.runtime.TelemetryConfig.metrics now accepts a temporalio.runtime.MetricBuffer instance. That same instance must then be used to call retrieve_updates on repeatedly and frequently to get metrics coming out of Core. These come as raw events that can then filtered and/or sent to any other metrics system of choice.
To configure Core logging in the SDK, a new runtime must be created with telemetry config. Previously, Core logs would be sent to the console which wasn't always desirable. Now, the temporalio.runtime.LoggingConfig.forwarding field can be set with a temporalio.runtime.LogForwardingConfig class which accepts a logging.Logger to send core logs to. This is currently experimental while we gather feedback.
temporalio.workflow.Info.get_current_history_size() added to get history size (get_current_history_length() was already present)temporalio.workflow.Info.is_continue_as_new_suggested() added to know whether server has suggested to continue as newkeep_alive_config when connectingstart_delay to temporalio.client.Client.start_workflow and execute_workflow to support delaying a workflow startScheduleActionStartWorkflow.search_attributes replaced with ScheduleActionStartWorkflow.typed_search_attributesThe rarely used ScheduleActionStartWorkflow.search_attributes has been replaced by ScheduleActionStartWorkflow.typed_search_attributes since that object is used in both directions and we can't determine user intent. Users using the old field name in either direction will see an exception immediately on client side (i.e. no behavior changes or accidental misuse). We also added an untyped_search_attributes field to this class to let untyped ones stay present on update.
temporalio.runtime.TelemetryConfig.tracingtemporalio.runtime.TelemetryConfig.tracing and its associated class have been removed. This was not general purpose tracing, this was advanced tracing for debugging internal Core logc only and should not have been used by any users. All user-facing tracing remains untouched.
2023-08-01 - 393e5c8 - Provide Span.Kind for TracingInterceptor (#356) 2023-08-02 - 24fea4c - Expose history size and continue-as-new-suggested (#361) 2023-08-02 - 63f63ae - Upgrade grcpio to 1.53.0 (#359) 2023-08-07 - 59fbccf - Fix interceptors in testing environment (#364) 2023-08-16 - 31358d1 - Add ignore_unknown_fields as an argument to JSONProtoPayloadConverter (#365) 2023-08-24 - 40daaaa - Wait for activity completions on worker shutdown (#370) 2023-08-31 - aa829d3 - Update core/tonic, update metric options, remove core tracing (#380) 2023-09-25 - 3fade95 - Custom metric support (#384) 2023-09-28 - d5edb71 - Fix logging of error on activation failure (#389) 2023-10-05 - d03f356 - Buffered metrics (#391) 2023-10-06 - ded3747 - Encourage threaded activities, warn when max_workers too low, and other small changes (#387) 2023-10-09 - 00878ad - Client keep alive support (#396) 2023-10-24 - 4242dfb - README updates and CI fixes (#403) 2023-10-24 - 97814c2 - Workflow start delay (#406) 2023-10-25 - 2c15ed3 - Workflow Update (#400) 2023-10-30 - fd938c4 - Update last cleanup items (#410) 2023-11-02 - 063b9bf - Update core to get bugfix (#411) 2023-11-02 - 7c0a464 - Typed search attributes (#366) 2023-11-06 - 4802d2f - Log forwarding support (#413) 2023-11-06 - 6dbe2f4 - Fix docstring (#414) 2023-11-07 - d6646a2 - Fix pyd file name for Windows (#417)
Signals and queries that used the old form of dynamic=True which didn't require specific signatures are deprecated and will emit a warning.
Get from PyPI
dynamic=True can be added to @workflow.defn, @activity.defn, @workflow.signal, and @workflow.query to make them "dynamic". This means they are unnamed and are called if no other workflow/activity/signal/query match a name from the server when called. The workflow run or activity signature must be a single parameter typed with Sequence[temporalio.common.RawValue] whereas the signal or query signature must be two parameters typed with str and Sequence[temporalio.common.RawValue]. Signals and queries that used the old form of dynamic=True which didn't require specific signatures are deprecated and will emit a warning.
To support this we added workflow.payload_converter() and activity.payload_converter() functions to obtain a payload converter to convert raw values. We also added a temporalio.common.RawValue class which, when accepted or returned, will just use the raw payload (but it will still use codecs).
See the README for more information.
💥 NOTE: A slight behavior change was made to interceptors to support this. Previously, we would call signal/query interceptor and then check if there was a valid signal/query with that name. Now we check that a valid signal/query handler exists before calling the interceptor. This should not effect most users.
temporalio.testing.WorkflowEnvironment.start_local now uses the latest Temporal CLI release (which is up to date with latest server) instead of Temporalite. Any use of advanced, documented-experimental temporalite_-prefixed parameters should now use the dev_server_-prefixed ones.
Support has been added for the brand new Worker Versioning feature. This feature is currently experimental and can only be enabled when running the open source server and setting some special options. Samples for the versioning feature will be present soon.
The experimental tag for the scheduling API is removed.
result_type when not using type-safe activity, child workflow, and query calls to get properly typed results (but users should always prefer the type-safe forms)2023-05-31 - b0daaa3 - Create CODEOWNERS (#323) 2023-06-06 - e1d983e - Add Semgrep scanning (#324) 2023-06-16 - 6a3662c - Remove experimental tag for schedules and add limited action check (#330) 2023-07-05 - 07b2043 - Update core and update Rust dependencies (#337) 2023-07-05 - b75a567 - Allow converter failures to fail workflow and other minor things (#329) 2023-07-06 - aff198b - Set result types for string-based activity, child workflow, and query calls (#334) 2023-07-07 - 677f8be - Move from Temporalite to Temporal CLI dev server (#339) 2023-07-10 - d7238cd - Worker Versioning (#340) 2023-07-11 - 317dd9b - Add Versioning Intents to Commands (#342) 2023-07-11 - b902ec8 - Swallow Python exceptions better on workflow GC from eviction (#341) 2023-07-12 - 34681ca - Reachability type wasn't passed through all the way (#343) 2023-07-14 - 83bbc36 - Dynamic workflows, activities, signals, and queries (#346) 2023-07-17 - 60b72c6 - Link to Python SDK launch blog post (#350) 2023-07-18 - a17c0ef - Disallow most workflow operations in read-only context (#351) 2023-07-18 - b9df212 - Log and drop signals whose params can't be deserialized (and other error handling improvements) (#349)
No significant changes from previous version, mostly bug fixes.
Get from PyPI
No significant changes from previous version, mostly bug fixes.
2023-03-30 - 4ad2e64 - Use CDN for README image, fixes #302 (#308) 2023-03-30 - 61166af - Minor doc update (#305) 2023-03-30 - 72bdca7 - Update core (#307) 2023-03-30 - d790468 - Call JSON type converters recursively (#304) 2023-04-03 - dbf96fd - Pass through global telemetry tags (#303) 2023-05-01 - a4224a2 - Update core and release version (#314)
Python client now has support for creating and working with schedules.
Get from PyPI
Python client now has support for creating and working with schedules.
When a workflow is already running, we will now raise a WorkflowAlreadyStartedError error when trying to start instead of the default RPCError we do for all other errors.
2023-01-13 - 1a260c3 - Mark local activities as experimental (#252)
2023-01-13 - fdf8b65 - Fail activity worker on broken executor (#253)
2023-01-17 - 677262a - Add missing TERMINATE_IF_RUNNING to WorkflowIDReusePolicy (#257)
2023-01-23 - 82f723b - Properly encode failure encoded attributes (#251)
2023-01-23 - f22efea - Support PEP 604 union annotations (#256)
2023-02-07 - 832c375 - Add warning and direct to Pydantic converter sample if Pydantic models are detected (#249)
2023-02-08 - 3c8ee0a - Minor fixes (#268)
2023-02-08 - b52e04e - Add JSONTypeConverter (#269)
2023-02-09 - ae9038c - Fix gRPC health package clash (#270)
2023-02-13 - 1fa36c2 - Force Poetry setup file (#271)
2023-02-15 - 7a2d703 - Change types-protobuf dependency spec to match protobuf (#278)
2023-02-16 - 2ce6d9f - Update Rust dependencies (#281)
2023-02-16 - 852ff2f - Keep extra log attributes (#280)
2023-02-17 - fbcba65 - Schedules (#279)
2023-02-21 - c6e204a - Minor updates (#283)
This is the first stable release of the Python SDK! Since Python is now GA, we provide the same stability guarantees as all other SDKs - primarily tha
This is the first stable release of the Python SDK! Since Python is now GA, we provide the same stability guarantees as all other SDKs - primarily that we vow not to break workflow history in newer versions.
Get from PyPI.
Minor change since last beta - for those configuring a custom runtime for telemetry purposes via the experimental temporal.bridge.runtime.Runtime, they must now use the also-experimental temporal.runtime.Runtime class instead.
2022-12-08 - 1f72c98 - Added more context to the README sections (#225) 2023-01-03 - 22e8d92 - Update min proto version and fix gRPC optional dependency (#231) 2023-01-04 - 57bf9e6 - Minor type improvements (#239) 2023-01-04 - f252e36 - Expose core "runtime" as temporalio.runtime.Runtime (#240)
temporalio-sdk, and Rust 1.88 for the other crates.temporalio-client now provides a vendored-protox feature for compiling protobuf definitions
with protox, allowing client and Rust SDK builds without an installed protoc.CancelExternalWorkflowError and workflow_interceptors::CancelExternalWorkflowResult
for use in interceptors.WorkflowContextKey and context-value scopes provide replay-safe, workflow-run-owned context
storage for application code and workflow interceptors. Values survive async suspension while
remaining isolated between concurrent branches and signal/update handlers. Read-only workflow
views can observe values established by synchronous inbound interceptors, and outbound
interceptors can use values to propagate metadata to activities, child workflows, signals,
Nexus operations, and continue-as-new runs.ActivityEnvironmentBuilder no longer accepts a tokio_util::sync::CancellationToken.
Use ActivityEnvironment::cancel to cancel activities running in the test environment.ChildWorkflowStartError::StartFailed now reports an SDK-owned, non-exhaustive
StartChildWorkflowExecutionFailedCause instead of a generated protobuf enum. Add a wildcard
branch when matching the cause.WorkflowIdReusePolicy,
WorkflowIdConflictPolicy, QueryRejectCondition, ArchivalState, and
HistoryEventFilterType enums instead of generated protobuf enums. Add wildcard branches when
matching these types.ActivityError, PayloadConversionError, ActivityExecutionError,
ChildWorkflowStartError, ChildWorkflowExecutionError, and WorkflowSignalError are now
non-exhaustive. Add wildcard branches when matching these enums.
for use in interceptors, with WorkflowCancelFailureError exposing the decoded cancellation
failure.WorkflowSignalError::NotFound and CancelExternalWorkflowError::NotFound let workflows
distinguish a missing signal or cancellation target from other delivery failures.temporalio-sdk now exposes SDK-owned worker tuner and slot supplier types instead of
re-exporting the corresponding temporalio-sdk-core traits.temporalio-sdk now owns its runtime, polling, workflow-error, worker-validation, and local test
server configuration types instead of re-exporting their temporalio-sdk-core equivalents.
TokioRuntimeBuilder is non-exhaustive and provides a builder for construction. Unrelated Core
worker configuration and replay helpers are no longer re-exported by the SDK.
PollerBehavior::Autoscaling now holds builder-created AutoscalingOptions.Runtime::from_current_tokio replaces Runtime::new_assume_tokio as the preferred constructor.
The old name remains as a deprecated alias, but now returns RuntimeError instead of
anyhow::Error.Runtime::from_current_tokio now returns RuntimeError::NoCurrentTokioRuntime when called
without an active Tokio runtime instead of panicking.Memo::keys and SearchAttributes::keys now iterate in lexicographic order so workflow
decisions based on collection traversal remain deterministic during replay.⚠️ THIS IS A BETA RELEASE AND COMPATIBILITY MAY NOT BE MAINTAINED
⚠️ THIS IS A BETA RELEASE AND COMPATIBILITY MAY NOT BE MAINTAINED
Get from PyPI
We now generate Protobuf via 3.x and ensure it works with 3.x and 4.x Python libraries.
Now, unless opted out, sync multithread activities will raise an exception in thread when cancellation is received.
Since we are encouraging passing through third party modules, we have made it simpler to do so. Now the imports can simply be wrapped with with workflow.unsafe.imports_passed_through(): or the SandboxRunner's restrictions can just have passthrough_modules as a set of strings (or just SandboxRunner(restrictions=SandboxRestrictions.default.with_passthrough_modules("other.module")).
SandboxRestriction's passthrough_modules changed from SandboxMatcher type to a Set[str]2022-11-15 - 99e36cb - Sandbox and type fixes (#202) 2022-11-18 - a7d6fc3 - Add banner to README (#205) 2022-11-18 - b04813c - Add sdk-features CI trigger (#206) 2022-11-22 - e37b500 - Add table of contents to README (#209) 2022-11-29 - 89b6e66 - Support both protobuf 3 and 4 (#215) 2022-12-01 - 6a43919 - Support raising cancellation in sync multithreaded activities (#217) 2022-12-02 - cc679b9 - Sandbox Improvements (#219) 2022-12-05 - 06828ea - Update SDK core and minor updates (#221)
⚠️ THIS IS A BETA RELEASE AND COMPATIBILITY MAY NOT BE MAINTAINED
⚠️ THIS IS A BETA RELEASE AND COMPATIBILITY MAY NOT BE MAINTAINED
Get from PyPI
There is now an enabled-by-default workflow sandbox that attempts to ensure determinism via workflow isolation and restricted access to known non-deterministic standard library calls. If you are importing third-party libraries inside the same file as your workflow, this can incur a noticeable perf/mem penalty.
Also, if your workflow previously worked out of the sandbox, it may no longer work.
These issues can be mitigated. See https://github.com/temporalio/sdk-python#workflow-sandbox.
API improvements:
Client.list_workflows() - returns an async iterator of workflows based on
visibility filterWorkflowHandle.fetch_history_events() - returns an async iterator of history eventsWorkflowHandle.fetch_history() - helper for the above that returns a full WorkflowHistoryWorkflowExecutionAsyncIterator.map_histories() - returns an async iterator of WorkflowHistory based on async
iterator of workflowsReplayWorkflow.replay_workflow() - replays single WorkflowHistoryReplayWorkflow.replay_workflows() - replays async iterator of WorkflowHistory collecting resultsReplayWorkflow.workflow_replay_iterator() - async context manager providing an async iterator over replay results
from an async iterator of WorkflowHistoryUsing these APIs, users can now easily load many workflows and run their histories through a replayer. Among other benefits, this can help users know how code changes might react on previous workflow executions.
Python 3.11 is properly supported and early results show some speed improvement. Also, PyPI releases will now include Linux ARM wheels.
A custom temporalio.converter.FailureConverter can now be set as the DataConverter.failure_converter_class. In
addition to custom error conversion, this is also useful to set to
temporalio.converter.DefaultFailureConverterWithEncodedAttributes to force all error messages and stack traces to be
put in the encoded section of the failure, allowing them to run through a PayloadCodec for encryption.
Worker fatal errors are rare, but previously they were not surfaced when using async with. Now, similar to
asyncio.timeout, the current task will be
cancelled on fatal error and that cancel will be caught at the end of the async context manager and the reason for fatal
will be raised. The alternative to async with, Worker.run(), now also raises fatal errors.
Note, fatal errors only occur after a while of internal retries.
Not many and they are on less-often used parts.
patched History IncompatibilityIf you called patched for the same patch ID multiple times in the same workflow, this new release will be incompatible
with that workflow and you'll get non-determinism errors. patched is now memoized.
temporalio.worker.Replayer.replay_workflow now takes a temporalio.client.WorkflowHistory object instead of a proto
object or JSON str/dicttemporalio.client.WorkflowExecutionDescription.raw renamed to raw_descriptiontemporalio.client.WorkflowQueryFailedError instead of temporalio.client.RPCErrortemporalio.bridge.telemetry.init_telemetry package to making
a new telemetryio.bridge.runtime.Runtime and passing that around.2022-10-03 - 0dd2312 - Move API reference site to Vercel (#148) 2022-10-19 - e436ecc - Multiple History Replay support (#158) 2022-10-28 - 0126e6e - Workflow sandbox (#164) 2022-10-28 - 5259f4c - Preload type hints and remove global lookup cache (#168) 2022-10-28 - 657a13d - Don't require timer presence when fired (#169) 2022-10-28 - bc62186 - Remove Go server from Python tests (#170) 2022-10-31 - e16bbc3 - ARM runner and Python 3.11 support (#172) 2022-11-01 - 656b77b - Add simple benchmark script (#180) 2022-11-01 - b4b3f82 - Support for list workflow, fetch workflow history, and iterable replay results (#175) 2022-11-03 - cfdc548 - Add StrEnum conversion support (#177) 2022-11-04 - 65c4025 - Prefix private modules with underscore (#183) 2022-11-07 - 2546871 - Minor updates (#186) 2022-11-07 - 6b9f554 - Propagate fatal worker errors (#188) 2022-11-07 - 87fd193 - Clarity on client thread safety and sync activity cancel (#189) 2022-11-07 - 929dc81 - Failure converter (#185) 2022-11-07 - a75256e - Feature/datetime conversion fix (#179) 2022-11-08 - 3901df8 - Memoize patched calls and support UUID conversion (#192) 2022-11-09 - 87b28a7 - Add missing UUID test case (#193) 2022-11-10 - eacdca8 - Sdk core related updates (#191)
Most breaking changes were very minor:
⚠️ THIS IS A BETA RELEASE AND COMPATIBILITY MAY NOT BE MAINTAINED
Get from PyPI
temporalio.testing package now includes an ActivityEnvironment for mocking heartbeating and cancellation for activity code. See https://github.com/temporalio/sdk-python#testing-1 for more details.
temporalio.testing package also now includes a WorkflowEnvironment for testing workflows. The WorkFlowEnvironment can be started in time-skipping mode which, by default, will automatically forward time to the next event when a workflow's result is waited on. For a full, local Temporal server or a time-skipping server, APIs are included that automatically download the binaries needed to run. See https://github.com/temporalio/sdk-python#testing for more details.
The temporalio.worker package now has a Replayer which, given workflows and a history, can replay an entire workflow run locally. This is very useful for debugging and confirming code-change safety. See https://github.com/temporalio/sdk-python#workflow-replay for more details.
Nested dataclasses, Pydantic classes, optionals, unions, collections, etc are now supported for deserialization if the workflow/activity param/return types are properly type hinted. See https://github.com/temporalio/sdk-python#data-conversion for more details.
Client.workflow_service and Client.operator_service are now available for direct API calls to TemporalClient.service_client which, in addition to having access to the two services from the previous bullet, also has a check_health call to perform gRPC health checkrpc_metadata can be now added at the client level and/or to every API call which will set API headers (useful for proxies and other things)rpc_timeout can now be added to every API call to set a timeout on the call itselflazy parameter to Client.connect which avoids eager connection (cannot use these for workers)Most breaking changes were very minor:
Client.service is now Client.workflow_servicestatic_headers parameter in Client.connect is now rpc_metadataIterable were changed to accept a Sequenceinterceptors parameter in Client.connect no longer accepts callables, just the Interceptor instances it always hadmax_concurrent_wft_polls and max_concurrent_at_polls parameters in Client.connect were changed to max_concurrent_workflow_task_polls and max_concurrent_activity_task_polls respectively2022-08-05 - 043cdf3 - Minor README update (#99) 2022-08-10 - 8171049 - Fix activity class type hinting when not instantiated (#104) 2022-08-12 - efc1c7b - Advanced type hinting support (#102) 2022-08-16 - c965c47 - gRPC Service Improvements (#106) 2022-08-19 - 5b202c0 - Replayer (#108) 2022-08-25 - 4db14cc - README: Fix import name in quickstart (#112) 2022-09-01 - 07da1b9 - Test Framework (#121) 2022-09-07 - 1c9a59e - Several minor issues (#127) 2022-09-16 - 5b0e1c8 - Update and dogfood test framework (#132) 2022-09-19 - 580b6fc - Skip conditions during patch and query jobs (#137) 2022-09-19 - bcc0132 - Update protobuf (#136)
⚠️ THIS IS A BETA RELEASE AND COMPATIBILITY MAY NOT BE MAINTAINED
⚠️ THIS IS A BETA RELEASE AND COMPATIBILITY MAY NOT BE MAINTAINED
Get from PyPI
http://host:port, the target endpoint is now host:port to align with other SDKs (warns if scheme is present, will be an error next version).@activity.defn decorator can be set on the method, and helpers like workflow.execute_activity_method are present to help typing/invocation.__call__ implemented. The @activity.defn decorator can be set on the class in that case, and helpers like workflow.execute_activity_class are present to help typing/invocation.client.WorkflowExecutionDescriptionAn OpenTelemetry interceptor can now be provided that traces workflows and activities. Due to Temporal's replay capabilities where a workflow may start in one place and finish in another at a completely different time, the workflow tracing spans do not have durations, but they properly and deterministically represent the things done by a workflow. They are hierarchical and pass across servers so if, for example, an activity made an HTTP call, the HTTP span would appear in the activity span that would appear in the workflow span. See the README for more information.
2022-06-15 - 431ca19 - macOS M1 Python 3.10+ gRPC README note (#51) 2022-06-15 - 6ac791f - Fix CI Rust cache working directory (#50) 2022-06-27 - 25caaf0 - Remove macOS-ARM support from missing features list (#53) 2022-07-01 - 0392468 - Use cibuildwheel and update grpcio (#57) 2022-07-13 - 7456f44 - Remove activity info retry policy (#65) 2022-07-13 - a47f573 - Add proper version to client (#67) 2022-07-13 - a5c455b - Support IntEnum in converter (#74) 2022-07-13 - d91593d - Add get_current_history_length() to workflow info (#73) 2022-07-14 - 232446a - Additional high-level describe details (#72) 2022-07-14 - 5926b76 - Minor exception-related updates (#75) 2022-07-14 - a079a5e - Improves typing of SearchAttributes (#76) 2022-07-14 - b8a80e0 - Type refactoring and activity class/method support (#69) 2022-07-14 - e5bd9a9 - Properly handle uncaught child/activity cancel during workflow cancel (#71) 2022-07-21 - a569582 - Many changes including OpenTelemetry support (#77) 2022-08-01 - 2288f41 - Use host:port instead of URL and TLS test fixes (#86) 2022-08-01 - dae22ac - Fix wait_condition timeout issue (#90) 2022-08-04 - f560680 - Fix cancel before run (#94)
⚠️ THIS IS AN ALPHA RELEASE AND COMPATIBILITY WILL _NOT_ BE MAINTAINED
⚠️ THIS IS AN ALPHA RELEASE AND COMPATIBILITY WILL NOT BE MAINTAINED
This release includes full Temporal workflow support.
Activities are now marked with @activity.defn and name can be overridden there instead of needing to provide a dict to the worker.
macOS ARM-based packages are now uploaded to PyPI.
2022-03-18 - c1efe42 - Readme updates (#13) 2022-03-22 - fc528ee - Move to proper async heartbeat queuing (#14) 2022-03-23 - 256bc4a - Worker package refactor (#15) 2022-03-28 - 23aa7ae - @activity.defn support and other minor things (#16) 2022-05-27 - f1aa1c9 - Workflow implementation (#21) 2022-06-01 - 4657453 - Async activity support and describe interceptor (#32) 2022-06-01 - 47be211 - Update SDK Core and PyO3 (#31) 2022-06-03 - 39eb19d - Add API doc publishing step (#38) 2022-06-03 - 962a5e8 - Patch support and random/UUID helpers (#35) 2022-06-03 - a8e842b - Move to pydoctor for API docs (#34) 2022-06-09 - 0f134e2 - Add generated protos (#42) 2022-06-09 - 81e17c0 - More tests, docs, and minor things (#41) 2022-06-10 - 155afe2 - Dependency updates, Core proto updates, and other minor things (#46) 2022-06-10 - 2d4405e - Clarify README (#44) 2022-06-10 - 8ffa58e - Search attributes (#43)
⚠️ THIS IS AN ALPHA RELEASE AND COMPATIBILITY WILL _NOT_ BE MAINTAINED
⚠️ THIS IS AN ALPHA RELEASE AND COMPATIBILITY WILL NOT BE MAINTAINED
This release includes:
This release does not include:
See the README or https://github.com/temporalio/samples-python for more
2022-01-31 - a3d5328 - Rework grpc locations and add some different structure (#3) 2022-02-04 - 7b5a69c - Converters and scaffolding (#4) 2022-02-16 - 2afda4e - Client impl and docs scaffolding (#6) 2022-03-14 - 3e1e408 - Activity support (#7) 2022-03-17 - 641efe8 - Packaging, heartbeat logic, dependency updates, and other errata (#8)
Your coding agent can read these notes before it upgrades. Set up the MCP server →