Programma
Mistral Medium 3 offre alte prestazioni a un prezzo significativamente inferiore rispetto a molte alternative. Attualmente è disponibile tramite l'API di Mistral AI, con un costo di soli $0,40 per milione di token in input e $2 per milione di token in output. Questo pricing batte concorrenti di punta come DeepSeek v3, sia in API che in sistemi self-hosted. In sintesi, puoi ottenere fino al 90% delle prestazioni di Claude Sonnet 3.7 su vari benchmark risparmiando sensibilmente sui costi.
In questo tutorial vedremo come configurare l'API di Mistral e usare il client Python per accedere al modello. Poi useremo LangGraph per costruire un'applicazione agentica che utilizza la ricerca sul web e lo strumento Python REPL per generare risposte.

Immagine dell’autore
Iniziare con Mistral Medium 3
In questa sezione impareremo a generare la chiave API, salvarla come variabile d'ambiente e poi usare il client Python per accedere a Mistral Medium 3 per generazione di testo e image understanding.
1. Generare la chiave API di Mistral AI
Registrati a La Plateforme: Mistral AI e poi vai alla sezione Billing e carica il credito di $5 con carta di credito/debito. Per questo progetto ti bastano pochi centesimi. Successivamente, vai alla scheda API keys per generare la nuova chiave API.
2. Configurare l'ambiente
Impostare una variabile d'ambiente in DataLab è semplice. Vai alla scheda "Environment", seleziona "Environment Variables" e aggiungi una nuova variabile chiamata "MISTRAL_API_KEY" insieme alla tua chiave API. Dopo aver salvato le modifiche, assicurati di connetterla.

In DataLab, crea una nuova cella Python e installa il pacchetto python di Mistral AI.
!pip install -U mistralai 3. Generazione di testo
Prima di scrivere qualsiasi codice, è fondamentale individuare i nomi degli endpoint per la chiave API di Mistral Medium 3 visitando la pagina Models Overview. In base alla documentazione, l'endpoint sembra chiamarsi mistral-medium-latest.

Fonte: Models Overview | Mistral AI Large Language Models
Ora creeremo un client Mistral AI usando la chiave API e genereremo una risposta in streaming a una richiesta dell'utente.
import osfrom mistralai import Mistralapi_key = os.environ["MISTRAL_API_KEY"]model = "mistral-medium-latest"client = Mistral(api_key=api_key)stream_response = client.chat.stream( model = model, messages = [ { "role": "user", "content": "What is the best course to take from DataCamp?", }, ])for chunk in stream_response: print(chunk.data.choices[0].delta.content, end="" )La risposta è molto accurata e sostanzialmente non ci è costata nulla.

4. Image understanding
Per testare le capacità multimodali del modello, faremo uno screenshot della pagina principale del blog di DataCamp e lo forniremo al modello insieme a un prompt utente.

Fonte: Blog | Data Science Articles | DataCamp
Poiché il modello non può accedere direttamente al file immagine, dobbiamo prima caricare l'immagine e convertirla in una stringa codificata Base64.
import base64import requestsdef encode_image(image_path): """Encode the image to base64.""" try: with open(image_path, "rb") as image_file: return base64.b64encode(image_file.read()).decode('utf-8') except FileNotFoundError: print(f"Error: The file {image_path} was not found.") return None except Exception as e: # Added general exception handling print(f"Error: {e}") return None# Path to your imageimage_path = "datacamp_fp.png"# Getting the base64 stringbase64_image = encode_image(image_path)Ora invieremo l'immagine codificata in Base64 insieme a una richiesta dell'utente al client di chat completion di Mistral AI.
# Define the messages for the chatmessages = [ { "role": "user", "content": [ { "type": "text", "text": "Explain the image in a Donald Trump style." }, { "type": "image_url", "image_url": f"data:image/png;base64,{base64_image}" } ] }]stream_response = client.chat.stream( model = model, messages = messages)for chunk in stream_response: print(chunk.data.choices[0].delta.content, end="" )Il modello interpreta correttamente l'immagine e genera una risposta nello stile di Donald Trump, dimostrando le sue capacità di comprensione multimodale.

Creare un'applicazione agentica con Mistral Medium 3
In questo progetto useremo Mistral Medium 3 con LangGraph per costruire un'applicazione agentica. L'applicazione userà l'API Tavily per la ricerca sul web e Python REPL per eseguire codice in base ai prompt dell'utente.
Nuovo su LangGraph? Nessun problema! Segui il nostro Tutorial su LangGraph e impara tutto ciò che ti serve sapere sul framework.
1. Configurare l'API di Tavily
Prima di passare all'implementazione, dobbiamo configurare Tavily AI creando un account e generando una chiave API. Il processo è semplice e non devi fornire dati di pagamento o una carta di credito.
Una volta ottenuta la chiave API, salvala come variabile d'ambiente chiamata TAVILY_API_KEY localmente o nella tua configurazione DataLab, come mostrato nella sezione precedente.
2. Installare i pacchetti Python
Ora installeremo i pacchetti Python necessari per creare strumenti e agenti usando l'ecosistema LangChain.
%%capture!pip install -U \ mistralai \ langchain langchain-mistralai \ langchain-experimental \ langgraph \ tavily-python3. Creare il client LLM
Creeremo il client dei large language model (LLM) ChatMistralAI di LangChain specificando il nome del modello, la temperatura e abilitando le risposte in streaming.
from langchain_mistralai import ChatMistralAIllm = ChatMistralAI( model="mistral-medium-latest", temperature=0.2, streaming=True )4. Inizializzare gli strumenti
Ora imposteremo gli strumenti per l'agente. Invece di crearli manualmente, possiamo usare strumenti predefiniti come Tavily Search e Python REPL dall'ecosistema LangChain.
from langchain_community.tools import TavilySearchResultsfrom langchain_experimental.tools.python.tool import PythonREPLToolsearch_tool = TavilySearchResults(max_results=5, include_answer=True)code_tool = PythonREPLTool()tools = [search_tool, code_tool]5. Configurare un agente
Con il client LLM e gli strumenti pronti, possiamo ora creare il React Agent usando LangGraph.
from langgraph.prebuilt import create_react_agentagent = create_react_agent( model=llm, tools=tools, ) LangGraph Studio è un ambiente di sviluppo visuale per il framework LangGraph; segui la guida a LangGraph Studio: installazione, setup, casi d'uso per saperne di più.
6. Estrarre i nomi degli strumenti
Prima di eseguire l'agente, definiremo una funzione Python per estrarre i nomi degli strumenti usati durante la generazione della risposta dell'agente. Questa funzione ci aiuterà a identificare quali strumenti sono stati richiamati.
def extract_tool_names(conversation: dict) -> list[str]: """ Given a conversation dict with a 'messages' list (where each message may be a dict or a Pydantic model), extract all unique tool names used in any tool call. """ tool_names = set() for msg in conversation.get('messages', []): # 1) Try direct attribute access (for Pydantic models) calls = [] if hasattr(msg, 'tool_calls'): calls = getattr(msg, 'tool_calls') or [] # 2) If that fails, the message might be a dict elif isinstance(msg, dict): calls = msg.get('tool_calls') # also check nested in additional_kwargs if not calls and isinstance(msg.get('additional_kwargs'), dict): calls = msg['additional_kwargs'].get('tool_calls') # 3) Finally, check additional_kwargs on objects else: ak = getattr(msg, 'additional_kwargs', None) if isinstance(ak, dict): calls = ak.get('tool_calls', []) # Normalize to list calls = calls or [] # Extract names for call in calls: # dict-style tool call if isinstance(call, dict): # top-level 'name' if 'name' in call: tool_names.add(call['name']) # nested under 'function' elif 'function' in call and isinstance(call['function'], dict): fn = call['function'] if 'name' in fn: tool_names.add(fn['name']) return sorted(tool_names)LangGraph Studio è un ambiente di sviluppo visuale per il framework LangGraph; segui la guida a LangGraph Studio: installazione, setup, casi d'uso per saperne di più.
7. Testare l'agente
Testiamo l'agente facendogli una domanda su notizie dell'ultima ora.
question = "What are the top 5 breaking news stories?"def run_agent(question): result = agent.invoke( { "messages": [ {"role": "user", "content": question} ] } ) tool_name = extract_tool_names(result) # The LLM’s final answer is always in the last message raw_answer = result["messages"][-1].content clean_text = "".join(part for part in raw_answer if isinstance(part, str)) return tool_name, clean_texttool_name, clean_text = run_agent(question)print("Tool used ⫸", tool_name, "\n")print(clean_text)L'agente ha usato lo strumento Tavily Search per generare una risposta sulle notizie dell'ultima ora.

Ora testiamo lo strumento Python REPL chiedendo all'agente di generare ed eseguire codice Python.
question = "Write a code to display the stars in a triangle. Please execute the code too."tool_name, clean_text = run_agent(question)print("Tool used ⫸", tool_name, "\n")print(clean_text)L'agente ha usato Mistral Medium 3 per generare il codice e Python REPL per l'esecuzione.

Infine, testiamo una query che richiede all'agente di usare entrambi gli strumenti in sequenza.
question = "Get the latest gold price data for the past 7 days and use it to generate a line plot"tool_name, clean_text = run_agent(question)print("Tool used ⫸", tool_name, "\n")print(clean_text)L'agente userà Tavily Search per ottenere i dati sul prezzo dell'oro, Mistral Medium 3 per generare il codice per la visualizzazione dei dati e Python REPL per eseguire quel codice. Il risultato includerà un grafico molto accurato insieme a un riepilogo degli strumenti utilizzati.
Tool used ⫸ ['Python_REPL', 'tavily_search_results_json'] The code generates a line plot showing the gold price per gram in USD over the last 7 days, with the x-axis representing dates and the y-axis representing the gold price. The plot includes markers for each data point, a title, labeled axes, a grid, and rotated x-axis labels for better readability.
Se riscontri problemi nell'esecuzione del codice, consulta il Mistral Medium 3 — DataLab Notebook per ulteriori indicazioni.
Puoi usare l'ecosistema Haystack per costruire un'applicazione agent ancora più potente e facile da implementare. Segui i tutorial per saperne di più: Tutorial Haystack AI: creare workflow agentici.
Conclusione
Dopo aver sperimentato l'API di Mistral AI e aver creato agenti per testare varie applicazioni, uno degli aspetti più notevoli è che non mi è costato nemmeno un dollaro, anche dopo aver usato 161.075 token. Il modello è economico, veloce, accurato e incredibilmente semplice da configurare. È un'ottima alternativa ad altre API costose, come DeepSeek, offrendo funzionalità comparabili.
Il panorama dell'AI si sta chiaramente spostando verso modelli più piccoli, più veloci, più accurati e convenienti, una tendenza promettente soprattutto per startup e piccole-medie imprese (PMI). Queste organizzazioni spesso dipendono fortemente dai fornitori di LLM e, man mano che i modelli diventano più accessibili, trarranno grande beneficio da margini di profitto più elevati.
Segui il percorso Developing Large Language Models per costruire i tuoi LLM con PyTorch e Hugging Face e le più recenti tecniche di deep learning e NLP.
In quanto data scientist certificato, sono appassionato di sfruttare tecnologie all’avanguardia per creare applicazioni di machine learning innovative. Con una solida esperienza in riconoscimento vocale, analisi e reportistica dei dati, MLOps, AI conversazionale e NLP, ho affinato le mie competenze nello sviluppo di sistemi intelligenti in grado di avere un impatto concreto. Oltre alla mia expertise tecnica, sono anche un comunicatore efficace, con il talento di rendere chiari e sintetici concetti complessi. Di conseguenza, sono diventato un blogger molto seguito in ambito data science, condividendo idee ed esperienze con una community in crescita di professionisti dei dati. Attualmente mi concentro sulla creazione e sull’editing di contenuti, lavorando con large language model per sviluppare contenuti potenti e coinvolgenti che possano aiutare aziende e singoli a valorizzare al meglio i propri dati.


