FinRobot را روی یک endpoint سفارشی سازگار با OpenAI اجرا کنید.

Updated 2026-07-30

FinRobot credential های LLM خود را از یک فایل AutoGen به‌نام OAI_CONFIG_LIST می‌خواند که ورودی‌های آن یک کلید base_url می‌پذیرند. یک ورودی اضافه کنید که به https://api.apisrouter.com/v1 با یک کلید gateway اشاره کند، و agent های forecaster، report-writer، و RAG می‌توانند روی هر id مدل در کاتالوگ اجرا شوند.

پاسخ سریع: یک ورودی در OAI_CONFIG_LIST.

دستورالعمل‌های راه‌اندازی FinRobot از شما می‌خواهند OAI_CONFIG_LIST_sample را به OAI_CONFIG_LIST تغییرنام دهید و credential ها را پر کنید. آن فایل یک config list استاندارد AutoGen است: یک آرایه JSON که هر ورودی model و api_key، و اختیاری base_url می‌گیرد، که نمونه عرضه‌شده از قبل برای endpoint های غیر-پیش‌فرض آن را نشان می‌دهد. یک ورودی با کلید gateway خود و base_url تنظیم‌شده روی https://api.apisrouter.com/v1 اضافه کنید، و هر agent در FinRobot که فایل را لود کند می‌تواند از طریق آن مسیردهی شود. یک گیر که وقت مردم را می‌گیرد: tutorial ها فایل را از طریق autogen.config_list_from_json با یک filter_dict که ورودی‌ها را با نام مدل انتخاب می‌کند لود می‌کنند. اگر ورودی جدید شما claude-sonnet-4-6 می‌گوید اما filter همچنان id GPT نمونه را می‌خواهد، ورودی شما فیلتر می‌شود و اجرا روی credential های قدیمی شکست می‌خورد. filter_dict را برای تطابق با مدلی که اضافه کردید به‌روزرسانی کنید، یا در حین تست filter را کنار بگذارید.

[
    {
        "model": "claude-sonnet-4-6",
        "api_key": "sk-YOUR-APISROUTER-KEY",
        "base_url": "https://api.apisrouter.com/v1"
    }
]

چطور FinRobot از config LLM خود استفاده می‌کند.

FinRobot (AI4Finance-Foundation در GitHub، حدود ۷.۶ هزار ستاره) یک پلتفرم agent AI برای تحلیل مالی است که روی AutoGen (pyautogen ۰.۲.۱۹ یا جدیدتر) ساخته شده. agent های آن workflow های بسته‌بندی‌شده‌اند: یک forecaster به‌نام Market_Analyst که اخبار و بنیادی‌های شرکت را می‌کشد و حرکت هفته-بعد را پیش‌بینی می‌کند، یک نویسنده annual-report که filing ها را به یک PDF پژوهش سهام تبدیل می‌کند، و agent های QA مبتنی‌بر-retrieval روی تماس‌های درآمد و filing های SEC. هر tutorial همان شکل llm_config را می‌سازد: یک dict که config_list آن از autogen.config_list_from_json که فایل OAI_CONFIG_LIST را می‌خواند می‌آید. آن llm_config به کلاس‌های wrapper مثل SingleAssistant و SingleAssistantShadow از finrobot.agents.workflow داده می‌شود، که agent های زیرین AutoGen را در اختیار دارند. پس تصمیم endpoint کاملاً در فایل JSON زندگی می‌کند: client OpenAI در AutoGen درخواست‌های /v1/chat/completions را به هر base_url ای که ورودی انتخاب‌شده حمل می‌کند می‌فرستد و فیلد model را به‌عنوان رشته ساده فوروارد می‌کند. آن رشته ساده برد عملی است. وقتی endpoint پشت base_url چند vendor سرویس می‌دهد، یک id از Claude، DeepSeek، یا Qwen از طریق همان config به‌شکل OpenAI سوار می‌شود بدون اینکه FinRobot متوجه شود، و عوض‌کردن مدل تحلیل به یک ویرایش JSON یک‌خطی به‌علاوه یک filter_dict متطابق تبدیل می‌شود.

راه‌اندازی کامل: فایل config، filter، و کلیدهای داده.

FinRobot credential ها را در سرتاسر دو فایل تقسیم می‌کند، و فقط یکی از آن‌ها به LLM مربوط است. OAI_CONFIG_LIST endpoint ها و کلیدهای مدل را نگه می‌دارد. config_api_keys credential های داده-بازار (FINNHUB_API_KEY، FMP_API_KEY، SEC_API_KEY، و کلیدهای اجتماعی) را نگه می‌دارد، جداگانه از طریق register_keys_from_json لود می‌شود. مسیردهی LLM از طریق یک gateway فایل اول را تغییر می‌دهد و دومی را دست‌نخورده رها می‌کند، پس کشیدن‌های اخبار، بنیادی‌ها، و filing ها دقیقاً مثل قبل رفتار می‌کنند. الگوی tutorial زیر ساختار notebook forecaster با ورودی gateway انتخاب‌شده است. همان llm_config برای tutorial های annual-report و RAG کار می‌کند، که فقط در اینکه کدام کلاس workflow را نمونه‌سازی می‌کنند فرق دارند.

import autogen
from finrobot.utils import register_keys_from_json
from finrobot.agents.workflow import SingleAssistant

llm_config = {
    "config_list": autogen.config_list_from_json(
        "../OAI_CONFIG_LIST",
        filter_dict={"model": ["claude-sonnet-4-6"]},  # match your entry
    ),
    "timeout": 120,
    "temperature": 0,
}

register_keys_from_json("../config_api_keys")  # finnhub/fmp/sec data keys

assistant = SingleAssistant("Market_Analyst", llm_config,
                            human_input_mode="NEVER")
assistant.chat("Analyze NVDA news this week and predict next week's movement.")

انتخاب مدل‌ها به ازای هر workflow در FinRobot.

حلقه آزمایش تمیز: ticker و بازه تاریخ را ثابت کنید، همان workflow را یک‌بار به ازای هر ورودی کاندید اجرا کنید، و خروجی‌ها را کنار هم مقایسه کنید. پشت یک endpoint هر کاندید یک ویرایش filter_dict است، و usage log هر-کلید صورت‌حساب token به ازای هر کاندید را بدون کار spreadsheet به شما می‌دهد.

  • نویسنده annual-report سنگین‌ترین کار استدلال است: بخش‌های filing را می‌خواند، یک تز سرمایه‌گذاری سنتز می‌کند، و یک گزارش ساختاریافته پیش‌نویس می‌کند. claude-opus-4-7 یا gpt-5.5 در آن workflow جایی است که کیفیت خروجی به‌طور قابل‌مشاهده تغییر می‌کند.
  • forecaster بازار یک کار کوتاه‌تر و تکراری روی اخبار و بنیادی‌ها است. claude-sonnet-4-6 یا deepseek-v4-pro آن را خوب مدیریت می‌کند، و وقتی آن را روزانه در سرتاسر یک watchlist اجرا می‌کنید اهمیت دارد.
  • QA مبتنی‌بر-RAG روی تماس‌های درآمد retrieval به‌علاوه سنتز روی گزیده‌های بلند است، که به id های long-context امتیاز می‌دهد؛ gemini-3.1-pro-preview ارزش تست در برابر claude-sonnet-4-6 آنجا را دارد.
  • چون ورودی‌ها با filter_dict انتخاب می‌شوند، می‌توانید یک فایل با یک ورودی frontier و یک ورودی سریع در برابر همان base_url نگه دارید و به ازای هر notebook انتخاب کنید، به‌جای ویرایش credential ها به ازای هر اجرا.
  • id های مدل رشته‌های دقیق‌اند. FinRobot آن‌ها را بدون اعتبارسنجی فوروارد می‌کند، پس فهرست /v1/models endpoint نگارش معتبر است.

پرداخت بر اساس مصرف · پایین‌تر از قیمت رسمی

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.4$2.50 / $15.00 per M$2.00 / $12.00 per M
DeepSeek V4 Pro$0.43 / $0.87 per M$0.40 / $0.90 per M
Gemini 3.1 Pro Preview$2.00 / $12.00 per M$1.60 / $9.60 per M

حالت‌های شکست مختص FinRobot.

عدم‌تطابق filter_dict بزرگ‌ترین است. config_list_from_json فقط ورودی‌هایی را برمی‌گرداند که model آن‌ها با filter مطابقت دارد؛ یک filter که با هیچ‌چیز مطابقت ندارد یک خطا درباره یک config list خالی raise می‌کند، و یک filter که با ورودی‌های باقی‌مانده نمونه مطابقت دارد درخواست‌ها را با کلیدهای placeholder به OpenAI می‌فرستد، که به‌شکل یک ۴۰۱ از host اشتباه ظاهر می‌شود. وقتی تغییرات مسیردهی به‌نظر نمی‌رسد اثر کرده، اول config_list resolve‌شده را چاپ کنید. مسیرهای نسبی دومی هستند. tutorial ها "../OAI_CONFIG_LIST" را لود می‌کنند چون notebook ها یک سطح زیر ریشه repo می‌نشینند؛ یک اسکریپت در ریشه به‌جای آن "OAI_CONFIG_LIST" می‌خواهد، و AutoGen همچنین متغیر محیطی OAI_CONFIG_LIST را که رشته JSON حمل می‌کند می‌پذیرد، که مسائل مسیر را در کانتینرها دور می‌زند. خط‌های comment سومی هستند. دستورالعمل‌های راه‌اندازی به شما می‌گویند یادداشت‌های comment را از فایل‌های نمونه حذف کنید چون آن‌ها JSON را نامعتبر می‌کنند؛ یک JSONDecodeError در startup یعنی یک comment سرگردان زنده مانده. credential های داده مستقلاً شکست می‌خورند. اگر agent خوب چت می‌کند اما اخبار یا بنیادی‌ها خالی برمی‌گردند، این یک مسئله config_api_keys (Finnhub، FMP، SEC) است، نه یک مسئله endpoint. و ماژول جدای FinRobot Pro equity به‌جای آن کلیدهای خود را از طریق یک config.ini پیکربندی می‌کند؛ تا ژوئیه ۲۰۲۶ تنظیمات مستند آن یک openai_api_key را پوشش می‌دهد اما هیچ override برای base-URL ندارد، پس آن ماژول را تا وقتی upstream یکی را مستند کند مستقیم-vendor در نظر بگیرید.

چه کسانی FinRobot را از طریق یک gateway مسیردهی می‌کنند.

  • تحلیل‌گرانی که گزارش‌های سهام را در سرتاسر یک فهرست پوشش تولید می‌کنند. context های بلند filing به ازای هر گزارش تفاوت‌های قیمت هر-مدل را مادی می‌کند، و یک endpoint مدل را یک انتخاب هر-اجرا می‌کند.
  • تیم‌های quant که forecaster را روزانه روی یک watchlist اجرا می‌کنند، جایی که یک id سریع mid-tier صورت‌حساب تکرارشونده را بدون بازنویسی workflow ثابت نگه می‌دارد.
  • پژوهشگرانی که خانواده‌های مدل را روی وظایف مالی یکسان مقایسه می‌کنند. هر کاندید یک ورودی config است، نه یک حساب vendor و تعویض SDK.
  • تیم‌هایی که stack های مبتنی‌بر-AutoGen را استاندارد می‌کنند. FinRobot قرارداد OAI_CONFIG_LIST را با پروژه‌های دیگر AutoGen به اشتراک می‌گذارد، پس یک فرمت ورودی gateway همه آن‌ها را سرویس می‌دهد.
  • توسعه‌دهندگان بدون دسترسی به صورت‌حساب یک vendor خاص. دسترسی مبتنی بر شارژ بدون الزام کارت وابستگی ثبت‌نام هر-provider را حذف می‌کند.

endpoint را تأیید کنید و اولین اجرا را عیب‌یابی کنید.

مدل‌هایی را که کلید شما می‌تواند آدرس دهد قبل از باز‌کردن یک notebook فهرست کنید؛ هر رشته model در OAI_CONFIG_LIST و هر مقدار filter_dict باید دقیقاً با یک id سرویس‌داده‌شده مطابقت داشته باشد. سپس کوتاه‌ترین چت ممکن را از طریق SingleAssistant اجرا کنید و کنسول را تماشا کنید. یک ۴۰۱ یعنی api_key ورودی انتخاب‌شده به endpoint در base_url آن تعلق ندارد؛ چک کنید filter واقعاً کدام ورودی را انتخاب کرده. یک خطای model-not-found یک غلط‌تایپی id در ورودی است. یک خطای اتصال معمولاً یعنی base_url پسوند /v1 خود را گم کرده. اگر agent بدون نتایج tool حلقه می‌زند، کلیدهای داده در config_api_keys مظنون‌اند، نه endpoint LLM. وقتی درخواست‌ها جاری شوند، کنسول APIsRouter مدل، شمارش token، و هزینه هر-درخواست را نشان می‌دهد. اجراهای report-writing مکالمات چند-نوبتی بلندند، و نمای usage نشان می‌دهد یک گزارش واقعاً چقدر هزینه دارد قبل از اینکه پنجاه‌تای آن را زمان‌بندی کنید.

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

پرسش‌های پرتکرار

آیا FinRobot از یک endpoint سفارشی سازگار با OpenAI پشتیبانی می‌کند؟

بله. FinRobot ورودی‌های به‌سبک AutoGen را از OAI_CONFIG_LIST می‌خواند، و ورودی‌ها یک کلید base_url را در کنار model و api_key می‌پذیرند. base_url را به gateway اشاره دهید، filter_dict خود را با model ورودی متطابق نگه دارید، و agent ها از طریق آن مسیردهی می‌شوند.

آیا agent های FinRobot می‌توانند روی مدل‌های Claude، DeepSeek، یا Qwen اجرا شوند؟

بله. AutoGen فیلد model را به‌عنوان رشته ساده روی /v1/chat/completions فوروارد می‌کند، پس هر id ای که endpoint سرویس دهد کار می‌کند. نام model در ورودی و در filter_dict فقط باید دقیقاً با id کاتالوگ مطابقت داشته باشد.

چرا FinRobot ورودی جدید OAI_CONFIG_LIST من را نادیده می‌گیرد؟

تقریباً همیشه filter_dict. tutorial ها ورودی‌ها را با نام model فیلتر می‌کنند، پس ورودی‌ای که model آن با filter مطابقت ندارد بی‌صدا حذف می‌شود. filter_dict را به id مدل جدید خود به‌روزرسانی کنید، یا در حین تست فایل را بدون filter لود کنید.

آیا کلیدهای Finnhub، FMP، و SEC من وقتی endpoint LLM را تغییر می‌دهم عوض می‌شوند؟

خیر. credential های داده-بازار در config_api_keys زندگی می‌کنند و از طریق register_keys_from_json لود می‌شوند، کاملاً جدا از OAI_CONFIG_LIST. مسیردهی LLM از طریق یک gateway pipeline داده را لمس نمی‌کند.

این روی کدام نسخه AutoGen اعمال می‌شود؟

FinRobot مقدار pyautogen ۰.۲.۱۹ یا جدیدتر را pin می‌کند و از loader به‌سبک 0.2 برابر config_list_from_json استفاده می‌کند. کلید base_url در ورودی‌های config در سرتاسر آن نسل استاندارد است، پس هیچ تغییر کدی در FinRobot لازم نیست.

آیا ماژول FinRobot Pro equity هم base_url را محترم می‌شمارد؟

همان‌طور که مستند شده، خیر. config.ini آن یک openai_api_key زیر API_KEYS افشا می‌کند اما تا ژوئیه ۲۰۲۶ هیچ override endpoint ای ندارد. مسیردهی OAI_CONFIG_LIST توصیف‌شده اینجا روی agent ها و tutorial های اصلی FinRobot اعمال می‌شود.