Mistral AI · model family

Remove Watermarks from Mistral and Codestral

Mistral covers more distinct surfaces than most families: Le Chat in a browser and on mobile, La Plateforme for the API, Codestral as a dedicated code endpoint with fill-in-the-middle completion, open weights running under Ollama or LM Studio, and the same models re-served through Azure, Bedrock and Vertex. Those surfaces have genuinely different character risk, and the autocomplete one behaves unlike anything in a chat window. This page also covers French typography, which is the one language convention that regularly puts an invisible-looking space into code by being entirely correct.

Scan your Mistral code now

Free, and it reports every removal by codepoint and line.

Open the scanner

What we measured

68

code-generation calls

17

provider and model targets

59,486

characters generated

0

contained a hidden character

On 2026-08-12 we sent identical code-writing prompts to every model our own gateway can reach and scanned each raw API response. Not one of them contained a zero-width character, a bidirectional control, or a tag character.

3 of the 68 answers contained typographic punctuation, and only in the prose-heavy prompts rather than in the plain code one. The most common was the non-breaking hyphen, which is visible but still breaks a copied command. 2 left trailing whitespace.

The useful conclusion is the boring one: raw model output is essentially clean, so when you do find hidden characters in your file, they almost certainly came from the path the text travelled rather than from the model. That is what the section below is about.

Scope: this measured API output from models we can reach directly. It did not measure the Mistral web app, which is the point being made, since the browser is where the characters get added.

How code gets out of Mistral, and what each path adds

Codestral completion inside an editor medium risk

Fill-in-the-middle completions are written into the buffer by the plugin, so there is no clipboard, no HTML and no chance for a rendering layer to substitute anything. The exposure is the opposite direction: the completion is conditioned on the text already around it, so a file that already contains a stray no-break space or a bidi control keeps producing code that sits alongside them, and the whole region gets copied onwards as one block. Scan the file, not the accepted suggestion.

Copying an answer out of Le Chat medium risk

Le Chat renders to HTML like any web app, so a selection that crosses out of a code block picks up whatever the prose was rendered with: curly quotes, en and em dashes, soft hyphens and no-break spaces. French answers add their own case, since correct French puts a narrow no-break space (U+202F) or a no-break space before a colon, semicolon, question mark or exclamation mark, and inside guillemets. That is right in a sentence and wrong in a JSON key, a CSS class or a shell command.

La Plateforme API, or Mistral models via Azure, Bedrock or Vertex low risk

Every one of these hands back a raw JSON string, so the gateway you chose changes the billing and the system prompt wrapper but not the characters. Nothing is added in transit. What remains is whatever the model produced plus whatever your prompt carried in from pasted or retrieved material, which is where tag-block payloads and bidi controls come from.

Local weights under Ollama, LM Studio or vLLM low risk

Mistral, Mixtral, Devstral and Codestral builds run locally decode straight to UTF-8 and are usually written to disk by a script. No browser, so no typographic substitution, but also no display step and no reviewer between the model and the file. Anything invisible in the generated string is committed as-is.

The French typographic spaces are the detail a Mistral user should take away. U+202F and U+00A0 before high punctuation are not a defect, they are the rule in French, and they travel intact through a copy from Le Chat into a docstring, a UI string or a commit message. The tool folds both to an ordinary space and tells you which lines they were on, which is what you want in code and worth a second look in prose you intend to publish in French. Guillemets are handled separately under the opt-in punctuation fold, so they are left alone unless you switch that on, and Greek letters used as maths variables are reported rather than replaced for the same reason: a real Greek alpha in a formula is fine, a Greek small omicron standing in for an ASCII o inside an identifier is not.

What this does not do

It does not remove statistical watermarking. Schemes of the SynthID family add no characters at all: they bias which token the model samples, so the signal lives in word choice across the whole output and nothing you can delete carries it. Attacking that means rewriting the text, which for source code risks changing what it does.

This is a hygiene and security tool, not an attribution bypass. Formatters already normalise surface signals, and what identifies generated code is structure and style rather than hidden bytes. Disclose AI assistance wherever you are asked to.

Mistral questions

Why is a space before a semicolon being flagged in my French text? +

Because it is a narrow no-break space (U+202F) or a no-break space (U+00A0), not U+0020. French typography requires it and your text is correct, but the same character inside code is a bug that is invisible in most editors: it will not match a split, it will not parse as indentation, and it breaks string comparisons. The report gives you the line numbers so you can keep it in prose and lose it in code.

Codestral writes straight into my file. What could it possibly add? +

By itself, very little, and that is genuinely the safest of the paths listed here. The risk with autocomplete is inherited rather than introduced: completions are conditioned on the surrounding file, so if something invisible was pasted into that file earlier it stays there while more code accumulates around it, and it ships when the file ships. Scan whole files periodically rather than individual suggestions.

Does it make any difference whether I call Mistral directly or through Bedrock or Azure? +

Not for characters. All three return a JSON string over HTTP with nothing rendered in between, so the bytes reach you the same way. What differs is the prompt wrapper and the deployment, neither of which introduces watermarks. The path that changes the answer is the browser one, and that is Le Chat rather than any API gateway.

The output uses Greek letters for maths variables. Will they be replaced? +

No, not by default. Look-alike replacement is opt-in, and a Greek letter used as a variable in a formula or a docstring is the intended character. The check exists for the case where a Greek or Cyrillic letter is impersonating an ASCII one inside an identifier, an import or a URL, so the tool reports each occurrence with its codepoint and line and lets you judge which kind you are looking at.

Other tools