Fai girare FinRobot su un endpoint OpenAI-compatible personalizzato.

Updated 2026-07-30

FinRobot legge le sue credenziali LLM da un file OAI_CONFIG_LIST di AutoGen le cui voci accettano una chiave base_url. Aggiungi una voce che punta a https://api.apisrouter.com/v1 con una chiave gateway, e gli agenti forecaster, report-writer, e RAG possono girare su qualsiasi id di modello nel catalogo.

Risposta rapida: una voce in OAI_CONFIG_LIST.

Le istruzioni di setup di FinRobot ti fanno rinominare OAI_CONFIG_LIST_sample in OAI_CONFIG_LIST e riempire le credenziali. Quel file è una config list AutoGen standard: un array JSON dove ogni voce prende model e api_key, e opzionalmente base_url, che il sample distribuito già dimostra per endpoint non predefiniti. Aggiungi una voce con la tua chiave gateway e base_url impostato su https://api.apisrouter.com/v1, e ogni agente FinRobot che carica il file può instradare attraverso di esso. Un dettaglio che costa tempo alle persone: i tutorial caricano il file tramite autogen.config_list_from_json con un filter_dict che seleziona le voci per nome di modello. Se la tua nuova voce dice claude-sonnet-4-6 ma il filtro chiede ancora l'id GPT del sample, la tua voce viene filtrata via e l'esecuzione fallisce sulle vecchie credenziali. Aggiorna filter_dict per corrispondere al modello che hai aggiunto, o rimuovi il filtro durante il test.

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

Come FinRobot usa la sua config LLM.

FinRobot (AI4Finance-Foundation su GitHub, circa 7,6K stelle) è una piattaforma di agenti AI per l'analisi finanziaria costruita su AutoGen (pyautogen 0.2.19 o successivo). I suoi agenti sono workflow confezionati: un forecaster Market_Analyst che recupera notizie e fondamentali aziendali e predice il movimento della settimana successiva, uno scrittore di report annuali che trasforma i filing in un PDF di ricerca azionaria, e agenti QA con retrieval-augmented su earnings call e filing SEC. Ogni tutorial costruisce la stessa forma di llm_config: un dict il cui config_list proviene da autogen.config_list_from_json che legge il file OAI_CONFIG_LIST. Quell'llm_config viene passato a classi wrapper come SingleAssistant e SingleAssistantShadow da finrobot.agents.workflow, che possiedono gli agenti AutoGen sottostanti. La decisione dell'endpoint vive quindi interamente nel file JSON: il client OpenAI di AutoGen invia richieste /v1/chat/completions a qualunque base_url la voce selezionata porti e inoltra il campo model come stringa semplice. Quella stringa semplice è il vantaggio pratico. Quando l'endpoint dietro base_url serve più fornitori, un id Claude, DeepSeek, o Qwen viaggia attraverso la stessa config a forma OpenAI senza che FinRobot se ne accorga, e scambiare il modello di analisi diventa una modifica JSON di una riga più un filter_dict corrispondente.

Configurazione completa: file di config, filtro, e chiavi dati.

FinRobot divide le credenziali tra due file, e solo uno riguarda l'LLM. OAI_CONFIG_LIST contiene endpoint e chiavi dei modelli. config_api_keys contiene le credenziali dei dati di mercato (FINNHUB_API_KEY, FMP_API_KEY, SEC_API_KEY, e chiavi social), caricate separatamente tramite register_keys_from_json. Instradare l'LLM tramite un gateway cambia il primo file e lascia intatto il secondo, quindi i pull di notizie, i fondamentali, e i filing si comportano esattamente come prima. Il pattern del tutorial qui sotto è la struttura del notebook forecaster con la voce gateway selezionata. Lo stesso llm_config funziona per i tutorial di report annuale e RAG, che differiscono solo per quale classe workflow istanziano.

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.")

Scegliere i modelli per workflow di FinRobot.

Il ciclo di esperimento pulito: fissa il ticker e l'intervallo di date, esegui lo stesso workflow una volta per voce candidata, e confronta gli output fianco a fianco. Dietro un endpoint ogni candidato è una modifica al filter_dict, e il log di utilizzo per chiave dà il conto token per candidato senza lavoro di foglio di calcolo.

  • Lo scrittore di report annuali è il lavoro di ragionamento più pesante: legge sezioni di filing, sintetizza una tesi di investimento, e redige un report strutturato. claude-opus-4-7 o gpt-5.5 in quel workflow è dove la qualità dell'output cambia visibilmente.
  • Il forecaster di mercato è un compito più breve e ripetuto su notizie e fondamentali. claude-sonnet-4-6 o deepseek-v4-pro lo gestisce bene, e conta quando lo esegui su una watchlist ogni giorno.
  • Il QA RAG su earnings call è retrieval più sintesi su lunghi estratti, il che favorisce id a contesto lungo; gemini-3.1-pro-preview merita un test contro claude-sonnet-4-6 lì.
  • Poiché le voci vengono selezionate per filter_dict, puoi tenere un unico file con una voce di frontiera e una veloce contro lo stesso base_url e scegliere per notebook, invece di modificare le credenziali per esecuzione.
  • Gli id di modello sono stringhe esatte. FinRobot le passa non validate, quindi l'elenco /v1/models dell'endpoint è la grafia autorevole.

Pagamento a consumo · sotto i prezzi ufficiali

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

ModelloPrezzo ufficialeIl nostro prezzo
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

Modalità di errore specifiche di FinRobot.

Il disallineamento di filter_dict è il grande. config_list_from_json restituisce solo le voci il cui model corrisponde al filtro; un filtro che non corrisponde a nulla solleva un errore su una config list vuota, e un filtro che corrisponde alle voci residue del sample invia richieste a OpenAI con chiavi placeholder, il che si manifesta come un 401 dall'host sbagliato. Quando i cambi di routing non sembrano avere effetto, stampa prima il config_list risolto. I percorsi relativi sono il secondo. I tutorial caricano "../OAI_CONFIG_LIST" perché i notebook stanno un livello sotto la radice del repo; uno script alla radice vuole "OAI_CONFIG_LIST" invece, e AutoGen accetta anche la variabile d'ambiente OAI_CONFIG_LIST che porta la stringa JSON, il che aggira i problemi di percorso nei container. Le righe di commento sono il terzo. Le istruzioni di setup ti dicono di rimuovere le note di commento dai file sample perché rendono il JSON non valido; un JSONDecodeError all'avvio significa che un commento vagante è sopravvissuto. Le credenziali dati falliscono in modo indipendente. Se la chat dell'agente funziona bene ma notizie o fondamentali tornano vuoti, quello è un problema di config_api_keys (Finnhub, FMP, SEC), non un problema di endpoint. E il modulo separato FinRobot Pro per l'equity configura le sue chiavi tramite un config.ini invece; a luglio 2026 le sue impostazioni documentate coprono un openai_api_key ma nessun override dell'URL base, quindi tratta quel modulo come diretto-al-fornitore finché il progetto a monte non ne documenta uno.

Chi instrada FinRobot tramite un gateway.

  • Analisti che generano report azionari su un elenco di copertura. I contesti lunghi dei filing per report rendono materiali le differenze di prezzo per modello, e un endpoint rende il modello una scelta per esecuzione.
  • Team quant che eseguono il forecaster ogni giorno su una watchlist, dove un id di fascia media veloce mantiene piatto il conto ricorrente senza riscrivere il workflow.
  • Ricercatori che confrontano famiglie di modelli su compiti finanziari identici. Ogni candidato è una voce di config, non uno scambio di account fornitore e SDK.
  • Team che standardizzano stack basati su AutoGen. FinRobot condivide la convenzione OAI_CONFIG_LIST con altri progetti AutoGen, quindi un formato di voce gateway serve tutti loro.
  • Sviluppatori senza accesso alla fatturazione di un dato fornitore. L'accesso basato su ricarica senza obbligo di carta rimuove la dipendenza dalla registrazione per provider.

Verifica l'endpoint e fai debug della prima esecuzione.

Elenca i modelli che la tua chiave può indirizzare prima di aprire un notebook; ogni stringa di modello in OAI_CONFIG_LIST e ogni valore filter_dict deve corrispondere esattamente a un id servito. Poi esegui la chat più breve possibile tramite SingleAssistant e osserva la console. Un 401 significa che l'api_key della voce selezionata non appartiene all'endpoint nel suo base_url; controlla quale voce il filtro ha effettivamente scelto. Un errore modello-non-trovato è un errore di battitura nell'id della voce. Un errore di connessione di solito significa che base_url ha perso il suffisso /v1. Se l'agente entra in loop senza risultati di tool, le chiavi dati in config_api_keys sono i sospetti, non l'endpoint LLM. Una volta che le richieste fluiscono, la console di APIsRouter mostra il modello per richiesta, i conteggi dei token e la spesa. Le esecuzioni di scrittura report sono lunghe conversazioni multi-turno, e la vista di utilizzo mostra quanto costa davvero un report prima di programmarne cinquanta.

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

Domande frequenti

FinRobot supporta un endpoint OpenAI-compatible personalizzato?

Sì. FinRobot legge voci OAI_CONFIG_LIST in stile AutoGen, e le voci accettano una chiave base_url insieme a model e api_key. Punta base_url sul gateway, mantieni il tuo filter_dict corrispondente al model della voce, e gli agenti instraderanno attraverso di esso.

Gli agenti FinRobot possono girare su modelli Claude, DeepSeek, o Qwen?

Sì. AutoGen inoltra il campo model come stringa semplice su /v1/chat/completions, quindi funziona qualsiasi id che l'endpoint serve. Il nome del modello nella voce e in filter_dict deve solo corrispondere esattamente all'id del catalogo.

Perché FinRobot ignora la mia nuova voce OAI_CONFIG_LIST?

Quasi sempre filter_dict. I tutorial filtrano le voci per nome di modello, quindi una voce il cui model non corrisponde al filtro viene esclusa silenziosamente. Aggiorna filter_dict al tuo nuovo id di modello, o carica il file senza filtro durante il test.

Le mie chiavi Finnhub, FMP, e SEC cambiano quando cambio l'endpoint LLM?

No. Le credenziali dei dati di mercato vivono in config_api_keys e si caricano tramite register_keys_from_json, completamente separate da OAI_CONFIG_LIST. Instradare l'LLM tramite un gateway non tocca la pipeline dati.

A quale versione di AutoGen si applica questo?

FinRobot fissa pyautogen 0.2.19 o successivo e usa il loader config_list_from_json in stile 0.2. La chiave base_url nelle voci di config è standard in quella generazione, quindi non servono modifiche al codice di FinRobot.

Il modulo FinRobot Pro per l'equity rispetta anch'esso base_url?

Non a quanto documentato. Il suo config.ini espone un openai_api_key sotto API_KEYS ma nessun override dell'endpoint a luglio 2026. Il routing OAI_CONFIG_LIST descritto qui si applica agli agenti e tutorial principali di FinRobot.