Skip to content

v0.10.3

Choose a tag to compare

@stainless-app stainless-app released this 30 Apr 21:24
f17ad00

0.10.3 (2026-04-30)

Full Changelog: v0.10.2...v0.10.3

Features

Bug Fixes

  • adk: Always inject headers on execute activity (#337) (9d80e0b)
  • allow litellm security patch (#336) (c980948)
  • tests: repair test_streaming_model so all 28 tests run and pass (#334) (7e5e69c)
  • use correct field name format for multipart file arrays (bd6d362)

Performance Improvements

  • streaming: coalesce per-token publishes to Redis (50ms / 128-char window) (#333) (e6f11c4)

Chores

  • internal: more robust bootstrap script (f004301)

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 bundles several independent fixes and one performance feature: a CoalescingBuffer that batches per-token Redis publishes into 50 ms / 128-char windows, three execute_activity_method → execute_activity corrections so headers are always injected, a BaseHTTPMiddleware → pure ASGI swap that fixes streaming response buffering, and an AGENTEX_CUSTOM_HEADERS env-var feature.

  • The expanded header-injection scope in context_interceptor.py now fires logger.warning for every non-agentex activity that lacks _task_id, which will flood logs in multi-activity workflows.
  • send_message (sync + async) silently discards JSON-RPC error payloads when the server returns an error envelope, returning an empty result list instead.

Confidence Score: 4/5

Safe to merge with minor follow-up; no data loss or critical runtime failures introduced.

Both findings are P2: the warning log noise in the interceptor is annoying but not functionally breaking, and the silent error discard in send_message was a pre-existing gap now made slightly more likely to hit. All P0/P1 bugs (execute_activity fix, BaseHTTPMiddleware streaming fix, multipart field naming) are addressed with tests.

src/agentex/resources/agents.py (silent error swallowing in send_message) and src/agentex/lib/core/temporal/plugins/openai_agents/interceptors/context_interceptor.py (warning log level).

Important Files Changed

Filename Overview
src/agentex/lib/core/services/adk/streaming.py Major addition: CoalescingBuffer (50ms/128-char windowed batching), StreamingMode literal, and delta merge helpers; StreamingTaskMessageContext updated to dispatch through the new buffer.
src/agentex/resources/agents.py send_message (sync + async) refactored to consume a streaming response and reconstruct the final result; JSON-RPC error chunks are silently discarded with an empty task_messages list.
src/agentex/lib/core/temporal/plugins/openai_agents/interceptors/context_interceptor.py Header injection scope widened from model-only activities to all activities; logger.warning fires for every non-agentex workflow activity that lacks _task_id/_trace_id/_parent_span_id.
src/agentex/lib/sdk/fastacp/base/base_acp_server.py RequestIDMiddleware replaced from BaseHTTPMiddleware (which buffers streaming responses) to a pure ASGI middleware; fixes streaming response truncation.
src/agentex/_utils/_utils.py extract_files now accepts an array_format parameter and delegates suffix generation to _array_suffix; fixes bracket/indices/repeat/comma naming for multipart file arrays.
src/agentex/_client.py Added AGENTEX_CUSTOM_HEADERS env var support (newline-delimited key:value pairs) in both sync and async clients; env headers take precedence over default_headers argument.
src/agentex/lib/core/temporal/plugins/openai_agents/hooks/hooks.py Switched execute_activity_method to execute_activity for stream_lifecycle_content calls; ensures header injection by the context interceptor.
pyproject.toml Bumped httpx (0.27 → 0.28), litellm minimum (1.83.0 → 1.83.7 for security patch), pinned starlette>=0.49.1 and tornado>=6.5.5 explicitly, and relaxed fastapi upper bound.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[stream_update called] --> B{streaming_mode?}
    B -->|off| C[Feed accumulator only\nno publish]
    B -->|per_token| D[Publish immediately\nvia stream_update]
    B -->|coalesced| E[CoalescingBuffer.add]

    E --> F{first delta OR\nbuf_chars >= 128?}
    F -->|yes| G[Signal flush_event]
    F -->|no| H[Wait for ticker]

    G --> I[_run background task\nawakens immediately]
    H --> J[50ms timeout\nexpires]
    I --> K[_drain_locked:\nmerge consecutive same-channel deltas]
    J --> K
    K --> L[Publish merged batch\nvia on_flush]

    M[context.close] --> N[buffer.close:\ncancel ticker\ndrain remainder]
    N --> L
    L --> O[stream_update:\nStreamTaskMessageDone]

Fix All in Cursor Fix All in Claude Code Fix All in Codex

Prompt To Fix All With AI
Fix the following 2 code review issues. Work through them one at a time, proposing concise fixes.