Decision Engine: Use cases and presets
Decision Engine: ten presets for ticket routing, inbox triage, leads, public-sector mail, RAG checks and AI agents, with options and human review rules.
The Decision Engine ships with ten ready-made presets, for example for ticket routing, inbox triage, lead qualification and AI agents. For each preset, this page shows what it decides, what input it expects, which answers are possible and when a human should review.
What a preset is
A preset is a question pack stored on our side, with fixed options, levels or yes/no. You send only the preset id and the state, meaning the text or JSON object to decide about. Because the questions live with us, they read the same on every call, which makes per-preset calibration possible later on. The preset's version number is echoed in every answer.
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."
}'The full list with all questions and example states is returned by
GET /v1/decisions/presets.
What applies to every preset
- The engine does not act on its own. It writes no reply to anyone, changes no text and executes nothing. Your workflow decides what follows from the result.
- Every answer carries a recommendation:
recommendation: "act"(your application can act) or"review"(a human checks first), with the reasons inreasons. The defaultthresholdgivesactas long as there is no warning signal;review_onlypresents every answer to a human,autonomousnone. Details under Automatic or human. - The per-preset rules apply in addition. Whatever is listed under “Human review” below
goes to a human even with
act, and so does every answer withreview. - Every choice question has an abstention as its last option, such as
unclearorother. If the model picks it, the recommendation isreview(chose_abstain_option, except inautonomousmode). For “unsure, please check” that is more reliable than a percentage. - Choice questions are double-checked: a second pass with reordered options, at twice the
input tokens. If the answer flips, the engine recommends
review(unstable_under_reordering), even at a probability close to 1. It does not catch misjudgements that come out the same in every order. - Three presets expect a JSON object as state
(Application complete?, Grounding check,
Agent step gate). Send the object directly as
state, not as a string; the questions refer to its fields. - For two presets we recommend
review_onlyor a stricter rule of your own: Publication release check and Agent step gate. The reasons are given there.
Ticket routing
Id: ticket-routing-v1 · For: customer service, helpdesk, shared service centres
Assigns a support message to a team and rates urgency, review need and language. The input is
the message text from your ticket system. team picks the queue, urgency the position in
it, language the template of the first reply.
| 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."
}'Human review: unclear and every ticket with needs_human: true, before a reply goes out.
Adapting it: replace the three teams with yours. The description per option is the text
the model reads: “invoices, payments, refunds” separates better than just “accounting”. The
abstention unclear stays in last place.
Inbox document classification
Id: inbox-document-v1 · For: administration, back office, mail room, accounting
Pre-sorts incoming letters: invoice, reminder, contract, job application, official mail or
advertising, plus deadline, need for action and language. The input is the OCR text from your
DMS or mail server. doc_type picks the folder and the responsible unit, has_deadline sets
the follow-up, action_level sorts the list.
| 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"
}'Human review: everything that is other, carries a deadline or has action level 3 to
4.
Adapting it: headers and footers may stay in the OCR text. Add your own document types
(delivery note, order confirmation) as options with a clear boundary; other stays at the
end.
Customer feedback analysis
Id: customer-feedback-v1 · For: customer service, customer success, product management
Rates a customer statement from a survey, shop review or social media: sentiment, churn risk, main topic and whether a personal response is needed. The input is the text, optionally with an NPS value or the source as JSON. The four values go to your CRM or BI system, for example as a task for customer success or as a topic breakdown in the dashboard.
| 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."
}'Human review: churn risk 2 to 3 and every needs_response: true entry.
Adapting it: 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 more finely graded.
Lead qualification
Id: lead-qualification-v1 · For: sales, inside sales, marketing automation
Rates a sales enquiry from a web form, e-mail or trade fair note by fit, timeline, budget
signal and decision-making authority. The input is the enquiry text plus form fields such as
company or headcount. The CRM turns fit and timeline into a priority: a strong fit with a
short horizon goes straight to sales, a weak fit without a timeframe into the nurturing track.
| 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"
}'Human review: a strong fit with timeline 3 to 4 goes straight to a person. Every
enquiry stays visible; sales decides about quote and contact.
Adapting it: send form fields most simply as a JSON object with the free text as one
field. Add an industry question as a choice with an other option.
Public-authority inbox
Id: behoerden-posteingang-v1 · For: public administration
Classifies e-mails and scanned letters to a municipal administration: type of matter, responsible unit, deadline relevance and threat of escalation. With these four values 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.
| 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"
}'Human review: unclear stays in the mail room. Objections and escalations are never filed
without review by a case worker.
Adapting it: the five units are a typical, not a complete, structure. Adapt the options to your organisation chart and list the duties per option, so that the model assigns dog tax, for example, to the treasury and not to the public order office.
Application complete?
Id: antrag-vollstaendigkeit-v1 · For: public administration · State: JSON object
The formal pre-check of an online application (housing benefit, childcare place, basic income
support): complete or not, what is missing, whether the data is consistent and which step
follows. naechster_schritt drives the case system: nachfordern prepares a letter with the
list of documents, bearbeiten hands 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."
}
}'Human review: every request letter is approved before sending. ruecksprache and
unclear always land with a case worker. The engine never decides on approval of the
application.
Keep the double check on here. In our tests a complete application got bearbeiten
(process) or nachfordern (request documents) depending on the order of the options, both
times with a probability close to 1. The double check makes this case visible and recommends
review (unstable_under_reordering) instead of sending the application back for documents
for no reason.
Adapting it: the field names are part of the questions. If your portal uses other names, map them before the call or write your own questions that name your fields. Do not send the object as a string: it is serialised in a fixed way 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
Checks press releases, posts, newsletters or public council documents before publication for third-party personal data, Art. 9 data and tone, and derives a release recommendation. Many data protection incidents are well-meant texts that name third parties' names, addresses or health details. The editorial system can show the recommendation as a traffic light or enforce it as a block, for every draft.
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."
}'Human review: 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.
Careful with automatic mode. In our tests the engine rated individual texts as
freigeben with full confidence although the preset's rule would have sent them to the
editors, for example an obituary containing details about third parties. Neither the
probability nor the double check warned. If you want to publish without an editor, send
"policy": { "mode": "review_only" } for this preset or treat freigeben as a suggestion only.
Adapting it: the channel line is the place for context the model should know without checking it, such as the audience 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
Decides, before an AI assistant answers, which path it takes: answer directly, web search,
company knowledge (RAG), ask back or hand over to a human. This happens as a separate,
measurable step before the expensive answering model runs. action picks the tool,
sensitive_data: true blocks web search for this request.
| 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."
}'Human review: on human, on unclear and from risk 2 upwards. There is no automatic
reply in those cases.
Adapting it: 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
Checks after answer generation whether a RAG answer is supported by its sources, whether it adds or contradicts anything, and whether it may be delivered. You can build the result into the pipeline as a hard rule.
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."
}
}'Human review: release with recommendation: "act" goes out automatically. revise and
unclear land in post-processing, block is never delivered. Log every abstention and every
review recommendation with question and sources; that becomes your test set later.
Release only via verdict. In our tests an answer with a fabricated core claim was rated
“partially supported” by support. The verdict blocked it or sent it to review, so under the
rule above it did not go out. Use support, unsupported_claims and contradiction only as
reasons for post-processing.
Adapting it: the check only sees what is in sources. Send exactly the passages the
answering model received. Otherwise it judges a different basis than the answer.
Agent step gate
Id: agent-step-risk-v1 · For: AI agents, automation, IT security · State: JSON object
Sits between planning and acting for an agent that operates a browser or a computer. It checks the planned step: is it reversible, what kind of effect would it have, how severe would a mistake be? Reading and scrolling pass through unimpeded, while "Place binding order" or "Delete permanently" stop, even though both look the same in the page structure.
The state is an object holding the agent's goal, where it currently is and which step it intends to take next.
| Question | Type | Options / levels |
|---|---|---|
irreversible | Yes/no | yes = costs money or cannot be undone by the agent (order, pay, submit, book, cancel, delete, publish, send outward) · no = harmless or reversible by the agent itself |
effect | Choice | read read only · input enter without submitting · state_change reversible change · submit submit without payment · payment payment · destructive delete/cancel · credentials access · external_message outward · unclear effect not discernible (abstention) |
risk | Score | 0 no harm · 1 minor · 2 substantial (money, deadlines, contracts, reputation) · 3 severe (legally binding, security-relevant, data loss) |
curl https://sovrgpt.com/api/v1/decisions \
-H "Authorization: Bearer $SOVR_KEY" -H "content-type: application/json" \
-d '{
"preset": "agent-step-risk-v1",
"state": {
"ziel": "Order a pack of printer paper from the office supplies shop",
"seite": "Cart — checkout, step 3 of 3, payment on invoice",
"schritt": "Click the button 'Place binding order'"
}
}'Human review: irreversible: true, the effect kinds payment, destructive,
credentials and external_message, the abstention unclear and risk level 3. Such steps
never run automatically, only after confirmation. The normal case is irreversible: false
with effect read, input or state_change: the agent proceeds.
If your agent runs without a human who could confirm, send
"policy": { "mode": "autonomous" }. The recommendation is then always act, but the warning
signals remain in reasons. On a warning signal the agent should skip the step or choose a
reversible path.
Careful with unclear steps. Two cases from our tests: a dialog with unreadable text was
confidently classified by sovr-decision-v1 as "submit a form" rather than unclear; only
margin was
conspicuously low. A "Continue" button without a recognisable effect was rated read with full
confidence by the default runtime, although the rule asks for unclear. Under threshold an
agent would click through. For agents with real consequences (payments, messages, deletion) we
recommend "policy": { "mode": "review_only" } or your own rule that lets read pass only
when the description is unambiguous and also evaluates margin.
The preset picks no element. For that it would need the page's elements as options, and a choice question has at most 26. In a sample of 20 real web pages the median was 27 clickable elements. The gate does not need that list; the description of the planned step is enough.
Designing your own questions
With questions instead of preset you define your own questions. What proved useful while
building the ten presets:
- The abstention is the last option. Every choice question over free text gets an
unclearorotherat the end. Without a permitted way out, the question forces the model into an assignment nobody wants. - At most 26 options, at most 10 levels. Every option gets a letter, every level a digit. A better description per option improves discrimination.
- Levels are ordered, lowest first. Only then do
expected_indexandnormalized_scoremake sense. - The state is data. Everything the model is supposed to do goes into
instructions. An “ignore all rules” inside the state stays text. - Order matters. Options are evaluated in your order, and a model may react to it. For
choice questions the double check covers this (
stability_check, on by default). Levels stay in your order; there the order is the meaning. - Keep instructions short and decisive. Say what the decision is based on (“the main purpose, not subordinate clauses”) and when the abstention is right.
- v2 for graded probabilities.
sovr-decision-v1mostly answers with 1.0 or 0. For 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 runs there with its example state or your own text, with the full answer.
- In chat: the Entscheiden (decide) pill in the composer enables the
decision_enginetool. That is how you try a preset on real texts. - Via MCP:
sovrgpt_decideandsovrgpt_list_decision_presetsthrough the authenticated MCP server, scopedecisions.
All paths run the same engine with the same presets.
Decision Engine: AI decisions via API
Decision Engine: AI routes tickets, mail and enquiries and flags what needs review. It returns probabilities in milliseconds, via API and in chat.
AI coding in your IDE: Cline, Continue, Kilo Code & more
OpenAI-compatible API for Cline, Continue, Kilo Code, Roo Code, Zed and Aider: base URL, key, model IDs and a ready-made config for each tool.