Recipes
Recipes are ready question packs with carefully worded instructions and options. Each one is the
questions object of a /v1/decide request. They are built into the curva binary: curva recipe show <name>
prints one as JSON.
curva recipe listcurva recipe show support-triage > questions.json| Recipe | Questions |
|---|---|
support-triage |
team (Choice, abstains below 0.8), urgency, frustration (Score), refund_requested, churn_risk (Noul) |
content-moderation |
violation (Choice, no escape option, abstains below 0.85), severity (Score), targets_individual, minor_involved (Noul) |
lead-qualification |
fit (Score), intent, timeline (Choice), decision_maker, enterprise (Noul) |
phishing-check |
phishing (Noul), tactics (Multi), risk (Score), sender_mismatch (Noul) |
llm-output-qa |
answers_question (Score), grounded, unsafe, leaks_data (Noul), issues (Multi), verdict (Choice: pass, revise, block) |
rag-check |
state {question, passages, answer?}: needs_retrieval, answerable (before an answer exists), grounded (once it does) (Noul), next_step (Choice: send, retrieve_more, rewrite, handoff) |
rag-rerank |
state {question, passage}: relevant (Noul); its probability is a reranking score, so run it over every retrieved passage with curva map |
Use one
Section titled “Use one”# One decisionjq -n --slurpfile q questions.json '{state: {ticket: "Charged twice, refund please"}, questions: $q[0]}' \ | curl -s localhost:7777/v1/decide -H 'content-type: application/json' -d @-
# A file of statescurva map tickets.jsonl -q questions.json -o answers.jsonl
# Against your current system firstcurva shadow traffic.jsonl -q questions.json -o shadow.jsonlFrom Python, load the file and pass the questions as dicts:
import jsonquestions = json.load(open("questions.json"))d = client.decide({"ticket": "Charged twice, refund please"}, questions)Recipes are a starting point: edit the wording and options for your domain. Rewording a question starts a fresh calibration, so settle the wording before collecting feedback.

