Skip to content

Commit 2b7649c

Browse files
stainless-app[bot]NiteshDhanpalclaudedeclan-scale
authored
chore: release main (#464)
Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com> Co-authored-by: Nitesh Dhanpal <NiteshDhanpal@users.noreply.github.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: Declan Brady <declan.brady@scale.com>
1 parent 77a1316 commit 2b7649c

32 files changed

Lines changed: 415 additions & 30 deletions

.github/workflows/ci.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ jobs:
1818
lint:
1919
timeout-minutes: 10
2020
name: lint
21-
runs-on: ${{ github.repository == 'stainless-sdks/agentex-sdk-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
21+
runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
2222
if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')
2323
steps:
2424
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -44,7 +44,7 @@ jobs:
4444
permissions:
4545
contents: read
4646
id-token: write
47-
runs-on: ${{ github.repository == 'stainless-sdks/agentex-sdk-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
47+
runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
4848
steps:
4949
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
5050

@@ -87,7 +87,7 @@ jobs:
8787
test:
8888
timeout-minutes: 10
8989
name: test
90-
runs-on: ${{ github.repository == 'stainless-sdks/agentex-sdk-python' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
90+
runs-on: ${{ startsWith(github.repository, 'stainless-sdks/') && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
9191
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
9292
steps:
9393
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

.release-please-manifest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
".": "0.20.0",
3-
"adk": "0.20.0"
2+
".": "0.21.0",
3+
"adk": "0.21.0"
44
}

.stats.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 75
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sgp/agentex-sdk-b2df5f506330ad5fba5a0d518ab8a4bcf876e8c3684a4fe0d0cc5102fd9c569e.yml
3-
openapi_spec_hash: 132e9efdb0535d9594abadf799431cf5
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sgp/agentex-sdk-644a4ec06aa1f055c614cbef3379684819a4edd84eeb20d2fb29ae01663622a3.yml
3+
openapi_spec_hash: a6a4dc0c09691ac9783bf38e9653a464
44
config_hash: 593e89b291976a5e84e4c3c3f8324354

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,21 @@
1212

1313
* **tracing:** emit OTel metrics for async span queue depth, batch drain, and SGP export success/failure (HTTP status labels). Disable SDK-side recording with ``AGENTEX_TRACING_METRICS=0``.
1414

15+
## 0.21.0 (2026-07-28)
16+
17+
Full Changelog: [agentex-client-v0.20.0...agentex-client-v0.21.0](https://github.com/scaleapi/scale-agentex-python/compare/agentex-client-v0.20.0...agentex-client-v0.21.0)
18+
19+
### Features
20+
21+
* **api:** add include_live parameter to schedules list method ([199fd6a](https://github.com/scaleapi/scale-agentex-python/commit/199fd6a633bc82626a4629ee1ac52a40e6f10271))
22+
* **codex:** republish todo_list revisions as they are ticked off ([#473](https://github.com/scaleapi/scale-agentex-python/issues/473)) ([0252fcc](https://github.com/scaleapi/scale-agentex-python/commit/0252fcc1d00c96066e4500d09b07a6b0da836437))
23+
* **stlc:** configurable CI runner and private-production-repo support in workflow templates ([23c1b6b](https://github.com/scaleapi/scale-agentex-python/commit/23c1b6b8dc60f16c5e19a1aab68d244d286caffc))
24+
25+
26+
### Bug Fixes
27+
28+
* **api:** remove params field from task list response ([152bc75](https://github.com/scaleapi/scale-agentex-python/commit/152bc75b242c2ff4179e0cfac0f33edbc6bcae38))
29+
1530
## 0.20.0 (2026-07-16)
1631

1732
Full Changelog: [agentex-client-v0.19.0...agentex-client-v0.20.0](https://github.com/scaleapi/scale-agentex-python/compare/agentex-client-v0.19.0...agentex-client-v0.20.0)

adk/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

3+
## 0.21.0 (2026-07-28)
4+
5+
Full Changelog: [agentex-sdk-v0.20.0...agentex-sdk-v0.21.0](https://github.com/scaleapi/scale-agentex-python/compare/agentex-sdk-v0.20.0...agentex-sdk-v0.21.0)
6+
7+
### Chores
8+
9+
* **agentex-sdk:** Synchronize agentex versions
10+
311
## 0.20.0 (2026-07-16)
412

513
Full Changelog: [agentex-sdk-v0.19.0...agentex-sdk-v0.20.0](https://github.com/scaleapi/scale-agentex-python/compare/agentex-sdk-v0.19.0...agentex-sdk-v0.20.0)

adk/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# (agentex/{__init__.py, _*.py, types/, resources/}) ships from the slim
55
# sibling package `agentex-client` which is pinned as a runtime dep.
66
name = "agentex-sdk"
7-
version = "0.20.0"
7+
version = "0.21.0"
88
description = "Agent Development Kit (ADK) overlay for the Agentex API — FastACP server, Temporal workflows, LLM provider integrations, observability"
99
license = "Apache-2.0"
1010
authors = [

examples/tutorials/10_async/10_temporal/020_state_machine/project/workflows/deep_research/performing_deep_research.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,28 @@
1313

1414
logger = make_logger(__name__)
1515

16+
# These reference MCP servers still import the mcp 1.x API (``McpError``), which
17+
# mcp 2.0.0 renamed to ``MCPError``. uvx gives each server its own isolated env and
18+
# resolves ``mcp`` unpinned there, ignoring the version this project pins, so without
19+
# this constraint every server dies at import and the agent silently makes zero tool
20+
# calls. Drop the pin once the servers support mcp 2.x.
21+
_MCP_PIN = ["--with", "mcp<2"]
22+
1623
MCP_SERVERS = [
1724
StdioServerParameters(
1825
command="uvx",
19-
args=["mcp-server-time", "--local-timezone", "America/Los_Angeles"],
26+
args=[*_MCP_PIN, "mcp-server-time", "--local-timezone", "America/Los_Angeles"],
2027
),
2128
StdioServerParameters(
2229
command="uvx",
23-
args=["openai-websearch-mcp"],
30+
args=[*_MCP_PIN, "openai-websearch-mcp"],
2431
env={
2532
"OPENAI_API_KEY": os.environ.get("OPENAI_API_KEY", "")
2633
}
2734
),
2835
StdioServerParameters(
2936
command="uvx",
30-
args=["mcp-server-fetch"],
37+
args=[*_MCP_PIN, "mcp-server-fetch"],
3138
),
3239
]
3340

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# overlay (formerly `src/agentex/lib/*`) now lives in `adk/` and ships
44
# as the sibling `agentex-sdk` package — see `adk/pyproject.toml`.
55
name = "agentex-client"
6-
version = "0.20.0"
6+
version = "0.21.0"
77
description = "The official Python REST client for the Agentex API"
88
dynamic = ["readme"]
99
license = "Apache-2.0"

src/agentex/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
22

33
__title__ = "agentex"
4-
__version__ = "0.20.0" # x-release-please-version
4+
__version__ = "0.21.0" # x-release-please-version

src/agentex/lib/adk/_modules/_codex_sync.py

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,13 @@
6060
a synthetic ToolRequestContent Full is emitted before the response.
6161
mcp_tool_call -> same as command_execution
6262
web_search -> same as command_execution
63-
todo_list -> same as command_execution
63+
todo_list -> same as command_execution, plus:
64+
item.updated -> StreamTaskMessageFull(ToolResponseContent)
65+
Codex ticks one in-place todo_list item through
66+
item.updated; each revision is republished under
67+
the same tool_call_id so consumers can render the
68+
checklist filling in rather than jumping to its
69+
final state at end of turn.
6470
collab_tool_call -> same as command_execution
6571
error (item type) -> StreamTaskMessageFull(TextContent, error text) on completed only
6672
@@ -75,9 +81,10 @@
7581
without this module needing to know about spans.
7682
item.updated (reasoning): the intermediate cumulative text is discarded;
7783
only item.completed carries the final text.
78-
item.updated (tool): tool item types other than agent_message do not
79-
emit updates; item.started opens the request and
80-
item.completed closes it.
84+
item.updated (tool): only todo_list is republished (see above). For the
85+
other tool item types item.started opens the request
86+
and item.completed closes it; any updates in between
87+
carry no state a consumer could act on.
8188
"""
8289

8390
from __future__ import annotations
@@ -112,6 +119,11 @@ def _truncate(text: str, max_len: int = _MAX_RESULT_LENGTH) -> str:
112119
return str(text)[:max_len]
113120

114121

122+
# Tool items codex revises in place rather than reopening. Their item.updated
123+
# events carry real intermediate state, so they are forwarded as responses.
124+
_PROGRESSIVE_TOOL_ITEMS = frozenset({"todo_list"})
125+
126+
115127
def _tool_name_for(item_type: str, payload: dict[str, Any]) -> str:
116128
"""Derive a canonical tool name from a codex item type."""
117129
if item_type == "command_execution":
@@ -467,6 +479,33 @@ def _handle_item(self, evt_type: str, item: dict[str, Any]) -> list[StreamTaskMe
467479
)
468480
out.append(StreamTaskMessageDone(type="done", index=req_idx))
469481

482+
elif evt_type == "item.updated" and item_type in _PROGRESSIVE_TOOL_ITEMS:
483+
# Codex revises its plan in place: one todo_list item is opened
484+
# at the start of the turn and ticked off through item.updated,
485+
# with item.completed only arriving at the very end. Forwarding
486+
# each revision as a response for the SAME tool_call_id lets a
487+
# consumer show the checklist filling in as the turn runs; the
488+
# last response received is the current state.
489+
if item_id in self._tool_open:
490+
actual_type = self._tool_item_types.get(item_id, item_type)
491+
result_text, is_error = _tool_output_for(actual_type, item)
492+
resp_content: dict[str, Any] = {"result": result_text}
493+
if is_error:
494+
resp_content["is_error"] = True
495+
out.append(
496+
StreamTaskMessageFull(
497+
type="full",
498+
index=self._alloc(),
499+
content=ToolResponseContent(
500+
type="tool_response",
501+
author="agent",
502+
tool_call_id=tool_call_id,
503+
name=_tool_name_for(actual_type, item),
504+
content=resp_content,
505+
),
506+
)
507+
)
508+
470509
elif evt_type == "item.completed":
471510
# file_change items may only emit item.completed (no started).
472511
if item_id not in self._tool_open:

0 commit comments

Comments
 (0)