Запустіть ai-hedge-fund на кастомному OpenAI-сумісному base URL.

Updated 2026-07-30

ai-hedge-fund будує свої OpenAI-моделі через ChatOpenAI від LangChain і зчитує base URL зі змінної OPENAI_API_BASE. Встановіть її на https://api.apisrouter.com/v1, експортуйте один ключ — і кожен агент-аналітик фонду маршрутизується через єдиний ендпоінт.

Коротка відповідь: OPENAI_API_BASE плюс один ключ.

Провайдер OpenAI в ai-hedge-fund інстанціюється як ChatOpenAI(model=model_name, api_key=api_key, base_url=base_url), а цей base_url береться з os.getenv("OPENAI_API_BASE") у src/llm/models.py. Тож перевизначення — це два рядки в .env: вкажіть OPENAI_API_BASE на https://api.apisrouter.com/v1 і встановіть OPENAI_API_KEY на ваш ключ шлюзу. Кожна модель, що йде через провайдера OpenAI, тепер надсилає запити до шлюзу. Уважно перевірте назву змінної: це саме OPENAI_API_BASE, конвенція епохи LangChain, а не OPENAI_BASE_URL. Експорт не тієї змінної тихо ігнорується, і запити продовжують йти на api.openai.com — це найпоширеніша причина, чому таке налаштування здається непрацюючим.

OPENAI_API_BASE=https://api.apisrouter.com/v1
OPENAI_API_KEY=sk-APIsRouter-...
FINANCIAL_DATASETS_API_KEY=...   # market data, unrelated to the LLM endpoint

Як ai-hedge-fund обирає модель і провайдера.

ai-hedge-fund (virattt на GitHub, приблизно 62 тис. зірок) симулює фонд як комітет агентів: персони аналітиків, змодельовані за відомими інвесторами, плюс агенти оцінки, настрою, фундаментального аналізу й технічного аналізу, що живлять ризик-менеджера та портфельного менеджера, які видають фінальні сигнали. Усі вони діляють один вибір моделі на прогін, тож один прогін помножує ваше рішення про модель на кожного агента й кожен тікер. У виборі моделі два шляхи. В інтерактивному режимі запуск poetry run python src/main.py --ticker AAPL,MSFT,NVDA без прапорця --model відкриває селектор questionary. У скриптованому — прапорець --model приймає назву моделі, але лише таку, що існує в реєстрі моделей репозиторію: find_model_by_name() шукає рядок у src/llm/api_models.json, і кожен запис реєстру несе display_name, model_name і provider. Якщо пошук провалюється, CLI не вгадує провайдера; він відкочується до інтерактивного селектора, що важливо для автоматизації, оскільки невідомий id перетворює скриптований прогін на такий, що зависає в очікуванні введення з клавіатури. Поле provider вирішує маршрутизацію. Записи, позначені OpenAI, йдуть через ChatOpenAI і поважають OPENAI_API_BASE; записи, позначені Anthropic, йдуть через ChatAnthropic і ANTHROPIC_API_KEY, повністю оминаючи ваш base URL. Це ключове розуміння для маршрутизації через шлюз: колонка provider обирає клієнта і, відповідно, ендпоінт, незалежно від того, хто насправді створив модель.

Повне налаштування: .env плюс запис реєстру на кожну модель шлюзу.

Для моделей, які реєстр уже перелічує під провайдером OpenAI, самого перевизначення .env достатньо; рядок моделі передається до ендпоінта як є. Щоб запустити id Claude, DeepSeek чи Qwen через шлюз на тому самому ключі, додайте запис до src/llm/api_models.json з id каталогу як model_name і, головне, з "OpenAI" як provider. Provider обирає клієнта, тож запис, позначений OpenAI, маршрутизується через ChatOpenAI і ваш OPENAI_API_BASE, навіть якщо сама модель — не модель OpenAI. Запис тоді з'являється в інтерактивному селекторі й резолвиться через --model у скриптах. Це редагування JSON на три рядки у вашому клоні, а не зміна коду, і це задокументована форма, яку реєстр уже використовує. Тримайте в голові записи, нативні для провайдера, як контраст: вибір моделі реєстру, позначеної Anthropic, шукатиме ANTHROPIC_API_KEY і піде прямо до ендпоінта Anthropic. Якщо ваша мета — один ключ шлюзу для всього, запускайте моделі через записи, позначені OpenAI, і ви можете взагалі не встановлювати ключі на кожного постачальника.

{
  "display_name": "Claude Sonnet 4.6 (gateway)",
  "model_name": "claude-sonnet-4-6",
  "provider": "OpenAI"
},
{
  "display_name": "DeepSeek V4 Pro (gateway)",
  "model_name": "deepseek-v4-pro",
  "provider": "OpenAI"
}

Вибір моделі для комітету агентів.

Оскільки реєстр робить кожного кандидата адресованим за одним прапорцем, чесна оцінка — емпірична: проженіть ті самі тікери й дати через дві-три моделі й порівняйте сигнали й витрати. Вигляд використання за ключем оцінює кожен прогін за вас, що перетворює вибір моделі з дискусії на вимірювання.

  • Один прогін — це багато вердиктів. Кожна персона аналітика міркує над тими самими звітностями й ціновими даними на тікер, тож вибір моделі множиться на кількість агентів і кількість тікерів. Фронтирна модель для міркування (claude-opus-4-7, gpt-5.5) підіймає якість кожного вердикту при відповідно помноженому рахунку за токени.
  • claude-sonnet-4-6 — розумний варіант за замовчуванням: достатньо сильна, щоб міркування персон лишалось зв'язним на довгому фундаментальному контексті, і за ціною, прийнятною для прогонів, що розгалужуються на десяток агентів і кошик тікерів.
  • deepseek-v4-pro і qwen3.7-max варто протестувати на широких прогонах, де розрив у ціні на прогін накопичується на кожній даті бектесту.
  • Що б ви не обрали, зафіксуйте це. Сигнали з різних знімків моделі, що змінюється, непорівнянні в межах вікна бектесту; використовуйте точні id і фіксуйте рядок моделі поруч з результатами, як випадкове зерно.

Оплата за фактом · нижче офіційних цін

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.5$5.00 / $30.00 per M$4.00 / $24.00 per M
DeepSeek V4 Pro$0.43 / $0.87 per M$0.40 / $0.90 per M
Qwen 3.7 Max$2.50 / $7.50 per M$2.50 / $7.50 per M

Збої, специфічні саме для ai-hedge-fund.

Неправильна змінна середовища. Цей репозиторій зчитує OPENAI_API_BASE. OPENAI_BASE_URL, змінну, яку використовують інші інструменти, тут не враховують, і її встановлення нічого не робить, окрім як переконує вас, що перевизначення зламане. Якщо запити все ще йдуть на api.openai.com, спершу перевірте назву змінної. --model з незареєстрованим id. find_model_by_name() знає лише записи з api_models.json. Передайте id каталогу, який не зареєстрований, і CLI виведе повідомлення not-found та впаде в інтерактивний селектор, що в cron-завданні чи прогоні CI означає тихе зависання, а не помилку з виходом. Спершу зареєструйте id; тоді скриптовані прогони резолвлять його детерміновано. Записи, позначені провайдером, оминають шлюз. Вибір моделі реєстру, чий provider — Anthropic, Google чи DeepSeek, маршрутизується через нативний клієнт і ключ того постачальника. Якщо ви очікували, що прогін з'явиться у вашому логу використання шлюзу, а він не з'явився, пояснення — в колонці provider обраної моделі. Помилки даних, що маскуються під помилки LLM. Цінові й фундаментальні дані надходять з фінансового API, налаштованого через FINANCIAL_DATASETS_API_KEY, цілком окремого сервісу. Відсутній чи вичерпаний ключ даних провалює прогін до або між викликами LLM, і traceback може виглядати як проблема моделі. Два облікові дані падають незалежно; налагоджуйте їх окремо. Інтерактивні запити в автоматизації. Навіть коли все налаштовано, забутий прапорець --model відкриває селектор. Для непідконтрольованих прогонів завжди передавайте --model із зареєстрованим id.

Хто спрямовує ai-hedge-fund через шлюз.

  • Бектестери, що прогонюють тікери й діапазони дат, де комітет агентів на тікер на дату робить витрати на токени домінантною вартістю, а використання за ключем — природним обліком.
  • Дослідники, що порівнюють вердикти моделей. Той самий прогін під двома id моделі — це зміна прапорця, а незгода сигналів між моделями — сама по собі цікаві дані.
  • Розробники, що розширюють репозиторій новими агентами і хочуть один ендпоінт і один ключ під будь-якою кількістю доданих персон.
  • Розробники, що хочуть міркування Claude чи DeepSeek у репозиторії, чий найчистіший шлях маршрутизації — у формі OpenAI, без підтримки ключа постачальника на кожен запис провайдера.
  • Розробники без доступу до білінгу певного постачальника. Доступ на основі поповнення без вимоги картки прибирає залежність від реєстрації в кожного провайдера.

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

Підтвердіть, що шлюз обслуговує id, які ви зареєстрували, перш ніж запускати прогін; рядки model_name реєстру мають точно збігатися з обслуговуваними id. Драбина збоїв першого прогону: 401 означає, що OPENAI_API_KEY у середовищі, з яким poetry насправді запустив процес, — не ключ шлюзу. Помилка model-not-found від шлюзу означає, що model_name запису реєстру має одруківку відносно /v1/models. Прогін, що зупиняється, чекаючи введення, означає, що рядок --model не потрапив у реєстр. Помилка ключа постачальника (Anthropic, Google) означає, що provider обраного запису — не OpenAI. А traceback у формі даних до будь-якого виводу моделі вказує на FINANCIAL_DATASETS_API_KEY, а не на шлях LLM. Щойно прогін завершиться, консоль APIsRouter показує модель на запит, кількість токенів і витрати. Прогін комітету — це десятки викликів по аналітиках, ризику й портфельних етапах, і вигляд використання — це те, як ви бачите, скільки насправді коштує одне рішення, перш ніж масштабувати його в серію прогонів.

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

Поширені запитання

Яка змінна середовища встановлює кастомний base URL для ai-hedge-fund?

OPENAI_API_BASE. Провайдер OpenAI у src/llm/models.py будує ChatOpenAI з base_url=os.getenv("OPENAI_API_BASE"). OPENAI_BASE_URL цим репозиторієм не зчитується, тож використовуйте написання саме API_BASE.

Чи може ai-hedge-fund запускати моделі Claude чи DeepSeek через один ключ?

Так, зареєструвавши id у src/llm/api_models.json з provider, встановленим на "OpenAI". Provider обирає клієнта, тож запис, позначений OpenAI, маршрутизується через ChatOpenAI і ваш OPENAI_API_BASE, а id каталогу передається до шлюзу як звичайний рядок.

Чому --model кидає мене в інтерактивний селектор?

Значення --model шукається через find_model_by_name() проти api_models.json. Невідомі id не вгадуються; CLI виводить повідомлення not-found і відкриває селектор. Додайте запис реєстру для id, і скриптовані прогони резолвлять його без запиту.

Чи все ще потрібен ANTHROPIC_API_KEY чи інші ключі постачальників?

Не для моделей, маршрутизованих через шлюз. Ключі постачальників враховуються лише записами реєстру, позначеними провайдером цього постачальника. Якщо кожна модель, яку ви запускаєте, зареєстрована під провайдером OpenAI, ключ шлюзу — єдиний облік даних LLM, потрібний прогону.

Чи змінюється налаштування ринкових даних, коли я змінюю ендпоінт LLM?

Ні. Цінові й фундаментальні дані течуть через фінансовий API, налаштований через FINANCIAL_DATASETS_API_KEY, що незалежний від base URL LLM. Два облікові дані падають на різних фазах прогону, тож налагоджуйте їх окремо.

Наскільки дорогий один прогін ai-hedge-fund?

Масштабується як агенти на тікери: кожна персона аналітика, плюс ризик-менеджмент і портфельний менеджмент, міркує на тікер. Прогони одного кошика зазвичай сягають десятків-сотень тисяч токенів, а серії бектесту множать це на сітку дат. Вигляд використання за ключем дає точну цифру на прогін.