入门指南
本指南将引导您向 Magisterium A2A 端点发出第一个请求、获取生成的任务并读取结构化响应。
前置条件
- 付费的 Magisterium 计划(专业版、组织版或企业版)。免费账户会从 A2A 收到
PLAN_REQUIRED错误。 - 与您
magisterium.com账户绑定的 OAuth 2.0 访问令牌。A2A 使用与 Magisterium MCP 服务器 相同的 OAuth 流程;可从https://www.magisterium.com/.well-known/oauth-authorization-server的 OAuth 元数据中发现授权端点、令牌端点和动态注册端点。 - 您希望调用的技能 —— 完整列表请参阅 技能。
请注意: 在 API 控制台 中创建的长期 API 密钥适用于 Chat Completions、Search 和 News,但 不适用于 A2A —— A2A 仅接受 OAuth 颁发的用户令牌。
将访问令牌导出为环境变量,这样下面的示例就可以自动识别:
bash
export MAGISTERIUM_TOKEN=<your-access-token-here>第 1 步:发现智能体
在调用端点之前,您可以先获取公开的 Agent Card,以了解有哪些可用技能并确认协议版本:
bash
curl https://www.magisterium.com/.well-known/agent.json获取该卡片无需身份验证。编排器可以缓存它一小时 —— 该端点设置了 Cache-Control: public, max-age=3600。
第 2 步:发送您的第一条消息
所有 A2A 操作都通过单个 JSON-RPC 端点:POST https://www.magisterium.com/api/v1/a2a。下面的示例对 catholic_qa 技能调用 message/send。
bash
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" }
}
}
}'typescript
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);
}
}python
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"])第 3 步:读取响应
message/send 返回一个 kind: "task" 的 Task 对象。同步的技能调用始终以两种终止状态之一结束:
status.state == "completed"—— 结果位于result.artifacts中。每个 artifact 都包含一个artifactId、一个可选的name以及一个或多个parts(text、data或file)。status.state == "failed"—— 失败原因位于status.message.parts[0].text中。
json
{
"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": [] } }
]
}
]
}
}第 4 步:获取或取消任务
任务会保存 24 小时,可使用 tasks/get 通过 ID 重新获取:
bash
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" }
}'如果您需要中止一个任务,请使用相同的 ID 调用 tasks/cancel。由于所有 Magisterium 技能都是同步完成的,取消操作仅在少数重试场景中有用 —— 已经 completed 或 failed 的任务无法被取消,将返回 INVALID_PARAMS。
常见错误
| 代码 | 含义 | 解决方法 |
|---|---|---|
-32004 | 未授权 | 检查 Authorization 请求头,并确认访问令牌有效且未过期。 |
-32005 | 需要付费计划 | 请在 magisterium.com/plan 升级您的账户。 |
-32002 | 找不到技能 | 确认 metadata.skillId 与 Agent Card 中列出的某个 ID 匹配。 |
-32003 | 超出速率限制 | 在重试前等待 retryAfter 秒(位于错误的 data 中)。 |
完整的方法和错误码请参阅 API 参考。