← all posts
// models · gemini

Gemini 3.5 Flash: Tool calling without magical thinking

Point your config at gemini-3.5-flash, switch the endpoint to the Interactions API Google now recommends for new projects, and you have decided nothing yet about whether this model belongs in your tool-calling loop.

That's the trap a new release sets.

The benchmark numbers show up first, and the question that actually matters, whether the model changes what you can promise a user about the requests you handle today, the deadlines you're under, and the tools already wired into production, gets asked last if it gets asked at all.

Work the order backward: start from what your system already does, the failure costs when a call goes sideways, the volume it runs at, and only then ask whether a faster, cheaper multimodal model changes the outcome enough to justify touching a route that already works.

The stable identifier and what it buys you

Google's own documentation lists gemini-3.5-flash as a current stable Gemini model and points new projects at the generally available Interactions API rather than anything experimental.

In practice that means a fast multimodal model built for high call volume with tools attached, not a research flagship and not the model you reach for when the whole job is one enormous context window.

The identifier to actually test is the literal string gemini-3.5-flash, and it's worth treating that string as perishable: aliases get renamed, prices move, availability shifts region by region, so check the Gemini docs again at implementation time rather than trusting what this paragraph says today.

Before you send a single prompt, write down what counts as a pass.

For extraction that's a schema-valid record whose fields trace back to source evidence.

For coding it's a patch that clears tests and review, not a diff that merely compiles.

For research work it's a set of claims each pinned to a real source.

Fluency doesn't count.

A model that writes a beautiful paragraph around a wrong tool call has failed, full stop.

Break the tool loop before you trust it

Testing "does it work" against a single happy-path prompt tells you almost nothing about a tool-calling model, because the happy path is the one case every vendor already tunes for.

Run the loop against the situations that actually break production systems:

  • valid calls with clean arguments
  • calls missing a required argument
  • prompts with genuinely ambiguous intent
  • a tool that returns an error mid-call
  • a tool result that's gone stale by the time it's used
  • a request that gets cancelled partway through
  • an attempt, deliberate or accidental, to cross an authorization boundary the caller shouldn't touch

Keep the entire request when you log a run, not a summary of it: system instructions, the tool schemas as sent, any files, the sampling or reasoning settings, the output cap.

Harness matters more than people admit.

A model handed native tool definitions and a model fed pasted terminal output as plain text can produce wildly different results even though it's "the same model" in both runs, so hold the workflow constant and let each provider use its own documented message format rather than forcing a lowest-common-denominator prompt on everyone you compare.

The near-miss your pass rate won't show you

The expensive mistake is counting a correct tool name as a win while the arguments underneath it are malformed, or while a retry fires a second time against an endpoint that has side effects.

Frontier-class output is fluent enough that these near-misses read as confident and correct at a glance, which is exactly why they survive into production unnoticed.

Measure the properties ordinary code can check, have a reviewer label real defects instead of vibes, and keep the failing transcripts instead of discarding them: a stack of failures is worth more than another folder of passing runs, because failures are what tell you where the routing and the guardrails actually need to sit.

Long-context capability deserves the same suspicion, maybe more.

A bigger window doesn't erase prefill time, doesn't filter retrieval noise, and doesn't draw the line between an instruction you trust and a document you merely retrieved.

If your long-context workflows already lean on prompt caching, put the stable prefix first, keep anything volatile away from the cache boundary, and send a structured checkpoint instead of the full conversation history whenever one will do.

Ask for a concise decision plus its evidence, not an unsolicited essay; short output is cheaper to generate and much cheaper for a human to check.

And the risk model itself shifts once tools are in play: the provider can get better at picking the right function, but your application still has to validate every argument, authorize the caller, cap the side effects, deduplicate retries, and write down what actually happened.

A web page, a file, an email body, a tool result: none of that is authority, it's just data the model happened to read.

A smarter model is not a substitute for a narrower interface.

A shorter leash, not a smarter model

The decision that holds up over time is boring on purpose: expose the smallest tool set that gets the job done, and keep authorization entirely outside the model.

Put that rule in configuration, not in a comment asking whoever's on call to remember which model is fashionable this month.

Log what a real operator needs later without hoarding what they shouldn't keep:

model id + dated api version
tool schema revision in effect
token counts by category: input, cached, reasoning, output
latency by phase: queue, first token, total
outcome: pass, retry, abstain, human repair
provider error and the fallback route taken

Keep a cheap, fast lane for the routine share of requests and a named condition for escalating the rest to something stronger.

The expensive model should only see work that actually benefits from it; a cheap tier stops being cheap the moment its retries and review overhead outrun the inference bill it was supposed to save.

Treat every model swap as a migration, not a vibe shift: pin dated versions where stability matters, watch the deprecation notices instead of finding out from an outage, canary a new alias on a slice of traffic before it touches everything, and keep a known-good fallback ready to take over.

Re-run your evaluation set the moment the model, the prompt, the tool contract, or a reasoning default changes underneath you.

Keep the model on the shortest leash that still lets it do the job.

#gemini#google#api#evaluation