chore: release main#443
Merged
stainless-app[bot] merged 12 commits intoJun 24, 2026
Merged
Conversation
…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>
38f3e69 to
c26eb73
Compare
…ort (#432) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: OpenAI <openai@example.com>
c26eb73 to
6665513
Compare
6665513 to
beee3cc
Compare
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
beee3cc to
d470497
Compare
…435) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d470497 to
2b2856c
Compare
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2b2856c to
764d347
Compare
…alStreamingModel (#442) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
764d347 to
9e9e3fa
Compare
9e9e3fa to
23bb002
Compare
23bb002 to
063fbc8
Compare
063fbc8 to
9d953cf
Compare
declan-scale
approved these changes
Jun 24, 2026
Contributor
Author
Contributor
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
✨ 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
Features
Bug Fixes
Refactors
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
Bug Fixes
Refactors
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/TemporalStreamingHookssurface that correctly separates tool-request emission (streaming model's job) from tool-response emission (hooks' job) while adding input-bearing SGP tool spans.SpanDeriver;SpanTracer._as_span_payloadwraps non-dict outputs so the SGP API no longer rejects string payloads.OpenAITurn+convert_openai_to_agentex_eventsreplace the oldsync_provider.pyconverter;run_turn+ the refactoredTemporalStreamingHooks(emit_tool_requests,emit_tool_responses,emit_handoffsflags + per-tool SGP spans) eliminate double-posting;TemporalStreamingModelgains hosted/server-side tool surfacing._streamed_texts/_streamed_thinkingslists that survive multi-envelope turns correctly.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
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)%%{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)Reviews (10): Last reviewed commit: "chore: release main" | Re-trigger Greptile