API-Integration
Integriere Magus-Agenten in deine eigenen Anwendungen über eine REST-API. Sende Nachrichten, empfange Antworten (Streaming oder synchron) und lass deine Nutzer mit einem voll ausgestatteten KI-Agenten interagieren: mit RAG, Tool-Aufrufen, Gedächtnis und Kontextmanagement, alles über einfache HTTP-Anfragen.
So funktioniert es
Jede API-Integration ist an einen eigenen Agenten gebunden. Wenn du eine Nachricht an die API sendest, wird sie an diesen Agenten weitergeleitet, der sie verarbeitet und eine Antwort zurückgibt. Unterhaltungen werden automatisch über Session-IDs verwaltet; dieselbe Session-ID leitet immer zur selben Unterhaltung.
Einrichtung
Schritt 1: Eigenen Agenten erstellen
Gehe zu Agenten und erstelle einen neuen Agenten. Konfiguriere seinen System-Prompt, seine Tools und sein Modell nach Bedarf. Dieser Agent wird alle Nachrichten verarbeiten, die über die API eingehen.
Schritt 2: API-Integration erstellen
Gehe zu Integrationen und fuege eine neue API-Integration hinzu. Wähle den Agenten, den du in Schritt 1 erstellt hast. Nach der Aktivierung erhältst du einen API-Schluessel (wird nur einmal angezeigt, speichere ihn sicher).
Der API-Schluessel sieht so aus: magus_sk_a1b2c3d4e5f6...
Schritt 3: Erste Nachricht senden
curl -X POST https://deine-magus-instanz.com/api/v1/messages \
-H "Authorization: Bearer magus_sk_dein_schluessel" \
-H "Content-Type: application/json" \
-d '{"content": "Hallo!", "session_id": "meine-session-1"}'
Anfrage-Format
POST /api/v1/messages
| Feld | Erforderlich | Standard | Beschreibung |
|---|---|---|---|
content |
Ja | - | Der Nachrichtentext |
session_id |
Nein | Automatisch generiert | Deine Kennung für die Unterhaltung. Gleiche ID = gleiche Unterhaltung. |
stream |
Nein | false |
Auf true setzen für Server-Sent Events Streaming |
verbosity |
Nein | "standard" |
Detailgrad der Events: "minimal", "standard" oder "full" |
attachments |
Nein | [] |
Dateianhange (Base64 inline) |
Anhange
{
"content": "übersetze dieses Dokument",
"attachments": [
{
"type": "file",
"name": "dokument.pdf",
"data": "base64-kodierter-inhalt",
"content_type": "application/pdf"
}
]
}
Nicht-Streaming-Antwort
Wenn stream false ist (Standard), wartet die API, bis der Agent fertig ist, und gibt eine einzelne JSON-Antwort zurück:
{
"id": "msg_abc123",
"session_id": "meine-session-1",
"conversation_id": "uuid",
"content": "Hallo! Wie kann ich dir heute helfen?",
"citations": [],
"tool_calls": [],
"attachments": [],
"usage": {
"prompt_tokens": 150,
"completion_tokens": 25
},
"created_at": "2026-03-28T14:30:00Z"
}
Streaming-Antwort (SSE)
Wenn stream true ist, ist die Antwort ein Server-Sent Events Stream. Jedes Event ist ein JSON-Objekt auf einer data:-Zeile:
data: {"event": "session.created", "session_id": "meine-session-1", "conversation_id": "uuid"}
data: {"event": "message.started", "message_id": "msg_abc123"}
data: {"event": "text.chunk", "delta": "Hallo! "}
data: {"event": "text.chunk", "delta": "Wie kann ich dir heute helfen?"}
data: {"event": "message.completed", "message_id": "msg_abc123", "usage": {"prompt_tokens": 150, "completion_tokens": 25}}
data: [DONE]
SSE im Code konsumieren
JavaScript:
const response = await fetch('/api/v1/messages', {
method: 'POST',
headers: {
'Authorization': 'Bearer magus_sk_dein_schluessel',
'Content-Type': 'application/json'
},
body: JSON.stringify({ content: 'Hallo', session_id: 'sess-1', stream: true })
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const text = decoder.decode(value);
for (const line of text.split('\n')) {
if (line.startsWith('data: ') && line !== 'data: [DONE]') {
const event = JSON.parse(line.slice(6));
if (event.event === 'text.chunk') {
process.stdout.write(event.delta);
}
}
}
}
Python:
import requests
import json
response = requests.post(
'https://deine-instanz.com/api/v1/messages',
headers={'Authorization': 'Bearer magus_sk_dein_schluessel'},
json={'content': 'Hallo', 'session_id': 'sess-1', 'stream': True},
stream=True
)
for line in response.iter_lines():
if line and line.startswith(b'data: ') and line != b'data: [DONE]':
event = json.loads(line[6:])
if event['event'] == 'text.chunk':
print(event['delta'], end='', flush=True)
curl:
curl -X POST https://deine-instanz.com/api/v1/messages \
-H "Authorization: Bearer magus_sk_dein_schluessel" \
-H "Content-Type: application/json" \
-d '{"content": "Hallo", "stream": true}' \
--no-buffer
Detailstufen
Steuere, wie viel Detail der SSE-Stream enthält:
| Event | minimal |
standard |
full |
|---|---|---|---|
session.created |
Ja | Ja | Ja |
message.started |
Ja | Ja | Ja |
text.chunk |
Ja | Ja | Ja |
message.completed |
Ja | Ja | Ja |
error |
Ja | Ja | Ja |
tool.started |
- | Ja | Ja |
tool.completed |
- | Ja | Ja |
tool.progress |
- | - | Ja |
thinking.chunk |
- | - | Ja |
Verwende "minimal" für einfache Chat-Oberflächen. Verwende "standard" (Standard), um Tool-Aktivität anzuzeigen. Verwende "full" für Debugging oder fortgeschrittene Oberflächen, die das Reasoning anzeigen.
Session-Verwaltung
Sessions werden Unterhaltungen zugeordnet. Die session_id, die du angibst, bestimmt, an welche Unterhaltung die Nachricht geht:
- Gleiche
session_id= gleiche Unterhaltung (Agent erinnert sich an den Kontext) - Andere
session_id= andere Unterhaltung - Keine
session_id= neue Unterhaltung (automatisch generierte ID in der Antwort)
Die automatisch generierte Session-ID wird in der Antwort als session_id zurückgegeben; speichere sie, wenn du die Unterhaltung fortsetzen möchtest.
Fehlerantworten
| Status | Code | Beschreibung |
|---|---|---|
| 400 | invalid_request |
Fehlender content oder fehlerhafte Anfrage |
| 401 | invalid_api_key |
Fehlender, ungueltiger oder fehlerhafter API-Schluessel |
| 403 | integration_inactive |
Integration ist deaktiviert oder gesperrt |
| 403 | usage_limit_exceeded |
Tägliches Credit-Limit erreicht |
| 502 | agent_error |
Agent hat bei der Verarbeitung einen Fehler festgestellt |
| 504 | timeout |
Agent hat nicht innerhalb des Zeitlimits geantwortet |
Alle Fehler folgen dem Format:
{"error": {"code": "invalid_api_key", "message": "Ungueltiger API-Schluessel"}}
Nutzungslimits
Die API teilt die Abonnement-Limits deines Kontos. Jede Nachricht verbraucht Credits aus demselben Pool wie die Web-Oberfläche und andere Integrationen.
Sicherheit
- API-Schluessel werden bei der Erstellung nur einmal angezeigt; speichere sie sicher
- Schluessel werden nie im Klartext gespeichert (nur ein Hash wird für die Suche aufbewahrt)
- Verwende Umgebungsvariablen oder einen Secrets-Manager; hardcode Schluessel niemals
- Jeder Schluessel ist an eine Integration und einen Agenten gebunden
- Rotiere Schluessel, indem du eine neue Integration erstellst und die alte deaktivierst