"No LLM provider is configured" (400)
"No LLM provider is configured" (400)
What it means: GridOS has no API key for any provider. The AI agent cannot run without at least one configured key.How to fix it:…and restart the server.
- Click the gear icon in the GridOS menubar to open Settings.
- Paste an API key for at least one provider — Gemini is recommended.
- Save and close Settings.
- The model picker in the chat composer will now show available models. Send your prompt again.
.env file in the repository root with one of:"The API key for this model was rejected" (401)
"The API key for this model was rejected" (401)
What it means: The provider returned a
401 Unauthorized response. The key you configured is invalid, expired, belongs to a different product (e.g. a Google Cloud Vertex AI key pasted into the Gemini slot), or has trailing whitespace.How to fix it:- Open Settings (gear icon).
- Find the provider whose key was rejected.
- Delete the existing key entry first — don’t just paste over it. Stale trailing characters are the single most common cause of persistent 401s.
- Copy a freshly-generated key from the provider’s console (click the copy button, don’t select-and-copy, which can grab whitespace).
- Paste and save. Retry your prompt.
"Request too large" / TPM exceeded (413)
"Request too large" / TPM exceeded (413)
What it means: The provider rejected the request because it would exceed the tokens-per-minute budget for the selected model on your current plan. Common on Groq’s free tier because reserved completion tokens count against the TPM bucket up-front — a 16K reservation on a 3.5K prompt “requests” ~19K tokens from the provider’s perspective, even though the model will only emit a few thousand.Typical message:How to fix it:
- Switch to a higher-TPM provider. Gemini Flash Lite has ~250K free-tier TPM — 30× what Groq free gives you. Pick it in the model picker and retry.
- Enable chain mode. In the chat composer, check the
Chaintoggle so the agent emits one rectangle per LLM call instead of packing the whole model into a single multi-intent response. This keeps each request well under any free-tier TPM cap. - Upgrade the provider. Groq Dev Tier (~$5/mo) raises TPM caps substantially. Anthropic’s paid tier similarly.
- Wait 60 seconds. TPM is a rolling-minute bucket. Back-to-back failed attempts can double-count against the budget; a one-minute cooldown resets it.
"Model provider is temporarily overloaded" (503)
"Model provider is temporarily overloaded" (503)
What it means: The provider returned a transient error (gateway overload, upstream timeout). GridOS already retried the request four times with exponential backoff (~1s, ~2s, ~4s) before surfacing this error.How to fix it:Wait a moment, then send your prompt again. Transient overloads on Groq and OpenRouter free tiers are common during peak hours. If the error persists, switch to a different provider in the model picker — for example, switch from Groq to Gemini while Groq recovers.
Formula guard: "agent proposed formulas whose inputs are empty" (422)
Formula guard: "agent proposed formulas whose inputs are empty" (422)
What it means: The AI proposed one or more formulas that reference cells which are currently empty. Applying them would produce How to fix it:
#DIV/0! errors or misleading zeros. GridOS blocks the write before it touches the sheet.The error message lists the affected cells and their empty references:- Re-ask the agent to include the inputs. “Fill in C3 and B3 with the baseline values first, then add the formula in C4.”
- Fill the cells manually and re-send your original prompt.
- Switch to multi-intent mode (the default on the agent). Multi-intent responses populate dependencies and formulas atomically in one call, so the guard sees all writes at once and doesn’t false-flag forward references.
"Model returned non-JSON output" / empty response (422)
"Model returned non-JSON output" / empty response (422)
What it means: The model either returned no content at all (usually hit its output-token cap with
finish_reason=length) or returned prose that can’t be parsed as JSON. Common on smaller or older OSS models on complex prompts.How to fix it:- Switch to a stronger model. Gemini Flash Lite, Claude Haiku, or GPT-OSS 120B all handle structured output more reliably than tiny free-tier models.
- Shorten the prompt. If you’re asking for a 3-statement model in one turn on a small model, split into smaller prompts (“build the income statement first, then the balance sheet”).
- If
finish_reason=length, the model ran out of output tokens. Either switch to chain mode (smaller responses per turn) or use a Groq model with a higher reservation (120B, 70B versatile).
Cell shows "#PARSE_ERROR!"
Cell shows "#PARSE_ERROR!"
What it means: The formula string in that cell could not be tokenized. The most common causes in agent-generated formulas used to be Excel-isms like
What’s still unsupported:
$C$5 absolute refs or 15% percent literals — but GridOS now normalizes those automatically before parsing.What GridOS already handles transparently:| Excel-ism | Normalized to |
|---|---|
$C$5, $C5, C$5 | C5 (no fill-down semantics here, so $ is noise) |
15%, 0.5% | (15*0.01), (0.5*0.01) |
Unicode −, ×, ÷, –, — | ASCII -, *, / |
- Comparison operators in infix form (
=A1 > 0): use the named form=GT(A1, 0)instead. - Cross-sheet references (
=Sheet2!A1): on the roadmap. - Nested function calls in cells (
=SUM(MAX(A1,B1), C1)): valid only inside macro bodies — see Formulas.
- Open the cell in the formula editor.
- Look at the raw formula string. If it uses comparison operators or cross-sheet refs, rewrite with named functions or move the data to the active sheet.
- If you can’t spot the problem, re-ask the agent with a more constrained prompt (e.g. *“use MULTIPLY, not ”).
Cell shows "#NAME? (Unknown function: X)"
Cell shows "#NAME? (Unknown function: X)"
What it means: The formula called a function that isn’t in the registry — either a typo (
=MULTIPLE vs =MULTIPLY) or an Excel-only function (=VLOOKUP).How to fix it:- Cross-check against the built-in primitives table.
- If the function you need genuinely doesn’t exist in GridOS, create a user macro or ship it as a plugin.
Cell shows "#VALUE!" or "#DIV/0!"
Cell shows "#VALUE!" or "#DIV/0!"
#VALUE! — a function received the wrong number of arguments, or a non-numeric value where a number was required. Inspect the cell references to confirm they contain numeric data.#DIV/0! — DIVIDE was called with a zero denominator. Check that the denominator cell has a non-zero value. The pre-apply guard catches the most common form of this (empty denominator cell), but a cell that’s explicitly 0 still triggers it at calc time."No save file found" on load
"No save file found" on load
What it means: You clicked Load (or the server tried to auto-load on startup) but no
system_state.gridos file exists. This happens on a fresh install or after the save file has been deleted.How to fix it: This is not an error — it simply means no previous session was saved. Start fresh by describing what you want to build in the chat, or open a preset template. Save your workbook after making changes using File → Save to create a save file for future loads.Chart not appearing after the agent adds one
Chart not appearing after the agent adds one
What it means: The agent wrote a
chart_spec but the chart didn’t render. The most common cause is that the data range referenced in the spec contains no data — the chart renderer has nothing to plot.How to fix it:- Check that the cells in the data range actually contain values.
- If the cells are empty, ask the agent to populate the data first, then add the chart: “Fill A1:B6 with the revenue data, then add a bar chart.”
- If the data is present but the chart still doesn’t appear, ask the agent to re-create it by referring to it by name — GridOS upserts charts by title, so re-issuing the same spec updates the existing chart in place.
When to switch providers vs fix the prompt
Rough rule of thumb:| Symptom | Fix |
|---|---|
| 401 / rejected key | Re-paste the key from provider console |
| 413 TPM exceeded | Switch provider or enable chain mode |
| 422 empty-input formula guard | Re-prompt to include dependencies |
| 422 non-JSON output | Switch to a stronger model |
#NAME? in cells | Typo or unsupported function — see the primitives table |
#PARSE_ERROR! in cells | Formula uses unsupported syntax (comparison infix, cross-sheet refs) |
#VALUE! | Wrong arg count or type — inspect references |
#DIV/0! | Denominator is literal zero — fix the input data |