1.32.0
Notable Changes
Added
-
Added
temporalio.converter.create_payload_validation_errorto create the
non-retryable application error used when a converted payload fails validation. -
Added experimental
temporalio.contrib.opentelemetry.ReplaySafeMeterProviderand
ReplaySafeLoggerProvider(and exportedReplaySafeTracerProvider): wrap an
OpenTelemetry provider so metrics and log events recorded from workflow code (e.g. by
Google ADK) are not duplicated on replay.GoogleAdkPluginwarns when a global OTel
provider is not replay-safe. -
Added
LoggingConfig.formatto select compact, pretty, or newline-delimited JSON output for
Core logs written to the console. -
Added the
Runtime(disable_environment_info=...)option to control whether
runtime, hosting, and platform information is included in worker heartbeats. -
temporalio.workflow.uuid7()generates a determinism-safe, time-sortable
UUIDv7 (RFC 9562) from workflow time and the workflow's deterministic random
generator, complementing the existingworkflow.uuid4()
(#1450). The
workflow sandbox now also restricts the non-deterministicuuid.uuid7()
added to the standard library in Python 3.14, matching the existing
uuid.uuid1()/uuid.uuid4()restrictions. -
Experimental:
TemporalOperationHandlercan now use Standalone Activities as asynchronous
Nexus Operation backing executions throughTemporalNexusClient.start_activity. -
Experimental:
temporalio.contrib.openai_agents.temporal_worker_env_refnames an environment
variable the worker reads for a hosted tool credential, keeping it out of workflow history. -
Experimental:
temporalio.contrib.openai_agents.TemporalWorkerEnvValuenames an environment
variable the worker reads for a sandbox environment value, keeping it out of workflow history. -
Experimental:
OpenAIAgentsPlugin(resolvable_worker_env_vars=...)allowlists the environment
variable names a worker will read. -
Experimental:
temporalio.contrib.openai_agents.AllowAllWorkerEnvVarsallowlists every
environment variable name on the worker.
Changed
- The
opentelemetryandlambda-worker-otelextras now require
opentelemetry-api/opentelemetry-sdk>= 1.26, matching what
temporalio.contrib.opentelemetryalready required in practice. temporalio.contrib.pydanticconverters now reuse Pydantic type adapters
for repeated type hints instead of rebuilding their schemas for every
payload, greatly speeding up decode of non-model hints such as discriminated
unions (#1695). Up
to 1024 type adapters are cached per converter instance by default, with
least-recently-used eviction. To change the bound, pass
max_cached_type_adapterstoPydanticPayloadConverter(or
PydanticJSONPlainPayloadConverter) from a nullary subclass used as the
DataConverter.payload_converter_class;Nonemakes the cache
unbounded and zero disables caching.- A data converter can now report that it understood a Nexus operation's input
but considers it invalid by raising a non-retryableApplicationErrorof type
PayloadValidationErrorwhile decoding it. Such a failure is reported to the
caller as aBAD_REQUESTNexus handler error with the message
Invalid operation input, retaining the original error as its cause. Raised
from a payload codec, that replaces a handler-sideINTERNALerror; raised
from a payload converter, the type was alreadyBAD_REQUESTand only the
message becomes specific to validation. Any other decode failure, and a
retryablePayloadValidationError, keep their existing treatment.
💥 Breaking Changes
- The
openai-agentsextra now requiresopenai-agents>=0.19.2,<0.20, up from>=0.17.5with no
upper bound. temporalio.contrib.openai_agentsnow rejects a sandboxSandboxPathGrantbound to a
host_path.temporalio.contrib.openai_agentsnow rejectsrun_config.sandbox.session.
Fixed
create_payload_validation_error(None)now creates an application error with no
details instead of encodingNoneas a detail.- Client header encoding no longer mutates interceptor-provided payloads, preventing
update-with-start from encoding a shared header twice when
HeaderCodecBehavior.CODECis enabled (#1769). temporalio.contrib.opentelemetryreplay-safe spans now delegate
Span.add_linkto the wrapped span. Previously the wrapper inherited
OpenTelemetry's non-abstract no-op default, silently dropping links added
after span creation.- Standalone activity start requests now include a unique request ID so RPC retries are deduplicated.
- OpenTelemetry trace and span IDs propagated by concurrent workers no longer
interfere with each other, preserving the correct parent-child hierarchy. - The
google-adkextra now depends onmcp, so fresh installs of
temporalio[google-adk]can importtemporalio.contrib.google_adk_agents
without separately installingmcp. Previously the import failed with an
ImportErrorbecausegoogle.adk.tools.mcp_toolonly exportsMcpToolset
whenmcpis installed. temporalio.contrib.openai_agentsno longer crashes when a plaindict
is passed forrun_config. (openai-agents >= 0.19.0 acceptsdictrun
configs at its public runner API)
SDK Core
Changelog
Added
- Core console logs can now be emitted as newline-delimited JSON when an SDK selects the JSON log
format. Configured log filters continue to apply to JSON output. - Worker heartbeats now report the SDK runtime, hosting environments, operating system, and
architecture once per worker, retrying until the first successful delivery. Runtime options can
disable the reporting. - Workers now log a
[TMPRL1104]warning when a workflow task takes longer than 5 seconds. Set
TEMPORAL_WORKFLOW_TASK_DURATION_WARN_SECONDSto change the threshold.
Breaking Changes 💥
- Activity failures now include the latest heartbeat details atomically instead of force-flushing a
throttled heartbeat first. Temporal Server 1.16.0 or newer is required to guarantee those details
are preserved on failure; workers warn when the server does not advertise support.
Fixed
- Workers no longer send worker heartbeats or appear in centralized heartbeat reports before they
begin polling. - Ephemeral server processes no longer leak on failed start.
- Local activity resolutions are now delivered to workflows as each activity completes instead of
waiting for every local activity in the workflow task. This allows sequences of short local
activities to make progress while a long-running local activity executes in parallel, while
preserving the resolution ordering recorded in existing histories during replay. - Try-cancel child workflows no longer cause nondeterminism when they complete or fail after their
cancellation was requested. - Nexus tasks are now timed out locally even when the server sends a
request-timeoutheader that
falls outside the Nexus duration grammar, such as a negative value for a task whose deadline has
already elapsed, a sub-millisecond unit, or a multi-unit value like1m30s. Previously such a
header was ignored entirely, so the handler was never told the task had timed out, and a task
left unanswered could block worker shutdown indefinitely.
What's Changed
- Automate release preparation by @tconley1428 in #1692
- Mark breaking change headers by @tconley1428 in #1694
- Fix flake in test_started_workflow_has_link_to_standalone_nexus_operation by @VegetarianOrc in #1696
- feat(extstore): Add support for Nexus task handling by @jmaeagle99 in #1676
- fix: revert testmodule proto gen to mypy-protobuf 3.3.0 format by @jmaeagle99 in #1699
- test: run integration suite against Cloud by @tconley1428 in #1687
- refactor: move workflow task duration logging to core by @jmaeagle99 in #1698
- chore: update uv lockfile by @tconley1428 in #1700
- test: unskip unfinished update handler cases on time-skipping server by @Sakshamm-Goyal in #1697
- Ensure unique workflow IDs in deployment config test by @VegetarianOrc in #1705
- Add pytest marker to skip nexus extstore tests by @VegetarianOrc in #1702
- Add SAA TemporalNexusOperation handling by @VegetarianOrc in #1689
- Bump OpenAI Agents failure-propagation test timeout by @THardy98 in #1711
- fix: preserve restricted proxies after in-place operations by @Sakshamm-Goyal in #1706
- revert: restore Python workflow task duration logging by @tconley1428 in #1720
- Forward MCP server config through GeminiTestServer.plugin() by @brianstrauch in #1721
- Updating Temporal API protos by @JoshuaFrenchwood in #1719
- fix(contrib): pool and idle-evict MCP connections in google_adk_agents by @wankhede04 in #1664
- Fix duplicate links for Nexus backing SAA by @VegetarianOrc in #1725
- Test Strands with unique task queues by @tconley1428 in #1729
- fix(contrib/pydantic): reuse TypeAdapters across payloads by @nathan-gage in #1703
- Fix race in nexus double start test by @VegetarianOrc in #1728
- Wait for deployment ramp propagation by @tconley1428 in #1730
- test: provision Cloud namespace per CI run by @tconley1428 in #1731
- test: tolerate trace start-run ordering by @tconley1428 in #1714
- Test LangSmith built-in query filtering by @tconley1428 in #1727
- [AI-163] google_adk_agents: support ToolContext session state in activity_tool by @DABH in #1683
- Add mcp dependency to google-adk extra by @DABH in #1736
- contrib/google_adk_agents: rename activity_tool to activity_as_tool by @DABH in #1735
- Accept dict run_config in openai_agents Temporal runner by @DABH in #1739
- docs: clarify AI contribution expectations by @tconley1428 in #1737
- [AI-250] Add Deep Agents plugin by @DABH in #1644
- chore: update sdk-core submodule to latest by @jmaeagle99 in #1738
- Add workflow.uuid7() by @ribhavjain in #1733
- docs: clarify OpenAI Agents tool execution by @jaeyoung0509 in #1741
- chore: update sdk-core submodule to latest by @jmaeagle99 in #1742
- Add missing changelog entry for Nexus invoked SAA by @VegetarianOrc in #1746
- Remove stale references to Python 3.9 by @mjameswh in #1740
- feat: expose runtime environment info option by @tconley1428 in #1747
- Fix OpenInference trace patch lifecycle by @tconley1428 in #1726
- Add SDK Core changelog release notes by @tconley1428 in #1744
- refactor: move workflow task duration logging to core by @jmaeagle99 in #1749
- feat: Add optional FIPS support- #466 by @christiandcucco in #1743
- Expose Core console log format by @Sushisource in #1750
- [SDK Sentinel] Fix concurrent OpenTelemetry ID seed isolation by @sdk-sentinel-bot in #1758
- test: support standalone activity cancellation status change by @tconley1428 in #1762
- Expose failure converter to system Nexus conversion by @VegetarianOrc in #1760
- AI-382: keep hosted tool credentials out of workflow history by @xumaple in #1752
- Report non-retryable PayloadValidationError as BAD_REQUEST by @bergundy in #1756
- Set request ID for SAA by @Quinn-With-Two-Ns in #1761
- Use target serialization context for system Nexus signal-with-start by @tconley1428 in #1672
- Fix the sandbox examples in the OpenAI Agents README by @brianstrauch in #1764
- [AI-383] Add replay-safe OpenTelemetry meter and logger providers by @DABH in #1710
- AI-382: keep sandbox credentials out of workflow history by @xumaple in #1745
- Move Nexus start workflow logic into the Nexus package. by @VegetarianOrc in #1765
- Add payload validation error factory by @bergundy in #1766
- Fix shared header encoding for update-with-start by @tconley1428 in #1770
- Omit null payload validation details by @bergundy in #1774
- Move Nexus workflow update and signal logic into the Nexus package. by @VegetarianOrc in #1771
- Decode system Nexus worker payloads by @VegetarianOrc in #1775
- Prepare release 1.32.0 by @tconley1428 in #1779
New Contributors
- @wankhede04 made their first contribution in #1664
- @nathan-gage made their first contribution in #1703
- @ribhavjain made their first contribution in #1733
- @jaeyoung0509 made their first contribution in #1741
- @christiandcucco made their first contribution in #1743
- @sdk-sentinel-bot made their first contribution in #1758
Full Changelog: 1.31.0...1.32.0