Vai al contenuto principale

Claude Sonnet 4: una guida pratica per sviluppatori

Esplora le funzionalità per sviluppatori di Claude Sonnet 4 — esecuzione di codice, Files API e uso di strumenti — costruendo un agente Python che risolve problemi di matematica.
Aggiornato 29 set 2026  · 11 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

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.

Esempi di grafici generati dallo strumento di esecuzione di codice nativo di Claude 4 Sonnet

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:

Un’immagine che mostra i modelli Claude 4 in testa su SWE-bench Verified, un benchmark per le prestazioni su reali task di ingegneria del software.

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:

  1. Runtime lunghi: Entrambi i modelli supportano diverse ore di esecuzione continua per risolvere problemi con migliaia di passaggi.
  2. 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.
  3. Esecuzione parallela degli strumenti: I modelli possono ora usare più tool contemporaneamente invece che in sequenza.
  4. Maggiore aderenza alle istruzioni: Una migliore “steerability” offre agli utenti maggior controllo sulle implementazioni e su come Claude risponde alle istruzioni.
  5. 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.
  6. 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:

  1. Gestione della chiave API: Controlla prima la chiave nelle variabili d’ambiente, poi usa il parametro in fallback.
  2. Impostazione del client: Crea un client Anthropic con entrambi gli header beta per esecuzione del codice e Files API.
  3. 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 di client.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 strumento
    • content_block_delta: mentre il contenuto viene generato
    • content_block_stop: quando un blocco di contenuto è terminato
    • message_delta: quando l’intero messaggio è completo
  • Specificazione degli strumenti: Includiamo lo strumento di esecuzione del codice nell’array tools con 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’array content.
  • 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"![{filename}]({relative_path})\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:

  1. Interazione con l’utente: Prompt per le domande e gestione dei comandi di uscita
  2. Risoluzione del problema: Chiamata al nostro metodo solve_problem()
  3. Elaborazione file: Estrazione e download di eventuali file generati
  4. Generazione del report: Creazione di un report markdown completo
  5. 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:

  1. Calcolo di base: “What is 15% of 240?”
  2. Algebra: “Solve for x: 3x + 7 = 22”
  3. Visualizzazione: “Graph y = x² — 4x + 3 and find its vertex”
  4. 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.

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.


Bexruz (Bex) Tuychiev's photo
Author
Bexruz (Bex) Tuychiev
LinkedIn

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. 

Argomenti
Intelligenza artificiale
Python

Scopri di più sull’AI con questi corsi!

Corso

Comprendere l'intelligenza artificiale

2 ore
426.1K
Impara i concetti di base dell'Intelligenza Artificiale, come l'apprendimento automatico, l'apprendimento profondo, l'NLP, l'IA generativa e altro ancora.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

Mostra AltroMostra Altro