Ejecuta ai-hedge-fund en una URL base personalizada compatible con OpenAI.

Updated 2026-07-30

ai-hedge-fund construye sus modelos OpenAI con ChatOpenAI de LangChain y lee la URL base desde OPENAI_API_BASE. Configúrala a https://api.apisrouter.com/v1, exporta una clave, y cada agente analista del fondo se enruta a través de un único endpoint.

Respuesta rápida: OPENAI_API_BASE más una clave.

El proveedor OpenAI de ai-hedge-fund se instancia como ChatOpenAI(model=model_name, api_key=api_key, base_url=base_url), y ese base_url viene de os.getenv("OPENAI_API_BASE") en src/llm/models.py. Así que el override son dos líneas en .env: apunta OPENAI_API_BASE a https://api.apisrouter.com/v1 y configura OPENAI_API_KEY con tu clave del gateway. Cada modelo que corre a través del proveedor OpenAI ahora envía sus peticiones al gateway. Presta atención al nombre exacto de la variable: es OPENAI_API_BASE, la convención de la era LangChain, no OPENAI_BASE_URL. Exportar la equivocada se ignora silenciosamente y las peticiones siguen yendo a api.openai.com, que es la forma más común en que esta configuración parece no funcionar.

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

Cómo elige ai-hedge-fund un modelo y un proveedor.

ai-hedge-fund (virattt en GitHub, unas 62K estrellas) simula un fondo como un comité de agentes: personas analistas modeladas sobre inversores conocidos, más agentes de valoración, sentimiento, fundamentales y técnicos, que alimentan a un gestor de riesgo y un gestor de portafolio que producen las señales finales. Todos comparten una sola elección de modelo por ejecución, así que una ejecución multiplica tu decisión de modelo entre cada agente y cada ticker. La selección de modelo tiene dos caminos. De forma interactiva, ejecutar poetry run python src/main.py --ticker AAPL,MSFT,NVDA sin flag de modelo abre un selector de questionary. Con script, el flag --model toma un nombre de modelo, pero solo nombres que existan en el registro de modelos del repositorio: find_model_by_name() busca el string en src/llm/api_models.json, y cada entrada del registro lleva display_name, model_name y provider. Si la búsqueda falla, la CLI no adivina un proveedor; recae en el selector interactivo, lo que importa para automatización porque un id desconocido convierte una ejecución con script en una que se queda esperando entrada de teclado. El campo provider es lo que decide el enrutamiento. Las entradas marcadas OpenAI pasan por ChatOpenAI y respetan OPENAI_API_BASE; las entradas marcadas Anthropic pasan por ChatAnthropic y ANTHROPIC_API_KEY, evitando tu URL base por completo. Esa es la idea clave para el enrutamiento a través de un gateway: la columna provider selecciona el cliente y por tanto el endpoint, independientemente de quién haya hecho realmente el modelo.

Configuración completa: .env más una entrada de registro por modelo del gateway.

Para modelos que el registro ya lista bajo el proveedor OpenAI, el override en .env es suficiente por sí solo; el string del modelo se pasa al endpoint tal cual. Para ejecutar un id de Claude, DeepSeek o Qwen a través del gateway con la misma clave, añade una entrada a src/llm/api_models.json con el id del catálogo como model_name y, crucialmente, "OpenAI" como provider. Provider selecciona el cliente, así que una entrada marcada OpenAI se enruta a través de ChatOpenAI y tu OPENAI_API_BASE aunque el modelo en sí no sea un modelo de OpenAI. La entrada aparece entonces en el selector interactivo y se resuelve vía --model en scripts. Esto es una edición JSON de tres líneas en tu clon, no un cambio de código, y es la forma documentada que el registro ya usa. Ten presentes las entradas nativas de proveedor como contraste: seleccionar un modelo del registro marcado Anthropic buscará ANTHROPIC_API_KEY e irá directo al endpoint de Anthropic. Si tu intención es una sola clave de gateway para todo, ejecuta tus modelos a través de entradas marcadas OpenAI y puedes dejar las claves por proveedor completamente sin configurar.

{
  "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"
}

Elegir un modelo para un comité de agentes.

Como el registro hace que cada candidato sea direccionable detrás de un solo flag, la evaluación honesta es empírica: corre los mismos tickers y fechas con dos o tres modelos y compara las señales y el gasto. La vista de uso por clave tasa cada barrido por ti, lo que convierte la elección de modelo de un debate en una medición.

  • Una ejecución son muchos veredictos. Cada persona analista razona sobre las mismas presentaciones y datos de precio por ticker, así que la elección de modelo se multiplica por el número de agentes por el número de tickers. Un id de razonamiento de vanguardia (claude-opus-4-7, gpt-5.5) eleva la calidad de cada veredicto con una factura de tokens multiplicada en la misma proporción.
  • claude-sonnet-4-6 es la opción por defecto sensata: suficientemente fuerte para que el razonamiento de cada persona se mantenga coherente sobre contexto fundamental largo, con precio pensado para ejecuciones que se abren en docenas de agentes y una cesta de tickers.
  • deepseek-v4-pro y qwen3.7-max merecen benchmark en barridos amplios, donde la diferencia de precio por ejecución se acumula en cada fecha de backtest.
  • Elijas lo que elijas, fíjalo. Las señales de distintas instantáneas de un modelo en movimiento no son comparables a lo largo de una ventana de backtest; usa ids exactos y registra el string del modelo junto a los resultados como una semilla aleatoria.

Pago por uso · por debajo del precio oficial

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

ModeloPrecio oficialNuestro precio
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

Los modos de fallo específicos de ai-hedge-fund.

La variable de entorno equivocada. Este repo lee OPENAI_API_BASE. OPENAI_BASE_URL, la variable que usan otras herramientas, no se consulta, y configurarla no hace nada excepto convencerte de que el override está roto. Si las peticiones siguen llegando a api.openai.com, revisa el nombre de la variable antes que nada. --model con un id no registrado. find_model_by_name() solo conoce las entradas de api_models.json. Pasa un id de catálogo que no esté registrado y la CLI imprime un mensaje de no encontrado y cae en el selector interactivo, lo que en un cron job o una ejecución de CI significa un cuelgue silencioso, no una salida con error. Registra el id primero; entonces las ejecuciones con script lo resuelven de forma determinista. Entradas marcadas por proveedor que evitan el gateway. Elegir un modelo del registro cuyo provider sea Anthropic, Google o DeepSeek enruta a través del cliente nativo y la clave de ese proveedor. Si esperabas que la ejecución apareciera en el log de uso de tu gateway y no fue así, la columna provider del modelo que elegiste es la explicación. Errores de datos disfrazados de errores de LLM. Los datos de precio y fundamentales vienen de la API financiera configurada por FINANCIAL_DATASETS_API_KEY, un servicio completamente separado. Una clave de datos ausente o agotada falla la ejecución antes o entre las llamadas de LLM, y el traceback puede leerse como un problema de modelo. Las dos credenciales fallan de forma independiente; depúralas de forma independiente. Prompts interactivos en automatización. Incluso con todo configurado, olvidar el flag --model abre el selector. Para ejecuciones desatendidas, pasa siempre --model con un id registrado.

Quién enruta ai-hedge-fund a través de un gateway.

  • Backtesters que barren tickers y rangos de fechas, donde un comité de agentes por ticker por fecha hace que el gasto en tokens sea el coste dominante y el uso por clave el libro de contabilidad natural.
  • Investigadores que comparan veredictos de modelos. La misma ejecución bajo dos ids de modelo es un cambio de flag, y el desacuerdo de señales entre modelos es en sí mismo un dato interesante.
  • Constructores que amplían el repositorio con nuevos agentes y quieren un endpoint y una clave debajo de cuantas personas añadan.
  • Desarrolladores que quieren razonamiento de Claude o DeepSeek dentro de un repo cuya ruta de enrutamiento más limpia tiene forma de OpenAI, sin mantener una clave de proveedor por entrada.
  • Desarrolladores sin acceso a la facturación de un proveedor concreto. El acceso mediante recarga sin necesidad de tarjeta elimina la dependencia de registrarse en cada proveedor.

Verifica el endpoint y depura la primera ejecución.

Confirma que el gateway sirve los ids que registraste antes de lanzar una ejecución; los strings model_name del registro deben coincidir exactamente con los ids servidos. La escalera de fallos de la primera ejecución: un 401 significa que OPENAI_API_KEY no es la clave del gateway en el entorno con el que poetry realmente lanzó. Un error de modelo no encontrado del gateway significa que el model_name de la entrada del registro tiene una errata respecto a /v1/models. Una ejecución que se detiene a pedir entrada significa que el string --model no coincidió con el registro. Un error de clave de proveedor (Anthropic, Google) significa que el provider de la entrada seleccionada no es OpenAI. Y un traceback con forma de datos antes de cualquier salida de modelo apunta a FINANCIAL_DATASETS_API_KEY, no a la ruta del LLM. Una vez que una ejecución se completa, la consola de APIsRouter muestra el modelo por petición, el recuento de tokens y el gasto. Una ejecución de comité son docenas de llamadas entre analistas, riesgo y las etapas de portafolio, y la vista de uso es cómo ves lo que realmente cuesta una decisión antes de escalarla a un barrido.

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

Preguntas frecuentes

¿Qué variable de entorno configura una URL base personalizada para ai-hedge-fund?

OPENAI_API_BASE. El proveedor OpenAI en src/llm/models.py construye ChatOpenAI con base_url=os.getenv("OPENAI_API_BASE"). OPENAI_BASE_URL no se lee en este repo, así que usa exactamente la grafía API_BASE.

¿Puede ai-hedge-fund ejecutar modelos Claude o DeepSeek a través de una clave?

Sí, registrando el id en src/llm/api_models.json con provider configurado a "OpenAI". Provider selecciona el cliente, así que una entrada marcada OpenAI se enruta a través de ChatOpenAI y tu OPENAI_API_BASE, y el id del catálogo se pasa al gateway como un string simple.

¿Por qué --model me deja en un selector interactivo?

El valor de --model se busca con find_model_by_name() contra api_models.json. Los ids desconocidos no se adivinan; la CLI imprime un mensaje de no encontrado y abre el selector. Añade una entrada de registro para el id y las ejecuciones con script lo resuelven sin preguntar.

¿Sigo necesitando ANTHROPIC_API_KEY u otras claves de proveedor?

No para modelos enrutados a través del gateway. Las claves de proveedor solo se consultan por entradas del registro marcadas con el provider de ese proveedor. Si cada modelo que ejecutas está registrado bajo el proveedor OpenAI, la clave del gateway es la única credencial de LLM que necesita la ejecución.

¿Cambia la configuración de datos de mercado cuando cambio el endpoint del LLM?

No. Los datos de precio y fundamentales fluyen a través de la API financiera configurada por FINANCIAL_DATASETS_API_KEY, que es independiente de la URL base del LLM. Las dos credenciales fallan en fases distintas de una ejecución, así que depúralas por separado.

¿Cuánto cuesta una ejecución de ai-hedge-fund?

Escala con agentes por tickers: cada persona analista, más gestión de riesgo y portafolio, razona por ticker. Las ejecuciones de una sola cesta suelen aterrizar en decenas a cientos de miles de tokens, y los barridos de backtest multiplican eso por la rejilla de fechas. La vista de uso por clave da la cifra exacta por ejecución.