Skip to content

chore: release main#443

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

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

Conversation

@stainless-app

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

Copy link
Copy Markdown
Contributor

✨ Stainless prepared a new release

agentex-client: 0.16.0

0.16.0 (2026-06-24)

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

⚠ BREAKING CHANGES

  • harness: consolidate the Pydantic-AI harness + remove tracing handler (#431)
  • harness: consolidate the LangGraph harness + remove tracing handler (#430)

Features

  • cli: add claude-code init templates (sync / async / temporal) (#435) (fd9bc4a)
  • cli: add codex init templates (sync / async / temporal) (#436) (0fadfd7)
  • cli: add default-openai-agents init template (async base) (#434) (624e9c8)
  • openai-agents: single-emit + input-bearing tool spans + run_turn (#445) (53ab8ef)
  • openai-temporal: render hosted/server-side tool calls in TemporalStreamingModel (#442) (5dce9f0)

Bug Fixes

  • cli: harden init templates per Greptile feedback (suite-wide) (#444) (2d85eb0)
  • harness: harden Claude Code + OpenAI taps and span tracing (#446) (5b4359d)

Refactors

  • harness: consolidate the LangGraph harness + remove tracing handler (#430) (a3fb5ad)
  • harness: consolidate the Pydantic-AI harness + remove tracing handler (#431) (48c3da8)
  • harness: move OpenAI harness into adk/_modules + facade export (#432) (58bdb16)
agentex-sdk: 0.15.0

0.15.0 (2026-06-24)

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

⚠ BREAKING CHANGES

  • harness: consolidate the LangGraph harness + remove tracing handler (#430)

Bug Fixes

  • harness: harden Claude Code + OpenAI taps and span tracing (#446) (5b4359d)

Refactors

  • harness: consolidate the LangGraph harness + remove tracing handler (#430) (a3fb5ad)

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 PR (v0.16.0 client / v0.15.0 SDK) consolidates the OpenAI, LangGraph, and Pydantic-AI harnesses, adds Claude Code and Codex CLI templates, and wires a new run_turn / TemporalStreamingHooks surface that correctly separates tool-request emission (streaming model's job) from tool-response emission (hooks' job) while adding input-bearing SGP tool spans.

  • Harness refactors: LangGraph and Pydantic-AI tracing handlers are removed; reasoning-span output now accumulates from deltas in SpanDeriver; SpanTracer._as_span_payload wraps non-dict outputs so the SGP API no longer rejects string payloads.
  • OpenAI / Temporal surface: OpenAITurn + convert_openai_to_agentex_events replace the old sync_provider.py converter; run_turn + the refactored TemporalStreamingHooks (emit_tool_requests, emit_tool_responses, emit_handoffs flags + per-tool SGP spans) eliminate double-posting; TemporalStreamingModel gains hosted/server-side tool surfacing.
  • Claude Code tap: Index-based deduplication replaced with content-based _streamed_texts/_streamed_thinkings lists that survive multi-envelope turns correctly.
  • CLI: Six new init templates added for Claude Code and Codex across all three deployment modes (async, sync, Temporal).

Confidence Score: 5/5

Safe to merge; all three previously flagged streaming bugs are addressed and the new Temporal hooks/run_turn surface is well-tested.

The core correctness fixes (text-item index collision, missing Done for reasoning messages, unguarded json.loads) are all present. The new emit_tool_requests/emit_tool_responses separation is tested end-to-end in test_run_turn_and_hooks.py and the finally-block draining of orphaned spans closes the last open lifecycle gap. Only minor documentation inconsistencies remain.

run.py and test_run_turn_and_hooks.py carry a stale emit_messages parameter name in their docstrings that should be updated to emit_tool_requests before the docs confuse future callers.

Important Files Changed

Filename Overview
src/agentex/lib/core/temporal/plugins/openai_agents/run.py New run_turn helper wires TemporalStreamingHooks correctly; module docstring names a non-existent emit_messages=False parameter (should be emit_tool_requests=False)
src/agentex/lib/core/temporal/plugins/openai_agents/hooks/hooks.py Adds emit_tool_requests/emit_tool_responses/emit_handoffs flags and per-tool SGP spans; best-effort tracing guards are correct; close_open_tool_spans drains orphaned spans on runner termination
src/agentex/lib/adk/_modules/_openai_sync.py Addresses previous review issues: text items now always claim a fresh index (no reasoning/text index collision), reasoning items emit Done, and argument parsing is guarded via _safe_parse_arguments
src/agentex/lib/adk/_modules/_claude_code_sync.py Content-based deduplication (_streamed_texts / _streamed_thinkings) replaces fragile block-index approach; handles interleaved and post-stream assistant envelopes correctly
src/agentex/lib/core/harness/span_derivation.py Reasoning spans now accumulate chain-of-thought / summary text from deltas and emit it as span output on close, matching the existing tool-span pattern
src/agentex/lib/core/harness/tracer.py New _as_span_payload coerces non-dict inputs/outputs (e.g. reasoning string) so the SGP API no longer silently drops them with 422 errors
src/agentex/lib/core/temporal/plugins/openai_agents/models/temporal_streaming_model.py Adds hosted/server-side tool surfacing; contains unreachable task_id check at line 656 that duplicates the guard at line 639
src/agentex/lib/adk/_modules/_openai_turn.py Clean OpenAITurn adapter; usage aggregation is defensive and deferred until stream exhaustion
src/agentex/lib/adk/_modules/_langgraph_sync.py Adds emit_langgraph_messages for non-streaming (ainvoke) LangGraph agents; handles both string and list content from AIMessage correctly
src/agentex/lib/cli/commands/init.py Adds Claude Code and Codex templates across async/sync/temporal modes; pre-existing package-manager cancellation gap is noted in previous threads

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant Caller
    participant run_turn
    participant Runner
    participant TemporalStreamingModel
    participant TemporalStreamingHooks

    Caller->>run_turn: run_turn(agent, input, task_id, trace_id, ...)
    run_turn->>TemporalStreamingHooks: "new(emit_tool_requests=False, emit_tool_responses=True, trace_id=...)"
    run_turn->>Runner: "Runner.run(agent, input, hooks=hooks)"

    loop per LLM call
        Runner->>TemporalStreamingModel: get_response(...)
        TemporalStreamingModel-->>Caller: StreamTaskMessageStart(ToolRequestContent)
        TemporalStreamingModel-->>Caller: "StreamTaskMessageDelta*(ToolRequestDelta)"
        TemporalStreamingModel-->>Caller: StreamTaskMessageFull(ToolRequestContent)
        TemporalStreamingModel-->>Caller: "StreamTaskMessageStart/Delta*/Full (text/reasoning)"
    end

    Runner->>TemporalStreamingHooks: on_tool_start(ctx, agent, tool)
    Note over TemporalStreamingHooks: emit_tool_requests=False skip UI post
    TemporalStreamingHooks->>adk.tracing: start_span(tool_name, arguments)

    Runner->>TemporalStreamingHooks: on_tool_end(ctx, agent, tool, result)
    TemporalStreamingHooks-->>Caller: stream_lifecycle_content(ToolResponseContent)
    TemporalStreamingHooks->>adk.tracing: "end_span(span, output=result)"

    run_turn->>TemporalStreamingHooks: close_open_tool_spans() [finally]
    run_turn-->>Caller: OpenAIAgentsTurnResult(result, 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"}}}%%
sequenceDiagram
    participant Caller
    participant run_turn
    participant Runner
    participant TemporalStreamingModel
    participant TemporalStreamingHooks

    Caller->>run_turn: run_turn(agent, input, task_id, trace_id, ...)
    run_turn->>TemporalStreamingHooks: "new(emit_tool_requests=False, emit_tool_responses=True, trace_id=...)"
    run_turn->>Runner: "Runner.run(agent, input, hooks=hooks)"

    loop per LLM call
        Runner->>TemporalStreamingModel: get_response(...)
        TemporalStreamingModel-->>Caller: StreamTaskMessageStart(ToolRequestContent)
        TemporalStreamingModel-->>Caller: "StreamTaskMessageDelta*(ToolRequestDelta)"
        TemporalStreamingModel-->>Caller: StreamTaskMessageFull(ToolRequestContent)
        TemporalStreamingModel-->>Caller: "StreamTaskMessageStart/Delta*/Full (text/reasoning)"
    end

    Runner->>TemporalStreamingHooks: on_tool_start(ctx, agent, tool)
    Note over TemporalStreamingHooks: emit_tool_requests=False skip UI post
    TemporalStreamingHooks->>adk.tracing: start_span(tool_name, arguments)

    Runner->>TemporalStreamingHooks: on_tool_end(ctx, agent, tool, result)
    TemporalStreamingHooks-->>Caller: stream_lifecycle_content(ToolResponseContent)
    TemporalStreamingHooks->>adk.tracing: "end_span(span, output=result)"

    run_turn->>TemporalStreamingHooks: close_open_tool_spans() [finally]
    run_turn-->>Caller: OpenAIAgentsTurnResult(result, usage)
Loading

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

…g handler (#430)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ing handler (#431)

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 38f3e69 to c26eb73 Compare June 23, 2026 23:34
…ort (#432)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: OpenAI <openai@example.com>
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from c26eb73 to 6665513 Compare June 23, 2026 23:46
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 6665513 to beee3cc Compare June 24, 2026 00:36
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 beee3cc to d470497 Compare June 24, 2026 00:46
…435)

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 d470497 to 2b2856c Compare June 24, 2026 02:08
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 2b2856c to 764d347 Compare June 24, 2026 02:16
…alStreamingModel (#442)

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 764d347 to 9e9e3fa Compare June 24, 2026 02:50
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 9e9e3fa to 23bb002 Compare June 24, 2026 03:44
Comment thread src/agentex/lib/adk/_modules/_openai_sync.py Outdated
Comment thread src/agentex/lib/adk/_modules/_openai_sync.py Outdated
Comment thread src/agentex/lib/adk/_modules/_openai_sync.py Outdated
@stainless-app stainless-app Bot force-pushed the release-please--branches--main--changes--next branch from 063fbc8 to 9d953cf Compare June 24, 2026 21:54
@stainless-app stainless-app Bot merged commit 521c60d into main Jun 24, 2026
67 checks passed
@stainless-app stainless-app Bot deleted the release-please--branches--main--changes--next branch June 24, 2026 22:11
@stainless-app

stainless-app Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

@stainless-app

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

1 participant