Запустите gpt-researcher на кастомном OpenAI-совместимом эндпоинте.
Updated 2026-07-30
gpt-researcher читает OPENAI_BASE_URL из окружения и делит свою работу на три слота модели. Установите base URL в https://api.apisrouter.com/v1, сохраните префикс openai:, и FAST_LLM, SMART_LLM и STRATEGIC_LLM смогут быть разными моделями каталога за одним ключом.
Короткий ответ: пятистрочный блок .env.
Задокументированный путь gpt-researcher для кастомного эндпоинта — переменные окружения. Установите OPENAI_BASE_URL в https://api.apisrouter.com/v1, установите OPENAI_API_KEY в ваш ключ шлюза и назначьте три слота модели с префиксом провайдера openai:. Префикс говорит gpt-researcher, какой клиент использовать; строка после двоеточия передаётся эндпоинту как есть, так что валиден любой id, который обслуживает шлюз, включая id Claude и Gemini. Это конфигурация, задокументированная на docs.gptr.dev для кастомных OpenAI-совместимых эндпоинтов, и она работает одинаково для pip-пакета, веб-приложения и мультиагентных потоков, потому что все они резолвят один и тот же конфиг.
OPENAI_BASE_URL=https://api.apisrouter.com/v1
OPENAI_API_KEY=sk-APIsRouter-...
FAST_LLM=openai:claude-haiku-4-5-20251001
SMART_LLM=openai:claude-sonnet-4-6
STRATEGIC_LLM=openai:gpt-5.5Как gpt-researcher тратит токены по трём слотам.
gpt-researcher (assafelovic на GitHub, около 28K звёзд) превращает запрос в исследованный, процитированный отчёт: он планирует исследовательские вопросы, разворачивает веб-поиски через retriever, скрейпит и суммирует источники, а затем пишет развёрнутый отчёт. Фреймворк разбивает этот пайплайн на три настраиваемых слота модели вместо одного. FAST_LLM обрабатывает высокообъёмную, малорискованную работу, в первую очередь суммирование скрейпленных страниц. SMART_LLM выполняет тяжёлое письмо, включая финальный отчёт. STRATEGIC_LLM отвечает за планирование: генерацию исследовательских вопросов и выбор подхода. Из коробки эти слоты по умолчанию — модели OpenAI (gpt-4o-mini, gpt-4.1 и o4-mini соответственно на момент написания), и именно поэтому единственное переопределение OPENAI_BASE_URL настолько эффективно: все три слота используют OpenAI-образный клиент, так что один base URL перемещает весь пайплайн. Поскольку каждый слот принимает свою собственную строку provider:model, слотам не нужно делить одного вендора. Прогон может суммировать быстрой моделью Claude, писать более сильной моделью Claude или GPT и планировать моделью уровня рассуждений, всё через один и тот же эндпоинт и ключ. На ключе одного вендора такое смешение потребовало бы трёх аккаунтов; за шлюзом это три строки в .env.
Полная настройка: .env плюс Python API.
Создайте файл .env в вашей рабочей директории (или экспортируйте переменные в шелле) и запускайте gpt-researcher как обычно; pip-пакет и веб-приложение читают одно и то же окружение. Python API вообще не требует кода, специфичного для эндпоинта, и в этом суть: маршрутизация — это конфигурация, а исследовательский код остаётся идентичным независимо от того, чей это эндпоинт — OpenAI или шлюза. Важны две смежные настройки. Веб-retrieval работает через retriever, по умолчанию Tavily, со своим собственным ключом (TAVILY_API_KEY); этот креденшел не зависит от эндпоинта LLM и всё равно нужен для живого веб-исследования. А embeddings по умолчанию используют openai:text-embedding-3-small, что означает, что вызовы embedding следуют той же конфигурации OpenAI-образного клиента; если эндпоинт за OPENAI_BASE_URL не обслуживает эту модель embedding, настройте EMBEDDING на провайдера, который её обслуживает (документация использует префикс custom: для OpenAI-совместимых эндпоинтов embedding, локальные варианты вроде Ollama тоже поддерживаются).
import asyncio
from gpt_researcher import GPTResearcher
async def main():
researcher = GPTResearcher(
query="State of small modular reactors in 2026",
report_type="research_report",
)
await researcher.conduct_research()
report = await researcher.write_report()
print(report)
asyncio.run(main()) # routing comes entirely from .envВыбор моделей по слотам.
Апстримные значения по умолчанию кодируют правильную форму — маленькая модель для объёма, сильная модель для письма, модель рассуждений для планирования, — так что сохраняйте эту форму и апгрейдьте слоты, а не сплющивайте их в одну модель. За одним эндпоинтом A/B-тест между двумя писателями — это правка .env в одну строку на прогон, а лог использования по ключу говорит вам, сколько реально стоила каждая конфигурация отчёта.
- FAST_LLM срабатывает чаще всего: каждый скрейпленный источник суммируется. Быстрый id (claude-haiku-4-5-20251001, deepseek-v4-flash) не даёт суммированию доминировать в стоимости отчёта со множеством источников, и потеря качества здесь ограничена, потому что резюме питают писателя, а не читателя.
- SMART_LLM пишет отчёт, который реально читает пользователь. Длинный вывод, устойчивая структура, дисциплина цитирования: именно здесь claude-sonnet-4-6 или gpt-5.5 оправдывают расход, и именно здесь снижение качества сказывается сразу.
- STRATEGIC_LLM формирует прогон ещё до его начала. Плохие исследовательские вопросы дают плохой отчёт независимо от того, насколько хорош писатель; сильная в рассуждениях модель здесь — мало вызовов, но высокий рычаг влияния.
- Id с длинным контекстом вроде gemini-3.1-pro-preview стоит протестировать в слоте SMART для прогонов detailed_report, где писатель работает с большим накопленным контекстом резюме.
Оплата по факту · дешевле официальных цен
Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.
| Модель | Официальная цена | Наша цена |
|---|---|---|
| Claude Haiku 4.5 20251001 | $1.00 / $5.00 per M | $0.80 / $4.00 per M |
| Claude Sonnet 4.6 | $3.00 / $15.00 per M | $2.40 / $12.00 per M |
| GPT-5.5 | $5.00 / $30.00 per M | $4.00 / $24.00 per M |
| Gemini 3.1 Pro Preview | $2.00 / $12.00 per M | $1.60 / $9.60 per M |
| DeepSeek V4 Pro | $0.43 / $0.87 per M | $0.40 / $0.90 per M |
Сбои, специфичные именно для gpt-researcher.
Пропуск префикса провайдера. Формат слота — provider:model, и префикс выбирает клиент. Установка SMART_LLM=claude-sonnet-4-6 без openai: не маршрутизирует id Claude через ваш base URL; это заставляет gpt-researcher пытаться интерпретировать строку как другого провайдера. Каждая модель кастомного эндпоинта должна сохранять префикс openai:, потому что "openai" здесь называет протокол, а не вендора. Embeddings тихо следуют за переопределением. EMBEDDING по умолчанию — это OpenAI-образная модель, так что как только OPENAI_BASE_URL указывает на шлюз, запросы embedding тоже идут туда. Если шлюз не обслуживает этот id embedding, исследовательские прогоны падают на этапе обработки источников, а не на первом вызове чата, что вводит людей в заблуждение и заставляет отлаживать не тот слот. Задайте EMBEDDING явно — и симптом исчезает. Обвинение эндпоинта в сбоях retriever. Отсутствующий или исчерпанный TAVILY_API_KEY ломает фазу поиска, и получившиеся ошибки о пустых источниках выглядят поверхностно как сбои LLM. Retriever — отдельный сервис с отдельным ключом; проверяйте его отдельно. Устаревшее окружение между прогонами. Файл .env читается из рабочей директории. Запуск веб-приложения из одной директории и Python API из другой означает два разных конфига, и "работает в приложении, но не в моём скрипте" — почти всегда именно это. Настройки лимита токенов отделены от возможностей модели. gpt-researcher несёт собственные лимиты токенов по слотам (FAST_TOKEN_LIMIT, SMART_TOKEN_LIMIT и связанные настройки) с консервативными значениями по умолчанию. Направление SMART_LLM на модель с длинным контекстом само по себе не поднимает эти лимиты; настраивайте их сознательно, если хотите более длинную генерацию.
Кто направляет gpt-researcher через шлюз.
- Команды, генерирующие повторяющиеся отчёты (обзоры рынка, литературные обзоры, конкурентные брифы), где видимость стоимости по трём слотам модели на прогон важнее отношений с одним вендором.
- Исследователи, сравнивающие модели-писатели. Зафиксировать FAST и STRATEGIC, меняя SMART между id Claude, GPT и DeepSeek — это три правки .env, а не три аккаунта у вендоров.
- Разработчики, встраивающие gpt-researcher в продукты, где один ключ шлюза на окружение заменяет пачку вендорских секретов в пайплайне деплоя.
- Пользователи, которые хотят, чтобы Claude или Gemini писали отчёт, оставляя стандартную OpenAI-образную конфигурацию gpt-researcher нетронутой.
- Разработчики без доступа к биллингу конкретного вендора. Доступ на основе пополнения без требования карты убирает зависимость от регистрации у каждого провайдера.
Проверьте эндпоинт и отладьте первый отчёт.
Сначала перечислите модели шлюза; строка после openai: в каждом слоте должна точно совпадать с обслуживаемым id, включая суффиксы версий. Сбои первого прогона чётко сортируются. 401 означает, что OPENAI_API_KEY отсутствует в окружении, которое реально видит процесс; файлы .env загружаются из рабочей директории, так что запускайте оттуда, где лежит файл, либо экспортируйте переменные глобально. Ошибка model-not-found называет слот с опечаткой. Сбой во время обработки источников, а не во время планирования, указывает на embeddings или retriever, а не на слоты чата: проверьте EMBEDDING и TAVILY_API_KEY, прежде чем трогать конфиг LLM. Полный исследовательский прогон — это всплеск из десятков запросов по всем трём слотам, так что как только он завершится, вид по запросу в консоли APIsRouter — самый быстрый способ увидеть разбивку FAST/SMART/STRATEGIC в реальных токенах и реальных расходах и поймать слот, который потребляет больше, чем заслуживает его роль.
curl -s https://api.apisrouter.com/v1/models \
-H "Authorization: Bearer $OPENAI_API_KEY" | head -50Частые вопросы
Может ли gpt-researcher использовать модели Claude или Gemini через OPENAI_BASE_URL?
Да. Префикс openai: выбирает OpenAI-образный клиент, а строка модели после двоеточия передаётся эндпоинту как есть. Любой id, который обслуживает шлюз, валиден в любом из трёх слотов, включая id Claude, Gemini и DeepSeek.
Должны ли FAST_LLM, SMART_LLM и STRATEGIC_LLM быть от одного вендора?
Нет. Каждый слот — независимая строка provider:model. За мультивендорным эндпоинтом обычная настройка — быстрый id Claude для резюме, более сильный id Claude или GPT для написания отчёта и id уровня рассуждений для планирования, всё на одном ключе.
Нужен ли мне по-прежнему ключ Tavily после смены эндпоинта LLM?
Да, если вы хотите живое веб-исследование. Retriever (по умолчанию Tavily, задаётся через RETRIEVER) получает результаты поиска и имеет собственный ключ. Это отдельный от эндпоинта LLM сервис, на который OPENAI_BASE_URL не влияет.
Что происходит с embeddings, когда я задаю OPENAI_BASE_URL?
Embedding по умолчанию — это OpenAI-образная модель, так что вызовы embedding следуют той же конфигурации клиента и попадают на ваш шлюз. Если шлюз не обслуживает этот id embedding, задайте EMBEDDING явно на провайдера, который его обслуживает, либо на локальный вариант; иначе прогоны падают на этапе обработки источников.
Работает ли эта конфигурация также для веб-приложения и мультиагентного режима?
Да. pip-пакет, веб-приложение и мультиагентные потоки все резолвят одну и ту же конфигурацию окружения, так что один файл .env маршрутизирует их одинаково.
Сколько стоит один исследовательский прогон через шлюз?
Зависит от типа отчёта и того, сколько источников вернёт retriever: FAST_LLM суммирует каждый источник, SMART_LLM пишет отчёт, STRATEGIC_LLM планирует. Большинство прогонов приземляются в диапазоне от десятков до сотен тысяч токенов. Вид использования по ключу показывает точную разбивку по слотам, что лучше, чем оценка на глаз.