Documentation
Créez une clé d’API, activez la facturation à l’usage et envoyez votre première requête. Crossroads répond à des questions typées sur un contexte; il ne rédige pas de texte, ne tient pas de conversation et ne remplace pas le modèle d’un agent de programmation.
Vous travaillez avec un agent de programmation ? Demandez-lui d’installer Crossroads avec smallmodelslab.ai/agents.md.
Envoyer une requête
Remplacez l’hôte par votre déploiement Crossroads et gardez votre clé d’API sur le serveur. Utilisez une clé d’idempotence unique pour chaque requête distincte.
curl "$CROSSROADS_URL/v1/decisions" \
-H "Authorization: Bearer $CROSSROADS_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: ticket-123-attempt-1" \
-d '{
"state": "Hi! We were charged twice for our team's plan this month. Could you help us sort this out?",
"questions": {
"route": {
"type": "choice",
"instruction": "Which team should handle this request?",
"options": [
"billing",
"engineering",
"sales"
]
},
"needs_reply": {
"type": "boolean",
"instruction": "Does this message need a reply?"
},
"urgency": {
"type": "score",
"instruction": "How urgent is this request?",
"min": 1,
"max": 5
}
}
}'Lire la réponse
Chaque réponse porte les probabilités du modèle : pour un booléen, la probabilité de vrai; pour un choix, une par option; pour un score, une par niveau.
{
"id": "5f1c…",
"model": "crossroads-8b",
"answers": {
"route": {
"choice": "billing",
"probabilities": {
"billing": 0.91,
"engineering": 0.06,
"sales": 0.03
}
},
"needs_reply": {
"value": true,
"probability": 0.94
},
"urgency": {
"score": 3.48,
"probabilities": {
"1": 0.02,
"2": 0.08,
"3": 0.41,
"4": 0.38,
"5": 0.11
}
}
},
"usage": {
"input_tokens": 96,
"output_tokens": 0
}
}Types de questions
| Type | Champs | Réponse |
|---|---|---|
| choice | instruction, options: 2 or more names, or names mapped to descriptions or null | l’une des options, avec la probabilité de chaque option |
| boolean | instruction, optional yes and no descriptions | vrai ou faux, avec la probabilité de vrai |
| score | instruction, min and max, or levels: 2–32 descriptions scored from 0 | le score attendu dans son intervalle, avec la probabilité de chaque niveau |
Filtrer une liste
POST /v1/filter reçoit jusqu’à 256 éléments JSON, chacun d’au plus 48 000 caractères en JSON ou 16 000 sur Crossroads-M, et une consigne d’au plus 1 800 caractères. Il renvoie les éléments dont la probabilité de correspondre atteint cutoff (0,5 par défaut), du plus probable au moins probable, avec leurs probabilités et leurs positions dans votre liste. model, image et audio fonctionnent comme pour les décisions : chaque élément est jugé par rapport à l’image ou à l’enregistrement. Réutiliser la clé d’idempotence en ne changeant que cutoff reclasse les probabilités enregistrées sans nouvelle facturation. Une longue liste est traitée par lots facturés un à un : une nouvelle clé après un filtre échoué facture de nouveau ses lots terminés.
curl "$CROSSROADS_URL/v1/filter" \
-H "Authorization: Bearer $CROSSROADS_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: billing-filter-1" \
-d '{
"items": [
{
"title": "Fix invoices"
},
{
"title": "Update landing page"
}
],
"instruction": "Keep billing work",
"cutoff": 0.8
}'Modèles
| Modèle | Lit | Limites |
|---|---|---|
crossroads-8b | Texte ou JSON; le modèle par défaut | 48 000 caractères de state |
crossroads-m | Texte ou JSON, avec une image ou un enregistrement | 8 192 jetons par question, image ou enregistrement compris; images d’au plus 4 194 304 pixels |
Crossroads 8B coûte 0,040 $US et Crossroads M 0,080 $US par million de jetons d’entrée; la sortie est gratuite. Chaque question est évaluée sur tout le state : les jetons d’entrée d’une requête comptent, pour chaque question, le state, sa consigne et ses options, ainsi que l’image ou l’enregistrement. Seize questions dans une requête coûtent autant que seize requêtes, mais ne font qu’un aller-retour et ne comptent qu’une fois dans vos limites.
Une requête avec un enregistrement est traitée par le modèle entraîné sur l’audio, conçu pour les commandes vocales, les mots-clés, la langue parlée, la distinction entre parole, musique et bruit, et l’intention exprimée à l’oral; l’émotion, les sons ambiants et l’analyse musicale ne sont pas pris en charge.
Rédiger le state
Le state est ce sur quoi porte chaque question : un message, un document, ou un objet ou un tableau JSON d’enregistrements liés. Préférez un objet dont les noms disent ce qu’est chaque partie, et reprenez ces noms dans les consignes. Placez dans un même state tout ce qu’une question doit comparer, comme une demande et la politique qui permet d’en juger. Laissez de côté ce dont aucune question n’a besoin : cela coûte des jetons à chaque question et peut induire le modèle en erreur.
{
"message": "I was charged twice for order A-104. Please refund the duplicate.",
"order": {
"id": "A-104",
"charges": [
{ "amount_usd": 49, "status": "captured" },
{ "amount_usd": 49, "status": "captured" }
]
},
"refund_policy": "Duplicate charges are refunded in full."
}Agir selon les probabilités
Les probabilités disent à quel point le modèle est sûr. Agissez sur une réponse quand sa probabilité est élevée, demandez une confirmation ou une vérification entre les deux, et confiez le cas à une personne ou à un autre système quand elle est faible. Fixez chaque seuil selon le coût d’une erreur : émettre un remboursement mérite un seuil plus élevé qu’étiqueter un ticket.
const { choice, probabilities } = answers.route;
if (probabilities[choice] >= 0.9) assign(choice);
else if (probabilities[choice] >= 0.6) suggest(choice);
else sendToPerson();Un choix dont les probabilités sont proches, ou un score réparti sur plusieurs niveaux, signale souvent des options qui se recoupent, des niveaux ambigus ou un state qui manque de ce qu’il leur faut; reformulez-les avant d’abaisser un seuil. La sortie typée contraint le format, pas le jugement, et les probabilités ne sont pas garanties calibrées : choisissez vos seuils à partir de vos propres exemples annotés.
Schémas d’intégration
Orienter une demande
Posez un choix entre les destinations possibles d’une demande, avec une option pour aucune d’elles. Envoyez les cas nets à du code ordinaire, et les autres à une personne ou à un plus grand modèle.
Noter par parties
Décomposez un jugement large, comme l’intérêt d’un prospect, en scores précis aux niveaux décrits, puis combinez-les avec des poids fixés dans votre code, où vous pouvez les lire et les changer.
Encadrer un modèle de langage
Avant qu’un message n’atteigne le modèle, et avant que sa réponse n’atteigne l’utilisateur, posez des booléens, par exemple s’il demande quelque chose d’interdit ou contient des données personnelles, puis laissez-le passer, faites-le vérifier ou bloquez-le selon vos seuils.
Trier les passages retrouvés
Envoyez à /v1/filter les passages renvoyés par une recherche, avec la question de l’utilisateur comme consigne, et ne transmettez au modèle qui rédige la réponse que ceux qu’il garde. Essayez d’autres valeurs de cutoff avec la même clé d’idempotence sans frais.
Limites
Envoyez du JSON UTF-8 avec Content-Type: application/json; les champs inconnus sont refusés. Une requête contient de 1 à 16 questions nommées et jusqu’à 48 000 caractères de state, en texte ou en JSON compté sous sa forme compacte, et pèse au plus 1,5 Mio. Crossroads-M accepte aussi une image (JPEG, PNG ou WebP) ou un enregistrement (WAV ou FLAC, 30 secondes au plus), chacun limité à 1 Mio en base64 complété; avec un enregistrement, state peut être vide. Par défaut, chaque compte peut envoyer 120 requêtes par minute et quatre à la fois.
Erreurs et nouvelles tentatives
Chaque erreur comprend un code, un message descriptif et un identifiant de requête; conservez cet identifiant lorsque vous signalez un problème. La même entrée avec la même clé d’idempotence renvoie la réponse enregistrée sans nouvelle facturation : réessayer avec la même clé est donc toujours sûr.
| Statut | Signification | Ensuite |
|---|---|---|
| 400 | Entrée ou clé d’idempotence invalide | Corrigez la requête |
| 401 | Clé d’API manquante, invalide, révoquée ou expirée | Vérifiez la clé |
| 402 | La facturation à l’usage n’est pas active | Activez la facturation dans la console |
409request_in_progress | La première tentative avec cette clé est encore en cours | Réessayez la même clé quelques secondes plus tard |
409previous_request_failed | La première tentative a échoué et n’a pas été facturée | Renvoyez-la avec une nouvelle clé |
409idempotency_conflict | La clé a déjà servi pour une autre entrée | Utilisez une nouvelle clé |
| 413 | Le corps dépasse 1,5 Mio, ou une question dépasse les jetons du modèle | Envoyez moins de données |
| 415 | Content-Type n’est pas application/json | Corrigez l’en-tête |
| 429 | Limite de débit ou de concurrence du compte atteinte, ou tous les GPU sont restés occupés | Réessayez la même clé après Retry-After |
| 502 | Le serveur du modèle a renvoyé une erreur | Réessayez la même clé après un court délai |
| 503 | Le modèle a renvoyé des réponses invalides, un service requis est indisponible, ou la requête est encore en cours | Réessayez la même clé après un court délai |
Données et facturation
Crossroads conserve l’empreinte de la requête, les réponses renvoyées et l’utilisation des jetons pour les nouvelles tentatives et la facturation. Il ne conserve ni l’état fourni ni les consignes des questions. La politique de confidentialité décrit ce qui est conservé d’autre et qui le traite.
Seules les réponses validées et enregistrées avec succès entrent dans le registre de facturation, avec leur utilisation.