Übersicht
FIM One basiert auf einer Reihe von dünnen abstrakten Basisklassen — eine pro austauschbare Komponente. Jede Komponente hat eine einzige Verantwortung und eine minimale Schnittstelle. Sie implementieren die abstrakten Methoden, verbinden die Instanz mit der entsprechenden Registry oder dem Injector, und der Rest des Systems verwendet Ihre Implementierung automatisch.| Erweiterungspunkt | Basisklasse | Datei | Registrierung |
|---|---|---|---|
| LLM-Anbieter | BaseLLM | core/model/base.py | ModelRegistry.register() |
| Werkzeug | BaseTool | core/tool/base.py | Datei in builtin/ ablegen |
| Speicher | BaseMemory | core/memory/base.py | Constructor-Injektion |
| Embedding | BaseEmbedding | core/embedding/base.py | Constructor-Injektion |
| Bildgenerierung | BaseImageGen | core/image_gen/base.py | Constructor-Injektion |
| Reranker | BaseReranker | core/reranker/base.py | Constructor-Injektion |
| Web-Abruf-Backend | BaseWebFetch | core/web/fetch/base.py | Constructor-Injektion |
| Web-Suche-Backend | BaseWebSearch | core/web/search/base.py | Constructor-Injektion |
| RAG-Retriever | BaseRetriever | rag/base.py | Constructor-Injektion |
| Dokument-Loader | BaseLoader | rag/loaders/base.py | Loader-Registry / Injektion |
| Text-Chunker | BaseChunker | rag/chunking/base.py | Constructor-Injektion |
Benutzerdefinierter LLM-Anbieter
BaseLLM hat zwei erforderliche Methoden — chat und stream_chat — sowie eine optionale abilities-Eigenschaft, die dem Rest des Systems mitteilt, was das Modell kann.
Registrierung über ModelRegistry
ModelRegistry ordnet Namen BaseLLM-Instanzen zu und löst sie nach Rolle auf. Das System verwendet vier integrierte Rollen: general, fast, compact und vision. Sie können eigene hinzufügen.
abilities-Wörterbuch ist der Vertrag zwischen dem LLM und der ReAct-Engine. Wenn tool_call=True und der Agent mit use_native_tools=True erstellt wurde, verwendet die Engine natives Function Calling. Andernfalls wird automatisch auf JSON-Modus zurückgegriffen.
Benutzerdefiniertes Tool
Tools sind die häufigste Erweiterung.BaseTool hat drei erforderliche Teile: name, description und run. Alles andere hat sinnvolle Standardwerte.
Auto-Discovery
Legen Sie Ihre Datei insrc/fim_one/core/tool/builtin/ ab. Der discover_builtin_tools()-Scanner findet automatisch alle konkreten (nicht abstrakten) BaseTool-Unterklassen – keine manuelle Registrierung erforderlich.
_SKIP_AUTO_DISCOVER aufgelistet sind. Verwenden Sie diesen Satz für Werkzeuge, die externe Konfiguration erfordern (z. B. einen API-Schlüssel) und bei der Initialisierung bedingt instanziiert werden müssen.
Signalisierung der Nichtverfügbarkeit
Überschreiben Sieavailability(), um eine Nachricht im Werkzeugkatalog anzuzeigen, wenn eine Abhängigkeit fehlt:
Umfangreiche Ergebnisse mit Artefakten
Geben Sie einToolResult statt eines einfachen str zurück, wenn Ihr Tool Dateien erzeugt:
Benutzerdefinierter Speicher
BaseMemory ist die Persistierungsschicht für Gesprächsverlauf. Drei Methoden: add_message, get_messages, clear.
ReActAgent(llm=llm, memory=RedisMemory(conv_id, url)).
Benutzerdefinierte Einbettung
BaseEmbedding bietet zwei Methoden: embed_texts (Batch) und embed_query (einzeln), sowie eine dimension-Eigenschaft.
embed_texts und embed_query existiert, weil viele Einbettungsmodelle (z. B. E5, BGE) unterschiedliche Präfixe für Dokumente und Abfragen verwenden, um die Abrufqualität zu verbessern.
Benutzerdefinierte Bildgenerierung
BaseImageGen hat eine einzelne Methode generate. Sie speichert das Bild in output_dir und gibt ein ImageResult mit dem Dateipfad und einer serverelativen URL zurück.
Benutzerdefinierter Reranker
BaseReranker nimmt eine Abfrage und eine Liste von Dokumentzeichenfolgen entgegen und gibt sie neu geordnet mit Bewertungen zurück.
Benutzerdefinierte Web-Backends
Web-Abruf
BaseWebFetch ruft eine URL ab und gibt ihren Inhalt als Markdown oder Klartext zurück.
Websuche
BaseWebSearch gibt eine sortierte Liste von SearchResult-Objekten zurück.
Benutzerdefinierte RAG-Komponenten
Die RAG-Pipeline hat drei unabhängig austauschbare Stufen: Laden, Chunking und Abruf.Document Loader
BaseLoader wandelt einen Dateipfad in eine Liste von LoadedDocument-Objekten um. PDF-Loader geben normalerweise ein Dokument pro Seite zurück.
Text-Chunker
BaseChunker teilt Text in Chunk-Objekte auf. MAX_CHUNK_SIZE = 6000 Zeichen ist die harte Obergrenze — Chunk-Größen über diesem Wert können das Jina Embeddings v3 Token-Fenster überlasten.
Retriever
BaseRetriever fragt ein beliebiges Backend ab und gibt sortierte Document-Objekte zurück.
Designprinzipien
Einige Muster sind konsistent über alle Basisklassen hinweg, um benutzerdefinierte Implementierungen leichter korrekt zu schreiben: Async-first. Jede Methode istasync def. Auch wenn Ihre Implementierung synchron ist, wrappen Sie sie mit asyncio.to_thread() anstatt den Event Loop zu blockieren.
String-Ausgabe von Tools. BaseTool.run() gibt str (oder ToolResult) zurück. Das LLM sieht nur Text — Tool-Implementierungen sind verantwortlich für die Serialisierung komplexer Daten in ein lesbares Format.
Minimale Schnittstellen. Jede Basisklasse definiert den kleinsten erforderlichen Vertrag. BaseMemory hat drei Methoden; BaseWebFetch hat eine. Sie müssen nie Funktionalität implementieren, die Sie nicht benötigen.
Komposition über Vererbung. Die Basisklassen sind Schnittstellen, keine Frameworks. Sie injizieren Ihre Implementierung zur Konstruktionszeit; die Runtime patcht oder subklassifiziert sie nie weiter.