Releases · temporalio/sdk-python · GitHub
Skip to content

Releases: temporalio/sdk-python

1.34.0

Choose a tag to compare

@github-actions github-actions released this 30 Sep 20:25

Notable Changes

Added

  • 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.

Changed

  • The deepagents extra now requires deepagents>=0.7,<0.8 (was <0.7). Because
    deepagents 0.7 requires langsmith>=0.10.9, the langsmith extra now allows
    langsmith<0.13 (was <0.9).

💥 Breaking Changes

  • The 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 the
    workflow's deterministic random stream. A workflow started under an earlier release that calls
    workflow.random() or workflow.uuid4() after ADK code may not replay deterministically
    across the upgrade; drain such workflows or use worker versioning.

Fixed

  • temporalio.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.

SDK Core

Changelog

Added

  • External workflow signal and cancellation resolution activations now include the typed server
    failure cause alongside the existing failure.

Fixed

  • Task-poll targets no longer decrease after cancelled or timed-out polls. Affected pollers still
    retain their slot during backoff, while resource-exhaustion errors still reduce the target.
  • Replay now preserves which local activity results were delivered together for newly recorded
    histories. This prevents local activity scheduling which was conditional on local activity
    resolution order from assigning recorded results to different handles. Older markers keep their
    existing behavior.
  • Workflow poll balancing now lets non-sticky pollers use capacity after sticky pollers reach their
    configured or autoscaled polling limit.
  • Every path that fails a workflow task now only reports the failure to server
    on the task's first attempt, and later attempts are left to time out. Previously PayloadsTooLarge
    failures and history fetch failures were re-reported on every attempt.
  • The workflow_task_execution_failed metric is now recorded for every failed workflow task
    attempt, including attempts whose failure was not sent to the server, and its failure_reason
    tag distinguishes GrpcMessageTooLarge, PayloadsTooLarge, and RequestTooLarge on every path.

Commits

Read more

1.33.0

Choose a tag to compare

@github-actions github-actions released this 15 Sep 00:57
ab52fdd

Notable Changes

Added

Standalone Activity operator commands

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

Changed

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

💥 Breaking Changes

  • Experimental external storage: ExternalStorage.driver_selector is now called with a
    StorageDriverSelectContext instead of a StorageDriverStoreContext. Update the annotation;
    the new type carries the same target field. Since selectors are plain callables, a stale
    annotation fails type checking rather than at runtime.
  • client.ActivityExecution and client.ActivityExecutionDescription had some fields removed or renamed
    to match RPC API.
    • Dataclass parameters for these types were changed to frozen=True, eq=False, kw_only=True.
    • scheduled_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.
  • ActivityHandle.describe() long-poll token was removed. The functionality can still be used manually
    through raw gRPC API.

Fixed

  • 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.

SDK Core

info: syncing channel updates for 1.94-x86_64-unknown-linux-gnu
info: latest update on 2026-03-26 for version 1.94.1 (e408947bf 2026-03-25)
info: downloading 5 components
warn: the missing active toolchain 1.94-x86_64-unknown-linux-gnu has been auto-installed
warn: this might cause rustup commands to take longer time to finish than expected
info: you may opt out with RUSTUP_AUTO_INSTALL=0 or rustup set auto-install disable

Changelog

Added

  • Language SDKs can opt in to recording local activity arguments in the local activity marker's
    input detail.
  • Workflow completion-as-cancelled commands can now carry details for recording on the terminal
    history event.
  • Core now supports attaching EventGroupMarkers to most workflow commands.
  • The temporal_activity_execution_failed and temporal_local_activity_execution_failed worker
    metrics now carry a failure_reason attribute. Each is now split into one time series per
    reason, which may affect existing dashboards.
  • Workflow task completions larger than the gRPC request size limit are now paginated automatically when the namespace supports it. Paginated workflow task completions require Temporal Server 1.32.0 or later.

Breaking Changes 💥

  • The following types are now non-exhaustive: Priority, WorkerDeploymentVersion,
    WorkerCallbacks, WorkflowExecutionInfo, ActivityCloseTimeouts,
    ActivityExecutionDecodeHint, child-workflow and signal decode hints,
    SerializationContext, SerializationContextData, PayloadConverter, IncomingError,
    ScheduleSpec, and ScheduleOverlapPolicy. Construct structs using their respective builders
    or constructors (WorkerCallbacks::new, ActivityExecutionDecodeHint::new, or
    SerializationContext::new); use Default for PayloadConverter; and add wildcard branches
    when matching enums.
  • Renamed ActivityCloseTimeouts::Both to ActivityCloseTimeouts::ScheduleAndStartToClose.
  • Removed the unused ActExitValue type. Use ActivityError::WillCompleteAsync to mark an
    activity for asynchronous completion.
  • Removed the test-only FailOnNondeterminismInterceptor from the public API.
  • TaskToken no longer exposes its underlying bytes directly. Use TaskToken::into_inner() to
    consume a token into its bytes.

Fixed

  • Worker shutdown now drains activity completions that are still flushing their result to the
    server before finishing. Previously such a completion — typically one whose final heartbeat RPC
    was still in flight — could be permanently stranded by shutdown: the activity's result was
    never reported (the server had to time the attempt out before retrying it), and workers missed
    shutdown's slot-permit release deadline, panicking in debug builds.
  • The Prometheus exporter now appends _total to counter metric names when an SDK enables the
    counter suffix option.
  • Update-with-start ExecuteMultiOperation calls now use Core's long-poll timeout instead of the
    normal RPC timeout, avoiding premature failures while waiting for an update to reach its
    requested stage.
  • An activity failure caused by oversized final heartbeat details is now counted in the
    temporal_activity_execution_failed metric as failure_reason="PayloadsTooLarge". Previously it
    was counted under the reason for the failure the activity itself reported, and was not counted at
    all when that failure was benign, even though a payload-limit failure was reported instead.
  • Workers now warn when autoscaling task polling encounters errors continuously for one minute.
    Repeated warnings use exponential backoff up to 15-minute intervals and stop after polling
    recovers.
  • Workers with a small workflow cache no longer briefly stop accepting new workflows. Sticky
    workflow-task pollers could consume every workflow-cache permit and starve the non-sticky poller,
    so the worker would stop picking up new workflows until a poll timed out (up to ~60s). The poll
    balancer now reserves a non-sticky slot against the workflow cache size rather than the slot
    supplier size.

Commits

Read more

1.32.0

Choose a tag to compare

@tconley1428 tconley1428 released this 24 Aug 21:33

Notable Changes

Added

  • 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.

Changed

  • The opentelemetry and lambda-worker-otel extras now require
    opentelemetry-api/opentelemetry-sdk >= 1.26, matching what
    temporalio.contrib.opentelemetry already required in practice.
  • temporalio.contrib.pydantic converters now reuse Pydantic type adapters
    for repeated type hints instead of rebuilding their schemas for every
    payload, greatly speeding up decode of non-model hints such as discriminated
    unions (#1695). Up
    to 1024 type adapters are cached per converter instance by default, with
    least-recently-used eviction. To change the bound, pass
    max_cached_type_adapters to PydanticPayloadConverter (or
    PydanticJSONPlainPayloadConverter) from a nullary subclass used as the
    DataConverter.payload_converter_class; None makes the cache
    unbounded and zero disables caching.
  • A data converter can now report that it understood a Nexus operation's input
    but considers it invalid by raising a non-retryable ApplicationError of type
    PayloadValidationError while decoding it. Such a failure is reported to the
    caller as a BAD_REQUEST Nexus handler error with the message
    Invalid operation input, retaining the original error as its cause. Raised
    from a payload codec, that replaces a handler-side INTERNAL error; raised
    from a payload converter, the type was already BAD_REQUEST and only the
    message becomes specific to validation. Any other decode failure, and a
    retryable PayloadValidationError, keep their existing treatment.

💥 Breaking Changes

  • The openai-agents extra now requires openai-agents>=0.19.2,<0.20, up from >=0.17.5 with no
    upper bound.
  • temporalio.contrib.openai_agents now rejects a sandbox SandboxPathGrant bound to a
    host_path.
  • temporalio.contrib.openai_agents now rejects run_config.sandbox.session.

Fixed

  • create_payload_validation_error(None) now creates an application error with no
    details instead of encoding None as a detail.
  • Client header encoding no longer mutates interceptor-provided payloads, preventing
    update-with-start from encoding a shared header twice when
    HeaderCodecBehavior.CODEC is enabled (#1769).
  • temporalio.contrib.opentelemetry replay-safe spans now delegate
    Span.add_link to the wrapped span. Previously the wrapper inherited
    OpenTelemetry's non-abstract no-op default, silently dropping links added
    after span creation.
  • Standalone activity start requests now include a unique request ID so RPC retries are deduplicated.
  • OpenTelemetry trace and span IDs propagated by concurrent workers no longer
    interfere with each other, preserving the correct parent-child hierarchy.
  • The google-adk extra now depends on mcp, so fresh installs of
    temporalio[google-adk] can import temporalio.contrib.google_adk_agents
    without separately installing mcp. Previously the import failed with an
    ImportError because google.adk.tools.mcp_tool only exports McpToolset
    when mcp is installed.
  • temporalio.contrib.openai_agents no longer crashes when a plain dict
    is passed for run_config. (openai-agents >= 0.19.0 accepts dict run
    configs at its public runner API)

SDK Core

Changelog

Added

  • Core console logs can now be emitted as newline-delimited JSON when an SDK selects the JSON log
    format. Configured log filters continue to apply to JSON output.
  • Worker heartbeats now report the SDK runtime, hosting environments, operating system, and
    architecture once per worker, retrying until the first successful delivery. Runtime options can
    disable the reporting.
  • Workers now log a [TMPRL1104] warning when a workflow task takes longer than 5 seconds. Set
    TEMPORAL_WORKFLOW_TASK_DURATION_WARN_SECONDS to change the threshold.

Breaking Changes 💥

  • Activity failures now include the latest heartbeat details atomically instead of force-flushing a
    throttled heartbeat first. Temporal Server 1.16.0 or newer is required to guarantee those details
    are preserved on failure; workers warn when the server does not advertise support.

Fixed

  • Workers no longer send worker heartbeats or appear in centralized heartbeat reports before they
    begin polling.
  • Ephemeral server processes no longer leak on failed start.
  • Local activity resolutions are now delivered to workflows as each activity completes instead of
    waiting for every local activity in the workflow task. This allows sequences of short local
    activities to make progress while a long-running local activity executes in parallel, while
    preserving the resolution ordering recorded in existing histories during replay.
  • Try-cancel child workflows no longer cause nondeterminism when they complete or fail after their
    cancellation was requested.
  • Nexus tasks are now timed out locally even when the server sends a request-timeout header that
    falls outside the Nexus duration grammar, such as a negative value for a task whose deadline has
    already elapsed, a sub-millisecond unit, or a multi-unit value like 1m30s. Previously such a
    header was ignored entirely, so the handler was never told the task had timed out, and a task
    left unanswered could block worker shutdown indefinitely.

What's Changed

Read more

1.31.0

Choose a tag to compare

@github-actions github-actions released this 29 Jul 17:58
84b519e

Notable Changes

Added

  • 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.

Changed

  • Prepared replay-safe workflow activation scheduling that prevents cancellation
    from being lost when another event becomes ready in the same workflow task. The
    behavior is guarded by internal workflow logic flag 2 and remains disabled by
    default during its compatibility rollout.
    Maintainer reminder: keep flag 2 default-disabled for the first two published
    SDK releases that recognize it; enable it in the third release, remove the explicit
    overrides for this flag from tests/worker/test_workflow.py, and replace this rollout
    note with a Fixed entry announcing the behavior change.

💥 Breaking Changes

  • Custom workflow runners that construct 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.
  • System Nexus payload converter helpers added for generated bindings are now
    private implementation details, and the remaining public temporalio.nexus.system
    APIs are marked experimental and subject to change.
  • Payload size limits have moved from 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.

Fixed

  • Marked system Nexus envelope payloads so nested payloads can be detected and
    visited after the envelope is already stored as a payload.

SDK Core

  • 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)

What's Changed

  • fix(activity): do not mutate caller-provided extra dict in LoggerAdapter by @1fanwang in #1513
  • Update sdk-core to incorporate time-skipping api changes by @GregoryTravis in #1633
  • Fix flaky TMPRL1104 duration-log assertions in test_extstore by @DABH in #1628
  • Add dynamic node/task summaries to LangGraph plugin by @DABH in #1612
  • ...
Read more

1.30.0

Choose a tag to compare

@github-actions github-actions released this 02 Jul 21:21
b5777e9

Notable Changes

Added

  • Nexus operation link propagation for signals. When a Nexus operation handler signals a workflow
    (including signal-with-start), the inbound Nexus request links are now forwarded onto the signaled
    workflow so its history events link back to the caller, and the link the server returns for the
    signaled event is attached to the caller workflow's Nexus operation history event. This makes the
    caller and callee mutually navigable in the UI for signal-based Nexus operations.
  • Exposed backoff_start_interval for continue-as-new, to allow the new workflow to start after a delay.

Changed

  • AWS Lambda worker configure parameter supports sync, async, and async
    generator style functions. This callback is invoked on the asyncio event
    loop.
  • Relaxed the protobuf dependency bounds to allow protobuf 7 where compatible
    with the selected optional dependencies.
  • Standalone Nexus operation links are now forwarded on start workflow and signal requests.

Breaking Changes

  • AWS Lambda worker configure parameter has been changed to be invoked
    per-invocation of the worker instead of only at startup. It is advised that
    any shared, heavy-weight operations are performed outside of the callback
    before run_worker is invoked.

SDK Core

  • 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)

What's Changed

New Contributors

Full Changelog: 1.29.0...1.30.0

1.29.0

Choose a tag to compare

@github-actions github-actions released this 17 Jun 21:23
4b4e34e

Notable Changes

Added

  • Added experimental temporalio.workflow.signal_with_start_workflow, backed by
    generated system Nexus bindings for
    WorkflowService.SignalWithStartWorkflowExecution.
  • Added OpenAI Agents plugin support for CustomTool dispatch, including lazy
    tool discovery through defer_loading.

Breaking Changes

  • 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

  • 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.

    SDK Core

What's Changed

New Contributors

Full Changelog: 1.28.0...1.29.0

1.28.0

Choose a tag to compare

@github-actions github-actions released this 04 Jun 17:50
bda846f

Experimental Releases

Strands Agents Plugin

This release adds a new Temporal Plugin for running Strands Agents inside Temporal Workflows. Model invocations, tool calls, and MCP tool calls are routed through Temporal Activities, so your agents get durable execution, retries, and timeouts for free.

Workflow Streams support for LangGraph

The LangGraph plugin can now durably stream node output to external consumers. Values written with langgraph.config.get_stream_writer() are published to a Workflow Streams topic.

Standalone Nexus Operations

Standalone Nexus Operations is experimental and currently only supported on pre-release versions of the dev server.

Added support for Standalone Nexus Operations, allowing clients to start and manage Nexus operations directly outside of a Workflow. Documentation, Samples, and instructions to request enablement in Temporal Cloud will be linked here when available.

⚠️ Possible Local Activity Behavioral Difference

This release includes a bugfix in the Core library that changes incorrect behavior that may have unintentionally worked previously. Specifically, local activities that start running, and continue running while their associated workflow was evicted from the cache, could possibly be "re-attached" to the workflow if it was recreated before they finished. This behavior was unsound. Now, any running local activities are invalidated when a workflow is evicted. This change was really only likely to be encountered if you were running with the workflow cache disabled, which we never recommend doing.

What's Changed

New Contributors

Core Changes

2026-04-28 - 0f2f1b4c - chore: feature cleanup (temporalio/sdk-rust#1236)
2026-04-28 - 6f7e7536 - Move Core-specific test utilities out of the Common crate (temporalio/sdk-rust#1237)
2026-04-29 - 21263fa1 - 💥 feat(sdk): failure converter + rich error types (temporalio/sdk-rust#1226)
2026-04-29 - 9747e978 - Update cloud-api protos to v0.14.0 (temporalio/sdk-rust#1240)
2026-04-29 - a9481aae - bump versions 0.4.0 (temporalio/sdk-rust#1241)
2026-04-30 - 87162f50 - chore: upgrade doc code to no_run (temporalio/sdk-rust#1242)
2026-05-01 - 3a6efc35 - Fix flaky shutdown test (temporalio/sdk-rust#1243)
2026-05-01 - 9d1bdf90 - fix(macros): drop anyhow dependency from workflow_methods expansion (temporalio/sdk-rust#1246)
2026-05-05 - a22517e4 - chore: remove unnecessary anyhow wrapping (temporalio/sdk-rust#1247)
2026-05-12 - c57f825f - Add grpc-status trailers to fake gRPC responses (temporalio/sdk-rust#1257)
2026-05-13 - 99d6b402 - chore: update readme to mention public preview (temporalio/sdk-rust#1262)
2026-05-14 - 2ed11c8e - Enforce minimum DNS resolution interval (temporalio/sdk-rust#1272)
2026-05-14 - 68665e50 - Bump windows test leg to 20 minutes (temporalio/sdk-rust#1270)
2026-05-14 - a0ad8769 - feat(dns): add DNS load balancer settings to C bridge (temporalio/sdk-rust#1267)
2026-05-14 - eac03fbc - Upgrade cloud-api to v0.15.0 (temporalio/sdk-rust#1253)
2026-05-15 - 3e6ca9ff - VLN-1346: fix missing-dependency-cooldown (temporalio/sdk-rust#1275)
2026-05-15 - 6d2045dd - Make TLS backend feature-selectable in sdk-core and client (temporalio/sdk-rust#1274)
2026-05-18 - 56a4737e - fix: retry transport-sourced Cancelled errors and count them in metrics (temporalio/sdk-rust#1269)
2026-05-18 - 72374ca1 - (CI) Disable caching cargo binaries (temporalio/sdk-rust#1278)
2026-05-18 - de25e0c8 - fix(sdk): no longer error on cancelling fired timer (temporalio/sdk-rust#1268)
2026-05-19 - 179d7608 - refactor(examples): extract saga compensation into a reusable Saga pattern (temporalio/sdk-rust#1279)
2026-05-19 - 68a9661f - build(deps): update ringbuf requirement from 0.4 to 0.5 (temporalio/sdk-rust#1285)
2026-05-19 - 6c4011d1 - Update README & add banner (temporalio/sdk-rust#1280)
2026-05-19 - d6cfb9c7 - build(deps): update lru requirement from 0.16 to 0.18 (temporalio/sdk-rust#1276)
2026-05-21 - 96e0be0f - Add uds support in channel creation (temporalio/sdk-rust#1288)
2026-05-21 - d58edd2d - Add activity execution interceptors (temporalio/sdk-rust#1277)
2026-05-26 - 3839fa94 - feat(client): support custom ServerCertVerifier in TlsOptions (temporalio/sdk-rust#1271)
2026-05-26 - 5aaabd10 - 💥 WASM Workflows (temporalio/sdk-rust#1239)
2026-05-26 - 5d9faa8d - chore(sdk): rename child_workflow -> start_child_workflow (https://github.com/temporalio/sdk-core/...

Read more

1.26.1

Choose a tag to compare

@yuandrew yuandrew released this 18 May 16:55
f2350cb

Fix for worker shutdown ordering

There was an issue with worker shutdown when the frontend.enableCancelWorkerPollsOnShutdown dynamic config flag is enabled on server. The issue was causing shutdown to stall until the full 30s worker shutdown timeout was hit, as server was waiting for a message that the SDK was not sending. This fixes the SDK to send the proper message, allowing shutdown to occur normally.

What's Changed

  • [backport 1.26.1] Update core to pickup shutdown fix by @yuandrew in #1527

Full Changelog: 1.26.0...1.26.1

1.25.1

Choose a tag to compare

@yuandrew yuandrew released this 18 May 16:10
72e0390

Fix for worker shutdown ordering

There was an issue with worker shutdown when the frontend.enableCancelWorkerPollsOnShutdown dynamic config flag is enabled on server. The issue was causing shutdown to stall until the full 30s worker shutdown timeout was hit, as server was waiting for a message that the SDK was not sending. This fixes the SDK to send the proper message, allowing shutdown to occur normally.

What's Changed

  • [backport 1.25.1] Update core to pickup shutdown fix by @yuandrew in #1526

Full Changelog: 1.25.0...1.25.1

1.24.2

Choose a tag to compare

@yuandrew yuandrew released this 15 May 19:17
6ee7066

Bug Fixes

  • Removed upper bound constraint on types-protobuf dependency (#1525). The previous ceiling (<5.29.1) could cause dependency conflicts for users on newer types-protobuf versions. The constraint now matches the protobuf range (>=3.20,<7.0.0).

What's Changed

Full Changelog: 1.24.1...1.24.2