Releases: scaleapi/scale-agentex-python
agentex-client: v0.13.0
0.13.0 (2026-06-10)
Full Changelog: agentex-client-v0.12.0...agentex-client-v0.13.0
⚠ BREAKING CHANGES
- packaging: release tag scheme changes from v* to -v*.
Features
- add AgentCard for self-describing agent capabilities (#296) (6509be1)
- add HTTP-proxy LangGraph checkpointer (19fae2f)
- add OCI Helm registry support for agent deployments (#255) (5f054b5)
- adk: allow all ClaudeAgentOptions in run_claude_agent_activity (25bbe24)
- adk: Revamp run_claude_agent_activity to use more streaming (#309) (0c16595)
- api: api update (7b1b642)
- api: api update (710c63f)
- api: api update (8abce2b)
- api: Switch target to -client (e741990)
- lib: Add task updates to adk (a58747f)
- openai_agents: expose real
usage,response_id, plumbprevious_response_id, opt-inprompt_cache_keyfor stateful responses and prompt caching (#335) (ba5d64b) - packaging: introduce slim agentex-client + heavy agentex-sdk split (bbfb22e)
- pass AGENTEX_DEPLOYMENT_ID in registration metadata (#305) (31af8c6)
- tracing: Add background queue for async span processing (#303) (3a60add)
Bug Fixes
- add litellm retry with exponential backoff for rate limit errors (ccdb24a)
- adk: fix to queue drain (#327) (a862a06)
- api: remove agent_id and task_id parameters from states update method (a7cbaae)
- client: preserve hardcoded query params when merging with user params (d2c4788)
- ensure file data are only sent as 1 parameter (48fae27)
- render .env.example template in agentex init (#351) (6092595)
- Temporal Union deserialization causing tool_response messages to be lost (79ef4dd)
- temporal: allowing-ACP-temporal-telemetry (9b44eb0)
- tests: repair test_streaming_model so all 28 tests run and pass (#334) (7e5e69c)
- tracing: Fix memory leak in SGP tracing processors (#302) (f43dac4)
- tutorials: stop at130-langgraph workflow deadlock on graph compile (#399) (bd90a61)
Performance Improvements
- client: optimize file structure copying in multipart requests (f5064f9)
- tracing: larger span batch + linger_ms for high-volume ingest (#397) (c0d6330)
- tracing: skip span-start upsert by default (end-only ingest) (#394) (ae1c7ca)
Chores
Documentation
- api: clarify name parameter behavior in agent task creation (ce5af72)
- clarify task name is optional in adk.acp.create_task (#392) (bd41d9b)
Refactors
agentex-sdk: 0.13.0
0.13.0 (2026-06-10)
Full Changelog: agentex-sdk-v0.12.0...agentex-sdk-v0.13.0
⚠ BREAKING CHANGES
- packaging: release tag scheme changes from v* to -v*.
Features
- packaging: introduce slim agentex-client + heavy agentex-sdk split (bbfb22e)
This pull request is managed by Stainless's GitHub App.
The semver version number is based on included commit messages. Alternatively, you can manually set the version number in the title of this pull request.
For a better experience, it is recommended to use either rebase-merge or squash-merge when merging this pull request.
🔗 Stainless website
📚 Read the docs
🙋 Reach out for help or questions
Greptile Summary
This release (v0.13.0) introduces two major structural changes: a slim/heavy package split (agentex-client for the pure REST client, agentex-sdk for the full ADK overlay) and a config module promotion that moves canonical deployment/agent config models from agentex.lib.sdk.config.* / agentex.lib.types.* into the new agentex.config.* namespace, with back-compat re-export shims keeping old import paths working.
- Package split:
pyproject.tomlbecomesagentex-client(6 slim deps); the newadk/pyproject.tomlbecomesagentex-sdkwith all ADK/CLI/LLM deps, pinningagentex-client>=0.12.0. Ascripts/check-slim-depsCI guard prevents dep drift. - Config promotion: All model classes are now in
agentex.config.*; shims in the old paths re-export the identical class objects soisinstancechecks remain correct across import styles.AgentEnvironmentsConfig.from_yaml()is replaced by the standaloneload_environments_config()helper (kept in the shim module to preserve slim-safety). - Tracing optimisations: span-start writes are skipped by default (end-only ingest via
AGENTEX_TRACING_SKIP_SPAN_START), and the span-queue batch size / linger window are both increased for higher throughput. A tutorial deadlock caused by using LangGraph'sToolNode(aRunnable) inside a Temporal-wrapped workflow node is also fixed.
Confidence Score: 5/5
Safe to merge — all changes are well-tested, breaking changes are documented in the CHANGELOG, and the back-compat shims are covered by identity-checking tests.
The package split and config promotion are structural refactors with comprehensive shim tests confirming symbol parity and class identity. Tracing optimisations default to the new behaviour but are runtime-toggleab...
v0.12.0
0.12.0 (2026-06-02)
Full Changelog: v0.11.9...v0.12.0
Features
- api: Bump edition to switch rye -> UV (1bd4ff7)
Bug Fixes
This pull request is managed by Stainless's GitHub App.
The semver version number is based on included commit messages. Alternatively, you can manually set the version number in the title of this pull request.
For a better experience, it is recommended to use either rebase-merge or squash-merge when merging this pull request.
🔗 Stainless website
📚 Read the docs
🙋 Reach out for help or questions
Greptile Summary
This is the automated 0.12.0 release PR, primarily migrating the entire dev toolchain from rye to uv 0.10.2 and bumping the version consistently across pyproject.toml, _version.py, and the release manifest.
- All CI jobs (lint, build, test), the publish workflow, the devcontainer, and helper scripts (
bootstrap,test,lint,format,publish-pypi) are updated to useuvcommands; the uv version is uniformly pinned to0.10.2. - The devcontainer base Python image is upgraded from 3.9 → 3.12, aligning with the new test matrix minimum.
- Lock files (
uv.lock,requirements-dev.lock,requirements.lock) are regenerated to reflect the new toolchain.
Confidence Score: 5/5
Safe to merge — this is a clean tooling migration with the uv version pinned consistently at 0.10.2 across CI, the publish workflow, and the devcontainer.
The rye-to-uv migration is internally consistent: all three CI jobs, the publish workflow, and the devcontainer use the same uv 0.10.2 binary. The version bump is coherent across all version-bearing files. The two observations (broad required-version floor and the 3.11 test-coverage gap) are non-blocking quality notes that don't affect runtime correctness of the published package.
No files require special attention; scripts/test and pyproject.toml have a minor declared-vs-tested Python version gap worth cleaning up at leisure.
Important Files Changed
| Filename | Overview |
|---|---|
| .github/workflows/ci.yml | Migrated all three jobs (lint, build, test) from rye to uv 0.10.2 via astral-sh/setup-uv; version is consistent across all jobs. |
| .github/workflows/publish-pypi.yml | Updated from rye to uv 0.10.2, now consistent with CI; previous version mismatch (0.9.13 vs 0.10.2) has been resolved. |
| pyproject.toml | Bumped to 0.12.0, migrated build tooling config to uv; requires-python declares 3.11+ but test matrix only covers 3.12-3.13. |
| scripts/test | Migrated from rye to uv; test matrix now runs 3.12 and 3.13 only, leaving Python 3.11 (declared supported) untested. |
| scripts/bootstrap | Replaced rye sync with uv python install + uv sync + uv export for lock file generation. |
| .devcontainer/Dockerfile | Upgraded base Python from 3.9 to 3.12 and replaced rye install with uv 0.10.2 copied from the official image. |
| src/agentex/_version.py | Version bumped to 0.12.0, consistent with pyproject.toml and .release-please-manifest.json. |
| bin/publish-pypi | Replaced rye build/publish commands with uv build + uv publish. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Push / PR] --> B[CI: lint job]
A --> C[CI: build job]
A --> D[CI: test job]
B --> B1["uv 0.10.2 install\nuv sync --all-extras\n./scripts/lint"]
C --> C1["uv 0.10.2 install\nuv sync --all-extras\nuv build"]
D --> D1["uv 0.10.2 install\n./scripts/bootstrap\n./scripts/test"]
D1 --> D2["Python 3.12 run\n(PY_VERSION_MIN)"]
D1 --> D3["Python 3.13 run\n(PY_VERSION_MAX)"]
E[GitHub Release] --> F[publish-pypi workflow]
F --> F1["uv 0.10.2 install\nbin/publish-pypi"]
F1 --> F2["uv build\nuv publish → PyPI"]v0.11.9
0.11.9 (2026-06-02)
Full Changelog: v0.11.8...v0.11.9
Features
- api: add register build api endpoint (30c5da4)
v0.11.8
0.11.8 (2026-06-01)
Full Changelog: v0.11.7...v0.11.8
Features
- cli: add Temporal + LangGraph agent template and example (#383) (bbc9e02)
- tracing: OTel span queue and export telemetry (SGPINF-1863) (#373) (6669012)
This pull request is managed by Stainless's GitHub App.
The semver version number is based on included commit messages. Alternatively, you can manually set the version number in the title of this pull request.
For a better experience, it is recommended to use either rebase-merge or squash-merge when merging this pull request.
🔗 Stainless website
📚 Read the docs
🙋 Reach out for help or questions
Greptile Summary
This release (0.11.8) ships two features: a new Temporal + LangGraph agent template/example, and OTel span queue + export telemetry instrumentation.
- Temporal + LangGraph template: Adds a full CLI template (
temporal-langgraph) and a matching tutorial example. The template includes human-in-the-loop interrupt handling via Temporal signals, live introspection queries, and per-turn SGP tracing (correctly guarded bySGP_API_KEY/SGP_ACCOUNT_ID). A newemit_langgraph_messagesADK helper converts LangGraph message objects to Agentex content types. - OTel span queue telemetry: Adds
tracing_metrics.py(instrument definitions) andtracing_metrics_recording.py(best-effort recording helpers) with bounded tag cardinality throughout. The recording path is disabled viaAGENTEX_TRACING_METRICS=0and swallows all exceptions so it is safe on hot paths.enqueued_attimestamps are correctly preserved through re-enqueues for accurate lag histograms.
Confidence Score: 5/5
Safe to merge — changes are additive, all tag values are bounded, and the recording helpers are exception-safe on hot paths.
Both features are purely additive. The tracing metrics are well-isolated behind a feature flag and best-effort exception handling. The LangGraph template correctly guards credential-dependent setup. No behavioral regressions are introduced in existing code paths.
src/agentex/lib/core/tracing/span_queue.py — the retry path silently re-enqueues failed items without emitting a failure metric, making transient errors invisible until retries are exhausted.
Important Files Changed
| Filename | Overview |
|---|---|
| src/agentex/lib/core/tracing/span_queue.py | Adds OTel instrumentation across enqueue, batch-drain, and shutdown paths. enqueued_at timestamp is correctly preserved through re-enqueues. record_export_failure is only called for permanently-dropped spans (exhausted retries or non-retriable errors), leaving transient failures unobservable in metrics. |
| src/agentex/lib/core/observability/tracing_metrics.py | New file: defines the OTel instrument set for span queue + export telemetry. All tag cardinalities are explicitly bounded. Singleton is created lazily via get_tracing_metrics(). |
| src/agentex/lib/core/observability/tracing_metrics_recording.py | New file: best-effort recording helpers that lazy-load the OTel SDK module. AGENTEX_TRACING_METRICS=0 disables all recording. All helpers silently swallow exceptions. |
| src/agentex/lib/core/tracing/processors/sgp_tracing_processor.py | Adds record_export_success calls after successful upsert_batch on both on_spans_start and on_spans_end. |
| src/agentex/lib/adk/_modules/_langgraph_messages.py | New helper converting LangGraph/LangChain message objects to Agentex content types after ainvoke. Handles both OpenAI and Anthropic content block formats. |
| src/agentex/lib/cli/templates/temporal-langgraph/project/workflow.py.j2 | Full-featured Temporal+LangGraph template with human-in-the-loop, live queries, and properly guarded tracing setup. |
| examples/tutorials/10_async/10_temporal/130_langgraph/project/workflow.py | Simplified example workflow with durable multi-turn state kept on the workflow instance. |
| tests/lib/core/tracing/test_span_queue.py | New TestAsyncSpanQueueMetrics suite covering enqueue, drop, failure, and disabled-metrics fast-path scenarios. |
Sequence Diagram
sequenceDiagram
participant Caller
participant AsyncSpanQueue
participant Metrics as tracing_metrics_recording
participant Processor as SGPAsyncTracingProcessor
participant SGP as SGP HTTP API
Caller->>AsyncSpanQueue: enqueue(event_type, span, processors)
AsyncSpanQueue->>Metrics: record_span_enqueued(event_type)
Note over AsyncSpanQueue: stores enqueued_at timestamp
AsyncSpanQueue->>AsyncSpanQueue: drain loop (linger_ms)
AsyncSpanQueue->>Metrics: record_batch_coalesced(queue_depth, batch_items)
AsyncSpanQueue->>Processor: on_spans_start / on_spans_end
Processor->>SGP: upsert_batch(...)
alt HTTP success
SGP-->>Processor: 200 OK
Processor->>Metrics: record_export_success(event_type, span_count, sgp)
else Retriable failure (retries remaining)
SGP-->>Processor: 5xx / network error
Processor-->>AsyncSpanQueue: raises exception
Note over AsyncSpanQueue: re-enqueues item, no metric emitted
else Retries exhausted
AsyncSpanQueue->>Metrics: record_export_failure(exhausted_count)
else Permanent non-retriable failure
AsyncSpanQueue->>Metrics: record_export_failure(all items)
end
AsyncSpanQueue->>Metrics: record_batch_phase(phase, size, duration_ms)
Note over AsyncSpanQueue: on shutdown timeout
AsyncSpanQueue->>Metrics: record_shutdown_timeout(remaining_items)v0.11.7
v0.11.6
0.11.6 (2026-05-29)
Full Changelog: v0.11.5...v0.11.6
Features
- api: add cleaned_at field to task response types (38ed338)
- deps: bump openai-agents to >=0.14.3 for scale-sandbox oai_agents adapter (#375) (e1b31d9)
- lib: expose data_converter kwarg on AgentexWorker and Temporal client APIs (#372) (d04624e)
Bug Fixes
Performance Improvements
Chores
- back-merge release 0.11.5 into next (#381) (ab5a7d9)
- deps: drop unused runtime deps and exclude tests from wheel (#367) (f4303d1)
Refactors
v0.11.5
0.11.5 (2026-05-29)
Full Changelog: v0.11.4...v0.11.5
Features
- api: add cleaned_at field to task response types (38ed338)
- deps: bump openai-agents to >=0.14.3 for scale-sandbox oai_agents adapter (#375) (e1b31d9)
Performance Improvements
Chores
Refactors
v0.11.4
v0.11.3
0.11.3 (2026-05-20)
Full Changelog: v0.11.2...v0.11.3
Features
- added Pydantic AI sync, async, temporal integration (#359) (781dfe1)
- api: add schedule, checkpoints, and deployment endpoints (53b5c36)
Bug Fixes
This pull request is managed by Stainless's GitHub App.
The semver version number is based on included commit messages. Alternatively, you can manually set the version number in the title of this pull request.
For a better experience, it is recommended to use either rebase-merge or squash-merge when merging this pull request.
🔗 Stainless website
📚 Read the docs
🙋 Reach out for help or questions
Greptile Summary
This release (0.11.3) adds Pydantic AI integration for sync, async, and Temporal agent workflows, new API endpoints for agent schedules, deployments, and checkpoints, and a fix to the CoalescingBuffer shutdown sequence that eliminated duplicate-tail streaming events on the UI.
- Pydantic AI ADK modules: Three new modules (
_pydantic_ai_sync.py,_pydantic_ai_async.py,_pydantic_ai_tracing.py) map pydantic-ai event streams to Agentex streaming events, matching the existing LangGraph convention. Tracing handler uses deterministic span IDs derived from(trace_id, tool_call_id)to support Temporal activity boundaries. - New API resources:
CheckpointsResource,DeploymentsResource, andSchedulesResourceare fully generated from the OpenAPI spec and follow the established Stainless SDK patterns. CoalescingBufferfix: Replaces task cancellation with graceful natural-exit shutdown (while True+if self._closed: returnat loop bottom) to prevent duplicate Redis publishes caused by re-enqueueing items whose writes had already completed before theCancelledErrorwas raised.
Confidence Score: 5/5
Safe to merge — all changes are additive new features or targeted bug fixes with no modifications to existing behaviour for current users.
The pydantic-ai modules are self-contained additions that do not touch existing code paths; the generated SDK resources follow the established Stainless patterns with no structural deviations; and the CoalescingBuffer fix is a well-motivated, well-documented improvement to the streaming shutdown sequence. The only trade-off introduced (no timeout on _on_flush in close()) is acceptable provided the underlying Redis client carries its own timeouts.
src/agentex/lib/core/services/adk/streaming.py — the CoalescingBuffer shutdown change is the most behaviour-sensitive modification in the PR and warrants a second set of eyes on the Redis client timeout configuration.
Important Files Changed
| Filename | Overview |
|---|---|
| src/agentex/lib/adk/_modules/_pydantic_ai_async.py | New async streaming helper that pushes Pydantic AI events to Redis. Solid logic; stream parameter is untyped (intentional for lazy imports) and TextContent is imported from a different path than the sync sibling. |
| src/agentex/lib/adk/_modules/_pydantic_ai_sync.py | New async-generator sync helper that converts pydantic-ai events to Agentex StreamTaskMessage* events. Event mapping is thorough and the tracing integration is correct. |
| src/agentex/lib/adk/_modules/_pydantic_ai_tracing.py | Tracing handler for pydantic-ai tool calls. Clever use of deterministic UUIDv5 span IDs for Temporal activity-boundary resilience. |
| src/agentex/lib/core/services/adk/streaming.py | CoalescingBuffer shutdown refactored from cancel-and-requeue to graceful natural-exit. Fix is correct and eliminates duplicate-tail publishing; trade-off is that a permanently blocking _on_flush will now hang close() indefinitely. |
| src/agentex/resources/agents/schedules.py | Generated SDK resource for agent schedules (CRUD + pause/unpause/trigger). Follows established Stainless patterns; path params correctly excluded from body transforms. |
| src/agentex/resources/agents/deployments.py | Generated SDK resource for agent deployments. All CRUD + preview_rpc + promote endpoints look correct. |
| src/agentex/resources/checkpoints.py | Generated checkpoint resource for LangGraph-style thread checkpointing. list/get-tuple/put/put-writes/delete-thread all follow the established pattern. |
| examples/tutorials/10_async/00_base/110_pydantic_ai/project/acp.py | Example async ACP handler demonstrating correct multi-turn memory persistence and tracing integration with the new pydantic-ai helpers. |
Sequence Diagram
sequenceDiagram
participant Agent as Pydantic AI Agent
participant Helper as stream_pydantic_ai_events / convert_pydantic_ai_to_agentex_events
participant Redis as CoalescingBuffer / Redis
participant Agentex as Agentex API
Agent->>Helper: PartStartEvent(TextPart)
Helper->>Agentex: "messages.create (streaming_status=IN_PROGRESS)"
Helper->>Redis: StreamTaskMessageStart
Agent->>Helper: PartDeltaEvent(TextPartDelta)
Helper->>Redis: StreamTaskMessageDelta (buffered/coalesced)
Agent->>Helper: PartEndEvent
Helper->>Redis: CoalescingBuffer.close() final flush
Helper->>Redis: StreamTaskMessageDone
Helper->>Agentex: messages.update (final content)
Agent->>Helper: PartStartEvent(ToolCallPart)
Note over Helper: Accumulates args until PartEndEvent
Agent->>Helper: PartEndEvent(ToolCallPart)
Helper->>Agentex: messages.create (ToolRequestContent, full args)
Helper->>Agentex: spans.create (tracing_handler.on_tool_start)
Agent->>Helper: FunctionToolResultEvent
Helper->>Agentex: messages.create (ToolResponseContent)
Helper->>Agentex: spans.update (tracing_handler.on_tool_end)v0.11.2
0.11.2 (2026-05-13)
Full Changelog: v0.11.1...v0.11.2
Bug Fixes
This pull request is managed by Stainless's GitHub App.
The semver version number is based on included commit messages. Alternatively, you can manually set the version number in the title of this pull request.
For a better experience, it is recommended to use either rebase-merge or squash-merge when merging this pull request.
🔗 Stainless website
📚 Read the docs
🙋 Reach out for help or questions
Greptile Summary
This release (v0.11.2) fixes a message-ordering bug by stamping agent messages with workflow.now() when created inside a Temporal workflow, ensuring monotonically increasing created_at values even when two messages.create calls are awaited in quick succession from the same workflow turn. The created_at is captured at the workflow layer before activity dispatch and threaded through the entire stack — activity params, services, streaming contexts, and the SDK client — using an omit sentinel when no explicit timestamp is needed.
Confidence Score: 4/5
Safe to merge — only P2 findings, no logic errors or security concerns.
The core bug fix is well-structured and correctly captures workflow.now() at the workflow layer before activity dispatch. The _make_created_at_dispenser pattern in openai.py correctly limits the workflow timestamp to the first message per turn. Tests adequately cover the new behaviour. The only concern is the asyncio.sleep(1) in the integration test, which is a P2 style issue.
examples/tutorials/10_async/00_base/010_multiturn/tests/test_agent.py — brittle sleep-based synchronization worth revisiting.
Important Files Changed
| Filename | Overview |
|---|---|
| src/agentex/lib/utils/temporal.py | Adds workflow_now_if_in_workflow() — returns deterministic workflow.now() inside a Temporal workflow, None otherwise. Clean implementation. |
| src/agentex/lib/adk/_modules/messages.py | Auto-injects workflow_now_if_in_workflow() as created_at default in create() and create_batch(), threading the timestamp through both the activity-dispatch and direct-service paths. |
| src/agentex/lib/core/services/adk/providers/openai.py | Introduces _make_created_at_dispenser to stamp only the first streaming context opened per turn with the workflow timestamp; subsequent messages fall back to server wall-clock. Implementation is correct and well-commented. |
| src/agentex/lib/core/services/adk/streaming.py | Propagates created_at through StreamingTaskMessageContext and uses omit sentinel when None to let the server apply its own clock. Mostly formatting-only changes otherwise. |
| src/agentex/lib/core/temporal/activities/adk/messages_activities.py | Adds `created_at: datetime |
| examples/tutorials/10_async/00_base/010_multiturn/tests/test_agent.py | Adds asyncio.sleep(1) to work around a race between task creation and state initialization; brittle in slow CI environments. |
| tests/lib/adk/test_messages_module.py | New tests covering workflow/non-workflow created_at injection for MessagesModule.create and create_batch. Patch targets are correct. |
| tests/lib/adk/test_messages_service.py | Tests forwarding of created_at to SDK client and omit sentinel when None. Covers both single-message and batch paths. |
Sequence Diagram
sequenceDiagram
participant WF as Temporal Workflow
participant Mod as MessagesModule / LiteLLMModule / OpenAIModule
participant Act as Temporal Activity
participant Svc as MessagesService / OpenAIService
participant SDK as AgentEx SDK Client
WF->>Mod: messages.create(task_id, content)
Note over Mod: created_at = workflow_now_if_in_workflow()<br/>(captures deterministic workflow clock)
Mod->>Act: "execute_activity(CreateMessageParams{created_at})"
Note over Act: Runs outside workflow context
Act->>Svc: create_message(task_id, content, created_at)
Svc->>SDK: "messages.create(task_id, content, created_at=ts OR omit)"
SDK-->>Svc: TaskMessage
Svc-->>Act: TaskMessage
Act-->>Mod: TaskMessage
Mod-->>WF: TaskMessagePrompt To Fix All With AI
Fix the following 1 code review issue. Work through them one at a time, proposing concise fixes.