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

Updated 2026-07-30

TradingAgents با یک حالت provider برابر openai_compatible عرضه می‌شود. backend_url را روی https://api.apisrouter.com/v1 تنظیم کنید، یک کلید export کنید، و هر دو agent deep-think و quick-think از طریق یک endpoint واحد مسیردهی می‌شوند با هر مدل کاتالوگ قابل‌آدرس‌دهی با id.

پاسخ سریع: سه تنظیم TradingAgents را به هرجا مسیردهی می‌کند.

TradingAgents به‌صورت native از endpoint های سفارشی پشتیبانی می‌کند. llm_provider را روی "openai_compatible" تنظیم کنید، backend_url را روی آدرس endpoint خود تنظیم کنید، و OPENAI_COMPATIBLE_API_KEY را با یک کلید برای آن endpoint export کنید. با APIsRouter، backend URL برابر https://api.apisrouter.com/v1 است، و هر مدل در کاتالوگ از اسلات‌های deep_think_llm و quick_think_llm با id دقیق مدل خود قابل‌آدرس‌دهی می‌شود. این یک مسیر پیکربندی مستندشده در repo upstream است، نه یک fork یا patch. همان مقادیر همچنین می‌توانند به‌عنوان متغیرهای محیطی تأمین شوند (TRADINGAGENTS_LLM_PROVIDER، TRADINGAGENTS_LLM_BACKEND_URL، TRADINGAGENTS_DEEP_THINK_LLM، TRADINGAGENTS_QUICK_THINK_LLM)، پس یک job زمان‌بندی‌شده یا runner CI می‌تواند backend ها را بدون لمس کد پایتون عوض کند.

config["llm_provider"] = "openai_compatible"
config["backend_url"] = "https://api.apisrouter.com/v1"
# auth: export OPENAI_COMPATIBLE_API_KEY=sk-...

چطور TradingAgents با backend LLM خود صحبت می‌کند.

TradingAgents (TauricResearch در GitHub، بیش از ۹۳ هزار ستاره) یک framework معاملاتی چند-agent است. یک اجرای تحلیل در سرتاسر یک تیم تحلیل‌گر که بنیادی، احساسات، اخبار، و تکنیکال را پوشش می‌دهد شاخه می‌شود، سپس یک پژوهشگر bull و یک پژوهشگر bear مورد را در یک یا چند دور مناظره استدلال می‌کنند، یک agent معامله‌گر موقعیت را پیشنهاد می‌کند، و یک لایه مدیریت-ریسک آن را قبل از تصمیم نهایی بازبینی می‌کند. framework آن کار را در سرتاسر دو اسلات مدل تقسیم می‌کند. deep_think_llm گام‌های استدلال-سنگین را مدیریت می‌کند: مناظره پژوهش، تصمیم معامله‌گر، و بازبینی ریسک. quick_think_llm گام‌های حجم-بالا را مدیریت می‌کند: خواندن داده، خلاصه‌سازی اخبار، و پیش‌نویس گزارش‌های تحلیل‌گر. هر دو اسلات درخواست‌های استاندارد /v1/chat/completions صادر می‌کنند. تنظیم provider فقط تصمیم می‌گیرد آن درخواست‌ها به کدام client و host بروند، و openai_compatible آن‌ها را به هر backend_url ای که پیکربندی می‌کنید می‌فرستد. به‌صورت native، TradingAgents همچنین از OpenAI، Anthropic، Google، و DeepSeek به‌عنوان provider های first-party پشتیبانی می‌کند، اما هرکدام به حساب خودش، کلید خودش، و یک provider به ازای هر اجرا نیاز دارد. حالت openai_compatible آن را فرومی‌ریزد: TradingAgents فیلد model را به‌عنوان رشته ساده فوروارد می‌کند، پس وقتی endpoint پشت backend_url چند vendor سرویس می‌دهد، یک اسلات deep-think از Claude و یک اسلات quick-think از GPT یا DeepSeek می‌توانند در همان تحلیل اجرا شوند. آن ترکیب هر-نقش دلیل عملی مسیردهی framework از طریق یک gateway به‌جای یک endpoint تک-vendor است.

راه‌اندازی کامل: config پایتون یا متغیرهای محیطی.

مسیر برنامه‌نویسی‌شده DEFAULT_CONFIG را کپی می‌کند و چهار کلید را override می‌کند. کلیدی که در برابر endpoint سفارشی احراز هویت می‌کند از OPENAI_COMPATIBLE_API_KEY خوانده می‌شود، پس هرگز نیازی نیست در dict config یا فایل source ظاهر شود. مسیر متغیر-محیطی همان مقادیر را از طریق نگاشت _ENV_OVERRIDES در default_config.py تنظیم می‌کند و برای هم API پایتون و هم CLI تعاملی (tradingagents، یا python -m cli.main) کار می‌کند. توجه کنید backend_url به None پیش‌فرض می‌شود، در آن صورت client هر provider به endpoint پیش‌فرض خودش برمی‌گردد؛ override فقط وقتی صریح تنظیمش کنید اثر می‌کند. داده بازار یک نگرانی جدا است. TradingAgents نرخ‌ها و بنیادی‌ها را از طریق vendor های داده‌اش می‌کشد (مثلاً ALPHA_VANTAGE_API_KEY)، و آن credential ها نامرتبط با endpoint LLM هستند. تغییر backend_url pipeline داده را لمس نمی‌کند.

from tradingagents.graph.trading_graph import TradingAgentsGraph
from tradingagents.default_config import DEFAULT_CONFIG

config = DEFAULT_CONFIG.copy()
config["llm_provider"] = "openai_compatible"
config["backend_url"] = "https://api.apisrouter.com/v1"
config["deep_think_llm"] = "claude-opus-4-7"    # debate rounds + trade decision
config["quick_think_llm"] = "claude-sonnet-4-6" # analysts, summaries
config["max_debate_rounds"] = 2

ta = TradingAgentsGraph(debug=True, config=config)
_, decision = ta.propagate("NVDA", "2026-07-15")
print(decision)

انتخاب مدل‌های deep-think و quick-think.

پیش‌فرض upstream یک مدل frontier را در اسلات deep با یک مدل mini در اسلات quick جفت می‌کند، که شکل درست است: ظرفیت استدلال را جایی خرج کنید که تصمیم گرفته می‌شود، و ظرفیت حجمی را جایی که خواندن انجام می‌شود. مسیردهی از طریق یک endpoint جفت‌شدن را به یک تغییر دو-خطی بین اجراها تبدیل می‌کند، پس workflow عملی این است که اسلات deep را ثابت نگه دارید و اسلات quick را در برابر معیارهای backtest خود A/B کنید به‌جای حدس‌زدن.

  • deep_think_llm مناظره bull/bear، تصمیم معامله‌گر، و بازبینی ریسک را حمل می‌کند. چند فراخوانی به ازای هر اجرا، اما هرکدام روی کل context تحلیل‌گر استدلال می‌کند، و max_debate_rounds آن‌ها را ضرب می‌کند. اینجا جایی است که یک مدل استدلال frontier (claude-opus-4-7، gpt-5.5) token های خود را کسب می‌کند.
  • quick_think_llm روی هر گام تحلیل‌گر شلیک می‌کند: خواندن بنیادی‌ها، امتیازدهی احساسات، خلاصه‌سازی اخبار، پیش‌نویس گزارش‌ها. بیشتر حجم درخواست یک اجرا اینجا فرود می‌آید، پس یک مدل سریع mid-tier (claude-sonnet-4-6، deepseek-v4-pro) اجراها را سریع نگه می‌دارد بدون تنزل ورودی‌های مناظره.
  • بارهای long-context، مثل تغذیه filing های کامل یا پنجره‌های خبری بزرگ به تحلیل‌گران، جایی است که gemini-3.1-pro-preview ارزش تست در اسلات quick را دارد.
  • backtest ها همه‌چیز را تقویت می‌کنند. یک sweep روی ۵۰ ticker و ۲۰ تاریخ ۱٬۰۰۰ فراخوانی propagate() است، پس یک انتخاب مدل quick-think که روی یک اجرا حاشیه‌ای به‌نظر می‌رسد در مقیاس sweep بر صورت‌حساب token غالب می‌شود.

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

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

Backtest کردن در مقیاس sweep: کلیدها، pin کردن، و محدودیت‌ها.

وقتی راه‌اندازی تک-اجرا کار کند، سطح شکست به سمت sweep حرکت می‌کند. سه عادت یک backtest چند-روزه را بازتولیدپذیر و قابل‌دیباگ نگه می‌دارند. id های دقیق مدل را pin کنید. نام‌های خام مدل روی برخی vendor ها اشاره‌گرهای غلتان هستند که بی‌صدا به snapshot های جدیدتر منتقل می‌شوند، که یعنی یک backtest که دوشنبه شروع و جمعه تمام شده ممکن است یک مدل را اجرا نکرده باشد. جایی که کاتالوگ یک variant تاریخ‌دار فهرست می‌کند، id تاریخ‌دار را در config بگذارید، و dict config را کنار نتایج مثل یک random seed ثبت کنید. یک کلید به ازای هر آزمایش استفاده کنید. کلیدها رایگان برای ساخت هستند، و محدودکردن یک کلید به یک sweep usage log را به دفتر هزینه آزمایش تبدیل می‌کند: شمارش token و هزینه به ازای هر مدل، قابل‌فیلتر دقیقاً به اجراهای آن sweep. وقتی دو آزمایش یک کلید را به اشتراک می‌گذارند، انتساب هزینه بعداً یعنی grep کردن timestamp ها. سقف concurrency خود را قبل از موازی‌سازی بدانید. propagate() به ازای هر ticker-date همزمان (synchronous) است، پس sweep ها معمولاً در سرتاسر فرآیندها shard می‌شوند. هر shard نرخ درخواست را اول روی اسلات quick-think ضرب می‌کند، و یک ۴۲۹ در میان مناظره کل یک اجرا را هزینه دارد، نه یک درخواست. تعداد shard را در حالی که کنسول را تماشا می‌کنید بالا ببرید به‌جای راه‌اندازی سرد پنجاه worker؛ کانال‌های pooled upstream سقف را بالا می‌برند اما آن را بی‌نهایت نمی‌کنند.

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

  • Backtester هایی که sweep های ticker-بر-تاریخ اجرا می‌کنند. صدها فراخوانی propagate() به ازای هر آزمایش دید usage هر-کلید و یک سطح صورت‌حساب تکی را مفیدتر از چهار dashboard vendor می‌کند.
  • پژوهشگرانی که جفت‌های مدل را مقایسه می‌کنند. عوض‌کردن deep_think_llm بین id های Claude، GPT، و DeepSeek یک ویرایش config در برابر یک endpoint است، نه یک حساب vendor جدید به ازای هر کاندید.
  • تیم‌هایی که vendor ها را به ازای هر نقش ترکیب می‌کنند. Claude برای مناظره، DeepSeek برای حجم تحلیل‌گر. حالت provider native یک اجرا را به یک vendor قفل می‌کند؛ یک endpoint چند-vendor نمی‌کند.
  • توسعه‌دهندگان بدون دسترسی به صورت‌حساب یک vendor خاص. دسترسی مبتنی بر شارژ بدون الزام کارت وابستگی ثبت‌نام هر-provider را حذف می‌کند.
  • اجراهای زمان‌بندی‌شده و CI. راه‌اندازی فقط-env یعنی image مربوط به runner به یک secret (OPENAI_COMPATIBLE_API_KEY) نیاز دارد به‌جای یکی به ازای هر provider.

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

قبل از اجرای یک تحلیل کامل، تأیید کنید endpoint با مدل‌هایی که قصد استفاده دارید پاسخ می‌دهد. یک curl تک-خطی در برابر /v1/models با کلید خود هر id قابل‌آدرس‌دهی را فهرست می‌کند؛ رشته‌های موجود در deep_think_llm و quick_think_llm باید دقیقاً با آن id ها مطابقت داشته باشند. حالت‌های شکست روی یک اجرای اول ثابت‌اند. یک ۴۰۱ تقریباً همیشه یعنی OPENAI_COMPATIBLE_API_KEY در یک شل متفاوت از آنی که tradingagents را اجرا می‌کند export شده، یا اصلاً export نشده؛ env var های تنظیم‌شده در .bashrc به یک واحد systemd یا یک cron job نمی‌رسند مگر فایل واحد خودش آن‌ها را export کند. یک خطای model-not-found یعنی رشته id با کاتالوگ مطابقت ندارد: id ها دقیق‌اند، شامل پسوندهای نسخه، و خروجی /v1/models بالا منبع حقیقت است. یک خطای اتصال با backend_url تنظیم‌شده معمولاً یعنی URL پسوند /v1 خود را گم کرده، چون client مسیرهایی مثل /chat/completions را به هر base ای که بدهید اضافه می‌کند. اگر اجرا کار می‌کند اما به‌نظر می‌رسد در فاز مناظره متوقف شده، آن latency عادی برای مدل‌های استدلال روی context های بلند است نه یک مشکل endpoint؛ debug=True را روشن نگه دارید تا گام‌های agent را جریان‌دار تماشا کنید. timeout های واقعی روی نوبت‌های خیلی بلند deep-think یک تنظیم سمت-client هستند، و ارزش بالابردن دارند قبل از نتیجه‌گیری اینکه backend درخواست را انداخته. وقتی درخواست‌ها جاری شوند، کنسول APIsRouter مدل، شمارش token، و هزینه هر-درخواست را نشان می‌دهد، که برای یک framework این‌قدر فراخوانی-سنگین سریع‌ترین راه دیدن دقیقاً کجا token های یک اجرا می‌روند است.

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

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

آیا TradingAgents از مدل‌های Claude و Gemini از طریق یک endpoint برابر openai_compatible پشتیبانی می‌کند؟

بله. در حالت openai_compatible، framework فیلد model را به‌عنوان رشته ساده به backend_url روی /v1/chat/completions می‌فرستد. هر id ای که endpoint سرویس دهد کار می‌کند، شامل id های Claude، Gemini، و DeepSeek، در هرکدام از اسلات‌های deep-think یا quick-think.

کدام API key در TradingAgents با یک backend_url سفارشی استفاده می‌شود؟

OPENAI_COMPATIBLE_API_KEY. provider برابر openai_compatible آن را از محیط می‌خواند، پس کلید هرگز در dict config یا فایل‌های source شما ظاهر نمی‌شود. OPENAI_API_KEY فقط توسط provider native برابر openai استفاده می‌شود.

آیا deep_think_llm و quick_think_llm می‌توانند در همان اجرا از vendor های متفاوت باشند؟

از طریق یک endpoint چند-vendor، بله: هر دو اسلات به همان backend_url پست می‌کنند و رشته مدل vendor را به ازای هر درخواست تصمیم می‌گیرد. با provider های native (openai، anthropic، google، deepseek) یک اجرا برای هر دو اسلات به یک vendor قفل می‌شود.

آیا وقتی backend_url تنظیم شد هنوز به یک حساب OpenAI نیاز دارم؟

خیر. با llm_provider تنظیم‌شده روی openai_compatible، هیچ درخواستی به host های OpenAI نمی‌رود و OPENAI_API_KEY خوانده نمی‌شود. همچنان به credential های داده-بازار ای که TradingAgents استفاده می‌کند (مثلاً ALPHA_VANTAGE_API_KEY) نیاز دارید، که مستقل از endpoint LLM هستند.

آیا CLI تعاملی هم endpoint سفارشی را محترم می‌شمارد؟

بله. CLI (tradingagents، یا python -m cli.main) همان config را resolve می‌کند، و متغیرهای محیطی TRADINGAGENTS_LLM_PROVIDER / TRADINGAGENTS_LLM_BACKEND_URL قبل از prompt provider آن را override می‌کنند، پس اجراهای CLI زمان‌بندی‌شده یا کانتینری هیچ ورودی تعاملی برای مسیردهی نیاز ندارند.

یک تحلیل TradingAgents چند token مصرف می‌کند؟

با max_debate_rounds، تعداد تحلیل‌گران، و اینکه چقدر context بازار می‌بلعند تغییر می‌کند؛ یک تحلیل تک ticker-date معمولاً در صدها هزار token فرود می‌آید، بیشتر آن روی اسلات quick-think. نمای usage هر-کلید در کنسول APIsRouter تفکیک دقیق هر-اجرا را نشان می‌دهد، که از تخمین‌زدن قابل‌اعتمادتر است.