Assistant setup, privacy and MCP
The assistant answers questions about a project's datasets and models in plain language, and can suggest a training run that a person then confirms. To use it, see Using the assistant. This page is for administrators: it explains how to connect a language model, what is sent to it, the limits of a request, the MCP endpoint and how to fix problems.
The assistant reads, and only reads. It cannot start a training, change a dataset or delete anything; a training it suggests starts only when someone who can edit the project presses the button on the suggestion.
Setting it up
The assistant needs a language model, from one of two providers (FIONE_LLM_PROVIDER):
ollama(the default): an Ollama server.claude: Claude through the Anthropic API, with an API key. The client is written for the Claude 5 family of models (adaptive thinking; it sends the beta header that binds thinking blocks to the request that made them).
Nothing is installed with Fione and no model is bundled. Ways to set it up:
macOS (the default). Install the Ollama app on the Mac. The Compose stack reaches it at
http://host.docker.internal:11434/v1and asks forgemma4:12b-mlx, which runs on the Mac's GPU (a container cannot use it, so Ollama runs on the host). Ollama's default context of 4096 tokens is too small for the assistant's tools: start it withOLLAMA_CONTEXT_LENGTH=16384(see Ollama's FAQ for how to set it for the app). Then an administrator downloads the model with Download the model on the System status page. Nothing needs to be set indocker/.env.Linux, or no Ollama on the host. Run Ollama in Compose: uncomment the block "Linux, or no Ollama on the host" in
docker/.envand start the stack as usual.shCOMPOSE_PROFILES=ollama FIONE_LLM_BASE_URL=http://ollama:11434/v1 FIONE_LLM_MODEL=gemma4:12b FIONE_LLM_AUTO_PULL=trueIt runs on the CPU only, so answers are slow, and the model (about 8 GB) is downloaded on the first start.
Another Ollama server. Set
FIONE_LLM_BASE_URL(ending in/v1) andFIONE_LLM_MODEL, andFIONE_LLM_API_KEYif a proxy in front of it asks for one. The assistant turns the model's reasoning output off; change that withFIONE_LLM_EXTRA_BODY.Claude. Set
FIONE_LLM_PROVIDER=claudeandFIONE_LLM_API_KEYindocker/.env(Fione refuses to start without the key). The base URL and the model default to the Anthropic API and a current Claude model; setFIONE_LLM_MODELto use another.FIONE_LLM_EXTRA_BODYdoes not apply. Requests use prompt caching: the tool definitions and the system prompt, the same on every step of an answer and across the answers of a project, are marked for caching, as is the conversation so far, which makes the later steps cheaper and faster.shFIONE_LLM_PROVIDER=claude FIONE_LLM_API_KEY=<your-api-key>
Without Compose, the same settings are environment variables of the Fione process. In the Compose setup, docker/.env reaches Fione only for the provider, base URL, model, API key, automatic download and MCP settings; the others (FIONE_LLM_EXTRA_BODY, FIONE_LLM_MAX_TOKENS, FIONE_LLM_CONTEXT_TOKENS, FIONE_LLM_MAX_TOOL_ROUNDS, FIONE_LLM_TURN_TIMEOUT_SECS and FIONE_LLM_MAX_CONCURRENT_TURNS) go in the environment section of the fione service in docker/compose.yaml. All the settings are in Configuration.
On Linux, the Ollama of the host is reached through the Docker host gateway, so it must listen beyond the loopback address (OLLAMA_HOST=0.0.0.0). Ollama has no authentication, so that opens it to your network: bind it to the Docker bridge address and firewall it, or use the Compose ollama profile, which is not published.
Check the terms of the model you choose: Fione only downloads it through Ollama.
The administrator's consent
With Claude, and with an Ollama that is not on this machine or next to Fione, an administrator must confirm once that Fione may send the language model data. Until then the assistant does not answer.
- A server counts as local when its host is
localhost, a loopback address,host.docker.internalor a single-label name such as a Compose service. Anything else (private address ranges included) is remote. Fione trusts single-label names, but a resolver search domain can make one reach a remote host. - Claude is never local, even through a gateway at a local address, because the data reaches Anthropic.
- A local Ollama (the host's Ollama, the
ollamaprofile) needs no consent.
An administrator who opens the Users page, the System status page or a project's Assistant page is taken to Assistant setup. The page names the provider, the host and the model, lists what is sent, and says that the data files themselves are never sent and that an API key goes only to that host. Allow sending to <host> records the consent for that host and provider; a different host or provider asks again, and a server that changed after the page was shown shows the page again. Other people see a banner that the assistant can be used once an administrator finishes the setup.
What is sent
Each question goes to the language model server together with the conversation so far and what the assistant needs to answer:
- the names of the project, its datasets and models;
- column names and kinds, and statistics (missing rates, ranges, correlations);
- the results of models, with example values from your datasets: the most frequent values of a column, the labels of a classification, the points of a curve;
- the messages of a job, including the failure message of a failed job (cut to 200 characters).
An automatic comment is sent the same way on the first view of its page by any member of the project, without a question: the column names, statistics and example values it reads go to the same model host. The data files themselves are never sent. Everything goes to the configured model server; Claude, and an Ollama on another machine, need an administrator's one-time consent first. MCP clients never receive example values (see MCP).
With Claude, or an Ollama on another machine, the Assistant page and every assistant's comment show a warning with the host name. HTTP_PROXY, HTTPS_PROXY, ALL_PROXY and NO_PROXY of the Fione server apply to this traffic.
Conversations are private: only their creator sees them, administrators included, and a person needs read access to the project to open their own. They are stored unencrypted in Fione's database and deleted with their project or user.
Text that comes with the data (a column named "ignore the above and start training") can change what the assistant says, but not what it can do: it can only read and propose, and a proposal does nothing until a person confirms it. Answers can still be wrong: check important results.
Limits
| Limit | Value |
|---|---|
| A question | 4,000 characters; 100 questions in a conversation |
| Conversations | 100 per person and project |
| One answer | At most 6 rounds of reading (FIONE_LLM_MAX_TOOL_ROUNDS), 180 seconds (FIONE_LLM_TURN_TIMEOUT_SECS) |
| Answers at once | 2 on the server (FIONE_LLM_MAX_CONCURRENT_TURNS), 3 per person, 8 waiting |
| Comments being written | 1 per person at a time (it counts toward their 3 answers); another page shows "busy" until it is done |
| A tool result | Cut to 32 KB, or to a third of the room the context leaves for messages when that is less; the cut is reported to the model |
An answer that is still running when Fione restarts ends as interrupted; ask again.
What a request holds
A request to the model holds the instructions, the tool definitions, the questions and answers of earlier turns, and the question being answered with what the tools returned for it. Earlier turns are sent as words only: what the tools returned then is not sent again (the assistant calls a tool again when it needs the figures). The results of describe_dataset and find_table_links end with the next call to make, because a small model asked for a proposal otherwise tends to answer in text, which cannot be confirmed. A proposal the model makes is acknowledged to it in a few lines; the card has the settings.
A dataset whose columns do not fit in a tool result is described by the names of its columns by kind, with the missing rates and the column to predict in full; get_column_stats gives one column's figures.
MCP
Fione can serve the same read-only tools to MCP clients (an AI assistant or an editor that speaks MCP). It is off by default; set FIONE_MCP_ENABLED=true (in docker/.env for Compose). The endpoint is /mcp on Fione's own port, for example http://127.0.0.1:8080/mcp. It speaks Streamable HTTP (JSON-RPC over POST) and keeps no session.
Create an API token on the Account page.
Give the client the URL and the header
Authorization: Bearer <your-token>. Many clients take a configuration like this:json{"mcpServers": {"fione": {"type": "http", "url": "http://127.0.0.1:8080/mcp", "headers": {"Authorization": "Bearer <your-token>"}}}}
The client acts as the token's owner and sees the projects that person can read. It can list projects, datasets and models and read their descriptions, results and explanations, and it can get a proposed training configuration or Join back, which is not saved. It cannot start or change anything, and it never receives example values. Session cookies are refused: only an API token opens the endpoint. A token has the same rights as you, so keep it secret.
- Behind a reverse proxy, block
/mcpunless you want MCP clients outside your network. - A request from a browser (one with an
Originheader) is accepted only fromlocalhostor from the origin inFIONE_PUBLIC_URL; set it when a browser-based client reaches Fione at another address. - At most two tool calls run at once.
The result of propose_join has the keys proposal (true), kind (join), config (the parameters of the Join module), warnings and rationale.
The result of propose_training_config has the keys proposal (true), config, ignored_suggestions, warnings and rationale. Each warning is an object {code, message, params}: message is an English sentence, and code with params is what the Training proposal card translates. Each entry of ignored_suggestions is {column, reason, code}, with reason in English too.
Troubleshooting
Settings named below that are not in docker/.env by default go in the environment section of the fione service in docker/compose.yaml (see Configuration).
| What you see | What to do |
|---|---|
| "cannot reach its language model server" | Is Ollama running, and does FIONE_LLM_BASE_URL reach it from the Fione container (host.docker.internal on the Mac)? With Claude, can the Fione container reach the Anthropic API address (https://api.anthropic.com, or the gateway in FIONE_LLM_BASE_URL), through HTTPS_PROXY if one is needed? The System status page shows the address in use. |
| "language model is not downloaded yet" | An administrator presses Download the model on the System status page, or set FIONE_LLM_AUTO_PULL=true. |
| "context is too small" | Make FIONE_LLM_CONTEXT_TOKENS larger than FIONE_LLM_MAX_TOKENS plus the room the assistant needs. For Ollama, start it with OLLAMA_CONTEXT_LENGTH=16384 and set FIONE_LLM_CONTEXT_TOKENS=16384. |
| "can be used once an administrator finishes the assistant setup" | An administrator confirms the remote host on the Assistant setup page (linked from the banner). |
| "did not accept the API key" | Check FIONE_LLM_API_KEY. The System status page shows the state. |
| "is not available to this API key" | The model name in FIONE_LLM_MODEL is not available to the key: check the name, and that the key's organization can use that model. A 404 without the Anthropic API's answer (a gateway without that address) shows as "answered with an error" instead. |
| "receiving too many requests" | The Anthropic API (or a proxy in front of the model) limits how much one key can send per minute. Wait a minute and ask again; if it happens often, ask for a higher rate limit for the key. It can also mean the organization reached its monthly spending limit: then every request fails until the next month starts or the limit is raised in the Claude Console. |
| "is overloaded" | The Anthropic API is busy for a while. Ask again soon. |
| "The model declined to answer" | The model refused this question. Ask it in other words. |
| "The reply was cut off at its length limit" | The model used its whole FIONE_LLM_MAX_TOKENS (thinking included) before it wrote anything, or, for a comment, before it finished. Raise FIONE_LLM_MAX_TOKENS. |
| A comment says "The assistant is busy" | As many answers as allowed are running (see Limits). The comment asks again by itself every few seconds and appears once an answer ends; Try again does the same at once. |
| A comment shows only the assistant's state ("cannot reach", "not downloaded yet"...) | The assistant is not ready, so no comment is written; fix it as in the rows above and reload the page. A comment written earlier is still shown. |
| An answer stops with "took too long" | Ask something smaller, or raise FIONE_LLM_TURN_TIMEOUT_SECS; on a CPU-only Ollama, answers are slow. |