Model comparison · 2026-09-22

Tool calling and reasoning_effort mechanics on Ling 3.0 Flash

Covers in depth the tool_choice behavior briefly mentioned in the Flash migration guide, and why reasoning_effort only behaves predictably with the none value.

Technical reference diagram showing how tool_choice modes and the reasoning_effort suffix behave on Ling 3.0 Flash.

The migration guide covers the framework, this covers the detail

The Ling 3.0 Tiny to Flash migration guide covers why Tiny was withdrawn and the two things that change in your code. This article covers in depth two technical behaviors you'll run into using Flash in production after that migration: tool-calling modes and reasoning_effort mechanics.

Both behaviors are specific to Flash and work differently from their Tiny counterpart; going to production after applying the suffix change from the migration guide without knowing these details can lead to unexpected errors.

Tool-calling modes

Ling 3.0 Flash reliably supports `tool_choice: "auto"` and `tool_choice: "required"`; forcing one specific function by name also works on this model. That's not a guaranteed behavior across every model in the catalog; forcing by name can be inconsistent on some other models, so it's worth noting as a Flash-specific advantage.

Schema-enforced JSON output and image or audio input, on the other hand, are not supported by Flash; if you need structured output, you need to specify the output format explicitly in your instruction and validate the response on the parsing side.

  • `tool_choice: "auto"` and `"required"`: work reliably.
  • Forcing one specific function by name: works on this model (not guaranteed on every model).
  • Schema-enforced JSON output and image/audio input: not supported.

Only none is predictable in reasoning_effort

As the Flash migration guide also notes, to turn thinking off you append the `:none` suffix to the model identifier or send `reasoning_effort: "none"` in the request body; the `:fast` suffix from Tiny does not work on Flash. A different detail matters too: don't expect an ordered constraint like `low`, `medium`, or `high` from the `reasoning_effort` field; in measurement, these values did not produce a predictable ordering. That's why the catalog officially supports only the `none` value.

An integration that tries sending a value like `reasoning_effort: "low"` without knowing this behavior can get an unexpected response time or error. When you want to turn off the thinking step, don't rely on any value other than `none`.

Frequently asked questions

Can I use low or high for reasoning_effort on Ling 3.0 Flash?

The catalog officially supports only the none value; in measurement, other levels did not produce predictable behavior. Don't rely on any value other than none to turn thinking off.

Does the :fast suffix from Tiny also work on Flash?

No. Flash uses a different mechanism; to turn thinking off you need to send the :none suffix or reasoning_effort: "none" — carrying over the :fast suffix results in a 400 error.

Related posts