Symfony AI Agent bauen, was Johannes Wachters Notiz Agent über sichere Schreibrechte zeigt

Von Roland Golla
0 Kommentar
Goldene Wüste, Frau mit Schlüssel am Tor, Roboter wartet, Schild Symfony AI Agent

Ein Symfony AI Agent darf bei Johannes Wachter Notizen schreiben, und trotzdem kann er kaum etwas kaputt machen. Johannes ist Core Developer bei Sulu, Mitglied im Symfony AI Core Team und ein guter Freund von Never Code Alone. Für den Symfony AI Hackathon baut er gerade ein kleines zweites Gehirn namens Synapse und erklärt jeden Schritt auf seinem Blog. Im ersten Teil seiner Serie geht es um einen Agent, der Text bekommt und selbst entscheidet, wo er hingehört. Wir fassen seine Kernideen zusammen und sagen, was Teams davon mitnehmen können.

Symfony AI im Team lernen

Agents mit klaren Grenzen bauen, das üben wir mit eurem Team direkt am eigenen Code und gemeinsam an der NCA Funktastatur:

  • Tool Calling: PHP Klassen als Werkzeuge für den Agent
  • Guardrails: Regeln im Code, die auch ohne Modell testbar sind
  • Für Teams: remote oder inhouse, aktuelle Termine auf Anfrage

Was der Notiz Agent genau macht

Das Ziel klingt klein. Ihr gebt einem Konsolenbefehl ein Stück Text, und am Ende liegt eine Markdown Datei im richtigen Ordner. Ein grober Gedanke landet in inbox/. Klares Wissen, zum Beispiel eine Entscheidung, wird zur strukturierten Notiz in brain/.

Eine Datenbank braucht das Projekt nicht. Das Gehirn ist ein Ordner voller Markdown Dateien im Open Knowledge Format, jede mit einem kleinen YAML Kopf. Die Inbox ist dabei eine bewusste Designentscheidung. Ein Modell, das unsicher ist, bekommt einen Platz für Material, das noch nicht als Wissen gilt.

Johannes sagt selbst, dass Synapse kein Produkt ist, das er nutzen würde. Es ist ein kompaktes Beispiel dafür, wie Agents, Tools, das AI Bundle und das MCP SDK zusammenspielen. Der Hackathon dazu soll laut Johannes vor dem 1.0 Release zeigen, was im echten Einsatz noch bricht. Mehr dazu steht in seinem Beitrag zu Beta und Hackathon.

Wie ihr einem KI Agent sicher Schreibrechte gebt

Das ist für uns der wichtigste Teil des Artikels. Der Agent bekommt keine Funktion, mit der er frei auf Pfade zugreift. Alles, was eine Datei berührt, läuft durch eine einzige Klasse namens Vault. Sie kennt genau ein Wurzelverzeichnis und genau eine Regel für gültige Pfade.

Die Sicherheit steckt damit in mehreren Schichten. Nur die erste hängt vom Urteil des Modells ab.

SchichtWas sie tutHängt vom Modell ab
Prompt und list_notesAgent prüft vor dem Schreiben, ob es das Thema schon gibtJa
Pfadregel im VaultErlaubt nur .md Dateien in brain/ und inbox/, prüft auch SymlinksNein
Exklusives AnlegenBestehende Notizen lassen sich nicht überschreibenNein
Format ValidatorWeist Notizen ab, die den Regeln nicht entsprechenNein
Git und Status draftJede Änderung ist ein Diff, freigeben kann nur ein MenschNein

Genau dieses Denken fehlt uns bei vielen Agent Setups. Was rund um das Modell passiert, entscheidet oft mehr als das Modell selbst. Das haben wir auch in unserem Beitrag zum Agent Harness beschrieben.

Wie Tools in Symfony AI aussehen

Ein Tool ist eine normale PHP Klasse mit dem Attribut #[AsTool]. Name und Beschreibung liest das Modell. Die Konstruktor Parameter kommen per Autowiring. Aus den @param Zeilen im Docblock werden die Beschreibungen der Argumente. Wie das im Detail läuft, zeigt unser Glossar Eintrag zu Tool Calling in Symfony AI.

Der Notiz Agent kommt mit fünf Tools aus:

  • list_notes zeigt, welche Notizen es schon gibt
  • read_note liest eine einzelne Notiz
  • save_to_inbox legt rohes Material ab
  • describe_format erklärt dem Modell, wie eine gute Notiz aussieht
  • save_to_brain schreibt fertiges Wissen und erzeugt den YAML Kopf selbst

Das letzte Detail ist klug. Das Modell muss nie von Hand gültiges YAML produzieren, also kann es dort auch keinen Fehler machen.

Warum der Agent Fehler als Text zurückbekommt

Wirft ein Tool eine Exception, fängt die Toolbox von Symfony AI sie ab und macht weiter. Das Modell erfährt dann aber nur, dass etwas schiefging, und den Grund nicht. Darum geben die Tools bei Johannes den Fehler als Text zurück:

try {
    return 'Gespeichert: '.$this->brain->saveToInbox($slug, $text);
} catch (\InvalidArgumentException $e) {
    return 'Fehler: '.$e->getMessage();
}

Die Meldungen sind für das Modell geschrieben. Sie sagen, wie ein gültiger Pfad aussieht oder welcher Abschnitt in einer Notiz fehlt. Meist reicht das, damit sich der Agent beim nächsten Aufruf selbst korrigiert. Laut Johannes gibt es auf dem Entwicklungszweig von Symfony AI inzwischen eine ToolErrorException, mit der ein späteres Release das sauberer lösen kann.

Auch die Formatregeln liegen an genau einem Ort, in einer YAML Datei. Der Validator liest sie zum Prüfen, das Tool describe_format liest sie zum Erklären. So können Prompt und Code nicht auseinanderlaufen. Dieses Muster würden wir in jedem Agent Projekt übernehmen.

Symfony AI Agent einrichten und der Stolperstein bei der Beta

Johannes arbeitet mit PHP 8.4, Symfony 8.1, Symfony AI 1.0.0-BETA1 und einem Cohere API Key. Der Agent selbst ist nur Konfiguration in YAML plus eine Prompt Datei, dazu kommt ein kleiner Konsolenbefehl als Oberfläche. Die Liste der erlaubten Tools steht direkt in der Konfiguration, genau wie eine Obergrenze für Tool Aufrufe.

Gestolpert ist Johannes über die Composer Einstellung. Solange das AI Bundle eine Beta ist, lässt es sich mit dem Standard stable nicht installieren, und der Hinweis steht weit hinten in der Fehlermeldung. Diese Zeile löst das Problem:

composer config minimum-stability beta

Den kompletten Code findet ihr im Branch 01-write-agent von wachterjohannes/synapse-tutorial. Jeder weitere Teil der Serie bekommt dort einen eigenen Branch.

Was der Test mit dem echten Modell zeigt

Johannes hat drei Eingaben gegen das echte Modell laufen lassen. Eine vage Idee landete in der Inbox. Eine klare Entscheidung wurde zur Notiz vom Typ Decision, mit Status draft und einem neuen Eintrag im Log. Dieselbe Entscheidung ein zweites Mal führte zu keiner neuen Datei, weil der Agent die erste Notiz vorher gefunden hatte.

Johannes verlässt sich auf dieses Urteil nicht allein. Der Vault würde das Überschreiben auch dann ablehnen, wenn das Modell es versucht. Und diese Regeln lassen sich ganz ohne Modell prüfen. Ein kleines Skript schickt ungültige Pfade an den Vault und meldet, ob alle abgewiesen werden.

Für uns ist das der stärkste Punkt. Tests, die ohne API Key laufen, passen in jede Pipeline. Sie kosten keine Tokens und sie geben bei jedem Lauf dasselbe Ergebnis.

Wo der Agent an seine Grenzen kommt

Johannes benennt die Schwächen offen. Der Agent kann Notizen auflisten und lesen, aber nicht nach Bedeutung suchen. Eine doppelte Notiz mit anderer Formulierung rutscht also durch. Genau dort setzt später Retrieval an, das er in seiner RAG Serie erklärt.

Der zweite Punkt betrifft die Sicherheit. Wer dem Agent Text schicken darf, kann damit auch sein Verhalten beeinflussen.

„captured text is also input“

Johannes Wachter, An agent that files your notes

Auf Deutsch: Auch der erfasste Text ist eine Eingabe an das Modell. Das Tutorial geht darauf bewusst nicht tiefer ein. In einem echten Projekt gehört diese Frage ganz nach vorne, vor allem wenn Mails oder Webseiten in den Agent laufen.

Was wir Teams daraus mitgeben

Das Muster geht weit über Notizen hinaus. Es passt auf jeden Agent, der Tickets anlegt, Inhalte in ein CMS schreibt oder Daten ändert. Unsere Checkliste dazu:

  • Kleine Schreibfläche: Der Agent bekommt fachliche Tools und keinen allgemeinen Zugriff.
  • Harte Regeln im Code: Was nie passieren darf, prüft PHP und kein Prompt.
  • Hilfreiche Fehler: Meldungen sagen dem Modell, was es besser machen soll.
  • Tests ohne Modell: Die Regeln laufen in der Pipeline, gern mit Rector und statischer Analyse daneben.
  • Menschliche Freigabe: KI Ergebnisse bleiben Entwürfe, bis jemand sie prüft.

Das Modell ist dabei die austauschbare Stelle. Cohere passt für das Tutorial, weil ein kostenloser Test Key reicht. Für euer Projekt prüft ihr selbst, welcher Anbieter zu euren Daten passt. Unser Eintrag zu Model Inference in Symfony AI erklärt die gemeinsame API, und Ollama lokal in Symfony anbinden zeigt den Weg zu einem lokalen Modell. Ob das bei Tool Calls mithält, seht ihr, wenn ihr dieselben Eingaben noch einmal laufen lasst.

Den ganzen Artikel mit allem Code lest ihr im Original auf johanneswachter.dev. Die Fortsetzungen sammelt Johannes auf seiner Synapse Übersicht.

Mehr zu Symfony AI und Agents

Einen Überblick über alle Bausteine gibt unser Glossar für Symfony AI. Wie Johannes zu Symfony AI kam, erzählen wir in Symfony Mate, wie die Idee im Zug entstand. Wenn ihr Agents statt Notizen mit einer laufenden App verbinden wollt, helfen Symfony AI Mate und das Symfony MCP Bundle. Was das neue Framework Release bringt, steht in Symfony 8.2 neue Features erklärt. Johannes arbeitet außerdem im Core Team von Sulu, das erklärt unser Glossar für Sulu CMS. Hängt euer Projekt noch auf einem alten Stand, ist ein PHP Update der erste Schritt.

Agents mit Guardrails für euer Team

Ein Agent mit Schreibrechten braucht Grenzen, die im Code stehen. Wir erarbeiten mit eurem Team Tools, Regeln und Tests im eigenen Symfony oder Sulu Projekt. Direkt an eurem Code, gemeinsam an der Funktastatur.

Remote oder inhouse, aktuelle Termine auf Anfrage. Das Vorgespräch ist kostenlos.

Häufige Fragen zum Symfony AI Agent

Was ist ein Symfony AI Agent 2026?

Ein Symfony AI Agent verbindet ein Sprachmodell mit einem Prompt und mit Tools, also PHP Klassen, die das Modell aufrufen kann. Ihr konfiguriert ihn über das AI Bundle in YAML und injiziert ihn wie einen normalen Service. Das Modell entscheidet, welches Tool es wann nutzt.

Was ist Synapse von Johannes Wachter 2026?

Synapse ist ein kleines zweites Gehirn, das Johannes Wachter als Tutorial für den Symfony AI Hackathon baut. Der erste Teil sortiert Text per Agent in Markdown Notizen ein. Spätere Teile ergänzen Suche, einen MCP Server und Berechtigungen. Als fertiges Produkt ist es nicht gedacht.

Wie begrenze ich die Schreibrechte eines KI Agenten 2026?

Gebt dem Agent fachliche Tools und keinen freien Dateizugriff. Prüft Pfade, Formate und Überschreiben im PHP Code an einer zentralen Stelle. Haltet Änderungen in Git nachvollziehbar und lasst Ergebnisse von Menschen freigeben. So bleibt ein Fehler des Modells begrenzt und schnell rückgängig zu machen.

Warum lässt sich Symfony AI 2026 nicht installieren?

Häufig liegt es an der Composer Einstellung. In der Beta Phase passt das AI Bundle nicht zum Standardwert stable bei minimum-stability. Setzt den Wert im Projekt auf beta. Beachtet auch, dass symfony/ai-agent ein eigenes Paket ist und zusätzlich installiert werden muss.

Muss ich für Symfony AI Agents 2026 Cohere nutzen?

Nein. Johannes nutzt Cohere im Tutorial, Symfony AI bindet aber viele Anbieter über eine gemeinsame Plattform Schicht an, darunter auch lokale Modelle über Ollama. Prüft bei einem Wechsel, ob das gewählte Modell Tool Calls zuverlässig beherrscht und zu euren Daten passt.

Wo finde ich den Code zum Notiz Agent?

Der Code liegt im GitHub Repository wachterjohannes/synapse-tutorial im Branch 01-write-agent. Jeder weitere Teil der Serie hat einen eigenen Branch. Die ausführliche Erklärung schreibt Johannes Wachter auf seinem Blog johanneswachter.dev.

0 Kommentar

Tutorials und Top Posts

Gib uns Feedback

Diese Seite benutzt Cookies. Ein Akzeptieren hilft uns die Seite zu verbessern. Ok Mehr dazu