Skip to content

chore: release main#424

Merged
declan-scale merged 19 commits into
mainfrom
release-please--branches--main--changes--next
Jun 23, 2026
Merged

chore: release main#424
declan-scale merged 19 commits into
mainfrom
release-please--branches--main--changes--next

Conversation

@stainless-app

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

Copy link
Copy Markdown
Contributor

✨ Stainless prepared a new release

agentex-client: 0.15.0

0.15.0 (2026-06-23)

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

Features

  • api: add webhook endpoint (37c7d9d)
  • claude-code: stream-json parser tap for the unified harness surface (#420) (904339c)
  • codex: event-stream parser tap for the unified harness surface (#421) (9b2b031)
  • harness: public adk facade + docs for the unified harness surface (PR 9) (#423) (fa60632)
  • harness: unified harness surface — foundation (span derivation, delivery adapters, emitter) (#412) (a9cacf4)
  • langgraph: migrate LangGraph harness onto unified surface (#417) (d344228)
  • openai-agents: migrate onto the unified harness surface (#416) (d10e151)
  • pydantic-ai: migrate onto unified harness surface (PR4) (#415) (5ec62c2)
  • sdk: add webhook helper for forward-route handlers (#419) (514075d)
  • streaming: stream tool call argument deltas in TemporalStreamingModel (#355) (c8de1d4)
  • tracing: skip Agentex span-start write by default (end-only ingest) (#438) (10d22a2)

Bug Fixes

  • harness: assert cross-channel (yield vs auto-send) conformance equivalence [AGX1-373] (#414) (694960f)
  • harness: correct codex & openai reasoning stream envelopes (#441) (1d86e8a)
  • tests: use relative import for assert_matches_type in webhooks test (#440) (5954a9f)
  • tracing: fail open temporal span activities (#437) (2d63eef)

Refactors

  • cli: migrate existing langgraph/pydantic-ai templates to unified surface (#429) (ee41408)
  • tutorials: migrate to the unified harness surface + renumber (#428) (ebaf617)
agentex-sdk: 0.14.0

0.14.0 (2026-06-23)

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

Features

  • harness: public adk facade + docs for the unified harness surface (PR 9) (#423) (fa60632)

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.15.0 / agentex-sdk 0.14.0) introduces the unified harness surface — a shared SpanDeriver → SpanTracer → UnifiedEmitter pipeline that all agent frameworks (LangGraph, pydantic-ai, OpenAI Agents, Claude Code, Codex) now route through for streaming delivery and tracing. It also adds a webhook helper (handle_webhook) for forward-route agents, a new webhooks.create_webhook_trigger API resource, and two operational fixes: fail-open tracing span activities under Temporal, and end-only span ingest by default in the Agentex tracing processor.

  • Unified harness (src/agentex/lib/core/harness/): New types.py, span_derivation.py, tracer.py, auto_send.py, yield_delivery.py, and emitter.py define the canonical StreamTaskMessage* pipeline; each framework tap now implements HarnessTurn and delegates delivery + tracing to UnifiedEmitter.
  • Operational tracing fixes: TracingModule.start_span/end_span in Temporal now fail-open on ActivityError/TemporalTimeoutError with a low-cardinality Temporal metric; AgentexTracingProcessor skips the span-start write by default (AGENTEX_TRACING_SKIP_AGENTEX_SPAN_START=1), halving per-span API calls.
  • Webhook support: New handle_webhook helper in agentex.lib.sdk.utils.webhooks (with github_pr and generic shapers, remote params resolution, session-keyed task get-or-create, and async reply polling) backed by a new webhooks.create_webhook_trigger SDK method.

Confidence Score: 5/5

Safe to merge; the unified harness surface is well-structured, the operational tracing fixes are conservative and reversible via env-var, and the webhook helper degrades gracefully on errors.

The core harness pipeline (SpanDeriver → SpanTracer → UnifiedEmitter) is clean with appropriate defensive guards throughout. The fail-open tracing change and end-only ingest default are intentional and well-documented. The only new code issue found is a dead private helper (_message_ids) in webhooks.py that has no runtime impact.

src/agentex/lib/sdk/utils/webhooks.py (dead _message_ids function); src/agentex/lib/core/temporal/plugins/openai_agents/models/temporal_streaming_model.py (previously noted unreachable guard at lines 534-536 remains).

Important Files Changed

Filename Overview
src/agentex/lib/core/harness/emitter.py New UnifiedEmitter facade: ties SpanTracer to either yield (sync HTTP) or auto-send (async/temporal) delivery; clean design with lazy tracer construction and correct post-exhaustion usage read.
src/agentex/lib/core/harness/auto_send.py New async auto-send adapter: correctly routes Start/Delta/Done/Full stream events to streaming contexts, with index-keyed ctx_map, last-segment text semantics, and a defensive _close_all teardown in the finally block.
src/agentex/lib/core/harness/span_derivation.py New pure-reducer SpanDeriver: correctly derives OpenSpan/CloseSpan signals from the canonical stream; tool spans open on Done (full args available), reasoning spans open on Start; flush handles incomplete turn cleanup.
src/agentex/lib/core/harness/tracer.py New SpanTracer adapter: converts SpanSignals to adk.tracing calls; best-effort (catches all exceptions), correctly mutates span.output before end_span per the TracingModule contract; documents orphan-leak risk for duplicate open keys.
src/agentex/lib/adk/_modules/tracing.py Adds fail-open handling for Temporal span activities: ActivityError/TemporalTimeoutError are caught (cancellations re-raised), a low-cardinality Temporal metric is emitted, and None is returned from start_span — callers now guard against None span correctly.
src/agentex/lib/core/tracing/processors/agentex_tracing_processor.py Adds end-only ingest mode (AGENTEX_TRACING_SKIP_AGENTEX_SPAN_START=1 by default): on_span_end uses spans.create instead of spans.update when skip is active, reducing HTTP/DB writes per span from 2 to 1; skip decision is correctly frozen at init time.
src/agentex/lib/sdk/utils/webhooks.py New webhook helper: shapes GitHub/generic payloads into agent turns, supports params-by-id config resolution, get-or-creates session-keyed tasks, and polls for async replies; contains one dead function (_message_ids).
src/agentex/lib/adk/_modules/_claude_code_turn.py New ClaudeCodeTurn HarnessTurn: async on_result callback correctly matches convert_claude_code_to_agentex_events's Awaitable signature; usage normalization handles all known result envelope shapes defensively.
src/agentex/lib/adk/_modules/_codex_turn.py New CodexTurn HarnessTurn: sync on_result callback correctly matches convert_codex_to_agentex_events's synchronous call convention; events generator is cached to prevent double-consumption of the underlying iterator.
src/agentex/lib/core/temporal/plugins/openai_agents/models/temporal_streaming_model.py Adds incremental ToolRequestDelta streaming for function-call arguments; each call gets its own streaming context opened on ResponseOutputItemAddedEvent and closed on ResponseOutputItemDoneEvent, with a defensive orphan-close loop for truncated streams.
src/agentex/lib/sdk/state_machine/state_machine.py Adds span=None initialization and span is not None guard in reset_to_initial_state — correctly handles the fail-open case where start_span returns None instead of raising.
src/agentex/resources/webhooks.py New Stainless-generated webhook resource: exposes create_webhook_trigger for both sync and async clients, wiring agent_name/forward_path/source/secret to the /agent_api_keys/webhook-trigger endpoint.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Agent Turn\nLangGraph / pydantic-ai / OpenAI / ClaudeCode / Codex] --> B[HarnessTurn\nevents + usage]
    B --> C[UnifiedEmitter]
    C --> D{Delivery Mode}
    D -->|sync HTTP ACP| E[yield_events\nyield_delivery.py]
    D -->|async / temporal| F[auto_send\nauto_send.py]
    E --> G[SpanDeriver\nspan_derivation.py]
    F --> G
    G --> H[SpanTracer\ntracer.py]
    H --> I[adk.tracing\nstart_span / end_span]
    E --> J[StreamTaskMessage*\nyielded to caller]
    F --> K[adk.streaming\nstreaming_task_message_context]
    F --> L[TurnResult\nfinal_text + usage]
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[Agent Turn\nLangGraph / pydantic-ai / OpenAI / ClaudeCode / Codex] --> B[HarnessTurn\nevents + usage]
    B --> C[UnifiedEmitter]
    C --> D{Delivery Mode}
    D -->|sync HTTP ACP| E[yield_events\nyield_delivery.py]
    D -->|async / temporal| F[auto_send\nauto_send.py]
    E --> G[SpanDeriver\nspan_derivation.py]
    F --> G
    G --> H[SpanTracer\ntracer.py]
    H --> I[adk.tracing\nstart_span / end_span]
    E --> J[StreamTaskMessage*\nyielded to caller]
    F --> K[adk.streaming\nstreaming_task_message_context]
    F --> L[TurnResult\nfinal_text + usage]
Loading

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

…gModel (#355)

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: Nitesh Dhanpal <NiteshDhanpal@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from a191216 to bc0de88 Compare June 22, 2026 20:03
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from bc0de88 to 4265db1 Compare June 22, 2026 20:09
Comment thread tests/lib/core/harness/conformance/runner.py
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 4265db1 to 5f73947 Compare June 22, 2026 22:21
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch 2 times, most recently from 40522a9 to dc4d0af Compare June 22, 2026 22:22
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from dc4d0af to d01f757 Compare June 22, 2026 22:45
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from d01f757 to d5e53aa Compare June 22, 2026 22:46
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from d5e53aa to eea2ce6 Compare June 23, 2026 00:11
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from eea2ce6 to b4f2805 Compare June 23, 2026 17:46
…est) (#438)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from b4f2805 to 7cba674 Compare June 23, 2026 18:49
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 7cba674 to 8d5f6aa Compare June 23, 2026 20:10
Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 8d5f6aa to efc0a50 Compare June 23, 2026 20:25
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from efc0a50 to ba79c0d Compare June 23, 2026 20:52
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from ba79c0d to 26f7ca4 Compare June 23, 2026 21:05
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch 2 times, most recently from 8bcf459 to 3fc8174 Compare June 23, 2026 21:14
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 44602a2 to 055f0c1 Compare June 23, 2026 22:01
@declan-scale declan-scale merged commit b30a90b into main Jun 23, 2026
76 checks passed
@declan-scale declan-scale deleted the release-please--branches--main--changes--next branch June 23, 2026 22:17
@stainless-app

stainless-app Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor Author

@stainless-app

stainless-app Bot commented Jun 23, 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.

4 participants