We use LangChain ChatOpenAI, LangGraph, bind_tools, and with_structured_output with Gemini 3.
With OpenRouter (base_url = OpenRouter, model id like google/gemini-3-flash-preview), multi-turn tool use is stable and behavior matches our expectations.
When we switch to Google’s direct OpenAI-compat endpoint (https://generativelanguage.googleapis.com/v1beta/openai/, same client and same model class), we see much worse behavior: wrong or inconsistent tool use, replies that ignore conversation state, and user-visible “hallucination”-like failures. We also see 400 errors (e.g. missing thought_signature on replayed function calls, sometimes function_response.name empty). We suspect tool history isn’t round-tripped the way Gemini 3 expects (see thought signatures), while OpenRouter translates requests so our app keeps working.
Ask: How should clients using only Google’s OpenAI-compat URL get parity with OpenRouter for Gemini 3 + multi-turn tools? Is Gen AI SDK / native contents required for reliable agents, or is there documented guidance for preserving extra_content.google.thought_signature (or approved dummies) from generic OpenAI clients?