Measured reliability
What works, what does not
Function calling is emulated by genmux — the tools are rendered into the system prompt and the reply is parsed back into OpenAI tool_calls — so the honest list matters more than a checkbox.
| Feature | Status | |
|---|---|---|
| tools, tool_choice, tool_calls, role: tool | works | On the models flagged tools: true (listed above); ≤ 128 tools, ≤ 64 KiB of definitions. Other models answer 400 tools_unsupported. |
| Streamed tool calls | works | delta.tool_calls chunks exactly as OpenAI emits them, finish_reason tool_calls. |
| JSON mode | works | response_format json_object and json_schema, validated on non-streamed replies with one automatic retry; cannot be combined with tools. |
| OpenAI error envelope | works | {"error": {message, type, code, param, request_id}} on the chat route, so client retry logic recognises rate limits and quota. |
| Large max_tokens | works | Values above the model's max_output_tokens are clamped, not rejected. Default reply budget on the tool models is 8192 tokens. |
| tool_choice: required / named function | partial | An instruction the model usually follows; small models occasionally answer in prose instead. Agents retry, so in practice this is rare. |
| Parallel tool calls | partial | Models usually emit one call per turn; parallel_tool_calls is accepted and ignored. Agents loop, so the task still completes. |
| n > 1, logprobs, legacy functions | not yet | Rejected with 400 unsupported_parameter. stream_options, seed, user, metadata, store and logit_bias are accepted and ignored. |
| Claude Code, Codex CLI | not yet | They speak the Anthropic Messages and OpenAI Responses APIs, which the endpoint does not serve yet — coming soon. |
Measured reliability
20 agent-style tasks per model through the real API on September 7, 2026: file writes with multi-line code and Unicode, shell commands with quotes, nested arguments, forced and forbidden tool choice, a full tool round-trip and a streamed write.
Every model handles the basic loop — call, result, answer, streamed or not. The misses were model behaviour, mostly ignoring tool_choice: required, not parsing. We re-run the set before every release and keep a model on the list only above 90 %.
Start with a key
Sign up, create a key in the dashboard, paste one of the configs above. The first request is billed on actual tokens — no subscription and no seat.
Image generation in your assistant: the MCP server →