Suche/KI-Anbieter und Vektorspeicher zu einem modularen Rust-KI-Framework hinzufügen

KI-Anbieter und Vektorspeicher zu einem modularen Rust-KI-Framework hinzufügen

Für die Erweiterung eines Rust-Frameworks für viele KI-Anbieter. Die KI folgt den vorhandenen Traits und Buildern, erhält die WebAssembly-Unterstützung, lässt Hooks mit und ohne Streaming gleich arbeiten und prüft aufgezeichnete Kassetten auf API-Schlüssel.

Diese KI-Regeln verwenden
## Nur den gewünschten Umfang ändern und ohne Auftrag nichts committen - Lies vor Codeänderungen die bestehende Implementierung, Manifeste, Tests und öffentliche Dokumentation. - Begrenze jede Änderung auf den vom Benutzer beauftragten Umfang. - Bevorzuge vorhandene Traits, Builder, Module und Fehlertypen gegenüber parallelen Abstraktionen. - Füge keine TODOs, Attrappen, Platzhalterlogik oder spekulativen öffentlichen APIs hinzu. - Erstelle keine Commits, stelle keine Änderungen bereit, pushe nichts, lege keine Zweige an und öffne keine Pull Requests, sofern der Benutzer dies nicht ausdrücklich verlangt. - Bewahre sachfremde Benutzeränderungen und arbeite sicher um einen veränderten Arbeitsbaum herum. - Vermeide sachfremde Umstrukturierungen, auch wenn sich ein benachbartes Design verbessern ließe. - Unterscheide Richtlinien für Mitwirkende von den technischen Regeln des Repositorys und befolge beide. - Halte an, wenn die erforderliche Produktabsicht oder eine externe Genehmigung fehlt. ## Crate-Aufteilung und Feature-Flags im ganzen Arbeitsbereich stimmig halten - Belasse das öffentliche Fassaden-Crate, das Kern-Crate, ergänzende Integrationen, Ableitungsmakros, Beispiele und Tests in ihren festgelegten Rollen. - Die Fassade soll Kern-APIs erneut exportieren und optionale Ergänzungs-Crates über Feature-Schalter bereitstellen. - Prüfe das Arbeitsbereichsmanifest und die Fassadenexporte, bevor du öffentliche Features, Integrationen oder Modulpfade änderst. - Lege Anbieter- und Vektorspeicherintegrationen in Ergänzungs-Crates ab, sofern kein gewichtiger Architekturgrund die Aufnahme in den Kern verlangt. - Trenne Beispiele des Arbeitsbereichs von Crate-spezifischen Beispielen und Integrationstests. - Aktualisiere beim Hinzufügen eines Ergänzungs-Crates nach Bedarf die Wurzelabhängigkeit, das Feature, den Fassadenexport, Beispiele, README und Crate-Dokumentation. - Stelle sicher, dass Feature-Kombinationen kompilieren, ohne nicht verfügbare Module offenzulegen. - Halte die öffentliche Dokumentation zwischen Fassade und betroffenen Ergänzungs-Crates synchron. - Beschreibe einen Modulpfad oder ein Feature erst, nachdem Code und Manifeste es bestätigt haben. ## Auf den gemeinsamen Traits aufbauen statt anbieterspezifische Varianten zu schaffen - Baue Integrationen auf den zentralen Traits des Frameworks für Vervollständigung, Einbettung, Vektorindizes und aufrufbare Werkzeuge auf. - Erstelle keine anbieterspezifischen Alternativen zu einem vorhandenen anbieterübergreifenden Trait. - Befolge für konfigurierbare öffentliche Typen das etablierte Builder-Muster. - Halte die Konstruktion flüssig und typisiert und schließe sie erst nach einem ausdrücklichen Build-Schritt ab. - Verwende eine allgemeine Client-Architektur, die Anbietererweiterungen vom zugrunde liegenden HTTP-Transport trennt. - Deklariere Anbieterfähigkeiten ausdrücklich, damit nicht unterstütztes Verhalten bereits beim Kompilieren scheitert. - Stelle fehlende Fähigkeiten durch einen bewussten Markertyp statt durch Vermutungen zur Laufzeit dar. - Bewahre die Beziehungen der API-key-Typen zwischen Anbieter-Buildern und öffentlichen Client-Aliasen. - Halte anbieterspezifische Anfrage- und Antworttypen hinter Konvertierungsgrenzen. ## Gemeinsamen asynchronen Code auch unter WebAssembly lauffähig halten - Bewahre die WebAssembly-Unterstützung in gemeinsamen Traits, Futures, Fehlern und Integrationen. - Verwende bei unterschiedlichen Zielplattformen die Kompatibilitätsabstraktionen des Frameworks anstelle unvermittelter `Send`- und `Sync`-Schranken. - Verwende für dynamisch zurückgegebene Futures den vorgesehenen plattformübergreifenden boxed-future-Typ. - Wende native Schranken für Threadsicherheit nur auf Zielplattformen an, die sie unterstützen. - Halte gekapselte WebAssembly-Fehler frei von nicht unterstützten, ausschließlich nativen Schranken. - Teste nach Änderungen gemeinsamer Traits sowohl native als auch auf WebAssembly ausgerichtete Typsignaturen. - Füge keine Abhängigkeit oder API hinzu, die eine unterstützte Zielplattform stillschweigend ausschließt. - Begrenze bedingte Kompilierung auf einen engen Bereich und erläutere den Unterschied zwischen Zielplattformen. - Stelle sicher, dass Anbieter-, Vektorspeicher- und Hook-APIs denselben Portabilitätsvertrag verwenden. ## Eindeutige Fehlertypen nutzen und jede neue öffentliche API dokumentieren - Verwende `String` nicht als Fehlertyp für eine neue fallible API. - Definiere ausdrückliche Fehleraufzählungen und bewahre nützliche Einzelheiten der Anbieterantwort über die Fehlerhilfen des Frameworks. - Bevorzuge `?` und aussagekräftige Konvertierungen gegenüber dem manuellen Verlust von Fehlerkontext. - Verwende `unwrap()` oder `expect()` nur, wenn die Unmöglichkeit aus der umgebenden Invariante eindeutig hervorgeht. - Ergänze jedes neue öffentliche Element wie Typ, Funktion, Trait und Methode um Elementdokumentation. - Ergänze jedes neue öffentliche Modul um Moduldokumentation. - Halte Beispiele mit tatsächlichen APIs, Modellkonstanten, Modulpfaden und Feature-Schaltern in Einklang. - Kennzeichne Beispiele als nicht ausführbar, wenn sie externe Zugangsdaten oder Dienste benötigen. - Aktualisiere README-Dateien und Dokumentation auf Crate-Ebene bei jeder Änderung öffentlichen Verhaltens. ## Einen neuen KI-Anbieter nach dem Vorbild des ähnlichsten bestehenden hinzufügen - Untersuche vor der Implementierung oder Änderung eines Anbieters die ähnlichste vorhandene Anbieterimplementierung. - Ergänze Anbietererweiterungs- und Builder-Typen, die Anbieterimplementierung und eine ausdrückliche Fähigkeitsdeklaration. - Unterstütze die Konstruktion aus Umgebungswerten und direkten Werten, wenn das Framework beide Wege bereitstellt. - Halte öffentliche Client- und Builder-Aliase mit dem API-key-Typ des Anbieter-Builders in Einklang. - Verwende ausdrückliche Markertypen für Zugangsdaten oder Authentifizierung und schwärze zugangsdatenhaltige Werte in Debug-Ausgaben. - Konvertiere Framework-Anfragen in das tatsächliche Übertragungsformat des Anbieters und Antworten zurück in Framework-Typen. - Ergänze Streaming nur, wenn der Anbieter es tatsächlich unterstützt, und bewahre Anbieterfehler über die Standardhilfen. - Befolge bestehende Telemetriekonventionen und Erweiterungs-Traits. - Erfinde keine Anfrage- oder Antwortfelder, die in der tatsächlichen Anbieter-API fehlen. - Ergänze zielgerichtete Tests oder Beispiele, die das unterstützte Verhalten belegen. ## Einen Vektorspeicher mit echten Filtern und klaren Suchergebnissen anbinden - Lege eine Vektorspeicherintegration in einem Ergänzungs-Crate ab, sofern die Zugehörigkeit zum Kern nicht begründet ist. - Implementiere sowohl eine ergebnisliefernde als auch eine ausschließlich Kennungen liefernde Suche. - Verwende einen Filtertyp, der die tatsächlichen Filtermöglichkeiten des Backends abbildet. - Gib die Vektorspeicher-Fehlervarianten des Frameworks statt improvisierter Zeichenkettenfehler zurück. - Wende dieselben plattformübergreifenden asynchronen Schranken wie im Kern-Framework an. - Halte Konvertierungen von Bewertung, Dokument, Kennung und Metadaten ausdrücklich. - Definiere Sortierung, Begrenzung, leere Ergebnisse und Verhalten bei Backend-Fehlern. - Teste Filter, Rangfolge, Ergebnisgrenzen, fehlende Datensätze und Konvertierungsfehler. - Dokumentiere benötigte Features, Zugangsdaten, Indizes und externe Einrichtung, ohne Geheimnisse einzubetten. ## Für jedes Hook-Ereignis die erlaubten Aktionen festlegen - Modelliere Hooks als Beobachter und Steuerer eines einzelnen Ausführungslaufs. - Übergib jedem Ereignis einen Laufkontext mit Laufkennung, Runde, Streaming-Modus, Agentenkennung und gemeinsamem Zwischenspeicherzustand. - Gib jedem Ereignis einen eigenen Aktionstyp, damit nicht unterstützte Aktionskombinationen beim Kompilieren scheitern. - Lasse Hooks für Vervollständigungsaufrufe eine Anfrage ändern oder die Verarbeitung stoppen. - Lasse Hooks für Werkzeugaufrufe und -ergebnisse Werte für spätere Hooks umschreiben; definiertes skip oder stop ist dabei eine abschließende Aktion. - Stelle die Behandlung ungültiger Werkzeugaufrufe durch ausdrückliche Optionen für fail, retry, repair, skip und stop dar. - Beschränke rein beobachtende Ereignisse auf continue oder stop. - Registriere Beobachtungshooks vor Steuerungshooks, wenn stop-Aktionen den Stapel vorzeitig beenden. - Dokumentiere, welche Aktionen Daten umformen, ansammeln oder die Verarbeitung beenden. ## Gestapelte Hooks mit und ohne Streaming gleich zusammensetzen - Bewahre ereignisspezifische Zusammensetzungsregeln, wenn Hooks verschachtelt oder gestapelt werden. - Führe Änderungen an Vervollständigungsanfragen in Registrierungsreihenfolge zusammen. - Hänge zusätzlichen Kontext an, führe zusätzliche Parameter flach zusammen und bilde die Schnittmenge aktiver Werkzeuge. - Verwende das Prinzip „letzter Schreiber gewinnt“ nur für dokumentierte Skalar- und Verlaufsfelder und warne bei bedeutsamem Überschreiben. - Begrenze jede Anfrageänderung auf eine Runde; lasse sie niemals versehentlich dauerhaft werden. - Reiche Umschreibungen von Werkzeugaufrufen und -ergebnissen an alle späteren Hooks weiter. - Beende die Stapelauswertung sofort, wenn eine abschließende Aktion dies verlangt. - Lasse Streaming- und Nicht-Streaming-Oberflächen denselben Lebenszyklustreiber verwenden. - Teste identisches Hook-Verhalten über Streaming- und Nicht-Streaming-Einstiegspunkte. - Ergänze Zusammensetzungstests für verschachtelte Stapel, Zusammenführungskonflikte, Umschreibeketten, skip und stop. ## Den kleinsten Regressionstest wählen und Anbieteraufrufe mit aufgezeichneten Kassetten testen - Ergänze Regressionstestabdeckung im kleinsten zuverlässigen Umfang. - Bevorzuge für isolierte Konvertierungs- oder Logikfehler einen Komponententest neben der Implementierung. - Verwende kassettenbasierte Anbietertests, wenn das Verhalten vom Anfrage- und Antwortverkehr des Anbieters abhängt. - Verwende ignorierte Live-Tests nur, wenn eine deterministische Kassettenwiedergabe das Verhalten nicht darstellen kann. - Lies den Testleitfaden des Repositorys, bevor du Anbietertests hinzufügst, aktualisierst, aufzeichnest oder wiedergibst. - Spiele Kassetten standardmäßig ab, damit normale Tests keine Anbieterzugangsdaten benötigen. - Begrenze die Testausführung auf den geänderten Anbieter und das geänderte Verhalten. - Decke Streaming- und Nicht-Streaming-Verhalten ab, wenn beide Oberflächen vorhanden sind. - Bewahre das ursprüngliche Fehlermuster in der Regressionsprüfung. ## Kassetten nur für den Zieltest aufzeichnen und auf Geheimnisse prüfen - Behandle den Aufzeichnungsmodus als externen, zugangsdatenpflichtigen und dateiüberschreibenden Vorgang. - Verlange vor der Aufzeichnung die zugehörigen Anbieterzugangsdaten und gib sie niemals aus. - Zeichne nur den betroffenen Anbietertest auf, um sachfremde Änderungen an Testdaten zu minimieren. - Prüfe jeden Kassetten-Diff manuell, bevor du ihn vorlegst oder committest. - Verwirf Testdaten mit API keys, bearer credentials, cookies, Kontokennungen oder anderen sensiblen Werten. - Entferne sachfremde Anfrage- und Antwortänderungen, statt unübersichtliche Testdaten zu akzeptieren. - Lasse automatische Bereinigungs- und Sicherheitsprüfungen aktiviert, betrachte sie aber nicht als Ersatz für eine Inspektion. - Bewahre deterministische Wiedergabedaten, während du Geheimnisse und instabile Metadaten schwärzt. - Überschreibe Testdaten niemals nur, um einen fehlgeschlagenen Test ohne Erklärung der Verhaltensänderung erfolgreich zu machen. ## Prüfungen von eng nach breit ausführen und Ungeprüftes benennen - Führe zuerst die kleinsten nützlichen Prüfungen aus und erweitere sie danach entsprechend betroffenem Umfang und Risiko. - Formatiere den Arbeitsbereich und führe Lints für alle betroffenen Zielplattformen und Features aus. - Führe zielgerichtete Tests vor umfassenden Arbeitsbereichstests aus. - Erzeuge Dokumentation ohne Abhängigkeiten, wenn sich öffentliche APIs oder Dokumente ändern. - Prüfe native und WebAssembly-Kompatibilität, wenn sich gemeinsame Schranken oder Futures ändern. - Bestätige, dass Übertragungsfelder des Anbieters der tatsächlichen API entsprechen und Kassetten-Diffs keine Geheimnisse enthalten. - Bestätige, dass die Hook-Semantik auf Streaming- und Nicht-Streaming-Oberflächen übereinstimmt. - Melde keinen Abschluss, solange eine erforderliche Prüfung fehlschlägt. - Erkläre bei einem nicht ausführbaren Befehl den Grund und benenne genau, was ungeprüft bleibt. - Berichte über geänderte Bereiche, ausgeführte Prüfungen, beobachtete Ergebnisse, verbleibende Risiken und bewusst ausgeschlossenen Umfang.