Skip to content

chore: release main#411

Merged
stainless-app[bot] merged 25 commits into
mainfrom
release-please--branches--main--changes--next
Jun 22, 2026
Merged

chore: release main#411
stainless-app[bot] merged 25 commits into
mainfrom
release-please--branches--main--changes--next

Conversation

@stainless-app

@stainless-app stainless-app Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

✨ Stainless prepared a new release

agentex-client: 0.14.0

0.14.0 (2026-06-22)

Full Changelog: agentex-client-v0.13.1...agentex-client-v0.14.0

Features

  • api: add is error to tools (8ddd960)
  • compat: runtime SDK↔backend version guard at ACP startup (#408) (433c999)

Bug Fixes

  • types: add missing Optional import to ToolResponseContent (3439f6e)
agentex-sdk: 0.13.2

0.13.2 (2026-06-22)

Full Changelog: agentex-sdk-v0.13.1...agentex-sdk-v0.13.2


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 (agentex-client 0.14.0, agentex-sdk 0.13.2) introduces a runtime SDK↔backend version guard that fails fast at startup when the backend is older than the SDK's minimum supported contract, and adds an is_error field to ToolResponseContent/ToolResponseContentParam.

  • version_guard.py – new module that fetches /openapi.json from the backend, parses SemVer with full §11 precedence rules, and raises IncompatibleBackendError when the backend is below MIN_BACKEND_CONTRACT; gracefully no-ops on network failure or when AGENTEX_SKIP_VERSION_CHECK is set. Wired into both BaseACPServer.lifespan_context and AgentexWorker._register_agent.
  • is_error: Optional[bool] – new optional field added to ToolResponseContent (model) and ToolResponseContentParam (TypedDict), plus inline schema updates in messages.py and the two message_list*_params.py files; the missing Optional import is also backfilled in both files.

Confidence Score: 5/5

Safe to merge — all changes are additive, the guard gracefully no-ops on network failure or missing base URL, and the new is_error field defaults to None.

The version guard is well-implemented: it fails fast only when the backend version is definitively known to be below the minimum, and degrades gracefully in every other case (timeout, unresolvable host, unparseable version string, missing AGENTEX_BASE_URL). The SemVer comparison correctly implements §11 precedence including prerelease ordering. Both startup paths (ACP server lifespan and Temporal worker registration) are covered. The is_error type additions are straightforward and consistent. Test coverage is thorough, including end-to-end flows through httpx.MockTransport.

No files require special attention.

Important Files Changed

Filename Overview
src/agentex/lib/core/compat/version_guard.py New module: runtime SemVer comparison guard with full §11 precedence, graceful degradation on network failure, and explicit bypass env var. Well-tested and correct.
src/agentex/lib/core/temporal/workers/worker.py Wires assert_backend_compatible into _register_agent before register_agent, ensuring the worker fails fast on incompatible backends.
src/agentex/lib/sdk/fastacp/base/base_acp_server.py Wires assert_backend_compatible into lifespan_context before register_agent; mirrors the worker guard correctly.
src/agentex/types/tool_response_content.py Adds is_error: Optional[bool] = None field and the previously missing Optional import; straightforward additive change.
tests/test_version_guard.py Comprehensive unit + integration tests covering parse, precedence, skip env, network failure, and end-to-end flows via httpx.MockTransport.
tests/lib/core/temporal/workers/test_worker_version_guard.py Tests that the guard runs before register_agent, that an incompatible backend blocks registration, and that a missing URL skips both.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[ACP Server / Worker startup] --> B{AGENTEX_BASE_URL set?}
    B -- No --> Z[Skip guard, skip registration]
    B -- Yes --> C{AGENTEX_SKIP_VERSION_CHECK set?}
    C -- Yes --> W[warn + skip guard]
    W --> R[register_agent]
    C -- No --> D[fetch /openapi.json from backend]
    D -- "network error / timeout" --> E[warn: unknown version]
    E --> R
    D -- "200 OK" --> F{Parse info.version SemVer}
    F -- "unparseable" --> G[warn: proceed]
    G --> R
    F -- "valid" --> H{backend_version >= MIN_BACKEND_CONTRACT?}
    H -- Yes --> I[log: version guard OK]
    I --> R
    H -- No --> J[raise IncompatibleBackendError]
    J --> K[startup fails - operator must upgrade backend]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[ACP Server / Worker startup] --> B{AGENTEX_BASE_URL set?}
    B -- No --> Z[Skip guard, skip registration]
    B -- Yes --> C{AGENTEX_SKIP_VERSION_CHECK set?}
    C -- Yes --> W[warn + skip guard]
    W --> R[register_agent]
    C -- No --> D[fetch /openapi.json from backend]
    D -- "network error / timeout" --> E[warn: unknown version]
    E --> R
    D -- "200 OK" --> F{Parse info.version SemVer}
    F -- "unparseable" --> G[warn: proceed]
    G --> R
    F -- "valid" --> H{backend_version >= MIN_BACKEND_CONTRACT?}
    H -- Yes --> I[log: version guard OK]
    I --> R
    H -- No --> J[raise IncompatibleBackendError]
    J --> K[startup fails - operator must upgrade backend]
Loading

Reviews (4): Last reviewed commit: "chore: release main" | Re-trigger Greptile

max-parke-scale and others added 20 commits May 26, 2026 17:48
)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com>
Co-authored-by: Declan Brady <declan.brady@scale.com>
Co-authored-by: Michael Chou <michael.chou@scale.com>
…ts adapter (#375)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nc + temporal) (#377)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com>
Co-authored-by: Max Parke <max.parke@scale.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Declan Brady <declan.brady@scale.com>
Co-authored-by: Michael Chou <michael.chou@scale.com>
Co-authored-by: Daniel Miller <daniel.miller@scale.com>
Co-authored-by: Matteo Librizzi <matteo.librizzi@scale.com>
…into-next-2

# Conflicts:
#	src/agentex/lib/core/tracing/span_queue.py
#	tests/lib/core/tracing/test_span_queue.py
chore: back-merge main into next (merge commit to clear release PR #382)
Add OpenTelemetry metrics for async span queue processing and SGP export:
queue depth, batch lag, drain duration, shutdown flush timing, and
export success/failure counters with bounded HTTP status labels.

Introduce AGENTEX_TRACING_METRICS=0|false|no|off kill switch to disable
SDK-side recording without code changes.

Linear: SGPINF-1863
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
….7-into-next

# Conflicts:
#	CHANGELOG.md
#	src/agentex/lib/core/tracing/span_queue.py
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Comment thread .release-please-manifest.json Outdated
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from be400b9 to d24cd19 Compare June 18, 2026 20:46
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from d24cd19 to 34756c4 Compare June 22, 2026 18:20
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 34756c4 to 174a184 Compare June 22, 2026 19:34
Stainless dropped `from typing import Optional` for the BaseModel variant
of is_error (Optional[bool]); the _param TypedDict variant imports it
correctly. Restores valid import so wheel install, tests, and lint pass.
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 174a184 to 562e220 Compare June 22, 2026 19:37
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 562e220 to 527cb37 Compare June 22, 2026 19:37
@stainless-app stainless-app Bot merged commit 4d6f4cf into main Jun 22, 2026
44 checks passed
@stainless-app stainless-app Bot deleted the release-please--branches--main--changes--next branch June 22, 2026 19:43
@stainless-app

stainless-app Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor Author

@stainless-app

stainless-app Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants