Symfony AI Mate: MCP Server für PHP
Symfony AI Mate ist ein MCP Server für KI gestützte PHP Entwicklung. Installation, Extensions, Claude Code Integration und Vibe Coding mit Symfony.
Mehr erfahren
Structured Output ist ein Feature der Symfony AI Platform Component, das LLM Antworten direkt in typsichere PHP Objekte überführt. Statt eine JSON Zeichenkette selbst zu parsen, beschreibst du die gewünschte Form als gewöhnliche PHP Klasse und übergibst sie als response_format. Symfony AI generiert daraus automatisch ein JSON Schema, schickt es an das Modell und deserialisiert die Antwort zurück in eine Instanz deiner Klasse.
Der praktische Nutzen: Die Ausgabe des Modells fließt ohne Zwischenschritt in deine Anwendungslogik. Datenextraktion, Klassifikation und Anreicherung werden dadurch robust und typsicher. Besonders elegant ist die Populate Object Variante: Du übergibst ein bestehendes Objekt, bei dem nur ein Feld gesetzt ist, und lässt das Modell die fehlenden Felder recherchieren. Genau das zeigt das Beispiel auf dieser Seite: ein Land rein, die Hauptstadt zurück.
Structured Output funktioniert mit reinen PHP Klassen ebenso wie mit Array Strukturen und benötigt einen Event Subscriber, den PlatformSubscriber. Es läuft mit allen Anbietern, deren Modelle die Capability für strukturierte Ausgaben mitbringen, von OpenAI und Mistral bis zu lokalen Modellen über Ollama. Never Code Alone implementiert dieses Feature direkt in Symfony und Sulu CMS Projekte.
Never Code Alone entwickelt seit über 15 Jahren mit Symfony und betreibt die eigene Website auf Sulu CMS. Structured Output ist für uns kein Demo Snippet, sondern ein Werkzeug, das wir in echten Symfony Anwendungen für Datenextraktion und Anreicherung einsetzen. Wir kennen das Symfony AI Ökosystem inklusive Symfony AI Mate und das verwandte PHP Framework Neuron AI aus der Praxis.
Wir helfen Teams beim Vibe Coding Consulting, beim Weg vom Prototyp zur Produktion und beim Codebase Audit für KI generierten Code. KI Features sichern wir über CI/CD Pipelines mit PHPStan, Psalm und PHPUnit ab. Für sensible Daten setzen wir auf DSGVO konforme self hosted KI mit Ollama.
Finde das passende Angebot für dein Projekt
Hey! Ich bin CodeBot. Lass uns herausfinden, wie wir dein Projekt zum Fliegen bringen.
Was soll entstehen?
Der Ablauf ist in drei Schritten erklärt. Du definierst eine PHP Klasse mit typisierten Eigenschaften, übergibst sie als response_format und erhältst über asObject eine fertige Instanz zurück. Symfony AI kümmert sich dazwischen um das JSON Schema und die Deserialisierung. Voraussetzung ist der registrierte PlatformSubscriber am Event Dispatcher.
use Symfony\AI\Platform\Bridge\Mistral\PlatformFactory;
use Symfony\AI\Platform\Message\Message;
use Symfony\AI\Platform\Message\MessageBag;
use Symfony\AI\Platform\StructuredOutput\PlatformSubscriber;
use Symfony\Component\EventDispatcher\EventDispatcher;
$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber(new PlatformSubscriber());
$platform = PlatformFactory::create($apiKey, eventDispatcher: $dispatcher);
$messages = new MessageBag(
Message::forSystem('Du bist ein hilfreicher Mathe Tutor.'),
Message::ofUser('Wie loese ich 8x + 7 = -23'),
);
$result = $platform->invoke('mistral-small-latest', $messages, [
'response_format' => MathReasoning::class,
]);
$reasoning = $result->asObject(); // MathReasoning Instanz
Das Modell liefert keine freie Textantwort mehr, sondern exakt die Struktur, die deine Klasse vorgibt. Damit entfällt fehleranfälliges String Parsing, und die statische Analyse mit PHPStan oder Psalm greift auf die Ergebnisobjekte zu. Auch Array Strukturen als response_format sind möglich und benötigen denselben Subscriber.
Noch mächtiger als eine leere Klasse ist die Populate Object Variante. Du übergibst eine bestehende Instanz, bei der nur ein Feld gesetzt ist, und lässt das Modell die fehlenden Felder recherchieren. Hier ein Country Objekt, das nur den Namen kennt. Das Modell ermittelt die Hauptstadt und füllt das Objekt typsicher auf.
final class Country
{
public function __construct(
public string $name,
public ?string $capital = null,
) {
}
}
$country = new Country(name: 'Frankreich');
$messages = new MessageBag(
Message::forSystem('Du recherchierst fehlende Daten zu einem Land.'),
Message::ofUser('Ermittle die Hauptstadt fuer dieses Land.', $country),
);
$result = $platform->invoke('mistral-small-latest', $messages, [
'response_format' => $country,
]);
$researched = $result->asObject();
// Country(name: 'Frankreich', capital: 'Paris')
Das Ergebnis ist eine voll typisierte Country Instanz mit befülltem Hauptstadt Feld. Dieses Muster eignet sich für Datenanreicherung aller Art: Stammdaten vervollständigen, Entitäten klassifizieren oder unstrukturierte Eingaben in saubere Objekte überführen. In einer Symfony Anwendung fließt das Ergebnis direkt in Doctrine Entities, Formulare oder API Responses.
Structured Output ist nicht an US Anbieter gebunden. Über die Ollama Bridge läuft die strukturierte Ausgabe vollständig lokal auf eigener Hardware. Für DSGVO sensible Projekte ist das die naheliegende Wahl: Es verlassen keine Daten den eigenen Server. Wichtig ist nur, ein Modell zu wählen, das die Structured Output Capability unterstützt.
use Symfony\AI\Platform\Bridge\Ollama\OllamaApiCatalog;
use Symfony\AI\Platform\Bridge\Ollama\PlatformFactory;
$platform = PlatformFactory::create(
'http://127.0.0.1:11434',
HttpClient::create(),
new OllamaApiCatalog('http://127.0.0.1:11434', HttpClient::create()),
);
// Strukturierte Ausgabe lokal, ohne Daten an externe Anbieter zu senden
$result = $platform->invoke('qwen3', $messages, [
'response_format' => $country,
]);
In der NCA Produktion setzen wir lokale Modelle über Ollama mit Qwen und Llama ein. Für strukturierte Aufgaben kombinieren wir sie je nach Anforderung mit europäischen Anbietern wie Mistral. So bleibt die Kontrolle über Daten und Kosten im Haus, ohne auf typsichere LLM Ergebnisse zu verzichten.
Structured Output entfaltet seinen Wert überall dort, wo eine LLM Antwort direkt in die Anwendungslogik fließen soll. Häufige Einsatzfelder:
Der gemeinsame Nenner: Das Ergebnis ist kein unsicherer String, sondern ein geprüftes Objekt. In Kombination mit den deterministischen Werkzeugen aus dem PHP Stack wird aus einem LLM Aufruf ein verlässlicher Baustein. Genau diese Verbindung aus KI und Qualitätssicherung ist der Kern unserer Arbeit beim AI Slop Refactoring und beim Vibe Coding Security Audit.
Im NCA Stack ist Symfony die Basis und Sulu CMS das produktive Content System. Structured Output fügt sich nahtlos ein: Die Ergebnisobjekte landen über Dependency Injection in Services, werden mit dem Symfony Profiler nachvollziehbar und mit PHPUnit getestet. Für Integrationstests nutzen wir den Symfony KernelTestCase und mocken Modellantworten über den HttpClient MockResponse.
So wird aus einem KI Feature kein Blackbox Risiko, sondern getesteter Code, der in Production zuverlässig läuft. Wir beraten Teams beim Einbau solcher Features im Rahmen unseres Vibe Coding Consultings, beim 1 zu 1 Mentoring und beim Onboarding ins Team. Wer ein festgefahrenes KI Projekt hat, findet Hilfe beim Vibe Coding Projekt retten.
At first AI is a ton of buzzwords and hype
In Beratungsprojekten sehen wir regelmäßig denselben Reflex: Ein Team lässt das LLM JSON ausgeben und parst die Antwort mit Regex oder manuellem Mapping. Das funktioniert im Prototyp und bricht in Production, sobald das Modell das Format leicht variiert. Structured Output löst genau dieses Problem an der Wurzel, weil das Schema vom PHP Typ abgeleitet und die Antwort deserialisiert wird.
Unser Ansatz: KI Feature einbauen, dann mit deterministischen Werkzeugen absichern. PHPStan und Psalm prüfen die Typen der Ergebnisobjekte, Rector modernisiert generierten Code, und PHPUnit hält das Verhalten fest. Eingebettet in eine CI/CD Pipeline wird so aus einem KI Aufruf ein verlässlicher Baustein. Wer Symfony AI strategisch einordnen will, findet im Symfony AI Mate Eintrag und im Neuron AI Vergleich weitere Bausteine.
Roland Golla ist Entwickler aus Leidenschaft – seit über 20 Jahren. Er hat hunderte Projekte begleitet, von Legacy-Refactoring bis KI-Integration. Bei Vibe Coding verbindet er das Beste aus beiden Welten: Die Geschwindigkeit von KI-generiertem Code mit der Qualität professioneller Softwareentwicklung. Kein Bullshit, keine Agentur-Floskeln – direkte Hilfe von jemandem, der selbst täglich im Code steckt.
Die wichtigsten Fragen rund um Structured Output in Symfony AI, typsichere PHP Objekte und den praktischen Einsatz im Symfony und Sulu CMS Stack im Überblick.
Structured Output ist ein Feature der Symfony AI Platform Component, das LLM Antworten in typsichere PHP Objekte überführt. Du beschreibst die gewünschte Form als PHP Klasse und übergibst sie als response_format. Symfony AI erzeugt daraus ein JSON Schema, schickt es an das Modell und deserialisiert die Antwort zurück in eine Instanz deiner Klasse.
Structured Output funktioniert mit allen Anbietern, deren Modelle die Capability für strukturierte Ausgaben mitbringen. Dazu zählen OpenAI, Mistral, Google Gemini und Anthropic. Auch lokale Modelle über Ollama sind möglich, sofern das gewählte Modell strukturierte Ausgaben beherrscht. Entscheidend ist nicht der Anbieter, sondern die Capability des konkreten Modells.
Für Cloud Anbieter wie OpenAI oder Mistral benötigst du einen API Key, der als Umgebungsvariable hinterlegt wird. Setzt du lokale Modelle über Ollama ein, entfällt der API Key vollständig. Die Anfrage läuft dann gegen deinen eigenen Ollama Endpoint, etwa unter 127.0.0.1 Port 11434, ohne externe Authentifizierung.
Ja. Über die Ollama Bridge läuft Structured Output vollständig lokal auf eigener Hardware. Das ist für DSGVO sensible Projekte ideal, weil keine Daten den eigenen Server verlassen. Die PlatformFactory wird mit der lokalen Ollama Adresse erstellt, der Rest des Codes bleibt identisch zur Cloud Variante. Das Modell muss strukturierte Ausgaben unterstützen.
Symfony AI hat mit Version 0.1 einen großen Meilenstein erreicht und nähert sich dem 1.0 Release. Die Components entwickeln sich schnell und sind noch nicht vom Backward Compatibility Promise abgedeckt. Für Production empfiehlt sich, den Entwicklungsstand zu beobachten, Versionen zu pinnen und kritische Features mit Tests abzusichern. Genau dabei unterstützt Never Code Alone.
Übergibst du response_format als Klassennamen, erzeugt das Modell eine komplett neue Instanz aus der Antwort. Übergibst du eine bestehende Objektinstanz, befüllt das Modell nur die fehlenden Felder dieses Objekts. Die zweite Variante, Populate Object genannt, eignet sich für Datenanreicherung, etwa um zu einem bekannten Land die Hauptstadt zu ermitteln.
Der PlatformSubscriber ist ein Event Subscriber, der am Event Dispatcher registriert wird. Er kümmert sich um die Schema Generierung aus deiner PHP Klasse und die Deserialisierung der Modellantwort zurück in ein Objekt. Ohne diesen Subscriber funktioniert weder die klassenbasierte noch die arraybasierte strukturierte Ausgabe in Symfony AI.
Ja. Du kannst Eigenschaften mit eigenen Klassentypen versehen und so verschachtelte Strukturen abbilden, etwa ein Country Objekt mit einem eingebetteten Region Objekt. Symfony AI generiert für die gesamte Struktur ein passendes JSON Schema. Achte auf saubere Typisierung, damit die Deserialisierung die richtigen Klassen instanziieren kann.
Für Unit Tests prüfst du die Ergebnisobjekte mit PHPUnit auf die erwarteten Typen und Werte. Für Integrationstests nutzt du den Symfony KernelTestCase und mockst Modellantworten über den HttpClient MockResponse, sodass keine echten API Calls nötig sind. So bleiben die Tests schnell, deterministisch und unabhängig von externen Diensten.
Wenn die Modellantwort nicht zum erwarteten Schema passt, schlägt die Deserialisierung fehl. In Production solltest du diesen Fall abfangen, etwa mit einer Validierung und einem Retry oder einem Fallback. Lokale Modelle liefern bei strukturierten Aufgaben mitunter weniger zuverlässig als spezialisierte Cloud Modelle, weshalb sich Tests und eine robuste Fehlerbehandlung lohnen.
Structured Output nutzt du, wenn du eine typisierte Datenstruktur aus einer Antwort gewinnen willst. Tool Calling nutzt du, wenn das Modell aktiv eine deiner PHP Funktionen aufrufen soll, um Daten zu holen oder Aktionen auszulösen. Beide lassen sich kombinieren: Ein Agent ruft Tools auf und liefert das Endergebnis als strukturiertes Objekt.
Never Code Alone implementiert KI Features wie Structured Output direkt in bestehende Symfony und Sulu CMS Projekte. Wir bauen das Feature ein, sichern es mit PHPStan, Psalm und PHPUnit ab und betten es in eine CI/CD Pipeline ein. Auf Wunsch DSGVO konform mit lokalen Modellen über Ollama. Die Abrechnung erfolgt transparent und minutengenau.
Ein Methodenaufruf, jedes Modell: Die Platform Component spricht OpenAI, Anthropic, Mistral und lokale Modelle über dieselbe invoke Schnittstelle an.
KI Antworten erscheinen Token für Token wie bei ChatGPT. Symfony AI streamt über die stream Option und asStream, mit jedem unterstützten Modell.