Skip to content

5.23.0 — 2026-10-31

← 5.22.0 | ↑ 5.x series

Added

Adapters - Temporal

  • Client Options - The Temporal client takes more of its settings from TEMPORAL config.
    • CONNECT_TIMEOUT bounds the TCP connection attempt, GRPC_COMPRESSION (gzip or none) controls gRPC compression (the SDK gzips by default since 1.29, which breaks proxies without gRPC compression), and PAYLOADS_WARN_SIZE / MEMO_WARN_SIZE set the payload and memo size warning limits
    • TLS_SERVER_NAME, TLS_VERIFICATION_SERVER_NAME and TLS_ENABLED add a server name override, a certificate-only name check that leaves SNI alone, and a TLS switch; the CA certificate alone now gives server-only TLS, and only a client certificate without its key (or the reverse) is rejected
    • METRICS_GLOBAL_TAGS adds tags to every SDK metric and SDK_CORE_LOG_LEVEL sets the log level of the SDK core
    • RUNTIME_DISABLE_ENVIRONMENT_INFO keeps runtime and hosting information out of worker heartbeats
    • TemporalAdapter and TemporalWorkerManager accept a data_converter and interceptors; client interceptors that also implement the worker interface apply to every worker the manager starts
  • Pydantic Payloads - Workflow and activity payloads use temporalio's Pydantic data converter by default (PYDANTIC_DATA_CONVERTER), so Pydantic models, datetimes and decimals round trip. Pass data_converter to add a payload codec for encryption or compression.
  • Worker Options - start_worker accepts tuner, activity_executor, deployment_config, workflow_failure_exception_types and workflow_runner; WORKER_POLLER_AUTOSCALING turns on poller autoscaling and WORKER_MAX_ACTIVITIES_PER_SECOND, WORKER_MAX_TASK_QUEUE_ACTIVITIES_PER_SECOND and WORKER_MAX_EAGER_ACTIVITY_RESERVATIONS set the rate limits and the eager reservations.
  • Workflow IDs - start_workflow and execute_workflow accept id_reuse_policy and id_conflict_policy, so a start can be idempotent with USE_EXISTING. Generated workflow and worker IDs are UUIDv7.
  • Workflow Listing - list_workflows takes a limit and the new iter_workflows pages through results without loading them all.
  • Schedules - Added pause_schedule, unpause_schedule, trigger_schedule, describe_schedule, update_schedule, list_schedules and delete_schedule; create_schedule accepts args and memo.
  • Domain Errors - Adapter calls raise ArchiPy errors instead of Temporal's: AlreadyExistsError (with the run_id and first_run_id of the running workflow), NotFoundError, UnavailableError, DeadlineExceededError, WorkerConnectionError and TemporalError.

Adapters - MinIO

  • S3 Checksums and CA Bundle - REQUEST_CHECKSUM_CALCULATION and RESPONSE_CHECKSUM_VALIDATION control the S3 checksums boto3 enables by default since 1.36 (older MinIO servers reject them), and CA_BUNDLE points to a CA bundle for certificate checks.

Adapters - PostgreSQL

  • Connect Timeout - POSTGRES_SQLALCHEMY.CONNECT_TIMEOUT bounds the connection attempt; without it libpq waits indefinitely.

Adapters - Elasticsearch

  • Retry Backoff - RETRY_BACKOFF_BASE and RETRY_BACKOFF_CAP add exponential backoff between retries; unset, the client keeps its own defaults.

Adapters - Parsian IPG

  • SOAP Timeout - PARSIAN_SHAPARAK.TIMEOUT (default 30 seconds) bounds every SOAP operation.

Helpers - OpenTelemetry

  • Replay-Safe Logs - Log events recorded from workflow code use ReplaySafeLoggerProvider, so replays no longer duplicate them.
  • Metric Cardinality Limit - OTEL.METRICS_CARDINALITY_LIMIT caps the attribute sets per instrument; the rest fold into the otel.metric.overflow series.

Changed

Adapters - Temporal

  • Activity Heartbeat Default - Behavior: ACTIVITY_HEARTBEAT_TIMEOUT defaults to None. The old 10 seconds failed every activity that does not heartbeat.
  • Workflow Timeouts - Behavior: WORKFLOW_RUN_TIMEOUT and WORKFLOW_EXECUTION_TIMEOUT default to unbounded instead of 60 and 300 seconds. A run timeout above the execution timeout is still rejected, but the task timeout no longer has to be below the run timeout. A timeout of 0 passed to a call means unbounded.
  • Workflow Retries - Behavior: the RETRY_* policy is no longer applied to whole workflows, because a workflow retry reruns it from the start. Set WORKFLOW_RETRY_ENABLED to bring it back.
  • Activity Errors - Behavior: BaseActivity no longer logs the error message, only its type, and an ArchiPy error with a 4xx HTTP status fails the activity without retries. Override _is_non_retryable to change the rule.
  • Worker Shutdown - stop lets the SDK enforce the graceful shutdown timeout, and shutdown_all_workers stops workers concurrently.
  • Sandboxed Config - BaseWorkflow reads the host process configuration inside the workflow sandbox, and its activity and child workflow helpers default to the workflow's own task queue instead of a configured one.
  • SDK Pin - temporalio is capped below 2.

Adapters - Kafka

  • Hostname Verification - Behavior: SSL connections verify the broker hostname. SSL_ENDPOINT_IDENTIFICATION_ALGORITHM defaults to https; set it to none for brokers whose certificates do not match their address, which logs a warning.
  • Producer Close - close closes the producer instead of only flushing it, which also aborts an open transaction.

Adapters - Vault

  • Session Settings - The TLS and timeout settings (CA_CERT_PATH, VERIFY_SSL, CONNECT_TIMEOUT, READ_TIMEOUT) are applied. hvac copied the session's own verify over them and used a fixed 30 second timeout.
  • Parameterised Requests - get_dynamic_credentials with parameters calls write_data, avoiding hvac's deprecated write(data=...).

Adapters - ScyllaDB

  • Execution Profile - Policies and the request timeout are set in the default execution profile instead of the deprecated legacy Cluster arguments.
  • Pool Settings - Behavior: MAX_CONNECTIONS_PER_HOST, MIN_CONNECTIONS_PER_HOST, CORE_CONNECTIONS_PER_HOST and MAX_REQUESTS_PER_CONNECTION were never applied, because scylla-driver has no per-host pool sizing. They stay, and a DeprecationWarning names those set to a non-default value.

Adapters - Keycloak

  • Async Token Validation - validate_token and get_token_info of the async adapter verify against every key of the realm's JWKS instead of one realm key, so they keep working after a key rotation, like the sync adapter.

Adapters - Parsian IPG

  • Proxy for WSDL - The proxy is also used to load the WSDL in async mode, where zeep's own client bypassed it.

Helpers - OpenTelemetry

  • Pushgateway Grouping Key - Behavior: the Pushgateway grouping key gets an instance label unless one is configured: POD_NAME, else HOSTNAME or the host name. Several replicas used to share one group and overwrite each other's metrics, and a shutdown deleted the shared group. A pod that crashes leaves its group behind; see the observability tutorial.
  • Logging Handler - Log records ship through the LoggingHandler of opentelemetry-instrumentation-logging, which the otel extra now installs. The SDK's own handler is deprecated since OpenTelemetry 1.40 and remains the fallback.

Adapters - Redis

  • Mock Protocol - The Redis mocks follow PROTOCOL, so their replies have the RESP3 shapes of a real client.

Models - Keycloak

  • Validation Settings - The Keycloak DTOs use validate_by_name and validate_by_alias instead of populate_by_name.

Adapters - Elasticsearch

  • Request Body - Search and index creation expand the request body into keyword arguments, avoiding the client's deprecation warning when both are passed.

Fixed

Adapters - SQLAlchemy

  • MySQL and StarRocks Error Codes - Database errors are classified by the MySQL error number before the SQLSTATE. pymysql 1.2 and asyncmy 0.2.14 attach a SQLSTATE to server errors, which made deadlocks serialization failures, lock timeouts connection errors and duplicate keys generic integrity errors.
  • StarRocks Connect Timeout - CONNECT_TIMEOUT is applied.
  • In-Memory SQLite - Connections of an in-memory database are no longer recycled, which discarded the database.
  • Async Extras - archipy-mysql[async], archipy-starrocks[async] and archipy-sqlite depend on sqlalchemy[asyncio], because SQLAlchemy 2.1 no longer installs greenlet.

Adapters - Temporal

  • Activity Cache Key - BaseActivity builds its cache key from a SHA-256 digest of the input. hash() is salted per process, so workers never shared a key.
  • Worker Failures - WorkerHandle tracks the worker run task: is_running turns False when it ends, and run_error holds the error that ended it.
  • Concurrent Clients - Concurrent first calls share one client.
  • Cancel Reason - cancel_workflow passes its reason.
  • Schedules - stop_schedule is deprecated for delete_schedule, because it deleted the schedule.
  • Atomic Activities - AtomicActivity.with_db_type returns a validated copy instead of raising NotImplementedError.
  • Runtime Errors - A Runtime that cannot be built raises ConfigurationError instead of silently dropping the SDK metrics.

Tests

Tests - Temporal

  • New Scenarios - Replaying recorded histories to catch non-determinism, long timers in a time-skipping environment (start_time_skipping_v2), the heartbeat default, client and worker interceptors, the Pydantic round trip, error mapping, schedule management and the new client and worker options.

Tests - Redis

  • Index Races - The aggregation, vector range and shard ratio searches retry until RediSearch has indexed the documents.

Tests - Keycloak

  • Key Rotation - An async adapter validates a token after the realm's signing key rotates.

Tests - Containers

  • testcontainers 4.15 - The containers come from testcontainers.community.* and wait for log lines through LogMessageWaitStrategy.

Chore

Chore - Docs

  • Documentation - Tutorials gained admonitions, sync and async tabs, cross-links to the BDD features, an extras reference, a Pydantic AI tutorial, scheduler, cache and health check tutorials, a deprecations page, and a section on running Pushgateway with several replicas.

Dependencies

  • Lower Bounds - Dependency lower bounds match uv.lock, including opentelemetry-* 1.45.2 / 0.66b2, temporalio 1.35.0, pydantic 2.14.2, grpcio 1.85.1 and cachetools 7.2.7.
  • Removed - pydantic-extra-types (not imported anywhere), types-requests and types-cachetools (both libraries ship their own types), and the unused pool extra of psycopg.
  • Added - opentelemetry-instrumentation-logging in the otel extra.
  • Test Images - Redis 8.10.3, Mailpit 1.33.0 and OpenTelemetry Collector 0.164.0.