• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

lsm / neokai / 28138892406
82%

Build:
DEFAULT BRANCH: dev
Ran 25 Jun 2026 12:37AM UTC
Jobs 0
Files 0
Run time –
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

Canceled at 25 Jun 2026 01:13AM UTC via web
28138892406

push

github

web-flow
fix(codex-bridge): log 4xx request bodies, stringify tool output, self-heal reasoning 400s (#2181)

The Codex (gpt-5.5) bridge intermittently returns a terminal
400 {"detail":"Unsupported content type"}, killing the worker turn
(e.g. task 8d61e3d3). The error originates upstream and the failing
request body was never logged, so the rejected item could not be
identified. This change adds the missing diagnostics plus two
defensive mitigations.

1. 4xx request diagnostics (highest priority)
   Add summarizeResponsesRequestFor4xx() + logUpstream4xx(): when the
   upstream returns 4xx, log a payload-free summary of the translated
   request — every input item's type plus the shapes most likely to
   trigger "Unsupported content type" (function_call_output.output form,
   function_call.status presence, reasoning encrypted_content length,
   message content block types). This is what will pin the actual cause
   on the next occurrence. 5xx is intentionally skipped (server-side).

2. Defensively stringify function_call_output.output (candidate 3)
   toolResultContent() now always returns a string. Previously, non-text
   tool results (e.g. screenshots) were sent as an array of typed content
   blocks, which the ChatGPT Codex backend hard-rejects. The Responses API
   documents output as a string; images become descriptive placeholders.
   (The example run had all-string results, but this latent bug is fixed
   defensively per the task plan.)

3. Self-healing reasoning replay 400 (candidate 1 — leading suspect)
   Reasoning encrypted_content is cached per session and replayed before
   the current turn. A stale blob (e.g. after an SDK context rewrite) can
   trigger the 400 terminally. Following the existing previous_response_id
   retry pattern, retry once without reasoning items when a 400 occurs with
   reasoning present, so the turn completes instead of dying. The streaming
   response refreshes/clears the per-session reasoning cache automatically.

Tests:... (continued)
Source Files on build 28138892406
Detailed source file information is not available for this build.
  • Back to Repo
  • Github Actions Build #28138892406
  • fe9ba9ae on github
  • Prev Build on dev (#28137825013)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc