Bắt đầu
Hướng dẫn này sẽ dẫn bạn qua các bước để gửi yêu cầu đầu tiên đến điểm cuối A2A của Magisterium, truy xuất nhiệm vụ kết quả và đọc phản hồi có cấu trúc.
Yêu cầu tiên quyết
- Một gói Magisterium trả phí (Pro, Tổ chức hoặc Doanh nghiệp). Các tài khoản miễn phí sẽ nhận lỗi
PLAN_REQUIREDtừ A2A. - Một access token OAuth 2.0 gắn với tài khoản
magisterium.comcủa bạn. A2A dùng cùng luồng OAuth như máy chủ Magisterium MCP; hãy lấy các điểm cuối ủy quyền, token và đăng ký động từ metadata OAuth tạihttps://www.magisterium.com/.well-known/oauth-authorization-server. - Các kỹ năng bạn muốn gọi — xem Kỹ năng để biết danh sách đầy đủ.
Lưu ý: Các khóa API lâu dài được tạo trong API Console hoạt động với Chat Completions, Search và News, nhưng không hợp lệ với A2A — A2A chỉ chấp nhận token người dùng do OAuth cấp.
Xuất access token của bạn dưới dạng biến môi trường để các ví dụ bên dưới tự động nhận được:
export MAGISTERIUM_TOKEN=<your-access-token-here>Bước 1: Khám phá Agent
Trước khi gọi điểm cuối, bạn có thể tải Agent Card công khai để xem những kỹ năng nào khả dụng và xác nhận phiên bản giao thức:
curl https://www.magisterium.com/.well-known/agent.jsonCard này không yêu cầu xác thực. Các bộ điều phối có thể cache nó trong một giờ — điểm cuối đặt Cache-Control: public, max-age=3600.
Bước 2: Gửi tin nhắn đầu tiên
Tất cả các thao tác A2A đều đi qua một điểm cuối JSON-RPC duy nhất: POST https://www.magisterium.com/api/v1/a2a. Ví dụ bên dưới gọi message/send trên kỹ năng 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"])Bước 3: Đọc phản hồi
message/send trả về một đối tượng Task có kind: "task". Một lời gọi kỹ năng đồng bộ luôn kết thúc ở một trong hai trạng thái cuối:
status.state == "completed"— kết quả nằm trongresult.artifacts. Mỗi artifact có mộtartifactId, mộtnametùy chọn và một hoặc nhiềuparts(text,datahoặcfile).status.state == "failed"— lý do thất bại nằm ởstatus.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": [] } }
]
}
]
}
}Bước 4: Lấy lại hoặc Hủy một Nhiệm vụ
Các nhiệm vụ được lưu trong 24 giờ và có thể được tải lại theo ID bằng 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" }
}'Nếu bạn cần hủy bỏ một nhiệm vụ, hãy gọi tasks/cancel với cùng một ID. Vì tất cả các kỹ năng của Magisterium đều giải quyết đồng bộ, việc hủy chỉ hữu ích trong các kịch bản thử lại hiếm — một nhiệm vụ đã ở trạng thái completed hoặc failed không thể bị hủy và sẽ trả về INVALID_PARAMS.
Các lỗi thường gặp
| Mã | Ý nghĩa | Cách khắc phục |
|---|---|---|
-32004 | Không được phép | Kiểm tra header Authorization và đảm bảo access token hợp lệ và chưa hết hạn. |
-32005 | Yêu cầu gói trả phí | Nâng cấp tài khoản của bạn tại magisterium.com/plan. |
-32002 | Không tìm thấy kỹ năng | Xác minh metadata.skillId khớp với một ID được liệt kê trong Agent Card. |
-32003 | Vượt quá giới hạn tốc độ | Đợi retryAfter giây (có trong data của lỗi) trước khi thử lại. |
Xem toàn bộ Tham khảo API để biết mọi phương thức và mã lỗi.