Die AI Platform ist das zentrale AddOn fuer die Integration von KI-Diensten in REDAXO. Es bietet eine einheitliche Schnittstelle zu verschiedenen LLM-Providern und stellt einen MCP-Server bereit, ueber den andere AddOns Tools fuer KI-Agenten anbieten koennen.
- Verwaltung mehrerer AI-Provider und API-Keys ueber Profile
- Pro Profil ein Typ (Text/Code, Bildgenerierung, Bildverstaendnis) mit typspezifischen Einstellungen
- Automatische Modell-Vorauswahl je nach Provider und Typ
- API-Verbindungstest direkt im Backend
- MCP-Server (Model Context Protocol) als HTTP-Endpoint mit konfigurierbarer Beschreibung
- Eingebautes
redaxo_statusMCP-Tool (Systeminfos der REDAXO-Instanz) - Extension Points fuer andere AddOns (MCP-Tools, Agent-Tools)
- Basiert auf Symfony AI (v0.6)
| Provider | Text | Bildgenerierung | Bildverstaendnis |
|---|---|---|---|
| OpenAI | gpt-4o, gpt-4o-mini, o1, o3-mini |
dall-e-3, gpt-image-1 |
gpt-4o, gpt-4o-mini |
| Anthropic | claude-sonnet-4-20250514, claude-opus-4-20250514, claude-3-7-sonnet-latest |
- | claude-sonnet-4-20250514, claude-opus-4-20250514 |
gemini-2.5-flash, gemini-2.5-pro |
gemini-2.0-flash-exp |
gemini-2.5-flash, gemini-2.5-pro |
|
| Ollama | llama3.2, mistral, deepseek-r1 u.a. |
- | llava, llama3.2-vision |
Bei Ollama wird kein API-Key benoetigt, nur die Basis-URL (Standard: http://localhost:11434).
- AddOn im REDAXO-Installer herunterladen oder in
redaxo/src/addons/ai_platform/ablegen - AddOn in REDAXO installieren und aktivieren
Die Symfony-AI-Abhaengigkeiten sind im Release-Paket bereits enthalten (vendor/ ist Teil des AddOns). Wer das Repo direkt klont, statt das Paket ueber REDAXO.org zu laden, fuehrt einmalig composer install --no-dev im AddOn-Verzeichnis aus.
Unter AI Platform > Profile werden Profile fuer jeden Anwendungsfall separat angelegt. Jedes Profil hat einen Typ und ein Modell mit typspezifischen Einstellungen.
| Feld | Beschreibung |
|---|---|
| Profilname | Eindeutiger Name, z.B. "Claude Text" oder "DALL-E Bilder" |
| Typ | Text/Code, Bildgenerierung oder Bildverstaendnis |
| Provider | OpenAI, Anthropic, Google, Ollama oder Replicate |
| API-Key | API-Schluessel (wird bei Ollama ausgeblendet) |
| Basis-URL | Nur bei Ollama sichtbar (Standard: http://localhost:11434) |
| Modell | Wird automatisch passend zum Provider und Typ vorausgefuellt |
| Einstellung | Beschreibung | Standard |
|---|---|---|
| Temperature | 0 = deterministisch, 1 = normal, 2 = kreativ | 1.0 |
| Max Tokens | Maximale Antwortlaenge | 4096 |
| System-Prompt | Standard-Anweisung, z.B. "Du bist ein hilfreicher Assistent." | leer |
Der System-Prompt wird automatisch bei jedem Aufruf verwendet, kann aber per API ueberschrieben werden.
| Einstellung | Beschreibung | Standard | Nur bei |
|---|---|---|---|
| Bildgroesse | z.B. 1024x1024, 1792x1024 | 1024x1024 | alle |
| Bildqualitaet | Standard oder HD | Standard | OpenAI |
| Bildstil | Vivid oder Natural | Vivid | OpenAI |
Bildqualitaet und Bildstil sind DALL-E-spezifisch und werden bei anderen Providern ausgeblendet.
| Einstellung | Beschreibung | Standard |
|---|---|---|
| Temperature | 0 = deterministisch, 1 = normal, 2 = kreativ | 1.0 |
| Max Tokens | Maximale Antwortlaenge | 4096 |
| Detail-Level | Auto, Low oder High (High kostet mehr Tokens) | Auto |
Hinweis: Das Detail-Level wird im Profil gespeichert, aber aktuell nicht als API-Option an den Provider gesendet. Bei Symfony AI wird das Detail-Level ueber die Image-Message gesteuert.
Unter AI Platform > Einstellungen wird pro Anwendungsfall ein Standard-Profil gewaehlt. Die Dropdowns zeigen nur Profile des passenden Typs. So kann z.B. Anthropic fuer Text und OpenAI fuer Bildgenerierung verwendet werden.
Beim Bearbeiten eines Profils kann ueber den Button "API-Verbindung testen" geprueft werden, ob API-Key und Modell funktionieren. Der Test sendet einen minimalen Request an den Provider.
Alle Profil-Einstellungen (Temperature, Max Tokens, System-Prompt, Bildgroesse etc.) werden automatisch bei jedem API-Aufruf angewendet.
$service = rex_ai_platform_service::getInstance();
// Einfache Textgenerierung - nutzt Standard-Profil mit dessen Temperature,
// Max Tokens und System-Prompt
$text = $service->generateText('Beschreibe REDAXO CMS in 3 Saetzen.');
// System-Prompt ueberschreiben (ueberschreibt den im Profil hinterlegten)
$text = $service->generateText(
'Uebersetze ins Englische: Hallo Welt',
'Du bist ein professioneller Uebersetzer.'
);
// Mit bestimmtem Profil (ID)
$text = $service->generateText('Hallo', null, 2);$service = rex_ai_platform_service::getInstance();
// Nutzt automatisch Detail-Level, Temperature und Max Tokens aus dem Profil
$description = $service->understandImage(
'Beschreibe dieses Bild.',
rex_path::media('foto.jpg')
);
// Alt-Text generieren
$altText = $service->understandImage(
'Erstelle einen kurzen, beschreibenden Alt-Text fuer dieses Bild.',
rex_path::media('header.png')
);$service = rex_ai_platform_service::getInstance();
// Nutzt automatisch Bildgroesse, Qualitaet und Stil aus dem Profil
$imageUrl = $service->generateImage('Ein modernes Logo fuer ein CMS');$service = rex_ai_platform_service::getInstance();
// Alle Einstellungen eines Profils als Options-Array
$options = $service->getProfileOptions($profileId);
// Liefert z.B.: ['temperature' => 0.7, 'max_output_tokens' => 8192] (OpenAI)
// Oder: ['temperature' => 0.7, 'max_tokens' => 8192] (Anthropic, Google, Ollama)
// Profil-Daten lesen
$profile = $service->getDefaultProfile('text');
// $profile['system_prompt'], $profile['temperature'], etc.
// Profile nach Typ filtern
$textProfiles = $service->getProfiles('text');
$imageProfiles = $service->getProfiles('image_generation');use Symfony\AI\Platform\Message\Message;
use Symfony\AI\Platform\Message\MessageBag;
$service = rex_ai_platform_service::getInstance();
$profile = $service->getDefaultProfile('text');
$platform = $service->getPlatform($profile['id']);
$options = $service->getProfileOptions($profile['id']);
$messages = new MessageBag(
Message::forSystem($profile['system_prompt'] ?? 'Du bist ein hilfreicher Assistent.'),
Message::ofUser('Was ist REDAXO?'),
);
// Options enthalten Temperature, Max Tokens etc. aus dem Profil
$result = $platform->invoke($profile['model'], $messages, $options);
echo $result->asText();use Symfony\AI\Platform\Message\Message;
use Symfony\AI\Platform\Message\MessageBag;
$service = rex_ai_platform_service::getInstance();
// Agent erstellt - sammelt automatisch Tools von anderen AddOns
$agent = $service->createAgent('text');
$messages = new MessageBag(
Message::ofUser('Wie ist das Wetter in Berlin?'),
);
$result = $agent->call($messages);
echo $result->getContent();Das AddOn stellt einen MCP-Server (Model Context Protocol) als HTTP-Endpoint bereit. Damit koennen KI-Tools wie Claude Desktop, Cursor, Windsurf oder andere MCP-Clients direkt auf REDAXO-Funktionen zugreifen.
- AI Platform > MCP Server oeffnen
- MCP Server aktiv auf "Aktiv" setzen
- Optional: Server-Beschreibung eintragen - diese wird als
instructionsan MCP-Clients gesendet und beschreibt, wofuer der Server gedacht ist und welche Daten die REDAXO-Instanz verwaltet - Speichern
- Den angezeigten Endpoint-URL und Token notieren
Das AddOn registriert automatisch das Tool redaxo_status, das folgende Informationen ueber die REDAXO-Instanz liefert:
- REDAXO-Version, PHP-Version, Datenbank-Version
- Server-URL und Server-Name
- Sprachen (alle CMS-Sprachen)
- Anzahl Artikel, Kategorien, Medien, Benutzer
- Debug- und Safe-Mode Status
- Liste aller installierten AddOns mit Versionen und Plugins
Die URL hat folgendes Format:
https://deine-domain.de/index.php?rex-api-call=ai_mcp
Bei einer lokalen Entwicklungsumgebung z.B.:
https://redaxo.localhost/index.php?rex-api-call=ai_mcp
Alle Requests an den MCP-Server muessen einen Bearer-Token im Header senden:
Authorization: Bearer <dein-token>
Der Token wird beim Installieren automatisch generiert und kann auf der MCP-Server-Seite eingesehen und neu generiert werden.
In der Claude Desktop Konfigurationsdatei (claude_desktop_config.json):
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Claude Desktop unterstuetzt HTTP-basierte MCP-Server ueber mcp-remote als Proxy. Installiere zuerst mcp-remote:
npm install -g mcp-remoteDann in der claude_desktop_config.json:
{
"mcpServers": {
"redaxo": {
"command": "npx",
"args": [
"mcp-remote",
"https://deine-domain.de/index.php?rex-api-call=ai_mcp",
"--header",
"Authorization: Bearer dein-token-hier"
]
}
}
}Lokaler Server (z.B. https://redaxo.localhost)
Bei einem lokalen Server mit selbstsigniertem SSL-Zertifikat muss die Zertifikatspruefung deaktiviert werden:
{
"mcpServers": {
"redaxo": {
"command": "npx",
"args": [
"mcp-remote",
"https://redaxo.localhost/index.php?rex-api-call=ai_mcp",
"--header",
"Authorization: Bearer dein-token-hier"
],
"env": {
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
}
}
}{
"mcpServers": {
"redaxo": {
"command": "npx",
"args": [
"mcp-remote",
"http://localhost:8080/index.php?rex-api-call=ai_mcp",
"--header",
"Authorization: Bearer dein-token-hier"
]
}
}
}In der Cursor-Konfiguration (.cursor/mcp.json im Projektverzeichnis):
{
"mcpServers": {
"redaxo": {
"command": "npx",
"args": [
"mcp-remote",
"https://deine-domain.de/index.php?rex-api-call=ai_mcp",
"--header",
"Authorization: Bearer dein-token-hier"
]
}
}
}Fuer lokale Server mit selbstsigniertem Zertifikat:
{
"mcpServers": {
"redaxo": {
"command": "npx",
"args": [
"mcp-remote",
"https://redaxo.localhost/index.php?rex-api-call=ai_mcp",
"--header",
"Authorization: Bearer dein-token-hier"
],
"env": {
"NODE_TLS_REJECT_UNAUTHORIZED": "0"
}
}
}
}claude mcp add redaxo \
-- npx mcp-remote \
"https://deine-domain.de/index.php?rex-api-call=ai_mcp" \
--header "Authorization: Bearer dein-token-hier"Fuer lokale Server:
NODE_TLS_REJECT_UNAUTHORIZED=0 claude mcp add redaxo \
-- npx mcp-remote \
"https://redaxo.localhost/index.php?rex-api-call=ai_mcp" \
--header "Authorization: Bearer dein-token-hier"Der Server implementiert das MCP-Protokoll (JSON-RPC 2.0) mit folgenden Methoden:
| Methode | Beschreibung |
|---|---|
initialize |
Handshake, gibt Server-Info und Capabilities zurueck |
tools/list |
Listet alle verfuegbaren Tools |
tools/call |
Fuehrt ein Tool aus |
ping |
Health-Check |
curl -X POST "https://deine-domain.de/index.php?rex-api-call=ai_mcp" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer dein-token-hier" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}'Andere AddOns koennen Tools ueber den Extension Point AI_PLATFORM_MCP_TOOLS bereitstellen. Diese Tools werden sowohl im MCP-Server als auch im Agent-System verfuegbar.
// In boot.php oder lib/ des eigenen AddOns:
rex_extension::register('AI_PLATFORM_MCP_TOOLS', function (rex_extension_point $ep) {
$tools = $ep->getSubject();
$tools['redaxo_article_search'] = new rex_ai_mcp_tool(
name: 'redaxo_article_search',
description: 'Sucht nach REDAXO-Artikeln anhand eines Suchbegriffs.',
inputSchema: [
'type' => 'object',
'properties' => [
'query' => [
'type' => 'string',
'description' => 'Der Suchbegriff',
],
'limit' => [
'type' => 'integer',
'description' => 'Maximale Anzahl der Ergebnisse (Standard: 10)',
],
],
'required' => ['query'],
],
handler: function (array $arguments): string {
$query = $arguments['query'];
$limit = $arguments['limit'] ?? 10;
$sql = rex_sql::factory();
$sql->setQuery(
'SELECT id, name FROM ' . rex::getTable('article')
. ' WHERE name LIKE ? LIMIT ?',
['%' . $query . '%', $limit]
);
$results = [];
foreach ($sql as $row) {
$results[] = [
'id' => $row->getValue('id'),
'name' => $row->getValue('name'),
];
}
return json_encode($results, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
},
);
return $tools;
});rex_extension::register('AI_PLATFORM_MCP_TOOLS', function (rex_extension_point $ep) {
$tools = $ep->getSubject();
$tools['redaxo_media_info'] = new rex_ai_mcp_tool(
name: 'redaxo_media_info',
description: 'Gibt Informationen zu einer Mediendatei zurueck.',
inputSchema: [
'type' => 'object',
'properties' => [
'filename' => [
'type' => 'string',
'description' => 'Der Dateiname der Mediendatei',
],
],
'required' => ['filename'],
],
handler: function (array $arguments): string {
$media = rex_media::get($arguments['filename']);
if (!$media) {
return 'Mediendatei nicht gefunden: ' . $arguments['filename'];
}
return json_encode([
'filename' => $media->getFileName(),
'title' => $media->getTitle(),
'type' => $media->getType(),
'size' => $media->getFormattedSize(),
'width' => $media->getWidth(),
'height' => $media->getHeight(),
'url' => $media->getUrl(),
], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
},
);
return $tools;
});| Extension Point | Beschreibung | Subject |
|---|---|---|
AI_PLATFORM_MCP_TOOLS |
Tools fuer den MCP-Server registrieren | array<string, rex_ai_mcp_tool> |
AI_PLATFORM_AGENT_TOOLS |
Tools fuer den Agent registrieren | array<object> (Symfony AI Tool-Objekte) |
- REDAXO >= 5.18
- PHP >= 8.2
- Composer (fuer die Installation der Symfony AI Bibliotheken)
MIT License