Corso
Anthropic ha recentemente lanciato gli aggiornati Claude Sonnet 4.5, Claude Agents SDK e Imagine with Claude.
Con il rilascio di Claude Sonnet 4, gli sviluppatori hanno ora accesso a nuove potenti funzionalità, tra cui esecuzione di codice nativa, una Files API flessibile e uso dinamico degli strumenti. Queste feature aprono possibilità entusiasmanti per creare applicazioni AI che vadano oltre le semplici interazioni testuali.
In questo tutorial, ti guiderò attraverso queste nuove funzionalità costruendo un agente basato su Python che può risolvere problemi di matematica avanzata direttamente dal terminale. Imparerai a usare il nuovo tool di esecuzione di codice nativo e la Files API.
Alla fine, avrai un agente funzionante basato su Claude Sonnet 4 per analizzare problemi, scrivere ed eseguire codice Python e generare visualizzazioni come quelle qui sotto.

Dai un’occhiata al repository GitHub di questo progetto per vedere tutto il codice per costruire l’applicazione.
Se stai iniziando ora a lavorare con LLM come Claude, questa roadmap per sviluppatori AI illustra strumenti, competenze e percorsi di apprendimento essenziali per iniziare.
Novità dell’API di Anthropic
Prima di entrare nel tutorial, vediamo tutte le nuove funzionalità rilasciate di recente e disponibili tramite l’API di Anthropic. Se le conosci già, puoi saltare avanti.
Secondo me l’intero annuncio di Claude 4 si può riassumere in questa immagine:

I modelli Claude 4 (Opus e Sonnet 4) superano la concorrenza nei task verificati di ingegneria del software con un margine significativo. Anthropic ha raggiunto questo traguardo introducendo alcuni cambiamenti importanti nel comportamento dei modelli:
- Runtime lunghi: Entrambi i modelli supportano diverse ore di esecuzione continua per risolvere problemi con migliaia di passaggi.
- Ragionamento esteso con uso di strumenti: Entrambi i modelli ora possono usare strumenti come la ricerca sul web durante il ragionamento esteso, permettendo a Claude di alternare tra ragionamento e uso di tool per migliorare le risposte.
- Esecuzione parallela degli strumenti: I modelli possono ora usare più tool contemporaneamente invece che in sequenza.
- Maggiore aderenza alle istruzioni: Una migliore “steerability” offre agli utenti maggior controllo sulle implementazioni e su come Claude risponde alle istruzioni.
- Capacità di memoria migliorate: Con accesso a file locali, i modelli possono estrarre e salvare fatti chiave per mantenere continuità e costruire conoscenza tacita nel tempo.
- Comportamenti di scorciatoia ridotti: Rispetto alle versioni precedenti, entrambi i modelli hanno il 65% di probabilità in meno di usare scorciatoie o cavilli per completare i task (vedi il post di annuncio completo per i dettagli).
Inoltre, nell’ambito dell’annuncio della famiglia di modelli Claude 4, Anthropic ha aggiunto quattro nuove funzionalità per creare agenti AI: lo strumento di esecuzione del codice, la Files API, il connettore MCP e il prompt caching esteso. Questi strumenti cambiano il modo in cui gli sviluppatori possono costruire applicazioni AI.
Code execution tool: esegui codice Python in modo sicuro
Il code execution tool permette a Claude di eseguire codice Python in un ambiente sandbox sicuro. Invece di limitarsi a suggerire codice, ora Claude può eseguirlo, analizzare i risultati e iterare sulle soluzioni.
Per usare il code execution tool, aggiungilo all’array tools e includi l’header beta richiesto:
from anthropic import Anthropic
# Initialize client with the code execution beta header
client = Anthropic(
default_headers={
"anthropic-beta": "code-execution-2025-05-22"
}
)
# Send a request that triggers code execution
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=4096,
messages=[{
"role": "user",
"content": "Solve the quadratic equation 2x² + 5x - 3 = 0 and plot the parabola"
}],
tools=[{
"type": "code_execution_20250522",
"name": "code_execution"
}]
)
Quando Claude esegue codice, la risposta contiene sia il codice generato sia i risultati dell’esecuzione. Ecco come analizzare le varie componenti:
# Parse the response to extract code and results
for item in response.content:
if item.type == "server_tool_use":
# This contains the actual Python code Claude wrote
print(f"Code executed:\n{item.input['code']}")
elif item.type == "code_execution_tool_result":
# This contains the output from running the code
print(f"Output:\n{item.content['stdout']}")
if item.content.get('stderr'):
print(f"Errors:\n{item.content['stderr']}")
Limitazioni della sandbox: L’ambiente di esecuzione del codice ha diverse restrizioni integrate per la sicurezza. Claude gira in un container isolato senza accesso a Internet, con risorse computazionali limitate (1 GB di RAM, 5 GB di spazio su disco e 1 CPU) e non può accedere al tuo file system locale. L’ambiente include preinstallate librerie popolari come numpy, pandas, matplotlib e scipy, ma non puoi installare pacchetti aggiuntivi durante l’esecuzione.
Files API: contesto file persistente per task complessi
La Files API ti permette di caricare documenti una sola volta e referenziarli in più conversazioni. Non serve più includere documenti di grandi dimensioni in ogni richiesta API.
Per prima cosa, carica il file sui server di Anthropic:
# Upload a file once - this stores it on Anthropic's servers
uploaded_file = client.beta.files.upload(
file=open("sales_data.csv", "rb"),
purpose="user_upload"
)
# The uploaded_file.id can now be referenced in multiple conversations
Una volta caricato, referenzia il file nelle chiamate API usando il content type container_upload:
# Reference the uploaded file in a conversation
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=4096,
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Create a quarterly sales report from this data"},
{"type": "container_upload", "file_id": uploaded_file.id}
]
}],
tools=[{
"type": "code_execution_20250522",
"name": "code_execution"
}]
)
Quando Claude crea file durante l’esecuzione del codice (come grafici o dati elaborati), puoi estrarli e scaricarli:
# Extract file IDs of any files Claude created during execution
def extract_created_files(response):
file_ids = []
for item in response.content:
if item.type == 'code_execution_tool_result':
content = item.content
if content.get('type') == 'code_execution_result':
# Look for file objects in the execution results
for file_obj in content.get('content', []):
if 'file_id' in file_obj:
file_ids.append(file_obj['file_id'])
return file_ids
# Download any files Claude created
created_files = extract_created_files(response)
for file_id in created_files:
file_content = client.beta.files.download(file_id)
file_content.write_to_file(f"output_{file_id}.png")
Connettore MCP: collega Claude a qualsiasi workflow
Il connettore MCP porta il supporto al Model Context Protocol direttamente nell’API. Gli MCP consentono a Claude di connettersi a servizi esterni come database, API e strumenti di produttività senza codice di integrazione personalizzato.
In precedenza, collegarsi a server MCP richiedeva la creazione di un’infrastruttura client. Ora, puoi semplicemente fornire un URL di un server MCP remoto nella richiesta API e Claude scopre automaticamente gli strumenti disponibili, gestisce le connessioni e si occupa dell’autenticazione.
Questo apre l’accesso a un ecosistema in crescita di server MCP di aziende come Zapier e Asana, permettendoti di creare agenti che possono leggere il tuo calendario, aggiornare gli strumenti di project management o integrarsi con centinaia di altri servizi.
Primi passi con Claude Sonnet 4: panoramica del progetto e setup
Ora che abbiamo capito le nuove feature dell’API, costruiamo il nostro risolutore interattivo di problemi di matematica. Combinerà le capacità di esecuzione del codice di Claude con la gestione dei file per creare un assistente matematico completo.
La nostra applicazione accetterà domande di matematica in linguaggio naturale, eseguirà codice Python per risolverle, genererà visualizzazioni e salverà report completi.
Per un approccio strutturato alla creazione di progetti come questo, dai un’occhiata al percorso Developing AI Applications.
> Nota: Poiché interromperemo blocchi di codice lunghi con spiegazioni, l’indentazione potrebbe non essere del tutto accurata negli snippet. Per questo motivo, ti consigliamo di aprire il repo GitHub del progetto in una scheda separata mentre segui la guida.
Step 0: imposta l’ambiente del progetto Claude Sonnet 4
Prima di scrivere codice, impostiamo l’ambiente di sviluppo e le dipendenze.
Crea una nuova directory per il progetto e i file richiesti:
mkdir math-solver
cd math-solver
touch math_solver.py demo_problems.py requirements.txt README.md
Crea un file requirements.txt con le dipendenze necessarie:
anthropic>=0.42.0
Installa le dipendenze:
pip install -r requirements.txt
Imposta la tua chiave API di Anthropic come variabile d’ambiente:
export ANTHROPIC_API_KEY="your-api-key-here"
Step 1: progetta la struttura dell’applicazione
Iniziamo creando la struttura base della nostra classe MathSolver. Questa classe gestirà tutte le funzionalità principali: comunicazione con l’API, gestione dei file e interazione con l’utente.
Per prima cosa, impostiamo gli import e la struttura di base:
#!/usr/bin/env python3
"""
Interactive Math Problem Solver using Claude 4 Code Execution Tool
This application allows users to ask math questions in natural language,
gets solutions using Claude's code execution capabilities, and saves
both visualizations and detailed markdown reports.
"""
import os
import json
import datetime
from pathlib import Path
from typing import List, Dict, Any
from anthropic import Anthropic
Ora definiamo la struttura della classe principale:
class MathSolver:
def __init__(self, api_key: str = None):
"""Initialize the Math Solver with Anthropic client."""
# API setup and directory creation will go here
pass
def solve_problem(self, question: str) -> Dict[str, Any]:
"""Send a math question to Claude and get solution with code execution."""
pass
Here are the methods for file and report handling:
def extract_files_from_response(self, response) -> List[str]:
"""Extract file IDs from Claude's response."""
pass
def download_files(self, file_ids: List[str]) -> List[str]:
"""Download files created by code execution to local storage."""
pass
def extract_code_blocks(self, response) -> List[str]:
"""Extract all code blocks from the response."""
Pass
Infine, aggiungiamo la gestione della sessione e l’entry point:
def generate_markdown_report(self, result: Dict[str, Any], downloaded_files: List[str]) -> str:
"""Generate a comprehensive markdown report of the solution."""
pass
def run_interactive_session(self):
"""Run the main interactive session loop."""
pass
def main():
"""Main entry point for the application."""
pass
Questa struttura ci dà una roadmap chiara: inizializzazione, risoluzione dei problemi, gestione dei file, generazione del report e interazione con l’utente. Ogni metodo ha una responsabilità specifica nella pipeline di risoluzione dei problemi matematici.
Costruire un risolutore matematico con l’esecuzione di codice di Claude Sonnet 4
Ora implementiamo le funzionalità core usando il tool di esecuzione del codice di Claude e le risposte in streaming.
Step 2: inizializza Claude con header API sicuri
Implementiamo il metodo __init__() per configurare il client API e la creazione delle directory.
Per prima cosa, gestiamo la chiave API:
def __init__(self, api_key: str = None):
"""Initialize the Math Solver with Anthropic client."""
if not api_key:
api_key = os.getenv("ANTHROPIC_API_KEY")
if not api_key:
raise ValueError(
"Please set ANTHROPIC_API_KEY environment variable or provide api_key"
)
Poi configuriamo il client Anthropic con gli header beta richiesti:
# Initialize client with both code execution and files API headers
self.client = Anthropic(
api_key=api_key,
default_headers={
"anthropic-beta": "code-execution-2025-05-22,files-api-2025-04-14"
},
)
Infine, creiamo la struttura delle directory di output:
# Create organized output directories
self.output_dir = Path("math_solver_output")
self.images_dir = self.output_dir / "images"
self.reports_dir = self.output_dir / "reports"
self.output_dir.mkdir(exist_ok=True)
self.images_dir.mkdir(exist_ok=True)
self.reports_dir.mkdir(exist_ok=True)
print(f"📁 Output directories created:")
print(f" • Images: {self.images_dir}")
print(f" • Reports: {self.reports_dir}")
Questa inizializzazione fa tre cose importanti:
- Gestione della chiave API: Controlla prima la chiave nelle variabili d’ambiente, poi usa il parametro in fallback.
- Impostazione del client: Crea un client Anthropic con entrambi gli header beta per esecuzione del codice e Files API.
- Struttura delle directory: Crea cartelle organizzate per archiviare immagini e report.
Step 3: scrivi la funzione core del solver
Il metodo solve_problem() è il cuore della nostra applicazione. Invia richieste a Claude con supporto allo streaming.
Iniziamo con la firma della funzione e il setup iniziale:
def solve_problem(self, question: str) -> Dict[str, Any]:
"""
Send a math question to Claude and get solution with code execution.
"""
print(f"\n🤔 Thinking about: {question}")
try:
# Use streaming to show real-time progress
with self.client.messages.stream(
model="claude-sonnet-4-20250514",
max_tokens=4096,
Now we configure the message and tool specification:
messages=[
{
"role": "user",
"content": f"""Solve this math problem using code execution:
Problem: {question}
Please:
1. Solve the problem with actual Python code
2. Create visualizations using matplotlib if helpful
3. Save any plots as PNG files using plt.savefig()
4. Show your calculations step by step
5. Use descriptive filenames for saved plots
Execute Python code to solve this problem.""",
}
],
tools=[{"type": "code_execution_20250522", "name": "code_execution"}],
) as stream:
The streaming event processing handles real-time updates:
print("\n💭 Claude is working...")
# Process streaming events and show progress
for event in stream:
if event.type == "content_block_start":
if hasattr(event.content_block, "type"):
if event.content_block.type == "text":
print("\n📝 Response:", end=" ", flush=True)
elif event.content_block.type == "server_tool_use":
print(f"\n🔧 Using tool: {event.content_block.name}")
Gestiamo diversi tipi di eventi in streaming:
elif event.type == "content_block_delta":
if hasattr(event.delta, "text"):
print(event.delta.text, end="", flush=True)
elif event.type == "content_block_stop":
print("", flush=True) # New line
elif event.type == "message_delta":
if hasattr(event.delta, "stop_reason"):
print(f"\n✅ Completed: {event.delta.stop_reason}")
Infine, restituiamo il risultato o gestiamo gli errori:
# Get the final message
final_message = stream.get_final_message()
return {
"response": final_message,
"question": question,
"timestamp": datetime.datetime.now().isoformat(),
}
except Exception as e:
print(f"❌ Error solving problem: {e}")
return None
Questa funzione dimostra diversi concetti importanti:
- Supporto allo streaming: Usiamo
client.messages.stream()invece diclient.messages.create()per avere feedback in tempo reale mentre Claude lavora al problema. - Gestione degli eventi: L’API di streaming invia diversi tipi di eventi:
content_block_start: quando Claude inizia a scrivere testo o a usare uno strumentocontent_block_delta: mentre il contenuto viene generatocontent_block_stop: quando un blocco di contenuto è terminatomessage_delta: quando l’intero messaggio è completo- Specificazione degli strumenti: Includiamo lo strumento di esecuzione del codice nell’array
toolscon il tipo esatto"code_execution_20250522". - Prompt strutturato: Il nostro prompt istruisce chiaramente Claude a usare l’esecuzione del codice e a salvare eventuali visualizzazioni.
Step 4: risolvi problemi di matematica con esecuzione di codice in streaming
Quando Claude crea file durante l’esecuzione del codice (come grafici di matplotlib), dobbiamo estrarne gli ID e scaricarli in locale.
Il metodo di estrazione dei file attraversa la struttura della risposta:
def extract_files_from_response(self, response) -> List[str]:
"""Extract file IDs from Claude's response."""
file_ids = []
for item in response.content:
if item.type == "code_execution_tool_result":
content_item = item.content
if isinstance(content_item, dict):
if content_item.get("type") == "code_execution_result":
content_list = content_item.get("content", [])
Poi cerchiamo gli ID dei file nel contenuto:
for file_item in content_list:
if isinstance(file_item, dict) and "file_id" in file_item:
file_ids.append(file_item["file_id"])
return file_ids
Il processo di download recupera i file e li salva in locale:
def download_files(self, file_ids: List[str]) -> List[str]:
"""Download files created by code execution to local storage."""
downloaded_files = []
for file_id in file_ids:
try:
# Get file metadata and download content
file_metadata = self.client.beta.files.retrieve_metadata(file_id)
filename = file_metadata.filename
file_content = self.client.beta.files.download(file_id)
local_path = self.images_dir / filename
file_content.write_to_file(str(local_path))
Teniamo traccia dei file scaricati e gestiamo gli errori:
downloaded_files.append(str(local_path))
print(f"✅ Downloaded: {filename}")
except Exception as e:
print(f"❌ Error downloading file {file_id}: {e}")
return downloaded_files
- Logica di estrazione file: Il metodo
extract_files_from_response()attraversa la struttura della risposta per trovare gli ID file. I risultati dell’esecuzione del codice sono annidati in un formato specifico in cui i file compaiono nell’arraycontent. - Processo di download dei file: Il metodo
download_files(): - Ottiene i metadati per ogni file (incluso il nome originale)
- Scarica il contenuto del file usando la Files API
- Salva i file nella nostra struttura di directory organizzata
- Restituisce un elenco di percorsi locali per utilizzi successivi
Estrarre risultati da Claude Sonnet 4: codice, visual e report
Ora riutilizziamo e verifichiamo il codice e gli output generati da Claude.
Step 5: scarica gli output visuali dalle risposte di Claude
Per i nostri report in markdown, vogliamo includere il codice Python effettivamente eseguito da Claude:
def extract_code_blocks(self, response) -> List[str]:
"""Extract all code blocks from the response."""
code_blocks = []
for item in response.content:
if item.type == "server_tool_use" and item.name == "code_execution":
if (
hasattr(item, "input")
and isinstance(item.input, dict)
and "code" in item.input
):
code_blocks.append(item.input["code"])
return code_blocks
Questo metodo cerca gli elementi server_tool_use con nome "code_execution" ed estrae il codice Python dal campo input. Otteniamo così il codice effettivo che Claude ha scritto ed eseguito.
Step 6: estrai il codice di Claude per riuso e audit
Il nostro generatore di report crea una documentazione completa di ogni soluzione.
Per prima cosa, estraiamo i contenuti e impostiamo la struttura del report:
def generate_markdown_report(self, result: Dict[str, Any], downloaded_files: List[str]) -> str:
"""Generate a comprehensive markdown report of the solution."""
response = result["response"]
question = result["question"]
timestamp = result["timestamp"]
# Extract text content and code blocks
text_content = []
code_blocks = self.extract_code_blocks(response)
for item in response.content:
if item.type == "text":
text_content.append(item.text)
Poi generiamo un nome file sicuro con timestamp:
# Generate filename with timestamp
safe_question = "".join(
c for c in question[:50] if c.isalnum() or c in (" ", "-", "_")
).strip()
filename = f"{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}_{safe_question.replace(' ', '_')}.md"
filepath = self.reports_dir / filename
Costruiamo il contenuto markdown con intestazione e enunciato del problema:
# Create markdown content
markdown_content = f"""# Math Problem Solution Report
**Generated:** {timestamp}
**Question:** {question}
---
## Problem Statement
{question}
---
## Solution
"""
Add the solution explanation and code blocks:
# Add the main explanation
for text in text_content:
markdown_content += f"{text}\n\n"
# Add code sections
if code_blocks:
markdown_content += "---\n\n## Code Used\n\n"
for i, code in enumerate(code_blocks, 1):
markdown_content += f"### Code Block {i}\n\n```python\n{code}\n```\n\n"
Includi eventuali visualizzazioni generate:
# Add images section
if downloaded_files:
markdown_content += "---\n\n## Generated Visualizations\n\n"
for file_path in downloaded_files:
filename = Path(file_path).name
relative_path = f"../images/{filename}"
markdown_content += f"\n\n"
Finally, add metadata and save the report:
# Add footer
markdown_content += f"""---
## Report Details
- **Generated by:** Claude 4 Math Solver
- **Model:** claude-sonnet-4-20250514
- **Timestamp:** {timestamp}
- **Files created:** {len(downloaded_files)} visualization(s)
---
*This report was automatically generated using Claude's code execution capabilities.*
"""
# Save the report
with open(filepath, "w", encoding="utf-8") as f:
f.write(markdown_content)
return str(filepath)
Questo generatore crea un documento markdown strutturato che contiene:
- Enunciato del problema e metadati
- Spiegazione della soluzione dalle risposte testuali di Claude
- Blocchi di codice con il Python effettivamente eseguito
- Visualizzazioni incorporate con percorsi relativi
- Metadati del report per tracciamento e riferimento
La generazione del nome file crea nomi sicuri con timestamp che non andranno in conflitto con file esistenti.
Esecuzione interattiva del Math Solver
Poi concentriamoci sul loop di interazione con l’utente, strumenti demo e testing.
Step 7: gestisci la sessione interattiva
Il loop di sessione interattiva gestisce l’input dell’utente e coordina tutti i componenti.
Partiamo con il setup della sessione e il messaggio di benvenuto:
def run_interactive_session(self):
"""Run the main interactive session loop."""
print("🧮 Interactive Math Problem Solver with Claude 4")
print("=" * 60)
print("Ask me any math question and I'll solve it step by step!")
print("I can handle algebra, calculus, statistics, geometry, and more.")
print("Type 'quit', 'exit', or 'q' to end the session.")
print("=" * 60)
session_count = 0
Il loop principale gestisce input ed exit condition:
while True:
try:
# Get user input
question = input(f"\n📝 Question #{session_count + 1}: ").strip()
if question.lower() in ["quit", "exit", "q"]:
print("\n👋 Thanks for using the Math Solver! Goodbye!")
break
if not question:
print("Please enter a question.")
continue
session_count += 1
Per ogni domanda valida, processiamo l’intero workflow:
# Solve the problem
result = self.solve_problem(question)
if not result:
continue
# Extract and download any files created
file_ids = self.extract_files_from_response(result["response"])
downloaded_files = []
if file_ids:
print(f"📥 Downloading {len(file_ids)} file(s)...")
downloaded_files = self.download_files(file_ids)
Concludiamo con la generazione del report e il feedback all’utente:
# Generate markdown report
print(f"📝 Generating report...")
report_path = self.generate_markdown_report(result, downloaded_files)
print(f"\n✅ Solution complete!")
print(f"📄 Report saved: {report_path}")
if downloaded_files:
print(f"🖼️ Visualizations: {len(downloaded_files)} file(s) saved")
except KeyboardInterrupt:
print("\n\n👋 Session interrupted. Goodbye!")
break
except Exception as e:
print(f"❌ An error occurred: {e}")
print("Please try again with a different question.")
Questo loop mostra un workflow completo:
- Interazione con l’utente: Prompt per le domande e gestione dei comandi di uscita
- Risoluzione del problema: Chiamata al nostro metodo
solve_problem() - Elaborazione file: Estrazione e download di eventuali file generati
- Generazione del report: Creazione di un report markdown completo
- Gestione errori: Gestione elegante di interruzioni ed errori
Step 8: scrivi l’entry point dell’applicazione
Infine, ci serve una funzione main() per inizializzare e avviare l’applicazione:
def main():
"""Main entry point for the application."""
try:
solver = MathSolver()
solver.run_interactive_session()
except Exception as e:
print(f"❌ Failed to initialize Math Solver: {e}")
print("Make sure you have set the ANTHROPIC_API_KEY environment variable.")
return 1
return 0
if __name__ == "__main__":
exit(main())
Questo semplice entry point gestisce gli errori di inizializzazione (come chiavi API mancanti) e fornisce messaggi di errore utili.
Step 9: aggiungi un generatore di problemi demo
Per aiutare gli utenti a partire, creiamo uno script separato con esempi di problemi. Crea demo_problems.py.
Per prima cosa, definiamo le nostre categorie di problemi:
# demo_problems.py
#!/usr/bin/env python3
"""
Demo problems for the Interactive Math Problem Solver
"""
# Sample problems organized by difficulty and topic
DEMO_PROBLEMS = {
"Beginner": [
"What is 15% of 240?",
"Solve for x: 3x + 7 = 22",
"Find the area of a circle with radius 5",
"Convert 45 degrees to radians",
"Calculate the hypotenuse of a right triangle with legs 3 and 4",
],
Aggiungi set di problemi intermedi e avanzati:
"Intermediate": [
"Solve the quadratic equation: 2x^2 + 5x - 3 = 0",
"Graph y = x^2 - 4x + 3 and find its vertex",
"Calculate mean, median, and standard deviation of [12, 15, 18, 22, 25, 28]",
"Find where f(x) = x^3 - 3x^2 + 2 crosses the x-axis",
"Solve the system of equations: 2x + 3y = 7, x - y = 1",
],
"Advanced": [
"Find the derivative of sin(x) * e^x and plot both functions",
"Calculate the integral of x^2 from 0 to 5",
"Use Newton's method to find the root of x^3 - 2x - 5 = 0",
"Perform linear regression on data points and plot the results",
"Solve the differential equation dy/dx = x*y with initial condition y(0) = 1",
],
}
Crea funzioni helper per selezione casuale e visualizzazione:
def get_random_problem(category=None):
"""Get a random problem from a specific category or all categories."""
import random
if category and category in DEMO_PROBLEMS:
return random.choice(DEMO_PROBLEMS[category])
else:
# Pick from all problems
all_problems = []
for problems in DEMO_PROBLEMS.values():
all_problems.extend(problems)
return random.choice(all_problems)
Aggiungi una funzione per mostrare tutti i problemi disponibili:
def print_demo_problems():
"""Print all demo problems organized by category."""
print("🧮 Demo Problems for Interactive Math Solver")
print("=" * 60)
print("Here are example problems you can try, organized by difficulty:\n")
for category, problems in DEMO_PROBLEMS.items():
print(f"### {category}")
print("-" * (len(category) + 4))
for i, problem in enumerate(problems, 1):
print(f"{i:2d}. {problem}")
print()
print("💡 Tips:")
print(" • Copy and paste any question into the math solver")
print(" • All visualizations and reports will be saved automatically")
print("\n🚀 Start the solver with: python math_solver.py")
if __name__ == "__main__":
print_demo_problems()
Questo script demo offre:
- Problemi categorizzati dal livello principiante all’avanzato
- Selezione casuale dei problemi per i test
- Indicazioni d’uso per i nuovi utenti
Step 10: esegui e testa l’applicazione
Ora testiamo l’applicazione completa! Avvia il risolutore:
python math_solver.py
Prova alcune domande di esempio:
- Calcolo di base: “What is 15% of 240?”
- Algebra: “Solve for x: 3x + 7 = 22”
- Visualizzazione: “Graph y = x² — 4x + 3 and find its vertex”
- Matematica avanzata: “Find the derivative of sin(x) * e^x and plot both functions”
Ogni domanda:
- Mostrerà output in streaming in tempo reale mentre Claude lavora
- Genererà eventuali visualizzazioni necessarie
- Salverà un report markdown completo
- Scaricherà i file dei grafici nella cartella delle immagini
Puoi anche eseguire lo script dei problemi demo per vedere tutti gli esempi disponibili:
python demo_problems.py
Cosa abbiamo costruito con Claude Sonnet 4
Il nostro risolutore di problemi matematici dimostra diverse potenti funzionalità di Claude 4 e delle nuove capacità dell’API:
- Esecuzione di codice: Claude può scrivere ed eseguire codice Python per risolvere problemi matematici, iterare sulle soluzioni e gestire calcoli complessi.
- Generazione e gestione di file: L’applicazione gestisce automaticamente creazione, download e organizzazione dei file usando la Files API.
- Interazione in streaming: Il feedback in tempo reale rende l’esperienza reattiva e coinvolgente.
- Documentazione completa: Ogni soluzione è conservata in report markdown dettagliati con codice e visualizzazioni incorporate.
- Interfaccia user-friendly: L’interfaccia da terminale è semplice ma efficace per la risoluzione di problemi matematici.
Questo progetto mostra come le nuove capacità di Claude 4 possano essere combinate per creare applicazioni sofisticate, al di là delle semplici interazioni in chat. Il tool di esecuzione del codice, unito a una corretta gestione dei file e allo streaming, crea una piattaforma potente per l’esplorazione e l’analisi matematica.
Puoi anche imparare a costruire agenti simili su altre piattaforme seguendo il corso Developing AI Systems with the OpenAI API.
Conclusioni e passi successivi
La costruzione di questo risolutore di problemi matematici ha dimostrato come le nuove funzionalità di Claude 4 trasformino ciò che è possibile fare con le applicazioni AI.
La nostra applicazione gestisce tutto, dai calcoli di base alle visualizzazioni matematiche complesse, mostrando come queste feature dell’API lavorino insieme per creare ottime esperienze d’uso. In particolare, lo strumento di esecuzione del codice è un vero game-changer, perché consente a Claude di iterare sulle soluzioni e generare output visuali che in passato avrebbero richiesto strumenti separati e integrazioni complesse.
Da qui puoi estendere il solver con interfacce web, integrarlo con fonti di dati esterne tramite MCP o applicare pattern simili per creare assistenti specifici di dominio in altri ambiti, come l’analisi dei dati, il calcolo scientifico o strumenti educativi.
- Se sei uno sviluppatore e vuoi certificare le tue competenze di ingegneria AI, valuta il percorso Associate AI Engineer per sviluppatori, che enfatizza implementazioni a livello production come questa.
- I data scientist interessati a mettere in produzione gli LLM possono seguire il percorso Associate AI Engineer per data scientist, che fa da ponte tra analisi e deployment AI.
FAQs
Cosa rende Claude 4 diverso dalle versioni precedenti?
Claude 4 introduce esecuzione di codice nativa, ragionamento esteso con uso di strumenti, esecuzione parallela dei tool, capacità di memoria migliorate e supporto per diverse ore di esecuzione continua dei task. Queste caratteristiche lo rendono particolarmente forte nei compiti di ingegneria del software.
Claude 4 può davvero eseguire codice Python durante le conversazioni?
Sì, Claude 4 può eseguire codice Python in un ambiente sandbox sicuro usando il nuovo strumento di esecuzione del codice. Può eseguire calcoli, generare visualizzazioni con matplotlib e iterare sulle soluzioni in base ai risultati dell’esecuzione.
Quali sono le limitazioni dell’ambiente di esecuzione di Claude?
La sandbox non ha accesso a Internet, ha risorse computazionali limitate e non può accedere al tuo file system locale. Include librerie popolari come numpy, pandas e matplotlib preinstallate, ma non puoi installare pacchetti aggiuntivi.
Come funziona la nuova Files API con l’esecuzione del codice?
La Files API ti consente di caricare documenti una sola volta e referenziarli tra conversazioni. Quando Claude crea file durante l’esecuzione del codice (come grafici), puoi estrarne gli ID e scaricarli in locale tramite l’API.
Serve un accesso API speciale per usare le funzionalità di esecuzione del codice di Claude 4?
Devi includere l’header beta "anthropic-beta": "code-execution-2025-05-22" nelle richieste API e usare il modello claude-sonnet-4-20250514. Lo strumento di esecuzione del codice va specificato come "code_execution_20250522" nell’array tools.
Sono un creator di contenuti sulla data science con oltre 2 anni di esperienza e uno dei più seguiti su Medium. Mi piace scrivere articoli dettagliati su AI e ML con un pizzico di sarcasmo, perché bisogna pur fare qualcosa per renderli un po’ meno noiosi. Ho pubblicato oltre 130 articoli e un corso su DataCamp, con un altro in arrivo. I miei contenuti sono stati visti da oltre 5 milioni di persone, 20.000 delle quali sono diventate follower sia su Medium che su LinkedIn.


