Data Modes & Privacy¶
This is the mechanism behind Wizard's local-first promise. Without it,
"your data stays local" would just be a property of how you happened to
configure a .env file — assign a cloud provider to a role, and the
prompt, sample rows and all, goes to it. Wizard makes that an explicit,
enforced, session-wide setting instead.
The three modes¶
| Mode | Behavior |
|---|---|
local-only |
Cloud providers are refused, not skipped — a hard boundary, not a preference. Attempting to resolve a cloud provider raises rather than silently falling back. |
cloud-only |
Only cloud providers may be used. |
hybrid |
Local and cloud providers can both be assigned, per role — plan on a local model, generate code on a cloud one, or any other split. |
Mode is set session-wide and seeded from your configured default. Switching mode clears any role assignment the new mode forbids — the alternative would be the next question simply failing, which would make a setting you chose to be safer read as having broken the app.
Three separate axes¶
Data mode is deliberately not one setting:
- Mode — which providers a role may resolve to (above).
- Policy — how much of your data a cloud-bound prompt actually carries.
Redaction (below) is decided per prompt, based on which provider that
specific prompt is going to. Under
hybridwith a cloud manager and a local worker, the planning prompt is redacted and the code-generation prompt isn't. - Tools — web search is unavailable under
local-only, not merely unchosen. If the agent's plan would search the web, that step is dropped with a warning rather than turned into an approval prompt — there's no consent that would make it allowed, so asking would be theatre.
What redaction actually withholds¶
When a prompt is redacted, it keeps shape, column names, dtypes, null rates and semantic types — but drops every real value: example rows, the data-glimpse preview, summary statistics, and categorical distinct values (replaced by a count). The model is told explicitly that values were withheld and must be computed, not guessed.
Execution output is never redacted. The final answer is synthesised from real stdout — withholding that would leave the answering model nothing to answer from. This is stated plainly in the UI rather than implied.
Redaction is settable per source, not just per session — a published reference table and a payroll export don't deserve the same policy. An explicit override survives independently of the session default, and is dropped when its dataset is removed, so re-uploading a file of the same name doesn't silently inherit a policy meant for something else.
Embeddings are data too¶
Text sent to be embedded is still data. A forbidden encoder degrades to the built-in hashing fallback instead of raising — retrieval quality getting worse is something you can live with; a failed question isn't.
Credentials¶
API keys live in a local credentials.json under your platform's config
directory — this is not encryption at rest, the guarantee is the same
OS-level access control ~/.aws/credentials relies on, stated plainly
rather than dressed up as something stronger. Keys are never logged and
never returned by any API route — only whether one is configured, and a
masked hint (…abcd).
Cost, when a cloud model runs¶
Token usage is reported per turn — three shapes of data depending on what
the provider actually returns, falling back to an estimate flagged as
inexact rather than silently reporting nothing. An unpriced model reports
tokens with no cost figure and is named as unpriced, rather than guessing at
a dollar amount. Under local-only, there is no cost meter at all — not
$0.00, which would read as a computed number, but an explicit statement
that there's nothing to meter.