Запустите 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.