概要
FIM One は、スワップ可能なコンポーネントごとに 1 つの薄い抽象基底クラスのセットを中心に構築されています。すべてのコンポーネントは単一の責任と最小限のインターフェースを持ちます。抽象メソッドを実装し、インスタンスを適切なレジストリまたはインジェクターに配線すると、システムの残りの部分が自動的に実装を使用します。| 拡張ポイント | 基底クラス | ファイル | 登録 |
|---|---|---|---|
| LLM プロバイダー | BaseLLM | core/model/base.py | ModelRegistry.register() |
| ツール | BaseTool | core/tool/base.py | builtin/ にファイルをドロップ |
| メモリ | BaseMemory | core/memory/base.py | コンストラクタインジェクション |
| 埋め込み | BaseEmbedding | core/embedding/base.py | コンストラクタインジェクション |
| 画像生成 | BaseImageGen | core/image_gen/base.py | コンストラクタインジェクション |
| リランカー | BaseReranker | core/reranker/base.py | コンストラクタインジェクション |
| Web フェッチバックエンド | BaseWebFetch | core/web/fetch/base.py | コンストラクタインジェクション |
| Web 検索バックエンド | BaseWebSearch | core/web/search/base.py | コンストラクタインジェクション |
| RAG レトリーバー | BaseRetriever | rag/base.py | コンストラクタインジェクション |
| ドキュメントローダー | BaseLoader | rag/loaders/base.py | ローダーレジストリ / インジェクション |
| テキストチャンカー | BaseChunker | rag/chunking/base.py | コンストラクタインジェクション |
カスタムLLMプロバイダー
BaseLLMには2つの必須メソッド — chatとstream_chat — と、モデルが何ができるかをシステムの残りの部分に伝えるオプションのabilitiesプロパティがあります。
ModelRegistry経由での登録
ModelRegistryは名前をBaseLLMインスタンスにマップし、ロールで解決します。システムは4つの組み込みロールを使用します:general、fast、compact、およびvision。独自のロールを追加できます。
後で取得
abilities 辞書は、LLM と ReAct エンジン間の契約です。tool_call=True で、エージェントが use_native_tools=True で作成された場合、エンジンはネイティブ関数呼び出しを使用します。それ以外の場合は、自動的に JSON モードにフォールバックします。
カスタムツール
ツールは最も一般的な拡張機能です。BaseToolには3つの必須要素があります:name、description、runです。その他すべてには適切なデフォルト値があります。
自動検出
src/fim_one/core/tool/builtin/ にファイルをドロップします。discover_builtin_tools() スキャナーは、具体的な(抽象的でない)BaseTool サブクラスを自動的に検出します。手動登録は不要です。
_SKIP_AUTO_DISCOVER にリストされているクラスをスキップします。外部設定(例:APIキー)が必要で、起動時に条件付きでインスタンス化する必要があるツールに対してそのセットを使用します。
利用不可を通知する
依存関係が不足している場合、ツールカタログにメッセージを表示するにはavailability() をオーバーライドします:
アーティファクトを含むリッチな結果
ツールがファイルを生成する場合、プレーンなstr の代わりに ToolResult を返します:
カスタムメモリ
BaseMemory は会話履歴の永続化レイヤーです。3つのメソッドがあります: add_message、get_messages、clear。
ReActAgent(llm=llm, memory=RedisMemory(conv_id, url))。
カスタム埋め込み
BaseEmbedding は 2 つのメソッド embed_texts(バッチ)と embed_query(単一)、および dimension プロパティを提供します。
embed_texts と embed_query の区別が存在するのは、多くの埋め込みモデル(例:E5、BGE)がドキュメントとクエリに異なるプレフィックスを使用して検索品質を向上させるためです。
カスタム画像生成
BaseImageGen には単一のメソッド generate があります。このメソッドは画像を output_dir に保存し、ファイルパスとサーバー相対 URL を含む ImageResult を返します。
カスタムリランカー
BaseRerankerはクエリとドキュメント文字列のリストを受け取り、スコア付きで並べ替えて返します。
カスタムウェブバックエンド
Web fetch
BaseWebFetch はURLをフェッチし、そのコンテンツをMarkdownまたはプレーンテキストとして返します。
ウェブ検索
BaseWebSearch は、ランク付けされた SearchResult オブジェクトのリストを返します。
カスタムRAGコンポーネント
RAGパイプラインには、独立して交換可能な3つのステージがあります:ロード、チャンキング、検索。ドキュメントローダー
BaseLoader はファイルパスを LoadedDocument オブジェクトのリストに変換します。PDF ローダーは通常、ページごとに 1 つのドキュメントを返します。
テキストチャンカー
BaseChunkerはテキストをChunkオブジェクトに分割します。MAX_CHUNK_SIZE = 6000文字がハード上限です — このサイズを超えるチャンクはJina Embeddings v3トークンウィンドウをオーバーフローする可能性があります。
Retriever
BaseRetriever は任意のバックエンドをクエリし、ランク付けされた Document オブジェクトを返します。
設計原則
すべての基本クラスにおいて、カスタム実装を正しく記述しやすくするための一貫したパターンがあります: 非同期ファースト。 すべてのメソッドはasync def です。実装が同期的であっても、イベントループをブロックするのではなく、asyncio.to_thread() でラップしてください。
ツールからの文字列出力。 BaseTool.run() は str(または ToolResult)を返します。LLM が見るのはテキストのみです。ツール実装は複雑なデータを読みやすい形式にシリアライズする責任があります。
最小限のインターフェース。 各基本クラスは必要な最小限の契約を定義します。BaseMemory は 3 つのメソッド、BaseWebFetch は 1 つです。必要のない機能を実装する必要はありません。
継承よりも合成。 基本クラスはインターフェースであり、フレームワークではありません。実装を構築時に注入します。ランタイムは決してモンキーパッチやさらなるサブクラス化を行いません。