ai-hedge-fund를 커스텀 OpenAI 호환 base URL에서 실행하기.

Updated 2026-07-30

ai-hedge-fund는 LangChain의 ChatOpenAI로 OpenAI 모델을 생성하며 base URL을 OPENAI_API_BASE에서 읽습니다. 이를 https://api.apisrouter.com/v1로 설정하고 키 하나를 export하면, 펀드의 모든 애널리스트 에이전트가 엔드포인트 하나를 통해 라우팅됩니다.

빠른 답: OPENAI_API_BASE와 키 하나.

ai-hedge-fund의 OpenAI 프로바이더는 ChatOpenAI(model=model_name, api_key=api_key, base_url=base_url)로 인스턴스화되며, 그 base_url은 src/llm/models.py의 os.getenv("OPENAI_API_BASE")에서 옵니다. 따라서 오버라이드는 .env의 두 줄이면 됩니다: OPENAI_API_BASE를 https://api.apisrouter.com/v1로 지정하고 OPENAI_API_KEY를 여러분의 게이트웨이 키로 설정하세요. OpenAI 프로바이더를 통해 실행되는 모든 모델이 이제 게이트웨이로 요청을 보냅니다. 변수 이름을 주의 깊게 확인하세요: OPENAI_BASE_URL이 아니라 LangChain 시대의 관례인 OPENAI_API_BASE입니다. 잘못된 변수를 export하면 조용히 무시되어 요청이 계속 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(GitHub의 virattt, 약 6.2만 스타)는 펀드를 에이전트 위원회로 시뮬레이션합니다: 유명 투자자를 본뜬 애널리스트 페르소나에 밸류에이션, 센티먼트, 펀더멘털, 기술적 분석 에이전트가 더해지고, 이들이 리스크 매니저와 포트폴리오 매니저에게 정보를 넘겨 최종 시그널을 만듭니다. 이들 모두는 실행당 하나의 모델 선택을 공유하므로, 한 번의 실행이 모델 결정을 모든 에이전트와 모든 티커에 걸쳐 곱합니다. 모델 선택에는 두 경로가 있습니다. 대화형으로는, model 플래그 없이 poetry run python src/main.py --ticker AAPL,MSFT,NVDA를 실행하면 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 오버라이드만으로 충분합니다; 모델 문자열은 그대로 엔드포인트에 전달됩니다. 같은 키로 Claude, DeepSeek, Qwen id를 게이트웨이를 통해 실행하려면, src/llm/api_models.json에 카탈로그 id를 model_name으로, 그리고 결정적으로 provider를 "OpenAI"로 하는 항목을 추가하세요. provider가 클라이언트를 선택하므로, OpenAI로 표시된 항목은 모델 자체가 OpenAI 모델이 아니더라도 ChatOpenAI와 여러분의 OPENAI_API_BASE를 거칩니다. 그러면 이 항목이 대화형 피커에 나타나고 스크립트에서 --model로 해석됩니다. 이는 클론에서 세 줄짜리 JSON 편집일 뿐 코드 변경이 아니며, 레지스트리가 이미 사용하는 문서화된 형태입니다. 대비되는 사례로 provider-네이티브 항목을 기억해 두세요: 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"
}

에이전트 위원회를 위한 모델 선택.

레지스트리가 모든 후보를 플래그 하나 뒤에서 주소 지정 가능하게 만들어주므로, 정직한 평가는 경험적입니다: 같은 티커와 날짜를 두세 개 모델에 돌려 시그널과 지출을 비교하세요. 키별 사용량 뷰가 각 스윕에 가격을 매겨주므로, 모델 선택이 논쟁이 아니라 측정이 됩니다.

  • 한 번의 실행은 여러 개의 판단입니다. 모든 애널리스트 페르소나가 티커별로 같은 공시자료와 가격 데이터를 바탕으로 추론하므로, 모델 선택은 에이전트 수 곱하기 티커 수만큼 곱해집니다. 프론티어 추론 id(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으로 향한다면 다른 무엇보다 먼저 변수 이름을 확인하세요. 등록되지 않은 id로 --model을 쓰는 경우. find_model_by_name()은 api_models.json에 있는 항목만 압니다. 등록되지 않은 카탈로그 id를 넘기면 CLI는 not-found 메시지를 출력하고 대화형 피커로 떨어지는데, 이는 cron 작업이나 CI 실행에서 오류 종료가 아니라 조용한 행(hang)을 의미합니다. id를 먼저 등록하면 스크립트 실행이 결정론적으로 해석됩니다. provider 표시가 게이트웨이를 우회하는 경우. provider가 Anthropic, Google, DeepSeek인 레지스트리 모델을 고르면 해당 벤더의 네이티브 클라이언트와 키를 거칩니다. 실행이 게이트웨이 사용량 로그에 나타날 것으로 기대했는데 나타나지 않았다면, 고른 모델의 provider 컬럼이 그 이유입니다. LLM 오류로 위장한 데이터 오류. 가격과 펀더멘털 데이터는 FINANCIAL_DATASETS_API_KEY로 설정되는, 완전히 별개인 금융 데이터 API에서 옵니다. 데이터 키가 없거나 소진되면 LLM 호출 이전 또는 그 사이에 실행이 실패하는데, 트레이스백은 마치 모델 문제처럼 읽힐 수 있습니다. 두 자격 증명은 독립적으로 실패하므로 독립적으로 디버깅하세요. 자동화 안에서의 대화형 프롬프트. 모든 것이 설정되어 있어도 --model 플래그를 빠뜨리면 피커가 열립니다. 무인 실행에서는 항상 등록된 id로 --model을 넘기세요.

어떤 사람들이 게이트웨이를 통해 ai-hedge-fund를 쓰는가.

  • 티커와 날짜 범위를 스윕하는 백테스터 — 티커·날짜별 에이전트 위원회가 토큰 지출을 지배적인 비용으로 만들고, 키별 사용량이 자연스러운 장부가 됩니다.
  • 모델 판단을 비교하는 연구자. 같은 실행을 두 모델 id로 돌리는 것은 플래그 하나만 바꾸면 되고, 모델 간 시그널 불일치 자체가 흥미로운 데이터입니다.
  • 새 에이전트로 저장소를 확장하는 빌더 — 몇 개의 페르소나를 추가하든 그 아래에 엔드포인트 하나, 키 하나만 두고 싶은 사람들.
  • 가장 깔끔한 라우팅 경로가 OpenAI 형태인 저장소 안에서 Claude나 DeepSeek 추론을 쓰고 싶은 개발자 — provider 항목마다 벤더 키를 유지하지 않고도.
  • 특정 벤더의 결제 수단에 접근할 수 없는 개발자. 카드 없이 충전만으로 사용할 수 있어 프로바이더별 가입 의존성이 사라집니다.

엔드포인트 검증 및 첫 실행 디버깅.

실행을 시작하기 전에 게이트웨이가 등록한 id를 서빙하는지 확인하세요; 레지스트리의 model_name 문자열은 서빙되는 id와 정확히 일치해야 합니다. 첫 실행 실패 사다리: 401은 poetry가 실제로 실행한 환경의 OPENAI_API_KEY가 게이트웨이 키가 아니라는 뜻입니다. 게이트웨이에서 나오는 model-not-found 오류는 레지스트리 항목의 model_name이 /v1/models 대비 오타가 있다는 뜻입니다. 입력을 기다리며 멈추는 실행은 --model 문자열이 레지스트리에 없다는 뜻입니다. 벤더 키 오류(Anthropic, Google)는 선택한 항목의 provider가 OpenAI가 아니라는 뜻입니다. 그리고 모델 출력 이전에 나타나는 데이터 형태의 트레이스백은 LLM 경로가 아니라 FINANCIAL_DATASETS_API_KEY를 가리킵니다. 실행이 완료되면 APIsRouter 콘솔에서 요청별 모델, 토큰 수, 지출을 볼 수 있습니다. 위원회 실행은 애널리스트, 리스크, 포트폴리오 단계에 걸친 수십 번의 호출이며, 사용량 뷰는 스윕으로 확장하기 전에 하나의 결정이 실제로 얼마인지 보는 방법입니다.

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

자주 묻는 질문

ai-hedge-fund에 커스텀 base URL을 설정하는 환경 변수는 무엇인가요?

OPENAI_API_BASE입니다. src/llm/models.py의 OpenAI 프로바이더는 base_url=os.getenv("OPENAI_API_BASE")로 ChatOpenAI를 생성합니다. 이 저장소는 OPENAI_BASE_URL을 읽지 않으므로, API_BASE 철자를 정확히 쓰세요.

ai-hedge-fund가 Claude나 DeepSeek 모델을 키 하나로 실행할 수 있나요?

네. src/llm/api_models.json에 provider를 "OpenAI"로 설정해 id를 등록하면 됩니다. provider가 클라이언트를 선택하므로, OpenAI로 표시된 항목은 ChatOpenAI와 여러분의 OPENAI_API_BASE를 거치며, 카탈로그 id는 그대로 문자열로 게이트웨이에 전달됩니다.

왜 --model이 저를 대화형 피커로 떨어뜨리나요?

--model 값은 find_model_by_name()으로 api_models.json에 대해 조회됩니다. 알 수 없는 id는 추측되지 않습니다; CLI는 not-found 메시지를 출력하고 피커를 엽니다. 그 id에 대한 레지스트리 항목을 추가하면 스크립트 실행이 프롬프트 없이 해석합니다.

ANTHROPIC_API_KEY나 다른 벤더 키가 여전히 필요한가요?

게이트웨이로 라우팅되는 모델에는 필요 없습니다. 벤더 키는 해당 벤더의 provider로 표시된 레지스트리 항목에서만 참조됩니다. 실행하는 모든 모델이 OpenAI provider 아래 등록되어 있다면, 게이트웨이 키가 그 실행에 필요한 유일한 LLM 자격 증명입니다.

LLM 엔드포인트를 바꾸면 시장 데이터 설정도 바뀌나요?

아니요. 가격과 펀더멘털 데이터는 FINANCIAL_DATASETS_API_KEY로 설정되는 금융 데이터 API를 통해 흐르며, 이는 LLM base URL과 독립적입니다. 두 자격 증명은 실행의 서로 다른 단계에서 실패하므로 따로 디버깅하세요.

ai-hedge-fund 한 번 실행에 비용이 얼마나 드나요?

에이전트 곱하기 티커에 비례해 커집니다: 각 애널리스트 페르소나에 리스크·포트폴리오 관리까지 더해져 티커별로 추론합니다. 단일 바스켓 실행은 보통 수만에서 수십만 토큰 사이이며, 백테스트 스윕은 이를 날짜 그리드만큼 곱합니다. 키별 사용량 뷰가 실행당 정확한 수치를 알려줍니다.