FinRobot を、カスタムの OpenAI 互換エンドポイントで動かす。

Updated 2026-07-30

FinRobot は、base_url キーを受け付ける AutoGen の OAI_CONFIG_LIST ファイルから LLM の認証情報を読み込みます。https://api.apisrouter.com/v1 とゲートウェイのキーを指す1つのエントリを追加すれば、フォーキャスター・レポートライター・RAG エージェントを、カタログの任意のモデル id で動かせます。

早わかり: OAI_CONFIG_LIST に1つのエントリ。

FinRobot のセットアップ手順は、OAI_CONFIG_LIST_sample を OAI_CONFIG_LIST にリネームし、認証情報を入力するよう指示しています。そのファイルは標準的な AutoGen の config list です。各エントリが model と api_key を、そして任意で base_url を取る JSON 配列であり、同梱のサンプルがすでにデフォルト以外のエンドポイントに対してそれを実演しています。ゲートウェイのキーと、base_url を https://api.apisrouter.com/v1 に設定したエントリを追加すれば、そのファイルを読み込むすべての FinRobot エージェントがそれを経由してルーティングできます。 時間を無駄にしがちな1つの落とし穴があります。チュートリアルは、モデル名でエントリを選ぶ filter_dict を伴う autogen.config_list_from_json を通じてファイルを読み込みます。新しいエントリが claude-sonnet-4-6 だと言っているのに、フィルターがまだサンプルの GPT id を要求している場合、あなたのエントリは除外され、実行は古い認証情報のまま失敗します。filter_dict を追加したモデルに合わせて更新するか、テスト中はフィルターを外してください。

[
    {
        "model": "claude-sonnet-4-6",
        "api_key": "sk-YOUR-APISROUTER-KEY",
        "base_url": "https://api.apisrouter.com/v1"
    }
]

FinRobot が、LLM の設定をどう使うか。

FinRobot(GitHub 上では AI4Finance-Foundation、スター数はおよそ7.6K)は、AutoGen(pyautogen 0.2.19 以降)上に構築された、金融分析のための AI エージェントプラットフォームです。そのエージェントはパッケージ化されたワークフローです。企業のニュースとファンダメンタルズを取得し翌週の値動きを予測する Market_Analyst のフォーキャスター、開示資料を株式リサーチの PDF に変換する年次報告書ライター、決算説明会や SEC の開示資料に対する検索拡張型の QA エージェントです。 各チュートリアルは同じ llm_config の形を構築します。config_list が OAI_CONFIG_LIST ファイルを読み込む autogen.config_list_from_json から来る辞書です。その llm_config は、finrobot.agents.workflow の SingleAssistant や SingleAssistantShadow のようなラッパークラスに渡され、それらが基盤となる AutoGen のエージェントを所有します。したがってエンドポイントの決定は、完全にその JSON ファイルの中にあります。AutoGen の OpenAI クライアントは、選択されたエントリが持つどんな base_url にも /v1/chat/completions リクエストを送り、model フィールドをそのままの文字列として転送します。 そのままの文字列であることが実践的な勝ち筋です。base_url の先にあるエンドポイントが複数のベンダーを提供する場合、Claude・DeepSeek・Qwen の id が、FinRobot に気づかれることなく同じ OpenAI 形状の設定を通り抜け、分析モデルの入れ替えは、1行の JSON 編集と、それに合わせた filter_dict になります。

フルセットアップ: 設定ファイル、フィルター、データキー。

FinRobot は認証情報を2つのファイルに分けており、そのうち LLM に関係するのは片方だけです。OAI_CONFIG_LIST はモデルのエンドポイントとキーを保持します。config_api_keys は市場データの認証情報(FINNHUB_API_KEY、FMP_API_KEY、SEC_API_KEY、そしてソーシャル系のキー)を保持し、register_keys_from_json を通じて別途読み込まれます。LLM をゲートウェイ経由でルーティングしても最初のファイルだけが変わり、2つ目はそのままなので、ニュース取得、ファンダメンタルズ、開示資料は以前とまったく同じように振る舞います。 以下のチュートリアルのパターンは、ゲートウェイのエントリを選んだフォーキャスターのノートブックの構造そのものです。同じ llm_config は、年次報告書と RAG のチュートリアルでも動作し、違いはどのワークフロークラスをインスタンス化するかだけです。

import autogen
from finrobot.utils import register_keys_from_json
from finrobot.agents.workflow import SingleAssistant

llm_config = {
    "config_list": autogen.config_list_from_json(
        "../OAI_CONFIG_LIST",
        filter_dict={"model": ["claude-sonnet-4-6"]},  # match your entry
    ),
    "timeout": 120,
    "temperature": 0,
}

register_keys_from_json("../config_api_keys")  # finnhub/fmp/sec data keys

assistant = SingleAssistant("Market_Analyst", llm_config,
                            human_input_mode="NEVER")
assistant.chat("Analyze NVDA news this week and predict next week's movement.")

FinRobot のワークフローごとにモデルを選ぶ。

クリーンな実験ループはこうです。銘柄と日付範囲を固定し、候補エントリごとに同じワークフローを1回実行し、出力を並べて比較する。1つのエンドポイントの裏では、各候補は filter_dict の編集であり、キーごとの利用ログが、表計算作業なしで候補ごとのトークン代を教えてくれます。

  • 年次報告書ライターは最も重い推論作業です。開示資料のセクションを読み、投資の論旨を統合し、構造化されたレポートを起草します。claude-opus-4-7 や gpt-5.5 をこのワークフローで使うと、出力品質が目に見えて変わる場所です。
  • 市場フォーキャスターは、より短く反復的なタスクで、ニュースとファンダメンタルズに基づきます。claude-sonnet-4-6 や deepseek-v4-pro でうまく処理でき、ウォッチリスト全体で毎日実行する際に重要になります。
  • 決算説明会に対する RAG の QA は、長い抜粋にわたる検索と統合であり、長文脈対応の id が有利です。gemini-3.1-pro-preview を claude-sonnet-4-6 と比べてテストする価値があります。
  • エントリは filter_dict によって選ばれるため、フロンティアのエントリと速いエントリの両方を同じ base_url に対して1つのファイルに保持し、実行ごとに認証情報を編集するのではなく、ノートブックごとに選ぶことができます。
  • モデル id は正確な文字列です。FinRobot はそれらを検証せずに渡すため、エンドポイントの /v1/models 一覧が正しい綴りの根拠です。

従量課金 · 公式価格より安い

Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.

モデル公式価格当社価格
Claude Opus 4.7$5.00 / $25.00 per M$4.00 / $20.00 per M
Claude Sonnet 4.6$3.00 / $15.00 per M$2.40 / $12.00 per M
GPT-5.4$2.50 / $15.00 per M$2.00 / $12.00 per M
DeepSeek V4 Pro$0.43 / $0.87 per M$0.40 / $0.90 per M
Gemini 3.1 Pro Preview$2.00 / $12.00 per M$1.60 / $9.60 per M

FinRobot に特有の失敗パターン。

filter_dict の不一致が大物です。config_list_from_json は、model がフィルターに一致するエントリだけを返します。何にも一致しないフィルターは、空の config list についてのエラーを発生させ、サンプルの残置エントリに一致するフィルターは、プレースホルダーのキーで OpenAI にリクエストを送り、間違ったホストからの 401 として表面化します。ルーティングの変更が効いていないように見える場合は、まず解決済みの config_list を出力してください。 相対パスが2番目です。チュートリアルは "../OAI_CONFIG_LIST" を読み込みます。ノートブックがリポジトリのルートより1段下にあるからです。ルートにあるスクリプトは代わりに "OAI_CONFIG_LIST" を求め、AutoGen は OAI_CONFIG_LIST 環境変数が JSON 文字列を運ぶことも受け付けるため、コンテナ内でのパスの問題を回避できます。 コメント行が3番目です。セットアップの手順は、JSON を無効にしてしまうため、サンプルファイルからコメントの注記を取り除くよう指示しています。起動時の JSONDecodeError は、迷い込んだコメントが残っていることを意味します。 データの認証情報は独立して失敗します。エージェントのチャットは正常に動くのに、ニュースやファンダメンタルズが空で返ってくる場合、それは config_api_keys(Finnhub、FMP、SEC)の問題であり、エンドポイントの問題ではありません。そして、別モジュールである FinRobot Pro のエクイティモジュールは、代わりに config.ini を通じてキーを設定します。2026年7月時点で、ドキュメント化された設定は openai_api_key をカバーしていますがベース URL の上書きはないため、upstream がそれをドキュメント化するまで、そのモジュールは直接ベンダーとして扱ってください。

ゲートウェイ経由で FinRobot を使うのは誰か。

  • カバレッジリストにわたってエクイティレポートを生成するアナリストで、レポートごとの長い開示資料の文脈がモデルごとの価格差を重要にし、1つのエンドポイントがモデルを実行ごとの選択にしてくれる人。
  • ウォッチリストに対して毎日フォーキャスターを実行するクオンツチームで、速いミドルティアの id が、ワークフローを書き換えることなく定期的な請求額を一定に保つ場合。
  • 同一の金融タスクでモデルファミリーを比較する研究者で、各候補は1つの設定エントリであり、ベンダーアカウントと SDK の入れ替えではない人。
  • AutoGen ベースのスタックを標準化するチームで、FinRobot は他の AutoGen プロジェクトと OAI_CONFIG_LIST の慣習を共有するため、1つのゲートウェイエントリの形式がそれらすべてに使える場合。
  • 特定ベンダーの請求手段にアクセスできない開発者。チャージ制でカード不要のアクセスなら、プロバイダーごとのサインアップという依存を取り除けます。

エンドポイントを検証し、最初の実行をデバッグする。

ノートブックを開く前に、あなたのキーがアドレスできるモデルを一覧してください。OAI_CONFIG_LIST の中のすべてのモデル文字列と、すべての filter_dict の値は、提供されている id と正確に一致していなければなりません。 次に、SingleAssistant を通じて最短のチャットを実行し、コンソールを見てください。401 は、選ばれたエントリの api_key が、その base_url のエンドポイントに属していないことを意味します。フィルターが実際にどのエントリを選んだか確認してください。model-not-found エラーは、エントリの中の id のタイプミスです。接続エラーは、通常 base_url が /v1 のサフィックスを失っていることを意味します。エージェントがツールの結果なしにループする場合、疑うべきは config_api_keys の中のデータキーであり、LLM エンドポイントではありません。 リクエストが流れ始めたら、APIsRouter コンソールがリクエストごとのモデル、トークン数、支出を表示します。レポート作成の実行は長いマルチターンの会話であり、利用状況ビューは、それを50回スケジュールする前に、1本のレポートが実際にいくらかかるのかを示してくれます。

curl -s https://api.apisrouter.com/v1/models \
  -H "Authorization: Bearer $APISROUTER_API_KEY" | head -50

よくある質問

FinRobot はカスタムの OpenAI 互換エンドポイントに対応していますか?

はい。FinRobot は AutoGen 形式の OAI_CONFIG_LIST エントリを読み込み、エントリは model と api_key に加えて base_url キーを受け付けます。base_url をゲートウェイに向け、filter_dict をそのエントリの model に一致させ続ければ、エージェントはそれを経由してルーティングされます。

FinRobot のエージェントは Claude・DeepSeek・Qwen のモデルで動かせますか?

はい。AutoGen は model フィールドをそのままの文字列として /v1/chat/completions 経由で転送するため、エンドポイントが提供する id なら何でも動作します。エントリの中と filter_dict の中のモデル名が、カタログの id と正確に一致してさえいれば構いません。

なぜ FinRobot は私の新しい OAI_CONFIG_LIST エントリを無視するのですか?

ほぼ常に filter_dict が原因です。チュートリアルはモデル名でエントリをフィルタリングするため、model がフィルターに一致しないエントリは静かに除外されます。filter_dict を新しいモデル id に更新するか、テスト中はフィルターなしでファイルを読み込んでください。

LLM エンドポイントを変更すると、Finnhub・FMP・SEC のキーも変わりますか?

いいえ。市場データの認証情報は config_api_keys にあり、register_keys_from_json を通じて読み込まれ、OAI_CONFIG_LIST とは完全に別です。LLM をゲートウェイ経由でルーティングしても、データパイプラインには触れません。

これはどのバージョンの AutoGen に当てはまりますか?

FinRobot は pyautogen を 0.2.19 以降に固定し、0.2 スタイルの config_list_from_json ローダーを使います。設定エントリの中の base_url キーは、その世代を通じて標準的なので、FinRobot 側のコード変更は必要ありません。

FinRobot Pro のエクイティモジュールも base_url を尊重しますか?

ドキュメント上はそうなっていません。2026年7月時点で、その config.ini は API_KEYS の下に openai_api_key を公開していますが、エンドポイントの上書きはありません。ここで説明した OAI_CONFIG_LIST のルーティングは、メインの FinRobot エージェントとチュートリアルに適用されます。