概要
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フェッチ
BaseWebFetch はURLをフェッチしてそのコンテンツをMarkdownまたはプレーンテキストとして返します。
Webサーチ
BaseWebSearchは、ランク付けされたSearchResultオブジェクトのリストを返します。
カスタムRAGコンポーネント
RAGパイプラインには、独立して交換可能な3つのステージがあります:ロード、チャンキング、および検索。ドキュメントローダー
BaseLoader はファイルパスを LoadedDocument オブジェクトのリストに変換します。PDF ローダーは通常、ページごとに 1 つのドキュメントを返します。
テキストチャンカー
BaseChunker はテキストを Chunk オブジェクトに分割します。MAX_CHUNK_SIZE = 6000 文字はハード上限です — このサイズを超えるチャンクサイズは Jina Embeddings v3 トークンウィンドウをオーバーフローさせる可能性があります。
レトリーバー
BaseRetriever は任意のバックエンドをクエリし、ランク付けされた Document オブジェクトを返します。
設計原則
すべての基本クラスにわたって一貫性のあるいくつかのパターンがあり、カスタム実装をより正しく記述しやすくします: 非同期ファースト。 すべてのメソッドはasync def です。実装が同期的であっても、イベントループをブロックするのではなく asyncio.to_thread() でラップしてください。
ツールからの文字列出力。 BaseTool.run() は str (または ToolResult) を返します。LLM はテキストのみを見ます — ツール実装は複雑なデータを読み取り可能な形式にシリアライズする責任があります。
最小限のインターフェース。 各基本クラスは必要な最小限の契約を定義します。BaseMemory は3つのメソッド、BaseWebFetch は1つです。不要な機能を実装する必要はありません。
継承よりも構成。 基本クラスはインターフェースであり、フレームワークではありません。構築時に実装を注入します。ランタイムは決してモンキーパッチやさらなるサブクラス化を行いません。