Symfony AI Model Inference
Model Inference in Symfony AI: Mit einem invoke Aufruf jedes KI Modell ansprechen. Anbieter wechseln ohne Code Änderung, von OpenAI bis Ollama lokal.
Mehr erfahren
Die lokale Ollama Anbindung in Symfony verbindet eine Symfony Anwendung mit einem lokal laufenden Ollama Daemon, sodass KI Recherche direkt auf eigener Hardware läuft. Statt Anfragen an eine fremde Cloud zu schicken, spricht deine Anwendung über die Platform Component von Symfony AI ein Modell an, das auf deinem Rechner oder Server liegt, ohne API Kosten und ohne Datenabfluss.
Technisch übernimmt das Paket symfony/ai-ollama-platform die komplette Verkabelung. Du musst keinen PHP Code anfassen, sondern nur drei Konfigurationen in Einklang bringen: den richtigen Endpunkt, ein installiertes Modell und eine funktionierende Netzwerkbrücke zwischen Docker Container und Host. Genau daran scheitern die meisten Setups im ersten Anlauf.
Dieses Tutorial zeigt Schritt für Schritt, wie du ein lokales Modell wie gpt-oss:20b in einem DDEV basierten Symfony Projekt erreichbar machst und einen KI Befehl zum Laufen bringst. Das Beispiel stammt aus einem echten Sulu CMS Projekt und liefert strukturierte JSON Ausgaben zurück. In der NCA Produktion setzen wir denselben Ansatz mit Ollama und Modellen wie Qwen und Llama ein.
Never Code Alone entwickelt seit über 15 Jahren mit Symfony und betreibt die eigene Plattform auf Sulu CMS. Lokale KI über Ollama ist für uns kein Experiment, sondern gelebte Praxis: Wir betreiben KI Recherche und Content Workflows auf eigenen Servern in Deutschland, ohne Daten an US Anbieter zu senden. Das Symfony AI Ökosystem inklusive Symfony AI Mate und das PHP Framework Neuron AI kennen wir aus echten Projekten.
Wir helfen Teams beim Vibe Coding Consulting, beim Aufbau von self hosted KI im Unternehmen und beim Weg vom Prototyp zur Produktion. KI Features sichern wir über CI/CD Pipelines mit PHPStan, Psalm und PHPUnit ab. Wann sich lokale Inferenz lohnt, ordnen wir mit dir im Kontext von Compliance und Wirtschaftlichkeit ein.
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?
Das Szenario ist typisch: Der KI Befehl ist verkabelt, symfony/ai-ollama-platform ist installiert, der Service existiert. Trotzdem läuft jeder Aufruf ins Leere, weil die Konfiguration auf eine fremde Cloud zeigt und der Container den lokalen Ollama gar nicht sieht. Drei Stolpersteine sind fast immer die Ursache:
Die gute Nachricht: Alle drei Punkte lösen wir mit Bordmitteln, ohne eine einzige Zeile PHP anzufassen. Die komplette Ollama Anbindung ist bereits über die Model Inference Schnittstelle von Symfony AI registriert. Wir bringen nur Endpunkt, Modell und Netzwerk in Einklang.
Bevor es losgeht, brauchst du drei Dinge. Der Rest sind reine Konfigurationsschritte, die in unter zehn Minuten erledigt sind.
Zuerst holst du das Modell, das die Implementierung standardmäßig erwartet. In unserem Beispiel ist das gpt-oss:20b, das quelloffene Modell von OpenAI. In der NCA Produktion nutzen wir hier je nach Aufgabe auch Qwen oder Llama.
ollama pull gpt-oss:20b
Danach prüfst du, was lokal verfügbar ist. Der Aufruf gegen die Ollama API listet alle installierten Modelle auf.
curl -s http://localhost:11434/api/tags | grep -o '"name":"[^"]*"'
In der Ausgabe sollte gpt-oss:20b auftauchen, neben eventuell bereits vorhandenen Modellen wie llama3.2 oder qwen2.5. Damit ist das Modell einsatzbereit.
Standardmäßig bindet Ollama nur an die Loopback Adresse. Dein Symfony Prozess läuft aber im Container und erreicht den Host über host.docker.internal. Damit das klappt, muss Ollama auf allen Netzwerkschnittstellen lauschen. Läuft Ollama als systemd Service, erledigt das ein kleiner Drop in.
sudo mkdir -p /etc/systemd/system/ollama.service.d
printf '[Service]\nEnvironment="OLLAMA_HOST=0.0.0.0:11434"\n' \
| sudo tee /etc/systemd/system/ollama.service.d/override.conf
sudo systemctl daemon-reload && sudo systemctl restart ollama
Ein Sicherheitshinweis: 0.0.0.0 macht Ollama im gesamten Netzwerk erreichbar. Tu das nur in vertrauenswürdigen Umgebungen, also nicht im öffentlichen WLAN. Wer den Dienst nach außen absichern will, stellt einen Reverse Proxy wie Caddy davor. Anschließend kontrollierst du das Ergebnis.
ss -ltn | grep 11434
Korrekt ist nun ein Sternchen statt 127.0.0.1, also LISTEN auf *:11434. Ollama nimmt jetzt Verbindungen vom Container an.
Jetzt passt du die drei relevanten Werte in der .env.local an. Sie sind meist der eigentliche Grund, warum der Aufruf vorher ins Leere lief: Der Host zeigte auf eine Cloud, das Modell war lokal nicht vorhanden und ein API Key war gesetzt, obwohl lokal keiner nötig ist. Die folgende Tabelle zeigt den Wechsel im Überblick.
| Variable | Vorher | Nachher |
|---|---|---|
| OLLAMA_HOST | https://ollama.com | http://host.docker.internal:11434 |
| OLLAMA_MODEL | qwen3-coder-next | gpt-oss:20b |
| OLLAMA_API_KEY | 6367 … | leer, lokal nicht nötig |
Zusammengefasst sieht der relevante Ausschnitt so aus. Das ist die einzige Datei, die du im Projekt anpasst.
OLLAMA_HOST=http://host.docker.internal:11434
OLLAMA_API_KEY=
OLLAMA_MODEL=gpt-oss:20b
Bevor du Symfony bemühst, verifizierst du die Netzwerkverbindung direkt aus dem Container. So trennst du sauber zwischen Netzwerk und Anwendung.
ddev exec curl -s -w "\nHTTP:%{http_code}\n" http://host.docker.internal:11434/api/tags
Steht am Ende HTTP:200 und du siehst die Modellliste, ist die Brücke geschlagen. Der Container erreicht den Ollama Daemon auf dem Host.
Jetzt der eigentliche Aufruf. Der Demo Befehl recherchiert die Hauptstadt eines Landes und gibt das Ergebnis als strukturiertes JSON zurück. Wie diese typsichere Ausgabe unter der Haube entsteht, zeigt der Eintrag zu Structured Output.
ddev exec bin/console ai:demo:property-research Deutschland
Die Ausgabe lautet: [OK] Deutschland — capital: Berlin. Und weil ein Treffer kein Zufall sein soll, testest du gleich mehrere Länder in einer Schleife.
for c in Japan Brasilien Australien; do
ddev exec bin/console ai:demo:property-research "$c"
done
Das Modell liefert zuverlässig Tokyo, Brasília und Canberra zurück. Damit läuft die KI Recherche komplett lokal, ohne Cloud, ohne API Key und ohne Datenabfluss.
Drei Erkenntnisse, die über dieses Beispiel hinaus gelten:
Wer diesen Mechanismus verstanden hat, steht vor der Tür zu mächtigeren Workflows: ein eigener Befehl für die FAQ Recherche oder eine Pipeline, die Content Blöcke direkt im Sulu CMS generiert. Die Infrastruktur steht, ganz ohne API Schlüssel und ohne Cloud Kosten.
At first AI is a ton of buzzwords and hype
In Beratungsprojekten sehen wir regelmäßig dasselbe Muster: Ein Team will lokale Modelle nutzen, scheitert aber an der Grenze zwischen Container und Host. Der PHP Code ist längst korrekt, es hakt an drei Umgebungsvariablen und einem fehlenden Binding. Wer diese Kette einmal verstanden hat, überträgt sie auf jeden anderen Dienst, der im Host läuft und aus dem Container erreichbar sein muss.
Unser Ansatz: lokale Inferenz einbauen, dann mit deterministischen Werkzeugen absichern. PHPStan und Psalm prüfen die Typen der Ergebnisobjekte, PHPUnit und der Symfony KernelTestCase halten das Verhalten fest, Modellantworten mocken wir über den HttpClient MockResponse. Eingebettet in eine CI/CD Pipeline wird aus einem lokalen KI Aufruf ein verlässlicher Baustein. Wir begleiten das im Vibe Coding Consulting, im 1 zu 1 Mentoring und beim Vibe Coding Projekt retten. Die Abrechnung erfolgt transparent und minutengenau.
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 die lokale Ollama Anbindung in Symfony, das Docker Netzwerk und den DSGVO konformen Betrieb im Überblick.
Die lokale Ollama Anbindung verbindet eine Symfony Anwendung über das Paket symfony/ai-ollama-platform mit einem Ollama Daemon auf eigener Hardware. KI Recherche läuft dann ohne Cloud, ohne API Kosten und ohne Datenabfluss. Die Anbindung ist bereits registriert, du bringst nur Endpunkt, Modell und Netzwerk in Einklang.
Weil Ollama standardmäßig nur auf 127.0.0.1 lauscht. Ein Container erreicht den Host über host.docker.internal und braucht deshalb einen Dienst, der auf allen Schnittstellen lauscht. Setzt du OLLAMA_HOST auf 0.0.0.0:11434 und startest den Daemon neu, nimmt Ollama die Verbindungen aus dem Container an.
Nein. Für lokale Modelle über Ollama entfällt der API Key vollständig. Die Anfrage läuft gegen deinen eigenen Endpunkt, etwa http://host.docker.internal:11434. Die Variable OLLAMA_API_KEY bleibt leer. Nur bei Cloud Anbietern wie OpenAI oder Mistral ist ein Schlüssel als Umgebungsvariable nötig.
Das hängt von der Aufgabe ab. Im Tutorial nutzen wir gpt-oss:20b, das quelloffene Modell von OpenAI. In der NCA Produktion setzen wir je nach Anforderung auf Qwen oder Llama. Wichtig ist, dass das Modell die benötigte Fähigkeit mitbringt, etwa strukturierte JSON Ausgaben, und lokal installiert ist.
Ja, weil keine Daten den eigenen Server verlassen. Die Inferenz läuft vollständig auf eigener Hardware, ohne Aufruf an externe Anbieter. Das macht den Ansatz ideal für sensible Daten und Berufsgeheimnisträger. Für den sicheren Betrieb nach außen empfiehlt sich zusätzlich ein Reverse Proxy und Zugangsschutz.
host.docker.internal ist ein spezieller DNS Name, über den ein Docker Container den Host Rechner erreicht, auf dem Docker läuft. Statt localhost, das im Container auf den Container selbst zeigt, adressierst du damit Dienste, die direkt auf dem Host laufen, wie einen lokalen Ollama Daemon.
Du bringst Ollama dazu, auf allen Schnittstellen zu lauschen, indem du OLLAMA_HOST auf 0.0.0.0:11434 setzt, bei systemd über einen Drop in. Danach zeigt OLLAMA_HOST in der Symfony Konfiguration auf http://host.docker.internal:11434. Aus dem Container testest du die Verbindung mit ddev exec curl gegen den Endpunkt.
Nein. Wenn symfony/ai-ollama-platform installiert und der Platform Service registriert ist, brauchst du keinen neuen Code. Die komplette Anbindung läuft über die Konfiguration. Du passt nur die .env.local an: Endpunkt, Modellname und den leeren API Key. Der restliche Ablauf bleibt identisch zur Cloud Variante.
Mit einem curl Aufruf direkt aus dem Container, etwa ddev exec curl gegen http://host.docker.internal:11434/api/tags. Kommt HTTP 200 und die Modellliste zurück, ist die Netzwerkbrücke geschlagen. Dieser Zwischenschritt trennt sauber zwischen Netzwerkproblemen und Fehlern in der Anwendung selbst.
Ja. Die Option format json im invoke Aufruf wird von Ollama nativ unterstützt, sofern das gewählte Modell strukturierte Ausgaben beherrscht. So fließt das Ergebnis typsicher in Entitäten, DTOs oder Doctrine Objekte. Details zeigt der Eintrag zu Structured Output in Symfony AI.
In einem vertrauenswürdigen Netzwerk ist es unkritisch, weil es Ollama nur lokal erreichbar macht. In öffentlichen Netzen solltest du es vermeiden oder absichern. Ein Reverse Proxy wie Caddy mit TLS und Zugangsschutz stellt den Dienst kontrolliert bereit, statt ihn offen ins Netz zu hängen.
Never Code Alone bindet lokale Modelle über Ollama in bestehende Symfony und Sulu CMS Projekte ein, sichert die KI Features mit PHPStan, Psalm und PHPUnit ab und bettet sie in eine CI/CD Pipeline ein. Auf Wunsch vollständig DSGVO konform auf eigenen Servern. 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.
Typsichere PHP Objekte direkt aus dem LLM: Symfony AI generiert das JSON Schema aus deiner Klasse und befüllt sie. Beispiel Land zu Hauptstadt.