The decision API

Uprelic Strom. Judgment you can automate.

Strom is an AI decision model and the decision layer for your workflows, agents and teams. It answers in milliseconds at a fraction of a chat model’s cost, tells you how often it’s wrong and checks every step against your rules.

90–430 ms per request · End to end in the EU

Reads any text, image or video: Emails, Invoices, Contracts, Support tickets, Reviews, Chats, Call transcripts, Forms, Receipts, PDFs, Spreadsheets, JSON, Logs, Web pages, Tool calls, Screenshots, Photos, Video.

Read the guide

What a decision model is. What changes with a decision model.

A decision model doesn’t write text. It reads your input, picks one of the answers you allow and tells you how sure it is, as a calibrated probability. 0.9 means it’s right about 9 times in 10. So every decision is fast, cheap and something your code can act on.

up to 5.3× faster
A three-step invoice check, end to end.
up to 70× cheaper
300,000 tickets a month, 8 decisions each.
0% invented answers
Only your options. It can pick the wrong one, never a new one.
≈97% known before it runs
You know how often each step is right, so you know it for the whole workflow.

Here are some concrete examples of how decision models differ.

Rules only match the words they were written for. A classifier is fast, but it learns one fixed set of answers from thousands of labelled examples and has to be retrained for every new question. A reasoning model handles anything, but it takes seconds, costs money on every call and gives no probability. Strom takes any question in plain words and answers it in milliseconds, with a calibrated probability.

Try it here. Play with it. No account needed.

Automation is a chain of small decisions.

Each one should be fast enough to wait for, cheap enough to ask every time, honest about how sure it is, and within your rules. That’s what Strom is built for.

One model, three jobs. Strom does the work. Guards it. Grades it.

Most decisions in an automation are small questions with a fixed set of answers, not open-ended reasoning. Strom answers them, so one model does the work, guards it and grades it.

Classify (Which one?)Check (Is it true?)Score (How much?)Locate (Where?)Extract (What exactly?)
WorkTriage support tickets by urgencyIs this invoice a duplicate?Rerank search results for this queryFind the damage on a car photoPull supplier, amount and due date
GuardWhich policy applies to this request?Does this tool call break a rule?How risky is this payment?Find faces and plates to blurMark the passages this user may not see
GradeWhat type of error was this?Is the answer grounded in its sources?Rate this reply from 1 to 5Did the agent track the right object?Did it fill every required field?

Does the work

The answer becomes data. What should accounts payable do with this invoice? hold for review (0.82)

Guards the work

The answer becomes a gate. Does refund($800) by a support agent break “no refunds above 500 without a manager”? yes · block (0.94)

Grades the work

The answer becomes a metric. Is the bot’s refund promise grounded in the policy? no (0.99)

Reliability. Know how often it’s wrong.

Every answer comes with a calibrated probability. Of the answers at 0.9, about 9 in 10 are right, so a threshold sets your error rate.

A confidence you can count on
A threshold sets the error rate you accept.
Can’t make one up
Every answer is one of your options. It can pick the wrong one, never a new one.

AI governance that runs. Let agents act. Within your rules.

Most AI governance is a document people are meant to follow. With Strom it runs. Each rule is a check, answered in milliseconds, before a tool runs, after it returns and before anything reaches another AI agent or a person.

  1. Before the call: Stops it before it happens. The agent calls run_shell git push --force origin main. Your rule: Never force-push, and never push directly to main. Strom: Blocked (0.98, 48 ms). The agent opens a pull request instead.
  2. After the result: Checks what comes back. The tool returns read_file config/database.yml → “password: hunter2”. Your rule: Block file contents that contain passwords, API keys or other secrets. Strom: Withheld (0.98, 32 ms). The agent never sees the password.
  3. Before the reply: Checks what it says. The agent replies reply “All done! Your $800 refund is on its way…”. Your rule: Never tell the customer an action is done unless a tool call did it. Checked before another AI agent or a person reads it.

Where the decisions are. In linear workflows, AI agents and human processes.

Automation runs on a fixed path or an open one, and many steps are still done by people. Each needs judgment where a rule runs out, on its own or all in one process.

Workflow (Logistics)

Crushed box

A crushed box on the belt.

  1. Your system: Parcel is scanned. at the warehouse gate
  2. Your system: Photo is taken.
  3. Strom: Is the packaging damaged?. damaged (0.8)
  4. Your system: Held for inspection. photo kept for the claim

Intact box

An intact carton on the belt.

  1. Your system: Parcel is scanned. at the warehouse gate
  2. Your system: Photo is taken.
  3. Strom: Is the packaging damaged?. intact (0.87)
  4. Your system: Ships as planned. label printed

Agent (IT operations)

Risky call

The agent wants to restart the production database, without a change ticket.

  1. Your system: Alert fires. disk 95% full on the production database
  2. An agent: Picks a tool. restart_db(production)
  3. Strom: Checks the tool call. no change ticket, blocked (0.97)
  4. Your system: Call is blocked. the agent asks the on-call engineer

Hidden instruction

The log the agent reads tells it to drop a database.

  1. Your system: Alert fires. disk 95% full on the production database
  2. An agent: Picks a tool. read_file(postgresql.log)
  3. Strom: Checks the tool call. allowed (0.93)
  4. Your system: Tool runs. the log has an instruction inside
  5. Strom: Checks the result. instruction inside, blocked (0.74)
  6. Your system: Result is dropped. the agent never acts on it

Safe call

The agent cleans up old log files.

  1. Your system: Alert fires. disk 95% full on the production database
  2. An agent: Picks a tool. cleanup_logs(older than 30 days)
  3. Strom: Checks the tool call. allowed (0.94)
  4. Your system: Tool runs. 412 files deleted, disk at 61%
  5. Strom: Checks the result. safe to use (0.93)

People (Manufacturing)

Complete report

A hydraulic hose replaced the way the policy says.

  1. A person: Technician files a report. “locked out, hose replaced, tested at 210 bar”
  2. Strom: Checked before it is sent. complete (0.98)
  3. A person: Supervisor signs off. one click
  4. Strom: Checked after sign-off. follows the safety policy (0.99)
  5. Your system: Work order closed. in your maintenance system

Missing test

The report leaves out the pressure test.

  1. A person: Technician files a report. “replaced hose, works again”
  2. Strom: Checked before it is sent. no pressure test, sent back (0.62)
  3. A person: Back to the technician. with what is missing

Skipped lockout

The repair was done with the machine running, and the supervisor signed it off.

  1. A person: Technician files a report. “hose replaced with the press running”
  2. Strom: Checked before it is sent. complete (0.97)
  3. A person: Supervisor signs off. one click
  4. Strom: Checked after sign-off. no lockout, second look (0.997)
  5. A person: Safety team takes a second look. before the press runs again

All together (E-commerce support)

Refund over €50

“My blender arrived with a cracked jug. I’d like my money back.”

  1. Your system: Ticket arrives. “arrived with a cracked jug”
  2. Strom: What does the customer want?. refund or return (0.99)
  3. An agent: Handles it. refund(order 4471, €89)
  4. Strom: Checks the tool call. over €50, ask a person (0.8)
  5. A person: Support lead approves. one click
  6. Strom: Grades the reply. clear next step (4.5 / 5)
  7. Your system: Reply is sent. with the refund

Where is my order?

“I ordered a blender a week ago and it still hasn’t arrived.”

  1. Your system: Ticket arrives. “still hasn’t arrived”
  2. Strom: What does the customer want?. order status (0.98)
  3. An agent: Handles it. get_tracking(order 4471)
  4. Strom: Checks the tool call. allowed (0.93)
  5. Strom: Grades the reply. clear next step (4.4 / 5)
  6. Your system: Reply is sent. with the tracking link

Speed and price. Chain decisions. Milliseconds each.

One forward pass, not a paragraph of reasoning. About 90 to 430 ms per request, so a chain of decisions finishes in about a second.

$0.042 per million input tokens, output free

First enterprise customer. Feddersen captures 20,000 inventory items from phone photos.

Feddersen Group started with one workflow, taking stock of its inventory from photos on a phone, and is taking Strom to the next ones.

Inventory was pure manual labour, and we tried several tools to cut it down. None of them worked, OCR included. Strom is the first that did. That gave us back countless hours in the first workflow alone and saved us not just money but a lot of frustration. That success is why we’re now expanding Strom to other areas of the group together with Uprelic.

Joachim Friedrich, Head of Digital Office, Feddersen Group

Read the case study

Built in Europe. Your data stays in the EU.

Strom is built by Uprelic, a German company. Requests are processed on GPUs in the EU, run for us by European cloud providers, and never forwarded to a third‑party AI provider. The only exception is the optional self-improvement of document extraction, which you turn on yourself and which uses an EU-hosted AI provider.

Questions. What people ask us.

What is a decision model?

A model that reads unstructured input, like an email, a PDF, a photo or a tool call, and answers a question you defined with one of your options and a probability. It doesn’t write text. That makes it fast, cheap and easy to check, so it can run at every step of a workflow.

How is this different from JSON mode or structured outputs?

JSON mode constrains the text a chat model writes. It still writes token by token, can still break the schema, and gives no calibrated probability. Strom never writes. It scores your options, and our API builds the JSON from the scores.

Can Strom be wrong?

Yes. It can pick the wrong option, like any model. It can’t invent a new one, and every answer carries a probability, so you can act automatically on confident answers and send uncertain ones to a person.

When should I still use an LLM?

For open-ended work like writing replies, summarising, planning and code. Use Strom for the decisions around that work, and your LLM runs far less often.

Does it work with images and video?

Yes. Send up to eight images per request and ask about them, find objects with a box question, or send a video frame by frame and get a fresh answer for every frame.

Where is my data processed?

On GPU servers in the EU, operated for us by a European cloud provider. No request goes to a third-party AI provider. Request contents are deleted after 7–365 days, depending on your plan, and never used to train any model. The only exception is the optional self-improvement of document extraction, which you turn on yourself and which uses an EU-hosted AI provider.

I already use Jev. Can I switch?

Strom accepts the same request format, a state and typed questions. Point your client at our API and use your Uprelic key.

Who is behind Strom?

Uprelic GmbH, a team in Berlin that builds AI for everyday business work. Strom grew out of the decision steps of our own AI agents.

Ask your first question.

100 free playground runs when you sign up. Then $0.042 per million input tokens, output tokens free, pay as you go.

Coding agents: everything about Strom (what it is, when to use it, the API, the Python SDK, pricing and limits) is in one Markdown file at https://platform.uprelic.com/skill.md. It doubles as an agent skill. For a hands-on tour with live calls, see getting-started-with-strom.md.