BoxAgnts hat mit seinem Tool-System bereits eine sichere Ausführungsebene für KI-Tools geschaffen. Doch um diese Tools auch in verschiedenen KI-Modellen nutzen zu können, musste das Team zwei zentrale Herausforderungen meistern: die unterschiedlichen API-Formate der Anbieter sowie die nahtlose Integration von Gesprächsfluss und Tool-Aufrufen. Die Lösung liegt in einer dreistufigen Abstraktionsebene sowie einem intelligenten Abfragezyklus, der diese Unterschiede elegant überbrückt.
Herstellerneutrale API-Integration durch Provider-Abstraktion
KI-Anbieter wie Anthropic, OpenAI und Google nutzen jeweils eigene Formate für Anfragen, Antworten und Fehlerbehandlungen. Während Anthropic Rollen in user und assistant unterteilt und Systemanweisungen separat übergibt, behandelt OpenAI Systemmeldungen als Teil der Nachrichtenrolle. Google integriert Systemanweisungen sogar als eigenständiges Feld auf oberster Ebene des Anfragekörpers.
Um diese Unterschiede zu vereinheitlichen, hat BoxAgnts eine dreistufige Abstraktionsschicht entwickelt:
- Unified Data Model (ProviderRequest/ProviderResponse): Diese zentralen Datenstrukturen standardisieren alle Eingabe- und Ausgabeparameter. Egal ob Anthropic oder OpenAI – das Agentensystem arbeitet ausschließlich mit diesen beiden Modellen und bleibt so unabhängig vom gewählten Anbieter.
- LlmProvider-Trait: Dieses Rust-Interface definiert die Grundfunktionen jedes Anbieters. Eine Implementierung muss beispielsweise eine asynchrone Methode zur Erstellung von Nachrichtenströmen bereitstellen, die einen einheitlichen
StreamEvent-Typ zurückgibt. Intern handhaben die Provider ihre spezifischen HTTP-Anfragen, Authentifizierungen und SSE-Parsing-Prozesse.
- Transformer-Schicht: Reine Konvertierungsfunktionen übersetzen die standardisierte Anfrage in das jeweils benötigte Format. Für jeden neuen Anbieter genügt die Implementierung eines Transformers und der dazugehörigen Provider-Klasse. Ein zentrales
ProviderRegistryverwaltet alle verfügbaren Anbieter und wählt den Standardanbieter aus.
Server-Sent Events: Ein einheitliches Streaming-Erlebnis
Die meisten Anbieter nutzen Server-Sent Events (SSE) für Streaming-Antworten, doch die Granularität und Semantik der Ereignisse variieren erheblich:
- Anthropic: Verwendet ein dreistufiges System mit
content_block_start,content_block_deltaundcontent_block_stop. Ein einzelner Inhaltsblock wird über mehrere SSE-Nachrichten verteilt. - OpenAI: Arbeitet mit flachen Delta-Nachrichten ohne explizite Blockgrenzen.
- Google Gemini: Nutzt stattdessen das gRPC-Web-Protokoll mit eigenem Streaming-Format.
BoxAgnts’ stream_parser-Modul vereinheitlicht diese Unterschiede durch eine zentrale StreamEvent-Struktur:
pub enum StreamEvent {
TextDelta { text: String },
ToolUseStart { id: String, name: String },
ToolUseDelta { id: String, json: String },
ToolUseEnd { id: String },
ThinkingDelta { text: String },
UsageUpdate { input_tokens: u32, output_tokens: u32 },
MessageStop,
}Jeder Anbieter implementiert einen eigenen Parser, der als endlicher Automat arbeitet. Beispielsweise wandelt der Anthropic-Parser die eingehenden SSE-Nachrichten in die definierten StreamEvent-Typen um:
- Bei
message_startwerden Metadaten wie Modellname und initiale Token-Zählung erfasst. content_block_startlöst die Erstellung neuer Blöcke aus – je nach Typ als Text-, Tool- oder Denkblock.- Delta-Nachrichten (
content_block_delta) aktualisieren den jeweiligen Block und senden entsprechende Ereignisse an das System. content_block_stopschließt einen Block ab und sendet einToolUseEnd-Ereignis für Tool-Nutzungen.
Ein StreamAccumulator verwaltet den Zustand aller aktuellen Blöcke und setzt sie bei MessageStop zu einer vollständigen Nachricht zusammen.
Der Agent-Abfragezyklus: Nahtlose Integration von Tools und KI-Modellen
Der Abfragezyklus von BoxAgnts verbindet die standardisierten Nachrichten mit der Tool-Ausführung. Der Prozess läuft in folgenden Schritten ab:
- Nachrichtenaufbereitung: Das System konstruiert eine Anfrage mit Nachrichtenhistorie, Systemanweisungen und Tool-Definitionen.
- Streaming-Abfrage: Die Anfrage wird an den ausgewählten Anbieter gesendet, dessen Antwort als Nachrichtenstrom verarbeitet wird.
- Echtzeit-Verarbeitung: Während des Streams werden Tool-Aufrufe (
ToolUseStart,ToolUseDelta) direkt an das Frontend weitergeleitet, sodass Nutzer die Interaktion live verfolgen können. - Abschluss und Validierung: Nach Erhalt des
MessageStop-Ereignisses wird die vollständige Nachricht zusammengesetzt. Derstop_reasongibt Aufschluss darüber, ob die Antwort erfolgreich abgeschlossen oder abgebrochen wurde.
Diese Architektur ermöglicht eine flexible Integration von Tools in unterschiedlichste KI-Systeme – ohne dass Entwickler sich mit den Eigenheiten einzelner Anbieter beschäftigen müssen. Die Abstraktionsebenen sorgen für Stabilität und Skalierbarkeit, während der Agentenzyklus die nahtlose Zusammenarbeit zwischen KI und Tools sicherstellt.
In Zukunft wird diese Herangehensweise nicht nur die Kompatibilität zwischen Anbietern verbessern, sondern auch die Grundlage für erweiterte Funktionen wie adaptive Tool-Auswahl oder dynamische API-Anpassungen legen. BoxAgnts setzt damit neue Maßstäbe für die Interoperabilität von KI-Systemen.
KI-Zusammenfassung
BoxAgnts’in çoklu yapay zeka sağlayıcı uyumu nasıl sağlıyor? Provider soyutlama katmanı ve Akıllı Sorgulama Döngüsü hakkında detaylı inceleme.