Decision Engine: Use cases
Nine built-in Decision Engine presets — who they are for, how to call them, what to do with the answer and where the human stays in the loop.
The presets are built in and usable via API, in chat and via MCP. Questions and options may still change; every preset therefore carries a version number that is echoed in every answer.
The Decision Engine does not answer a question with prose but with probabilities over a fixed set of options. This page shows what that is good for in practice — using the nine presets that ship with SovrGPT.
What a preset is
A preset is a server-side question pack: one or more questions with fixed options, levels or yes/no, plus a short instruction per question. You send only the preset id and the state — the text, document or JSON object to decide about. The questions live on our side so that they read the same on every call and for every customer. That is the prerequisite for calibrating them later and for quality reports per preset.
How to call a preset
curl https://sovrgpt.com/api/v1/decisions \
-H "Authorization: Bearer $SOVR_KEY" -H "content-type: application/json" \
-d '{
"preset": "ticket-routing-v1",
"state": "Since this morning I cannot log in."
}'Three things hold for every preset on this page:
- Answers are recommendations. Every answer carries
abstain— with the defaultreview_onlyit is alwaystrue. Your workflow decides what follows; the engine does not act. How to set a threshold rule instead is described under Release. - Every choice question has a domain abstention — an option such as
unclearorother, always the last one. If the model picks it,abstainstaystrueeven with a threshold rule. For “unsure → a human reviews” that is more reliable than a percentage. - Two presets expect a JSON object as state
(Application complete? and
Grounding check). Send the object directly as
state, not as a string — the questions refer to its fields.
The full list with all questions and example states is returned by
GET /v1/decisions/presets.
Ticket routing
Id: ticket-routing-v1 · For: customer service, helpdesk, shared service centres
A support mailbox or ticket system receives messages that someone has to read, assign to a team and order by urgency before anyone replies. The ticket system sends the message text as state; back come team, urgency level, review need and language as fields that sort the queue directly. A chat answer would be an explanation nobody reads — what is needed is one assignment per ticket in milliseconds, with a probability.
| Question | Type | Options / levels |
|---|---|---|
team | choice | support technical help, login, errors · billing invoices, payments, contracts · sales quotes, plans · unclear ambiguous or unassignable (abstention) |
urgency | score | 0 not urgent · 1 slightly urgent · 2 normal · 3 urgent · 4 very urgent — immediately |
needs_human | binary | yes = money, contracts, complaints, legal matters or unclear situation · no = a standard reply is acceptable |
language | choice | de · en · other other or mixed |
curl https://sovrgpt.com/api/v1/decisions \
-H "Authorization: Bearer $SOVR_KEY" -H "content-type: application/json" \
-d '{
"preset": "ticket-routing-v1",
"state": "Seit heute früh kann ich mich nicht mehr anmelden. Außerdem wurde meine Rechnung für September doppelt abgebucht — bitte prüfen Sie das dringend."
}'Using the answer. team picks the queue, urgency the position in it,
language the template of the first reply. unclear and every ticket with
needs_human: true is seen by a person before a reply goes out — the engine routes,
it does not answer.
Building your own. Replace the three teams with yours — the description per
option is the text the model reads, so prefer “invoices, payments, refunds” over just
“accounting”. The abstention unclear stays in last place.
Inbox document classification
Id: inbox-document-v1 · For: administration, back office, mail room, accounting
A central postal address or scan mailbox receives dozens of letters every day: supplier invoices, reminders, contracts, job applications, official mail, advertising. Today a person opens every document, skims it and forwards it — the deadline is often only on page two. The DMS or mail server delivers the OCR text as state; afterwards a workflow sets the folder, the responsible unit and the deadline flag, and documents with a high need for action are at the top of the list at once. What is needed is one field per document with a probability, in milliseconds and for a fraction of a cent.
| Question | Type | Options / levels |
|---|---|---|
doc_type | choice | invoice invoice, credit note · reminder payment reminder, dunning letter · contract contract, offer for signature · termination termination, withdrawal · application job application · complaint complaint, claim · authority official letter · advertising advertising, newsletter · other no category clearly applies (abstention) |
has_deadline | binary | yes = concrete deadline with an obligation to act · no = no deadline or only vague timing |
action_level | score | 0 no action needed · 1 low · 2 normal (usual course of business) · 3 high (deadline running) · 4 critical (legal or financial consequences) |
language | choice | de · en · other |
curl https://sovrgpt.com/api/v1/decisions \
-H "Authorization: Bearer $SOVR_KEY" -H "content-type: application/json" \
-d '{
"preset": "inbox-document-v1",
"state": "Sehr geehrte Damen und Herren,\n\nzu unserer Rechnung Nr. 2026-0871 vom 12.08.2026 über 1.845,20 € haben wir bislang keinen Zahlungseingang festgestellt. Wir bitten um Ausgleich bis spätestens 30.09.2026. Sollte die Zahlung bereits erfolgt sein, betrachten Sie dieses Schreiben als gegenstandslos.\n\nMit freundlichen Grüßen\nBuchhaltung Müller & Sohn GmbH"
}'Using the answer. doc_type picks the folder and the responsible unit,
has_deadline sets the follow-up, action_level sorts the list. Everything that is
other, carries a deadline or has action level 3–4 goes to a person — the engine
pre-sorts, it does not process.
Building your own. The state is the OCR text; headers and footers may stay in.
If you need your own document types (delivery note, order confirmation), add them as
options with a clear boundary and keep other at the end.
Customer feedback analysis
Id: customer-feedback-v1 · For: customer service, customer success, product management
After a purchase, a support contact or a contract year, companies collect free-text feedback through surveys, shop reviews and social media — often thousands of entries nobody reads in full. The text (optionally with an NPS value or the source as JSON) is the state; afterwards four values go to the CRM or BI system: a high churn risk creates a task for customer success, topic distributions feed the product dashboard, and only feedback with “response needed” lands in the work queue. A chat model could summarise every review — what is needed are four comparable fields per entry that you can put thresholds on.
| Question | Type | Options / levels |
|---|---|---|
sentiment | score | 0 very negative · 1 rather negative · 2 neutral or mixed · 3 rather positive · 4 very positive |
churn_risk | score | 0 no indication · 1 low · 2 elevated (switching, return or competitor mentioned) · 3 high (cancellation announced or done) |
topic | choice | product · price · service · delivery · usability · other other or no concrete topic (abstention) |
needs_response | binary | yes = question, unresolved problem, concrete request · no = pure review without an open issue |
curl https://sovrgpt.com/api/v1/decisions \
-H "Authorization: Bearer $SOVR_KEY" -H "content-type: application/json" \
-d '{
"preset": "customer-feedback-v1",
"state": "Die Kamera macht bei Tageslicht wirklich gute Bilder, aber nachts ist alles verrauscht, da hilft auch der Nachtmodus nicht. Der Support hat freundlich geantwortet, konnte aber nichts ändern. Für 349 € hätte ich mehr erwartet. Wenn das angekündigte Firmware-Update nichts bringt, geht sie zurück."
}'Using the answer. Churn risk 2–3 and every needs_response: true entry is
handled by a person; topic and sentiment go to the dashboard in aggregate. The
engine decides who comes first — never what is answered.
Building your own. For sentiment and churn_risk, expected_index gives a
finer value than the chosen level — useful when charting trends over months. Use
sovr-decision-v2 for that, whose probabilities are finer-grained.
Lead qualification
Id: lead-qualification-v1 · For: sales, inside sales, marketing automation
Website form, trade fair and e-mail bring in enquiries every day, from a bachelor's thesis to a corporate tender. Sales should call the few hot leads within an hour but works through the list chronologically. The enquiry text (plus form fields such as company or headcount) is the state; afterwards the CRM builds a priority from fit and timeline: a strong fit with a short horizon goes straight to an account manager, a weak fit without a timeframe into the nurturing track. Sales needs four fields that are named the same in every record and can be sorted by threshold.
| Question | Type | Options / levels |
|---|---|---|
fit | score | 0 no fit (private person, application, advertising) · 1 weak (organisation visible, no use case) · 2 good (concrete use case) · 3 very good (use case plus scope, user count or project) |
timeline | score | 0 no timeframe · 1 long-term · 2 mid-term · 3 short-term · 4 immediate (running project, deadline, tender) |
budget_signal | choice | stated amount or range given · implied budget exists without an amount · no_budget explicitly no budget · unclear no statement (abstention) |
decision_maker | binary | yes = sender decides or owns procurement · no = no role or no decision-making role visible |
curl https://sovrgpt.com/api/v1/decisions \
-H "Authorization: Bearer $SOVR_KEY" -H "content-type: application/json" \
-d '{
"preset": "lead-qualification-v1",
"state": "Betreff: Anfrage KI-Assistent\n\nGuten Tag, ich bin IT-Leiterin eines Maschinenbauunternehmens mit rund 850 Mitarbeitenden an drei Standorten. Wir suchen bis Ende Oktober eine DSGVO-konforme KI-Lösung für unsere 120 Konstrukteure, da unser bisheriger Anbieter zum 31.12. den Dienst einstellt. Das Budget für 2027 ist freigegeben. Können wir nächste Woche telefonieren?\n\nViele Grüße\nDr. Karin Vogt"
}'Using the answer. fit and timeline become a priority; a strong fit with
timeline 3–4 goes straight to a person. The engine prioritises, it does not
disqualify — every enquiry stays visible, and sales decides about quote and contact.
Building your own. Form fields belong in the state, most simply as a JSON object
with the free text as one field. If you need an industry question, add it as a choice
with an other option.
Public-authority inbox
Id: behoerden-posteingang-v1 · For: public administration
The mail room of a city administration receives hundreds of e-mails and scanned
letters every day — applications, objections, complaints, notices, advertising.
Today an employee reads every message and distributes it by hand; for objections
with deadlines, every day of idle time is a liability risk. The engine delivers four
machine-readable values per message with which the document management system puts
the message into the right inbox, gives deadline matters a follow-up and presents
escalations to the head of office — with a rule such as “unclear or review
needed → mail room, otherwise inbox”.
| Question | Type | Options / levels |
|---|---|---|
art | choice | antrag application · widerspruch objection (including appeals) · beschwerde complaint · anfrage enquiry · mitteilung notice without a request · sonstiges not an administrative matter · unclear several matters or request not identifiable (abstention) |
zustaendigkeit | choice | buergerservice citizens' and registry office · ordnung public order and traffic · bauen building authority · soziales social affairs, youth, education · finanzen treasury and tax office · unclear (abstention) |
fristrelevant | binary | yes = a running deadline with legal or financial consequences (an objection is always deadline-relevant) · no = no deadline |
eskalation | binary | yes = press, supervisory body, court, petition or legal steps threatened · no = no threat of escalation |
curl https://sovrgpt.com/api/v1/decisions \
-H "Authorization: Bearer $SOVR_KEY" -H "content-type: application/json" \
-d '{
"preset": "behoerden-posteingang-v1",
"state": "Sehr geehrte Damen und Herren, gegen den Bußgeldbescheid vom 3. September 2026 (Az. 0815/26, Parken im eingeschränkten Halteverbot) lege ich hiermit fristgerecht Widerspruch ein. Mein Fahrzeug stand zum genannten Zeitpunkt nachweislich in der Werkstatt, die Rechnung liegt bei. Ich bitte um Aufhebung des Bescheids. Mit freundlichen Grüßen, Katrin Vogel"
}'Using the answer. zustaendigkeit picks the inbox, fristrelevant sets the
follow-up, eskalation presents the case to the head of office. unclear and
everything below the threshold stays in the mail room; objections and escalations are
never filed without review by a case worker, and the engine never replies itself.
Building your own. The five units are a typical, not a complete, administrative structure. Adapt the options to your organisation chart — one list of duties per option, as above, so that the model assigns “dog tax” to the treasury and not to the public order office.
Application complete?
Id: antrag-vollstaendigkeit-v1 · For: public administration · State: JSON object
An online application portal (housing benefit, childcare place, basic income support) stores every application as a structured record with mandatory fields, a list of documents and a scan status. After receipt, someone has to check whether the case can be processed at all or whether documents must first be requested — today a manual review that takes days and eats into the processing deadline. The engine answers the pre-check at once: complete or not, what is missing, whether the data is consistent and which step follows. Because the answer is structured, the case system can prepare a request letter with the right list of documents or hand the application to case processing.
The state is an object with the fields antragsart, eingangsdatum,
pflichtfelder (object), erforderliche_unterlagen (list of names),
eingereichte_unterlagen (list with name and lesbar), unterschrift_vorhanden
and anmerkung. The field names are German because the questions refer to them.
| Question | Type | Options / levels |
|---|---|---|
vollstaendig | binary | yes = all mandatory fields filled, all documents submitted and legible, signature present · no = at least one of these is missing |
hauptmangel | choice | keine none · unterlage_fehlt document missing · unterlage_unlesbar document illegible · pflichtfeld_leer mandatory field empty · unterschrift_fehlt signature missing · mehrere_maengel several defects · unclear not determinable (abstention) |
widerspruch | binary | yes = data contradicts itself or is obviously implausible · no = consistent, even if something is missing |
naechster_schritt | choice | bearbeiten start case processing · nachfordern request what is missing · ruecksprache internal clarification before any contact · unclear (abstention) |
curl https://sovrgpt.com/api/v1/decisions \
-H "Authorization: Bearer $SOVR_KEY" -H "content-type: application/json" \
-d '{
"preset": "antrag-vollstaendigkeit-v1",
"state": {
"antragsart": "Wohngeld (Mietzuschuss)",
"eingangsdatum": "2026-09-18",
"pflichtfelder": { "name": "Anna Berger", "geburtsdatum": "1987-04-12", "anschrift": "Lutherstraße 4, 07743 Jena", "haushaltsmitglieder": 2, "iban": "DE89370400440532013000" },
"erforderliche_unterlagen": ["Mietvertrag", "Einkommensnachweis", "Mietbescheinigung"],
"eingereichte_unterlagen": [ { "name": "Mietvertrag", "lesbar": true }, { "name": "Einkommensnachweis", "lesbar": false } ],
"unterschrift_vorhanden": true,
"anmerkung": "Einkommensnachweis ist ein unscharfes Handyfoto."
}
}'Using the answer. naechster_schritt drives the case system: nachfordern
prepares the letter with the list of documents, bearbeiten releases the
application. Every request letter is approved before sending, ruecksprache and
unclear always land with a case worker, and the engine never decides on approval.
Building your own. The field names are part of the question — if your portal uses other names, map them before the call or write your own questions that name your fields. Do not send the state as a string: the object is serialised canonically so that the same application always yields the same state.
Publication release check
Id: veroeffentlichung-check-v1 · For: communications, data protection and compliance, public administration
Press office, social media team and departments of an authority or a company publish texts every day — press releases, posts, FAQ answers, newsletters, public council documents. A typical data protection incident is not an attack but a well-meant text that names third parties' names, addresses, licence plates or health details. The engine checks every draft before the click on “publish” and returns a release recommendation that the editorial system can show as a traffic light or enforce as a block — for every draft, not just the ones someone has doubts about.
The state is the text to check; a first line Kanal: … only describes the channel
and is not part of the text.
| Question | Type | Options / levels |
|---|---|---|
personenbezug_dritter | binary | yes = personal data of identifiable third parties included · no = none, or only persons in an official role |
art9_daten | binary | yes = special categories under Art. 9 GDPR of an identifiable person · no = no Art. 9 data or no personal reference |
tonalitaet | score | 0 factual, respectful · 1 slightly inappropriate (flippant, ironic) · 2 clearly inappropriate (condescending, threatening) · 3 unacceptable (insulting, discriminatory) |
freigabe | choice | freigeben release · ueberarbeiten fixable objection · nicht_freigeben data protection or legal review required · unclear not decidable from the text alone (abstention) |
curl https://sovrgpt.com/api/v1/decisions \
-H "Authorization: Bearer $SOVR_KEY" -H "content-type: application/json" \
-d '{
"preset": "veroeffentlichung-check-v1",
"state": "Kanal: Facebook-Seite der Stadt\n\nWas für ein Fest! Über 2.000 Gäste haben gestern mit uns den Marktplatz gefüllt. Ein besonderer Dank geht an Familie Schmidt aus der Goethestraße 12, die den Kuchenstand organisiert hat, und an die Freiwillige Feuerwehr für die Absicherung. Oberbürgermeisterin Dr. Müller eröffnete das Fest um 14 Uhr."
}'Using the answer. freigeben is a recommendation to the editors, not an
approval. nicht_freigeben and unclear always go to the data protection officer or
legal department; ueberarbeiten goes back to the author with the two yes/no values
as a hint. No text is changed by the engine.
Building your own. The channel line is the place for context the model should know without checking it — the audience, say, or whether humour fits the channel. The preset does not replace a legal review.
Agent handoff
Id: agent-handoff-v1 · For: AI agents, platform development
An assistant that knows web search, company knowledge and human handover has to decide before every answer which path to take — today usually a subordinate clause in the prompt that the answering model sometimes follows and sometimes does not. The agent handoff makes this decision a separate, measurable step before the expensive answering model even runs: only what needs the web goes online; only what concerns internal rules searches the knowledge base; only what a human has to decide lands in the queue. With the privacy flag, the workflow can hold a request back from the web search.
| Question | Type | Options / levels |
|---|---|---|
action | choice | direct answer directly · web_search current or public facts needed · company_knowledge company knowledge (RAG) · clarify ask back · human a human decides · unclear several paths equally valid (abstention) |
risk | score | 0 no harm · 1 low (error easy to spot) · 2 substantial (money, deadlines, contracts, reputation) · 3 severe (legal, safety or health consequences) |
sensitive_data | binary | yes = persons, customer numbers, health, credentials, internal figures · no = general question without protected data |
curl https://sovrgpt.com/api/v1/decisions \
-H "Authorization: Bearer $SOVR_KEY" -H "content-type: application/json" \
-d '{
"preset": "agent-handoff-v1",
"state": "Wie viele Urlaubstage habe ich laut unserer Betriebsvereinbarung im ersten Beschäftigungsjahr? Ich bin seit März dabei."
}'Using the answer. action picks the tool, sensitive_data: true blocks web
search for this request. On human, on unclear and from risk 2 upwards there is
no automatic reply — a human sees the case first.
Building your own. Instead of a single text you can send the conversation so
far as messages ([{role, content}]); the handoff then decides in context. Your
own tools become your own options — with the name your agent uses internally.
Grounding check
Id: grounding-check-v1 · For: AI agents, IT, quality assurance · State: JSON object
A RAG system delivers answers with sources — but in operation nobody checks whether the answer really reflects the sources or adds prior knowledge. The grounding check is the guard after answer generation: it receives question, sources and answer as one state and returns the degree of support, a fabrication flag, a contradiction flag and a release verdict before the answer reaches the person asking. As a decision rather than a chat answer this is done in milliseconds and can be built into the pipeline as a hard rule — without a second model writing an explanation that someone would have to parse again.
The state is an object with question, sources (list of texts) and answer.
| Question | Type | Options / levels |
|---|---|---|
support | score | 0 not supported at all · 1 barely · 2 partially (core supported, essentials not) · 3 mostly · 4 fully |
unsupported_claims | binary | yes = at least one concrete claim is in none of the sources · no = all claims appear literally or in substance in the sources |
contradiction | binary | yes = contradicts a source · no = no contradiction, at most omissions |
verdict | choice | release · revise · block · unclear sources allow no verdict (abstention) |
curl https://sovrgpt.com/api/v1/decisions \
-H "Authorization: Bearer $SOVR_KEY" -H "content-type: application/json" \
-d '{
"preset": "grounding-check-v1",
"state": {
"question": "Wie lange gilt die Garantie auf das Modell X200?",
"sources": ["Produktblatt X200: Herstellergarantie 24 Monate ab Kaufdatum. Akkus sind von der Garantie ausgenommen."],
"answer": "Die Garantie auf das X200 beträgt 24 Monate ab Kaufdatum; Akkus sind von der Garantie ausgenommen."
}
}'Using the answer. release goes out automatically, revise and unclear land
in post-processing, block is never delivered. Every abstention is logged with
question and sources — that is your test set for later.
Building your own. The check only sees what is in sources. Send exactly the
passages the answering model received — no more, no less — otherwise the guard
judges a different basis than the answer.
Designing your own questions
The presets are examples, not a limit: with questions instead of preset you
define your own. What proved useful while building the nine presets:
- The abstention is the last option. Every choice question over free text gets
an
unclearorotherat the end. The model needs a permitted way out, otherwise the question forces an assignment nobody wants. - At most 26 options, at most 10 levels. Every option gets a letter, every level a digit. A longer list does not add discrimination anyway — a better description per option does.
- Levels are ordered, lowest first. A score is a scale, not an assortment —
expected_indexandnormalized_scoreonly make sense then. - The state is data. It is never read as an instruction; everything the model is
supposed to do goes into
instructions. An “ignore all rules” inside the state stays text. - Order matters. Options and questions are evaluated in source order, and a model may react to the order. To rule that out, test with the options swapped.
- Keep instructions short and decisive. Say what the decision is based on (“the main purpose, not subordinate clauses”) and when the abstention is right. Examples help; exceptions to exceptions do not.
- v2 for graded probabilities.
sovr-decision-v1is very decisive — mostly 1.0 or 0. If you want to put thresholds onmax_probabilityorexpected_index, usesovr-decision-v2.
The limits (questions, characters, images) and the meaning of the answer fields are in the API reference.
Trying it in the product
- Playground: logged in, via the sidebar → Decision Engine. Every preset can
be run there with its example state or your own text — with real inference and the
full answer, including probabilities and
abstainreasons. - In chat as the “Decide” tool: enable the Entscheiden pill in the composer.
The language model then calls the
decision_enginetool — with a preset or with its own questions derived from your request — and summarises the decision with probabilities. Handy for trying a preset on real texts before wiring it into a workflow. - Via MCP: the authenticated MCP server offers
sovrgpt_decide(one decision with a preset or your own questions) andsovrgpt_list_decision_presets(the presets with example states). The key needs thedecisionsscope.
All three paths run the same engine with the same presets — what works in the playground behaves the same via API.
Decision Engine
AI decisions instead of long answers — classify, prioritise, route, with clear rules for automation and human review.
Coding in the IDE
SovrGPT as a model backend for Kilo Code, Cline, Roo Code, Continue, OpenCode, Qwen Code, goose, Zed, Theia, OpenHands, Cursor and Aider — sovereign EU models right in your editor, with honest figures on latency, telemetry, permissions and limits.