Aperçu
FIM One est construit autour d’un ensemble de classes de base abstraites minces — une par composant interchangeable. Chaque composant a une seule responsabilité et une interface minimale. Vous implémentez les méthodes abstraites, connectez l’instance au registre ou à l’injecteur approprié, et le reste du système utilise automatiquement votre implémentation.| Point d’extension | Classe de base | Fichier | Enregistrement |
|---|---|---|---|
| Fournisseur LLM | BaseLLM | core/model/base.py | ModelRegistry.register() |
| Outil | BaseTool | core/tool/base.py | Déposer un fichier dans builtin/ |
| Mémoire | BaseMemory | core/memory/base.py | Injection de constructeur |
| Embedding | BaseEmbedding | core/embedding/base.py | Injection de constructeur |
| Génération d’image | BaseImageGen | core/image_gen/base.py | Injection de constructeur |
| Reranker | BaseReranker | core/reranker/base.py | Injection de constructeur |
| Backend de récupération web | BaseWebFetch | core/web/fetch/base.py | Injection de constructeur |
| Backend de recherche web | BaseWebSearch | core/web/search/base.py | Injection de constructeur |
| Récupérateur RAG | BaseRetriever | rag/base.py | Injection de constructeur |
| Chargeur de documents | BaseLoader | rag/loaders/base.py | Registre de chargeur / injection |
| Chunker de texte | BaseChunker | rag/chunking/base.py | Injection de constructeur |
Fournisseur LLM personnalisé
BaseLLM a deux méthodes requises — chat et stream_chat — plus une propriété abilities optionnelle qui indique au reste du système ce que le modèle peut faire.
Enregistrement via ModelRegistry
ModelRegistry mappe les noms aux instances BaseLLM et résout par rôle. Le système utilise quatre rôles intégrés : general, fast, compact et vision. Vous pouvez en ajouter vos propres.
Récupérer plus tard
abilities est le contrat entre le LLM et le moteur ReAct. Quand tool_call=True et que l’agent a été créé avec use_native_tools=True, le moteur utilisera l’appel de fonction natif. Sinon, il bascule automatiquement en mode JSON.
Outil personnalisé
Les outils sont l’extension la plus courante.BaseTool a trois éléments requis : name, description et run. Tout le reste a des valeurs par défaut sensées.
Découverte automatique
Déposez votre fichier danssrc/fim_one/core/tool/builtin/. Le scanner discover_builtin_tools() trouvera automatiquement toute sous-classe concrète (non abstraite) de BaseTool — aucune inscription manuelle requise.
_SKIP_AUTO_DISCOVER. Utilisez cet ensemble pour les outils qui nécessitent une configuration externe (par exemple une clé API) et doivent être instanciés conditionnellement au démarrage.
Signalisation de l’indisponibilité
Remplacezavailability() pour afficher un message dans le catalogue des outils lorsqu’une dépendance est manquante :
Résultats enrichis avec des artefacts
Retournez unToolResult au lieu d’une simple str lorsque votre outil produit des fichiers :
Mémoire personnalisée
BaseMemory est la couche de persistance pour l’historique des conversations. Trois méthodes : add_message, get_messages, clear.
ReActAgent(llm=llm, memory=RedisMemory(conv_id, url)).
Intégration personnalisée d’embeddings
BaseEmbedding fournit deux méthodes : embed_texts (batch) et embed_query (single), ainsi qu’une propriété dimension.
embed_texts et embed_query existe parce que de nombreux modèles d’embedding (par exemple E5, BGE) utilisent des préfixes différents pour les documents et les requêtes afin d’améliorer la qualité de la récupération.
Génération d’images personnalisée
BaseImageGen possède une seule méthode generate. Elle enregistre l’image dans output_dir et retourne un ImageResult avec le chemin du fichier et une URL relative au serveur.
Réclasseur personnalisé
BaseReranker prend une requête et une liste de chaînes de documents et les retourne réorganisées avec des scores.
Backends web personnalisés
Récupération web
BaseWebFetch récupère une URL et retourne son contenu en Markdown ou en texte brut.
Recherche web
BaseWebSearch retourne une liste classée d’objets SearchResult.
Composants RAG personnalisés
Le pipeline RAG a trois étapes indépendamment interchangeables : chargement, segmentation et récupération.Chargeur de documents
BaseLoader transforme un chemin de fichier en une liste d’objets LoadedDocument. Les chargeurs PDF retournent généralement un document par page.
Découpeur de texte
BaseChunker divise le texte en objets Chunk. MAX_CHUNK_SIZE = 6000 caractères est la limite maximale — les tailles de chunk supérieures à cela peuvent dépasser la fenêtre de tokens Jina Embeddings v3.
Récupérateur
BaseRetriever interroge n’importe quel backend et retourne des objets Document classés.
Principes de conception
Quelques modèles sont cohérents dans toutes les classes de base qui facilitent l’écriture correcte des implémentations personnalisées : Async en premier. Chaque méthode estasync def. Même si votre implémentation est synchrone, enveloppez-la avec asyncio.to_thread() plutôt que de bloquer la boucle d’événements.
Sortie textuelle des outils. BaseTool.run() retourne str (ou ToolResult). Le LLM ne voit que du texte — les implémentations d’outils sont responsables de la sérialisation des données complexes dans un format lisible.
Interfaces minimales. Chaque classe de base définit le plus petit contrat nécessaire. BaseMemory compte trois méthodes ; BaseWebFetch en compte une. Vous n’êtes jamais obligé d’implémenter les fonctionnalités dont vous n’avez pas besoin.
Composition plutôt qu’héritage. Les classes de base sont des interfaces, pas des frameworks. Vous injectez votre implémentation au moment de la construction ; l’exécution ne la sous-classe jamais ou ne la modifie jamais ultérieurement.