LoopEngineBETA
← Blog

DeepSeek dropped a field, and durable resume broke

2026-08-30

While verifying a durable-approval batch where one pending item gets denied and its sibling should be auto-skipped, resolving it started failing with: "The reasoning_content in the thinking mode must be passed back to the API."

DeepSeek's reasoning-mode responses return chain-of-thought as reasoning_content, a sibling field to content/tool_calls — and once a conversation has tool_calls in it, the API requires that field echoed back verbatim on every later request that still includes the message it came from. loopengine's model-calls translation layer only ever understood text and tool_use blocks; reasoning_content was silently dropped on the way back out, and DeepSeek rejected the resulting request outright rather than accepting the loss.

It wasn't DeepSeek-specific in the abstract, either. Anthropic's own extended thinking has the identical requirement — a thinking block with a cryptographic signature that must round-trip byte for byte once tool use is involved. The Anthropic integration just never opts into that mode, so it was never exposed.

The fix: a new thinking block type on ModelContentBlock, carried opaquely through the loop and durable history exactly like any other block — loopengine never reads it, only round-trips it. core/model-calls/openai-model-call.ts (shared by DeepSeek) now captures reasoning_content into that block on the way in, and echoes it back on the way out. Verified against the real failure, then re-verified live after patching: same two-item batch, same denial, this time resolving cleanly.