* fix(llm): preserve null content on OpenAI tool-call turns OpenAI-compatible providers can return assistant tool-call messages with content=null. Coercing that to "" before history replay breaks providers that bind opaque reasoning state to the exact assistant message shape. Keep null only when the normalized response has tool calls; tool-less null still becomes "", and content_override stays authoritative. Fixes #1061 * test(live_llm): cover OpenAI null content tool-call replay Add a live multi-turn tool replay that asserts provider content=null stays null through normalize + OpenAIHistoryAdapter and that the continuation still answers. Mark gpt_4/gpt_5 families as supports_tool_replay. * docs(llm): note content_override None sentinel semantics None means no override, not force-null content. Addresses review on #1064. |
||
|---|---|---|
| .. | ||
| test_anthropic.py | ||
| test_gemini.py | ||
| test_openai.py | ||