AI assistant
A chat that answers questions about your data by composing the same reads the rest of this tool performs — “how many zones are there, and which courier has the most drops?” instead of clicking through Browse, Structure and the filter console yourself.
Configured per connection, so you can point a development database at OpenAI and leave production on a local model, or off entirely. Set it up from Set up assistant on the connection overview; once configured, the conversation is available as an Assistant tab beside Browse (scoped to the type you’re looking at) and as a connection-level page for cross-table questions.
What it can see
Section titled “What it can see”This is the part worth reading before you enable it.
- It can read every table in every connection configured in this tool — not only the one you opened the chat from. Cross-connection questions are the point, and that reach is the cost.
- What it reads — schemas, field names and document contents — is sent to the provider you configured, as part of the conversation. Treat it the way you’d treat pasting the same rows into that provider’s own web UI.
- Nothing is sent until you send a message. There’s no background indexing, no schema pre-fetch and no telemetry. Configuring the assistant does not, by itself, transmit anything; every request happens because you typed one. The Test button on the settings page is the one deliberate exception — it sends a fixed one-word prompt to prove the key works, and no database content.
- Connection strings and passwords are never included. The assistant can see that a connection exists and what backend it is, not how to reach it.
The same disclosure is on the settings page itself, so nobody has to have read this to have seen it.
It cannot write
Section titled “It cannot write”The assistant is given nine tools: list_connections, list_tables, list_types, describe_type,
table_stats, browse_documents, get_document, list_indexes and search_full_text. Every one is a
read.
There is no insert, update or delete tool, and no raw SQL tool — so read-only is a property of the tool surface rather than an instruction in a prompt the model might be talked out of. A test pins that exact list, so a write tool cannot be added by accident. Ask it to delete something and it will tell you it has no way to, and point you at the Browse and Edit tabs, which do.
Results are capped per call (50 rows, 4 KB of JSON per document) and truncation is reported to the model, so it reports a total from the count rather than from the rows it happened to receive.
Each reply lists the tools that ran, so what was read is visible per message rather than a claim made once at setup. The transcript lives in memory for the life of the browser session and is never written to disk — a file of production data sitting in the tool’s own store is a worse problem than losing history on refresh.
Providers
Section titled “Providers”| Provider | Notes |
|---|---|
| OpenAI | api.openai.com with your API key. |
| Azure OpenAI | Your own resource, so traffic stays in your tenant. The model box is the deployment name you chose in Azure, not the published model id. |
| Anthropic | Anthropic’s official .NET library (the Anthropic package). |
| OpenAI-compatible | Anything speaking the OpenAI wire format at a base URL you supply — OpenRouter, Groq, Gemini’s compatibility endpoint, LM Studio, vLLM, Ollama. |
The last one is also the privacy answer: point it at http://localhost:11434/v1 and a local model answers
your questions with nothing leaving the machine.
API keys are stored encrypted, the same way connection strings are — see the secret key.
Turning it off entirely
Section titled “Turning it off entirely”For a public instance — where a visible “configure AI” box invites a stranger to paste their own API key
into a database browser they don’t control — set ShinyDocDbMyAdmin:DisableAi. The feature is then
absent, not merely hidden: no tab, no settings link, the AI services aren’t registered at all, and the
/ai/... and /assistant/... routes refuse to render rather than being merely unlinked.
From an Aspire AppHost, .WithoutAi() does the same thing.
Demo mode forces it on.
For the library’s own AI story — MCP tools over your store from your application — see AI tools.


