Agent IA d'analyse des paiements échoués : pourquoi ce paiement a-t-il échoué ?
Un agent lit un paiement, ses tentatives et la page de statut du processeur, puis explique la cause et la prochaine étape à votre équipe support.
- Fichiers
- Connexion en lecture seule
- Web
- Callback
- Plafond de budget
Regardez une vraie exécution
Une vraie exécution du 7 oct. 2026, rejouée. Modèle : openai/gpt-6-luna.
{
"payment_id": "pay_123"
}- En file d'attentebudget de $0.04 réservé
- MicroVMmicroVM ready
- MicroVMworker started · shell off · web on
- Fichier
read playbook.md - Connexionpayments GET /payments/pay_123
- Résultat
payments GET → 200 - Connexionpayments GET /payments/pay_123/attempts
- Résultat
payments GET → 200 - MicroVMmicroVM destroyed
- Réussie4 appels au modèle, 6,787 jetonsSortie enregistrée (en anglais)
Cause: The card issuer declined the payment for insufficient funds.
Evidence:failure_code=insufficient_funds;failure_message=The card issuer declined the charge: insufficient funds.Both attempts failed for the same reason.
Next step: Suggest the customer retry or use another card. - Worker détruit$0.004055 facturé, $0.035945 libéré
Lancez-le vous-même
Ouvrez l'exemple dans le playground avec toute la requête déjà remplie. Il s'exécute sur votre propre compte, dans le budget indiqué, sur les mêmes systèmes d'exemple en lecture seule.
Budget pour cet exemple : $0.04
Fonctionnement
Donnez-lui un identifiant de paiement et un court playbook. Il appelle votre API de paiements via une connexion en lecture seule, consulte la page de statut quand l'échec ressemble à une panne, et répond en six lignes. Il ne peut ni rembourser ni relancer quoi que ce soit, car la connexion n'autorise que GET.
Ce que l'agent peut et ne peut pas faire
Les permissions font partie de la requête. Tout ce qui n'est pas listé ici n'est pas disponible pour l'exécution.
| Paramètre | Autorisé |
|---|---|
| Connexions | payments : GET uniquement, sur ephemer.al/api/samples/payments-api |
| Web | Uniquement ephemer.al |
| Shell | Désactivé |
| Fichiers | playbook.md (lecture seule) |
| Rétention zéro des données | Désactivée : l'historique est conservé 30 jours |
| Budget | $0.04, un plafond strict |
| Délai | 90 secondes |
Les identifiants n'entrent jamais dans la machine : un broker les ajoute à chaque appel et impose les méthodes ci-dessus.
Le code
Voici la requête exacte envoyée par l'exemple. Définissez EPHEMERAL_API_KEY avec une clé de membre de votre organisation.
curl -X POST $EPHEMERAL_URL/v1/runs \
-H "Authorization: Bearer $EPHEMERAL_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d @request.jsonFichiers de la requête
Transmis en ligne, rien n'est donc importé au préalable. L'agent voit chacun comme un fichier en lecture seule.
playbook.md
# Failed payment playbook
You can only read. The payments connection allows GET, and web access is limited to ephemer.al.
1. GET /payments/{payment_id}. Note status, amount, currency, failure_code and failure_message.
2. GET /payments/{payment_id}/attempts. Check whether earlier attempts failed for the same reason.
3. If failure_code is processor_error or timeout, read https://ephemer.al/api/samples/status for incidents around that time.
4. Decide the cause:
- card_declined, insufficient_funds, expired_card: the customer's bank or card. Suggest a retry or another card.
- processor_error, timeout: ours or the processor's. Say whether the status page shows an incident.
- fraud_review: a risk rule held it. Do not suggest bypassing it.
5. Never guess. If a call fails or a field is missing, say so.
Answer in at most six lines: the cause, the evidence (field and value) and the next step for the support agent.
Do not include card numbers or customer email addresses.
Corps complet de la requête request.json
Le même corps, avec les fichiers en ligne.
{
"prompt": "Find out why the payment in input.payment_id failed. Follow playbook.md exactly. Use only what the data returns and never guess; if a call fails or a field is missing, say so.",
"input": {
"payment_id": "pay_123"
},
"files": [
{
"path": "playbook.md",
"content": "# Failed payment playbook\n\nYou can only read. The payments connection allows GET, and web access is limited to ephemer.al.\n\n1. GET /payments/{payment_id}. Note status, amount, currency, failure_code and failure_message.\n2. GET /payments/{payment_id}/attempts. Check whether earlier attempts failed for the same reason.\n3. If failure_code is processor_error or timeout, read https://ephemer.al/api/samples/status for incidents around that time.\n4. Decide the cause:\n - card_declined, insufficient_funds, expired_card: the customer's bank or card. Suggest a retry or another card.\n - processor_error, timeout: ours or the processor's. Say whether the status page shows an incident.\n - fraud_review: a risk rule held it. Do not suggest bypassing it.\n5. Never guess. If a call fails or a field is missing, say so.\n\nAnswer in at most six lines: the cause, the evidence (field and value) and the next step for the support agent.\nDo not include card numbers or customer email addresses.\n"
}
],
"connections": {
"payments": {
"type": "http",
"url": "https://ephemer.al/api/samples/payments-api",
"auth": {
"type": "bearer",
"token": "sample_read_key"
},
"allowed_methods": [
"GET"
],
"instructions": "GET /payments/{id} returns a payment (status, amount in cents, currency, failure_code, failure_message, attempt_count). GET /payments/{id}/attempts returns its attempts."
}
},
"web": {
"allow": [
"ephemer.al"
],
"search": false
},
"shell": false,
"timeout_seconds": 90,
"max_cost_micros": 40000
}