Language models

Where a language model is used

Three places, all of them optional, none of them the simulation. Turn the key off entirely and the product still builds twins, runs scenarios, sweeps levers, writes briefs and answers questions. It just does the last two with retrieved rows instead of prose.

Why not just ask a modelWhat happens to your files

Every call is cached on a hash of the prompt, so asking the same thing twice costs nothing the second time.

The simulation never calls a language model. Neither does the network. Not once, not for a parameter, not for a tie break.

Demand responding to price, competitors responding to you, capacity being people, people costing money and money being cash are all arithmetic. So is the graph neural network, which trains on your own server on labels the engine produced. Given a seed, the same twin and the same levers produce the same numbers every time, on a machine with no internet connection. That property is the reason you can argue with the result rather than just believing it, and it is worth more than any amount of fluency.

The three

Exactly where a call can happen

Each of these is a single function with a fixed system prompt. There is no general purpose agent loose in the application.

Optional

Reading prose the rules could not parse

The rule based extractor goes first and goes every time. The model only sees chunks that produced nothing, is capped per pass, and is told never to invent a number that is not in the text and to return the shortest span that supports each fact. Everything it returns is written to the ledger marked as an estimate, with a wider band than a figure read by rule.

Optional

Rewriting a finished brief

The analysis is complete before this runs. It receives the finished numbers as JSON and is instructed to keep every number exactly as given, add none, soften nothing, and write about 350 words leading with the answer. It cannot change a result, because by the time it is called there is nothing left to compute.

Optional

Ask

A question about your twin, answered from a numbered evidence list the feature assembled: graph rows, ledger rows with their sources, network scores, run results and matching passages from your files. Since version two, every sentence containing a number has to carry the marker of the evidence it used, and the app counts the ones that do not and shows you the count above the answer.

The contract

What is sent, when, and what comes back

WhereWhat is sentWhen it happensWhat comes back
ExtractionThe document kind, the file title, the section heading and up to about 4,000 characters of one chunkOnly during a rebuild, only for chunks the rules produced no facts from, capped at a small number of chunks per passA JSON array of proposed facts, each with a quote. Written as estimates with a wider band and shown separately in the ledger.
Brief rewritingThe company name, the question, and the finished analysis as JSONOnly when you press the button on a completed runAbout 350 words of prose. No number may be added or changed, and the original structured brief remains available.
AskYour question, plus the numbered evidence the feature retrieved: graph rows, ledger rows, network scores, run results and matching passagesOnly when you ask a question and a key is configuredUnder 250 words with a marker on every sentence that carries a number, shown beside the exact numbered evidence it was given, with a count of any sentence that failed to cite.
The networkNothingNeverNot applicable. Training and scoring are arithmetic on your own server.
The simulationNothingNeverNothing. It is arithmetic.
The graph and the ledgerNothingNeverNothing. Both are built by rules from your facts.

No file is transmitted as a file. What goes out is text this software selected, in the sizes above, to the provider whose key is configured. There is a fourth prompt in the source, for describing an actor class the record barely mentions, which nothing in the application calls today. If it is ever wired in, it will appear in this table and on the changelog.

Caching

Every call is cached on a hash of the prompt

Before any request is made, the provider, the model, the kind of call, the system prompt and the user prompt are hashed together with SHA-256 and that hash is looked up in a cache table. A hit returns the stored response and no request is sent.

Two useful consequences. Rebuilding a twin after changing one file does not re-pay for the chunks that did not change. And the same question asked twice gives the same answer, which matters more than it sounds: a product where the answer drifts between two identical questions cannot be argued with.

Token counts are recorded per call so you can see exactly what has been spent, and a site wide monthly cap can be set so a runaway rebuild cannot produce a surprising bill.

  • Hash covers provider, model, call kind and both prompts
  • A hit is returned without any network request
  • Input and output token counts stored per call
  • A site wide monthly call cap, which ships at a few thousand
640 runs of one scenario

Your own key

Bring your own key, and the bill is between you and the provider

Members can put their own key and provider on their profile. When one is present it is used instead of the site key, and the site wide monthly cap does not apply to it, because you are paying the provider directly.

Two providers are supported: Anthropic, or anything speaking the OpenAI chat completions shape, which covers most hosted endpoints and most local servers. The base URL is configurable, so a model running on your own hardware is a supported configuration rather than a workaround.

This is also how the Explore plan gets language model features. The shared allowance is off on Explore, so the three optional calls are unavailable unless you supply a key of your own, at which point they work.

Plans and limits

Monthly revenuedocumentGross margindocumentPrice elasticitydefaultMonthly churndocumentCompetitor reactiondefaultContracted revenuedefaultLargest customer sharederivedCost per headderived

With no key at all

What you lose, stated precisely

Nothing structural. The extraction rules run, the graph builds, the agents generate, the simulation runs, sweeps run, comparisons run, the brief is produced with every section it normally has, and the ledger is complete.

What changes is the writing. The brief stays in its structured form rather than being rewritten into flowing prose. And Ask stops producing paragraphs and instead returns the rows: the matching graph nodes, the relevant ledger entries with their sources, and the run figures that bear on the question, with a plain sentence saying what they are.

That is a smaller loss than it sounds. A retrieved row with a source attached is often more useful than a fluent paragraph, and it can never be confidently wrong about something that is not in the data. The product was built so that this mode is the honest floor rather than a degraded state.

  • Extraction by rule is unaffected and runs every time regardless
  • The simulation, sweeps and comparisons are unaffected
  • The brief keeps every section, in structured form
  • Ask returns cited rows instead of prose
off track above 3.1%check here, month 3churn

A number produced by a language model never reaches the simulation without passing through the ledger first, where it is labelled as an estimate, given a wider band, and shown to you in a list you can edit. That is the whole leash, and it is short on purpose.

The obvious follow ups

So this is not an AI product?

Not in the sense people usually mean. The thinking is a discrete event simulation with agents in it, and that is arithmetic. A language model does three narrow jobs at the edges: reading awkward prose, writing English, and answering questions from material this software chose.

If the marketing of this were being optimised, that paragraph would be phrased differently. It is phrased this way because you can check it.

Which model is used?

Whatever is configured. The default points at a small, fast model because none of the three jobs needs a large one, and a self hosted install can point it anywhere that speaks either supported API shape.

Could the model change the answer without me noticing?

In extraction, yes in principle, which is why every fact it proposes is marked as an estimate, carries a quote from your own text, gets a wider band and appears in the ledger where you can see and change it. In brief rewriting and in Ask it cannot, because the numbers are already fixed before either call is made.

Does my data go to the provider for training?

That depends on your contract with the provider, not on this software. Check their terms for the key you configure. What this software controls is what it sends, which is listed in the table above, and the fact that it sends nothing at all when no key is present.

Can I switch it off after switching it on?

Yes. Remove the key, or switch the feature off in settings. Facts already extracted by a model stay in the ledger, still marked as estimates, and you can delete or replace them individually.

The part that matters runs with no key at all

Build a twin, run the question you have been putting off, and look at how far it gets before anything optional is involved.

Build a twinWhat the engine computes