CONNECT / INTEGRATION GUIDE

From prompt to decision.

Replace one narrow LLM call, measure it, then expand.

01

Define the answer your code needs.

Use choice for routing, boolean for a check, or score for an ordered rubric. Put application facts in state and ask one thing in each question.

Try it in the playground
02

Keep your existing fallback.

Run labeled examples before switching traffic. Set a probability threshold for each choice task. Route uncertain answers and request failures to your existing LLM or a person.

A high probability alone does not prove correctness. Measure accepted-answer accuracy, coverage, latency, and total cost including fallbacks.

03

Call Dante from your server.

Set DANTE_API_URL to the gateway origin and store DANTE_API_KEY in your server environment. Send one Idempotency-Key per logical run — reusing a key never re-runs a request.

Read errors before retrying: 402 means the account needs credits; 429 and 503 model_warming mean wait, then retry; an ambiguous 503 may still settle, so check GET /v1/requests/{id} before re-running; 409 result_not_retained means the result is gone and was already billed — start a new logical run with a new key instead of silently re-running.

dante / integration
SERVER SIDE
POST /v1/systemone
const response = await fetch(
  "https://api.dante.example/v1/systemone",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.DANTE_API_KEY}`,
      "Content-Type": "application/json",
      "Idempotency-Key": crypto.randomUUID(),
    },
    body: JSON.stringify({
      "model": "dante-latest",
      "state": "I was charged twice for my order. Please refund the extra payment.",
      "questions": {
        "route": {
          "type": "choice",
          "instructions": "Which team should handle this request?",
          "criteria": {
            "billing": "Charges, payments, and refunds",
            "shipping": "Delivery and tracking",
            "technical": "Broken features or login problems"
          }
        },
        "needs_action": {
          "type": "noul",
          "instructions": "Does this customer need help with a payment issue?"
        },
        "urgency": {
          "type": "score",
          "instructions": "Rate the urgency of this request.",
          "criteria": [
            "Low: general information",
            "Medium: a problem needing follow-up",
            "High: immediate action needed"
          ]
        }
      }
    }),
  },
);

if (!response.ok) {
  throw new Error(`Dante request failed: ${response.status}`);
}

const result = await response.json();

const decision = result.answers["route"];
const probability = decision.probabilities[decision.choice];
const nextStep = probability >= 0.95
  ? decision.choice
  : "needs_review";

The response has typed answers and probabilities. You decide which actions those answers authorize.