Laravel AI v0.11.0 erschien am 19. August 2026 mit 36 gemergten Pull Requests und zwölf Erst-Contributors. Die wichtigste Neuerung ist Observability: Eine einzige Invocation-ID durchzieht nun einen kompletten Agent-Run inklusive Failover-Versuchen, und Lifecycle-Events melden jeden Schritt.
Sieben Pull Requests von @pushpak1300 bauen das Run-Reporting um. Der synchrone prompt()-Pfad erzeugt die Invocation-ID jetzt vorab, wie es streamPrompt() bereits tat; zuvor sah die synchrone Middleware nur null, und ein Failover über drei Provider erzeugte drei unabhängige IDs für einen Run. Ein neuer RunContext trägt die Run-Identität und verschickt Events direkt. Die Tool-Invocation-ID wird nun in executeTool() erzeugt, was einen Nesting-Bug behebt, bei dem ein als Tool aufgerufener Agent die äußere ID überschrieb. Tools lesen sie über Request::toolInvocationId().
StartingStep, StepCompleted und StepFailed feuern um jeden Provider-Roundtrip, synchron wie gestreamt. StartingStep trägt Messages, aufgelöste Optionen und die komplette Message-History; die End-Events tragen die Laufzeit in Millisekunden, analog zu QueryExecuted::$time. ToolFailed meldet einen werfenden Tool-Handler mit seiner Invocation-ID, bevor die Exception erneut geworfen wird, und AgentFailed meldet einen endgültigen Fehler genau einmal pro Run, nach Erschöpfung der Failover-Kette. Ein Tool-Aufruf publiziert seine IDs, sodass von ihm gestartete Agenten sie als parentInvocationId und parentToolInvocationId erben; die Verknüpfung überschreitet jedoch keine Queue-Grenze.
Ein neuer ToolSearch-Wrapper von @behzadsp lässt große Tool-Kataloge auf Abruf laden: OpenAI und Anthropic nutzen dafür ihre gehostete Suche, statt bei jedem Request alle Tool-Definitionen mitzuschicken. Die Tools selbst bleiben unverändert. Der Wrapper bildet auf {"type":"tool_search"} bei OpenAI und auf tool_search_tool_* bei Anthropic ab, dessen Suchstrategie als Konstruktorargument gegen regex und bm25 validiert wird. Nicht unterstützte Provider werfen eine Exception vor dem Request; nur ein Wrapper pro Request ist erlaubt, und OpenAI Hosted Search erfordert gespeicherte Responses, sodass die Nutzung mit store=false eine Exception wirft. Derselbe PR ergänzt zustandsloses Output-Replay für OpenAI.
Failover greift nun in drei bisher verpassten Fällen. ConnectionException-Situationen, etwa ein nicht erreichbarer Host oder eine gestoppte lokale Ollama-Instanz, werden als ProviderConnectionException mit FailoverableException-Interface weitergereicht (@JVillator0). Die Liste der Überlast-Statuscodes wuchs von 503 auf 502, 503, 504, 520, 522 und 524; 500 bleibt bewusst außen vor (@sulimanbenhalim). Anthropic erhielt dieselbe Behandlung. Auch Anthropics HTTP-400-Ablehnungen bei erreichtem Ausgabenlimit lösen jetzt Failover aus, nachdem @oddvalue rund 990 unbehandelte Exceptions pro Monat aus genau diesem Fall gemeldet hatte.
Bei den Providern kam hinzu: Websuche und Dateisuche für xAI (@timmcleod), Transkription für OpenAI-kompatible Provider und Groq, das Web-Fetch-Servertool für OpenRouter (@CamilleScholtz) sowie Anthropic-Web-Fetch-Zitate auf $response->meta->citations bei nicht gestreamten Antworten. Geminis Standard-Textmodell ist nun gemini-3.7-flash.
Für Tests gibt es assertPromptedTimes() im Promptable-Fake, analog zu Bus::assertDispatchedTimes() (@F1nnG), und gefakte Queued-Generierung von Transkriptionen, Bildern, Audio und Embeddings führt nun den then(...)-Callback aus (@gdebrauwer).
Kleinere Fixes betreffen summierte Stream-Usage über Tool-Steps, erhaltene OpenAI-Cache-Write-Tokens, ausgenommene DeepSeek-Cache-Hit-Tokens, das Filtern verwaister Tool-Calls beim History-Replay, Reparatur unbekannter lokaler Tool-Calls, Mistral-Blocklisten-Content, gemappte Anthropic-Stop-Reasons refusal und model_context_window_exceeded, entfernte Markdown-Fences bei OpenAI-kompatiblem Structured Output, S3-Attachment-Rekonstruktion in File::fromArray, text/plain-Dokumentquellen bei Anthropic und eine stabile MCP-Request-Bindung.
Upgrade-Hinweise: Ein Provider-Fehler im Stream-Body wirft nun eine nicht failover-fähige StreamErrorException statt den Step still zu beenden; das Provider-Error-Event liegt auf ->error. AgentFailedOver erhielt ein Pflichtargument string $invocationId, ToolInvoked ein float $time, und AgentFailedOver feuert nicht mehr für den letzten Provider einer Kette. Wer Geminis Standardmodell nutzt, wechselt zu gemini-3.7-flash, sofern das Modell nicht explizit gesetzt ist. Update per composer update laravel/ai.
Kommentare
Noch keine Kommentare — schreib den ersten.
Starte die Diskussion
Kein Konto, kein Passwort nötig — gib einfach deine E-Mail-Adresse ein, wir senden dir einen einmaligen Anmelde-Link. Beim ersten Mal bist du damit automatisch angemeldet.
Deine Bewertung wird nach der Anmeldung automatisch übernommen.
Schau in dein Postfach
Wir haben einen Anmelde-Link an … gesendet. Öffne ihn auf diesem Gerät — dieser Tab meldet dich automatisch an.
Nichts angekommen? Wirf einen Blick in den Spam-Ordner — und markiere die Mail dort als „Kein Spam“, dann landet sie künftig direkt im Postfach.