Mise en route
Ce guide vous accompagne pour effectuer votre première requête vers le point de terminaison A2A de Magisterium, récupérer la tâche qui en résulte et lire la réponse structurée.
Prérequis
- Un plan Magisterium payant (Pro, Organisation ou Entreprise). Les comptes gratuits recevront une erreur
PLAN_REQUIREDd'A2A. - Un jeton d'accès OAuth 2.0 lié à votre compte
magisterium.com. A2A utilise le même flux OAuth que le serveur MCP Magisterium ; découvrez les points de terminaison d'autorisation, de jeton et d'enregistrement dynamique à partir des métadonnées OAuth disponibles àhttps://www.magisterium.com/.well-known/oauth-authorization-server. - Les compétences que vous souhaitez appeler — consultez la page Compétences pour la liste complète.
Attention : les clés d'API longue durée créées dans la Console d'API fonctionnent pour Chat Completions, Search et News, mais elles ne sont pas valides pour A2A — A2A n'accepte que des jetons utilisateur émis via OAuth.
Exportez votre jeton d'accès en tant que variable d'environnement afin que les exemples ci-dessous le récupèrent automatiquement :
export MAGISTERIUM_TOKEN=<your-access-token-here>Étape 1 : Découvrir l'agent
Avant d'appeler le point de terminaison, vous pouvez récupérer l'Agent Card publique pour voir quelles compétences sont disponibles et confirmer la version du protocole :
curl https://www.magisterium.com/.well-known/agent.jsonLa carte ne nécessite aucune authentification. Les orchestrateurs peuvent la mettre en cache pendant une heure — le point de terminaison définit Cache-Control: public, max-age=3600.
Étape 2 : Envoyer votre premier message
Toutes les opérations A2A passent par un unique point de terminaison JSON-RPC : POST https://www.magisterium.com/api/v1/a2a. L'exemple ci-dessous appelle message/send sur la compétence catholic_qa.
curl -X POST https://www.magisterium.com/api/v1/a2a \
-H "Authorization: Bearer $MAGISTERIUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "message/send",
"params": {
"message": {
"role": "user",
"messageId": "msg-001",
"kind": "message",
"parts": [{ "kind": "text", "text": "What does the Church teach about the Real Presence?" }],
"metadata": { "skillId": "catholic_qa" }
}
}
}'const accessToken = process.env.MAGISTERIUM_TOKEN!;
const response = await fetch("https://www.magisterium.com/api/v1/a2a", {
method: "POST",
headers: {
Authorization: `Bearer ${accessToken}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "message/send",
params: {
message: {
role: "user",
messageId: crypto.randomUUID(),
kind: "message",
parts: [
{ kind: "text", text: "What does the Church teach about the Real Presence?" },
],
metadata: { skillId: "catholic_qa" },
},
},
}),
});
const { result: task } = await response.json();
console.log(task.id, task.status.state);
for (const artifact of task.artifacts ?? []) {
for (const part of artifact.parts) {
if (part.kind === "text") console.log(part.text);
}
}import os
import uuid
import httpx
access_token = os.environ["MAGISTERIUM_TOKEN"]
payload = {
"jsonrpc": "2.0",
"id": 1,
"method": "message/send",
"params": {
"message": {
"role": "user",
"messageId": str(uuid.uuid4()),
"kind": "message",
"parts": [
{"kind": "text", "text": "What does the Church teach about the Real Presence?"}
],
"metadata": {"skillId": "catholic_qa"},
}
},
}
response = httpx.post(
"https://www.magisterium.com/api/v1/a2a",
headers={
"Authorization": f"Bearer {access_token}",
"Content-Type": "application/json",
},
json=payload,
timeout=60,
)
task = response.json()["result"]
print(task["id"], task["status"]["state"])
for artifact in task.get("artifacts", []):
for part in artifact["parts"]:
if part["kind"] == "text":
print(part["text"])Étape 3 : Lire la réponse
message/send renvoie un objet Task avec kind: "task". Un appel synchrone à une compétence se termine toujours dans l'un des deux états terminaux :
status.state == "completed"— les résultats se trouvent dansresult.artifacts. Chaque artefact possède unartifactId, unnamefacultatif et une ou plusieursparts(text,dataoufile).status.state == "failed"— la raison de l'échec se trouve dansstatus.message.parts[0].text.
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "task_abc123",
"contextId": "ctx_def456",
"kind": "task",
"status": { "state": "completed", "timestamp": "2026-04-20T12:00:00.000Z" },
"artifacts": [
{
"artifactId": "art_ghi789",
"name": "catholic_qa_response",
"parts": [
{ "kind": "text", "text": "The Catholic Church teaches..." },
{ "kind": "data", "data": { "citations": [] } }
]
}
]
}
}Étape 4 : Récupérer ou annuler une tâche
Les tâches sont conservées pendant 24 heures et peuvent être récupérées par identifiant via tasks/get :
curl -X POST https://www.magisterium.com/api/v1/a2a \
-H "Authorization: Bearer $MAGISTERIUM_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tasks/get",
"params": { "id": "task_abc123" }
}'Si vous devez interrompre une tâche, appelez tasks/cancel avec le même identifiant. Étant donné que toutes les compétences Magisterium se résolvent de manière synchrone, l'annulation n'est utile que dans de rares scénarios de nouvelle tentative — une tâche déjà completed ou failed ne peut pas être annulée et renverra INVALID_PARAMS.
Erreurs courantes
| Code | Signification | Correction |
|---|---|---|
-32004 | Non autorisé | Vérifiez l'en-tête Authorization et que le jeton d'accès est valide et n'a pas expiré. |
-32005 | Plan payant requis | Mettez à niveau votre compte sur magisterium.com/plan. |
-32002 | Compétence introuvable | Vérifiez que metadata.skillId correspond à un ID listé dans l'Agent Card. |
-32003 | Limite d'utilisation dépassée | Patientez retryAfter secondes (présent dans le data de l'erreur) avant de réessayer. |
Consultez la Référence de l'API complète pour toutes les méthodes et codes d'erreur.