Запустите FinRobot на кастомном OpenAI-совместимом эндпоинте.

Updated 2026-07-30

FinRobot читает свои LLM-креденшелы из файла AutoGen OAI_CONFIG_LIST, записи которого принимают ключ base_url. Добавьте одну запись, указывающую на https://api.apisrouter.com/v1, с ключом шлюза — и агенты прогнозирования, написания отчётов и RAG смогут работать на любом id модели из каталога.

Короткий ответ: одна запись в OAI_CONFIG_LIST.

Инструкция по установке FinRobot просит переименовать OAI_CONFIG_LIST_sample в OAI_CONFIG_LIST и заполнить креденшелы. Этот файл — стандартный AutoGen config list: JSON-массив, где каждая запись принимает model и api_key, а также опционально base_url, что уже демонстрирует поставляемый пример для нестандартных эндпоинтов. Добавьте запись со своим ключом шлюза и base_url, установленным в https://api.apisrouter.com/v1, и любой агент FinRobot, загружающий этот файл, сможет маршрутизироваться через него. Одна ловушка, которая отнимает у людей время: туториалы загружают файл через autogen.config_list_from_json с filter_dict, который отбирает записи по имени модели. Если ваша новая запись говорит 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 (AI4Finance-Foundation на GitHub, около 7.6K звёзд) — платформа AI-агентов для финансового анализа, построенная на AutoGen (pyautogen 0.2.19 или новее). Её агенты — это упакованные workflow: forecaster Market_Analyst, который забирает новости компании и фундаментальные показатели и предсказывает движение на следующую неделю, писатель годовых отчётов, превращающий отчётность в PDF equity research, и агенты retrieval-augmented QA поверх звонков по доходам и отчётности SEC. Каждый туториал строит одну и ту же форму llm_config: словарь, чей config_list приходит из autogen.config_list_from_json, читающего файл OAI_CONFIG_LIST. Этот llm_config передаётся классам-обёрткам вроде SingleAssistant и SingleAssistantShadow из finrobot.agents.workflow, которые владеют базовыми агентами AutoGen. Решение об эндпоинте поэтому целиком живёт в JSON-файле: OpenAI-клиент AutoGen отправляет запросы /v1/chat/completions на тот base_url, который несёт выбранная запись, и передаёт поле model как обычную строку. Эта обычная строка — практический выигрыш. Когда эндпоинт за base_url обслуживает несколько вендоров, id Claude, DeepSeek или Qwen проезжает через тот же OpenAI-образный конфиг незаметно для FinRobot, и смена модели анализа становится правкой JSON в одну строку плюс подходящий filter_dict.

Полная настройка: конфиг-файл, фильтр и ключи данных.

FinRobot разбивает креденшелы на два файла, и только один из них касается LLM. OAI_CONFIG_LIST хранит эндпоинты и ключи моделей. config_api_keys хранит креденшелы рыночных данных (FINNHUB_API_KEY, FMP_API_KEY, SEC_API_KEY и социальные ключи), загружаемые отдельно через register_keys_from_json. Маршрутизация LLM через шлюз меняет первый файл и не трогает второй, так что забор новостей, фундаментальных показателей и отчётности ведёт себя точно так же, как прежде. Паттерн туториала ниже — это структура ноутбука forecaster с выбранной записью шлюза. Тот же llm_config работает для туториалов annual-report и RAG, которые отличаются только тем, какой класс workflow они инстанцируют.

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.")

Выбор моделей для каждого workflow FinRobot.

Чистый цикл эксперимента: зафиксируйте тикер и диапазон дат, прогоните один и тот же workflow по разу на кандидата-запись и сравните вывод бок о бок. За одним эндпоинтом каждый кандидат — это правка filter_dict, а лог использования по ключу даёт вам счёт по токенам на кандидата без работы с таблицами.

  • Писатель годовых отчётов — самая тяжёлая работа по рассуждению: он читает разделы отчётности, синтезирует инвестиционный тезис и составляет структурированный отчёт. claude-opus-4-7 или gpt-5.5 в этом workflow — то место, где качество вывода заметно меняется.
  • Рыночный forecaster — более короткая, повторяющаяся задача над новостями и фундаментальными показателями. claude-sonnet-4-6 или deepseek-v4-pro хорошо с ней справляются, и это важно, когда вы прогоняете его ежедневно по watchlist.
  • RAG QA поверх звонков по доходам — это retrieval плюс синтез по длинным выдержкам, что благоприятствует id с длинным контекстом; там стоит протестировать gemini-3.1-pro-preview против claude-sonnet-4-6.
  • Поскольку записи выбираются через filter_dict, вы можете держать один файл с флагманской записью и быстрой записью на одном и том же base_url и выбирать по ноутбуку, вместо того чтобы редактировать креденшелы на каждый прогон.
  • 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 с placeholder-ключами, что проявляется как 401 с не того хоста. Когда изменения маршрутизации, кажется, не действуют, сначала распечатайте разрешённый config_list. Относительные пути — вторая проблема. Туториалы загружают "../OAI_CONFIG_LIST", потому что ноутбуки лежат на уровень ниже корня репозитория; скрипту в корне вместо этого нужен "OAI_CONFIG_LIST", а AutoGen также принимает переменную окружения OAI_CONFIG_LIST, несущую JSON-строку, что обходит проблемы с путями в контейнерах. Строки-комментарии — третья. Инструкция по установке говорит убрать комментарии-заметки из файлов-примеров, потому что они делают JSON невалидным; JSONDecodeError при старте означает, что случайный комментарий выжил. Креденшелы данных падают независимо. Если агент нормально общается в чате, но новости или фундаментальные показатели возвращаются пустыми, это проблема config_api_keys (Finnhub, FMP, SEC), а не проблема эндпоинта. А отдельный модуль FinRobot Pro equity настраивает свои ключи через config.ini; по состоянию на июль 2026 его задокументированные настройки покрывают openai_api_key, но не переопределение base-URL, так что относитесь к этому модулю как к прямому вендору, пока апстрим не задокументирует такую возможность.

Кто направляет FinRobot через шлюз.

  • Аналитики, генерирующие equity-отчёты по списку покрытия. Длинные контексты отчётности на отчёт делают разницу цен по моделям существенной, а один эндпоинт делает модель выбором на каждый прогон.
  • Квант-команды, ежедневно прогоняющие forecaster по watchlist, где быстрый id среднего уровня держит повторяющийся счёт плоским без переписывания workflow.
  • Исследователи, сравнивающие семейства моделей на идентичных финансовых задачах. Каждый кандидат — одна запись конфига, а не аккаунт у вендора и смена SDK.
  • Команды, стандартизирующие стеки на базе AutoGen. FinRobot разделяет соглашение OAI_CONFIG_LIST с другими проектами AutoGen, так что один формат записи шлюза обслуживает их все.
  • Разработчики без доступа к биллингу конкретного вендора. Доступ на основе пополнения без требования карты убирает зависимость от регистрации у каждого провайдера.

Проверьте эндпоинт и отладьте первый прогон.

Сначала перечислите модели, которые может адресовать ваш ключ, прежде чем открывать ноутбук; каждая строка model в OAI_CONFIG_LIST и каждое значение filter_dict должны точно совпадать с обслуживаемым id. Затем прогоните самый короткий возможный чат через SingleAssistant и следите за консолью. 401 означает, что api_key выбранной записи не принадлежит эндпоинту в её base_url; проверьте, какую запись фильтр реально выбрал. Ошибка model-not-found — это опечатка в id записи. Ошибка подключения обычно означает, что base_url потерял суффикс /v1. Если агент зацикливается без результатов инструментов, подозреваемые — ключи данных в config_api_keys, а не эндпоинт LLM. Как только запросы пошли, консоль APIsRouter показывает модель на запрос, счётчики токенов и расходы. Прогоны написания отчётов — это длинные многоходовые разговоры, и вид использования показывает, сколько реально стоит один отчёт, прежде чем вы запланируете пятьдесят таких.

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

Частые вопросы

Поддерживает ли FinRobot кастомный OpenAI-совместимый эндпоинт?

Да. FinRobot читает записи OAI_CONFIG_LIST в стиле AutoGen, и записи принимают ключ base_url наряду с model и api_key. Направьте 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 модели либо загружайте файл без фильтра во время тестирования.

Меняются ли мои ключи Finnhub, FMP и SEC при смене эндпоинта LLM?

Нет. Креденшелы рыночных данных живут в config_api_keys и загружаются через register_keys_from_json, полностью отдельно от OAI_CONFIG_LIST. Маршрутизация LLM через шлюз не трогает пайплайн данных.

К какой версии AutoGen это применимо?

FinRobot фиксирует pyautogen 0.2.19 или новее и использует загрузчик config_list_from_json в стиле 0.2. Ключ base_url в записях конфига стандартен для этого поколения, так что изменения кода FinRobot не нужны.

Учитывает ли модуль FinRobot Pro equity тоже base_url?

Не в задокументированном виде. Его config.ini предоставляет openai_api_key под API_KEYS, но без переопределения эндпоинта по состоянию на июль 2026. Описанная здесь маршрутизация через OAI_CONFIG_LIST применима к основным агентам и туториалам FinRobot.