รัน ai-hedge-fund บน custom OpenAI-compatible base URL
Updated 2026-07-30
ai-hedge-fund สร้างโมเดล OpenAI ของมันด้วย ChatOpenAI ของ LangChain และอ่าน base URL จาก OPENAI_API_BASE ตั้งค่าเป็น https://api.apisrouter.com/v1 export key เดียว แล้ว analyst agent ทุกตัวในกองทุนจะ route ผ่าน endpoint เดียว
คำตอบสั้น ๆ: OPENAI_API_BASE บวกกับ key เดียว
provider 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 ดังนั้นการ override คือสองบรรทัดใน .env: ชี้ OPENAI_API_BASE ไปที่ https://api.apisrouter.com/v1 แล้วตั้ง OPENAI_API_KEY เป็น key ของ gateway โมเดลทุกตัวที่รันผ่าน provider OpenAI จะโพสต์ไปที่ gateway ทันที สังเกตชื่อตัวแปรให้ดี: มันคือ OPENAI_API_BASE ตามธรรมเนียมยุค LangChain ไม่ใช่ OPENAI_BASE_URL การ export ตัวที่ผิดจะถูกเมินอย่างเงียบ ๆ และ request ยังคงวิ่งไปที่ 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 endpointai-hedge-fund เลือกโมเดลและ provider อย่างไร
ai-hedge-fund (virattt บน GitHub มีดาวประมาณ 62K) จำลองกองทุนเป็นคณะกรรมการของ agent: analyst persona ที่จำลองจากนักลงทุนชื่อดัง บวกกับ agent ด้าน valuation, sentiment, fundamentals และ technicals ที่ป้อนข้อมูลให้ risk manager และ portfolio manager ซึ่งสร้าง signal สุดท้าย ทั้งหมดใช้โมเดลเดียวกันต่อการรันหนึ่งครั้ง ดังนั้นการรันครั้งเดียวจะคูณการตัดสินใจเลือกโมเดลของคุณข้าม agent ทุกตัวและ ticker ทุกตัว การเลือกโมเดลมีสองทาง แบบโต้ตอบ: รัน poetry run python src/main.py --ticker AAPL,MSFT,NVDA โดยไม่มี flag model จะเปิด picker แบบ questionary แบบสคริปต์: flag --model รับชื่อโมเดล แต่รับเฉพาะชื่อที่มีอยู่ใน model registry ของ repo เท่านั้น find_model_by_name() จะค้นหาสตริงนั้นใน src/llm/api_models.json และแต่ละ entry ใน registry มี display_name, model_name และ provider ถ้าค้นหาไม่เจอ CLI จะไม่เดา provider แต่จะตกกลับไปที่ picker แบบโต้ตอบ ซึ่งสำคัญสำหรับระบบอัตโนมัติเพราะ id ที่ไม่รู้จักจะทำให้การรันแบบสคริปต์กลายเป็นการนั่งรอ keyboard input ฟิลด์ provider คือตัวตัดสิน routing entry ที่ทำเครื่องหมาย OpenAI จะผ่าน ChatOpenAI และเคารพ OPENAI_API_BASE ส่วน entry ที่ทำเครื่องหมาย Anthropic จะผ่าน ChatAnthropic และ ANTHROPIC_API_KEY ข้าม base URL ของคุณไปเลย นี่คือ insight สำคัญสำหรับ gateway routing: คอลัมน์ provider เลือก client และดังนั้นก็คือ endpoint โดยไม่ขึ้นกับว่าใครเป็นคนสร้างโมเดลนั้นจริง ๆ
ตั้งค่าแบบเต็ม: .env บวกกับ registry entry ต่อโมเดลของ gateway
สำหรับโมเดลที่ registry มีอยู่แล้วภายใต้ provider OpenAI การ override ผ่าน .env อย่างเดียวก็เพียงพอ สตริงโมเดลจะถูกส่งผ่านไปยัง endpoint ตามเดิม หากต้องการรัน id ของ Claude, DeepSeek หรือ Qwen ผ่าน gateway ด้วย key เดียวกัน ให้เพิ่ม entry ใน src/llm/api_models.json โดยใส่ id ในแคตตาล็อกเป็น model_name และที่สำคัญคือใส่ "OpenAI" เป็น provider เพราะ provider คือตัวเลือก client ดังนั้น entry ที่ทำเครื่องหมาย OpenAI จะ route ผ่าน ChatOpenAI และ OPENAI_API_BASE ของคุณ แม้ว่าโมเดลนั้นจะไม่ใช่โมเดลของ OpenAI ก็ตาม entry จะปรากฏใน picker แบบโต้ตอบและ resolve ผ่าน --model ในสคริปต์ได้ นี่คือการแก้ JSON สามบรรทัดใน clone ของคุณ ไม่ใช่การเปลี่ยนโค้ด และเป็นรูปแบบที่มีเอกสารระบุที่ registry ใช้อยู่แล้ว จำ entry แบบ provider-native ไว้เป็นข้อเปรียบเทียบ: การเลือกโมเดลใน registry ที่ทำเครื่องหมาย Anthropic จะมองหา ANTHROPIC_API_KEY และไปที่ endpoint ของ Anthropic โดยตรง ถ้าเป้าหมายของคุณคือ key เดียวของ gateway สำหรับทุกอย่าง ให้รันโมเดลผ่าน entry ที่ทำเครื่องหมาย OpenAI แล้วคุณสามารถปล่อย key ต่อ vendor ไว้โดยไม่ต้องตั้งค่าเลยก็ได้
{
"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"
}เลือกโมเดลสำหรับคณะกรรมการ agent
เพราะ registry ทำให้ผู้สมัครทุกตัวเรียกใช้ได้ผ่าน flag เดียว การประเมินที่ซื่อตรงคือแบบเชิงประจักษ์: รัน ticker และวันที่เดียวกันผ่านสองหรือสามโมเดล แล้วเปรียบเทียบ signal และค่าใช้จ่าย มุมมอง usage ต่อ key ตั้งราคาแต่ละ sweep ให้คุณ ซึ่งเปลี่ยนการเลือกโมเดลจากการถกเถียงให้กลายเป็นการวัดผล
- การรันหนึ่งครั้งคือคำตัดสินหลายอัน analyst persona แต่ละตัวให้เหตุผลบน filing และข้อมูลราคาเดียวกันต่อ ticker ดังนั้นการเลือกโมเดลจะถูกคูณด้วยจำนวน agent คูณจำนวน ticker id แบบ frontier reasoning (claude-opus-4-7, gpt-5.5) จะยกระดับคุณภาพของทุกคำตัดสิน โดยมีบิล token ที่คูณตามไปด้วย
- claude-sonnet-4-6 คือค่าเริ่มต้นที่สมเหตุสมผล: แข็งแกร่งพอที่จะให้ persona reasoning สอดคล้องกันตลอด context fundamental ที่ยาว ราคาเหมาะกับการรันที่กระจายไปยัง agent นับสิบตัวและ ticker หลายตัว
- deepseek-v4-pro และ qwen3.7-max คุ้มค่าที่จะ benchmark สำหรับ sweep ขนาดใหญ่ ซึ่งช่องว่างราคาต่อการรันจะทบต้นไปทั่วทุกวันที่ backtest
- ไม่ว่าจะเลือกอะไร ให้ pin มันไว้ signal จาก snapshot ต่างกันของโมเดลที่เปลี่ยนแปลงอยู่เปรียบเทียบกันไม่ได้ตลอดช่วง backtest ใช้ id ที่แน่นอนและบันทึกสตริงโมเดลไว้ข้าง ๆ ผลลัพธ์เหมือนกับ random seed
จ่ายตามการใช้งาน · ถูกกว่าราคาทางการ
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
ตัวแปร environment ที่ผิด repo นี้อ่าน OPENAI_API_BASE ส่วน OPENAI_BASE_URL ที่เครื่องมืออื่นใช้ จะไม่ถูกอ่านเลย และการตั้งค่ามันจะไม่ทำอะไรนอกจากทำให้คุณเข้าใจผิดว่าการ override เสีย ถ้า request ยังคงวิ่งไปที่ api.openai.com ให้ตรวจสอบชื่อตัวแปรก่อนอย่างอื่น --model ที่มี id ที่ไม่ได้ลงทะเบียน find_model_by_name() รู้จักแค่ entry ใน api_models.json เท่านั้น ถ้าส่ง id ในแคตตาล็อกที่ไม่ได้ลงทะเบียน CLI จะพิมพ์ข้อความ not-found แล้วตกไปที่ picker แบบโต้ตอบ ซึ่งใน cron job หรือการรัน CI หมายถึงการค้างอย่างเงียบ ๆ ไม่ใช่ exit แบบ error ลงทะเบียน id ก่อน แล้วการรันแบบสคริปต์จะ resolve มันได้อย่างแน่นอน entry ที่ทำเครื่องหมาย provider ข้าม gateway การเลือกโมเดลใน registry ที่มี provider เป็น Anthropic, Google หรือ DeepSeek จะ route ผ่าน client และ key แบบ native ของ vendor นั้น ถ้าคุณคาดว่าการรันจะปรากฏใน usage log ของ gateway แต่ไม่ปรากฏ คอลัมน์ provider ของโมเดลที่คุณเลือกคือคำอธิบาย error ของข้อมูลที่ปลอมตัวเป็น error ของ LLM ข้อมูลราคาและ fundamentals มาจาก financial-data API ที่ตั้งค่าด้วย FINANCIAL_DATASETS_API_KEY ซึ่งเป็นบริการที่แยกจากกันโดยสิ้นเชิง key ข้อมูลที่หายไปหรือหมดโควตาจะทำให้การรันล้มเหลวก่อนหรือระหว่างการเรียก LLM และ traceback อาจอ่านดูเหมือนปัญหาโมเดล credential ทั้งสองล้มเหลวแยกจากกัน ดีบักแยกจากกัน prompt แบบโต้ตอบในระบบอัตโนมัติ แม้จะตั้งค่าทุกอย่างแล้ว การลืม flag --model จะเปิด picker สำหรับการรันแบบไม่มีคนดูแล ให้ใส่ --model พร้อม id ที่ลงทะเบียนแล้วเสมอ
ใครที่ route ai-hedge-fund ผ่าน gateway
- ผู้ทำ backtest ที่ sweep ticker และช่วงวันที่ ซึ่งคณะกรรมการ agent ต่อ ticker ต่อวันที่ทำให้ค่าใช้จ่าย token เป็นต้นทุนหลัก และ usage ต่อ key เป็นบัญชีที่เป็นธรรมชาติ
- นักวิจัยที่เปรียบเทียบคำตัดสินของโมเดล การรันเดียวกันภายใต้ id โมเดลสองตัวคือแค่การเปลี่ยน flag และความไม่ลงรอยกันของ signal ระหว่างโมเดลก็เป็นข้อมูลที่น่าสนใจในตัวมันเอง
- builder ที่ขยาย repo ด้วย agent ใหม่ ๆ ที่ต้องการ endpoint เดียวและ key เดียวไม่ว่าจะเพิ่ม persona กี่ตัวก็ตาม
- นักพัฒนาที่ต้องการ reasoning ของ Claude หรือ DeepSeek ใน repo ที่เส้นทาง routing สะอาดที่สุดมีรูปทรงแบบ OpenAI โดยไม่ต้องดูแล key ของ vendor ต่อ entry provider
- นักพัฒนาที่ไม่มีสิทธิ์เข้าถึงระบบเก็บเงินของ vendor รายหนึ่ง การเข้าถึงแบบเติมเงินโดยไม่ต้องใช้บัตรตัดการพึ่งพาการสมัครต่อ provider ออกไป
ตรวจสอบ endpoint และ debug การรันแรก
ยืนยันว่า gateway เสิร์ฟ id ที่คุณลงทะเบียนไว้ก่อนเริ่มการรัน สตริง model_name ใน registry ต้องตรงกับ id ที่เสิร์ฟจริงทุกตัวอักษร ลำดับความล้มเหลวของการรันครั้งแรก: 401 หมายความว่า OPENAI_API_KEY ไม่ใช่ key ของ gateway ใน environment ที่ poetry ใช้รันจริง error model-not-found จาก gateway หมายความว่า model_name ของ entry ใน registry พิมพ์ผิดเทียบกับ /v1/models การรันที่หยุดเพื่อขอ input หมายความว่าสตริง --model ไม่ตรงกับ registry error vendor-key (Anthropic, Google) หมายความว่า provider ของ entry ที่เลือกไม่ใช่ OpenAI และ traceback ที่ดูเหมือนปัญหาข้อมูลก่อนที่โมเดลจะมี output ใด ๆ ชี้ไปที่ FINANCIAL_DATASETS_API_KEY ไม่ใช่เส้นทาง LLM เมื่อการรันเสร็จแล้ว console ของ APIsRouter จะแสดงโมเดลต่อ request, จำนวน token และค่าใช้จ่าย การรันของคณะกรรมการคือการเรียกหลายสิบครั้งข้าม stage ของ analyst, risk และ portfolio และมุมมอง usage คือที่ที่คุณจะเห็นว่าคำตัดสินหนึ่งอันมีต้นทุนจริงเท่าไหร่ก่อนที่จะขยายเป็น sweep
curl -s https://api.apisrouter.com/v1/models \
-H "Authorization: Bearer $OPENAI_API_KEY" | head -50คำถามที่พบบ่อย
ตัวแปร environment ตัวไหนที่ตั้งค่า custom base URL ให้ ai-hedge-fund?
OPENAI_API_BASE provider OpenAI ใน src/llm/models.py สร้าง ChatOpenAI ด้วย base_url=os.getenv("OPENAI_API_BASE") repo นี้ไม่อ่าน OPENAI_BASE_URL ดังนั้นใช้การสะกดแบบ API_BASE ให้ตรงเป๊ะ
ai-hedge-fund รันโมเดล Claude หรือ DeepSeek ผ่าน key เดียวได้ไหม?
ได้ โดยลงทะเบียน id ใน src/llm/api_models.json พร้อมตั้ง provider เป็น "OpenAI" provider คือตัวเลือก client ดังนั้น entry ที่ทำเครื่องหมาย OpenAI จะ route ผ่าน ChatOpenAI และ OPENAI_API_BASE ของคุณ และ id ในแคตตาล็อกจะถูกส่งผ่านไปยัง gateway เป็นสตริงธรรมดา
ทำไม --model ถึงทำให้ฉันตกไปอยู่ใน picker แบบโต้ตอบ?
ค่า --model จะถูกค้นหาด้วย find_model_by_name() เทียบกับ api_models.json id ที่ไม่รู้จักจะไม่ถูกเดา CLI จะพิมพ์ข้อความ not-found แล้วเปิด picker เพิ่ม entry ใน registry สำหรับ id นั้น แล้วการรันแบบสคริปต์จะ resolve ได้โดยไม่ถาม
ฉันยังต้องใช้ ANTHROPIC_API_KEY หรือ key ของ vendor อื่นอยู่ไหม?
ไม่จำเป็นสำหรับโมเดลที่ route ผ่าน gateway key ของ vendor จะถูกอ่านเฉพาะโดย entry ใน registry ที่ทำเครื่องหมาย provider ของ vendor นั้นเท่านั้น ถ้าทุกโมเดลที่คุณรันลงทะเบียนภายใต้ provider OpenAI key ของ gateway ก็เป็น credential LLM เดียวที่การรันต้องการ
การตั้งค่า market-data เปลี่ยนไปไหมเมื่อฉันเปลี่ยน LLM endpoint?
ไม่เปลี่ยน ข้อมูลราคาและ fundamentals ไหลผ่าน financial-data API ที่ตั้งค่าด้วย FINANCIAL_DATASETS_API_KEY ซึ่งเป็นอิสระจาก base URL ของ LLM credential ทั้งสองล้มเหลวคนละช่วงของการรัน ดังนั้นดีบักแยกจากกัน
การรัน ai-hedge-fund หนึ่งครั้งมีค่าใช้จ่ายเท่าไหร่?
มันขยายตาม agent คูณ ticker: analyst persona แต่ละตัว บวกกับ risk และ portfolio management ให้เหตุผลต่อ ticker การรันแบบ basket เดียวมักอยู่ในหลักหมื่นถึงหลักแสน token และ backtest sweep จะคูณสิ่งนั้นด้วย grid ของวันที่ มุมมอง usage ต่อ key ให้ตัวเลขที่แน่นอนต่อการรัน