Loading...
    • Crea
    • Admin
    • Modelli e prezzi
    • SDK client
    • Riferimento API
    Search...
    ⌘K
    Primi passi
    Introduzione a ClaudeGuida rapida
    Creare con Claude
    Panoramica delle funzioniUtilizzo dell'API MessagesCompetenza Claude APIGestione dei motivi di arresto
    Capacità del modello
    Extended thinkingAdaptive thinkingEffortBudget attività (beta)Modalità veloce (beta: anteprima ricerca)Output strutturatiCitazioniStreaming MessagesElaborazione batchRisultati di ricercaStreaming rifiutiSupporto multilingueEmbeddings
    Strumenti
    PanoramicaCome funziona l'uso degli strumentiStrumento di ricerca webStrumento di recupero webStrumento di esecuzione codiceStrumento AdvisorStrumento MemoryStrumento BashStrumento Computer useStrumento editor di testo
    Infrastruttura degli strumenti
    Riferimento strumentiRicerca strumentiChiamata programmatica degli strumentiStreaming granulare degli strumenti
    Gestione del contesto
    Finestre di contestoCompattazioneModifica del contestoPrompt cachingConteggio token
    Utilizzo dei file
    API FilesSupporto PDFImmagini e visione
    Competenze
    PanoramicaGuida rapidaBest practiceCompetenze per l'aziendaCompetenze nell'API
    MCP
    Server MCP remotiConnettore MCP
    Prompt engineering
    PanoramicaBest practice per il promptStrumenti di prompt in Console
    Test e valutazione
    Definire il successo e creare valutazioniUtilizzo dello strumento di valutazione in ConsoleRiduzione della latenza
    Rafforzare le protezioni
    Ridurre le allucinazioniAumentare la coerenza dell'outputMitigare i jailbreakRidurre la perdita di prompt
    Risorse
    Glossario
    Note sulla versione
    Claude Platform
    Console
    Log in
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...

    Solutions

    • AI agents
    • Code modernization
    • Coding
    • Customer support
    • Education
    • Financial services
    • Government
    • Life sciences

    Partners

    • Amazon Bedrock
    • Google Cloud's Vertex AI

    Learn

    • Blog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Company

    • Anthropic
    • Careers
    • Economic Futures
    • Research
    • News
    • Responsible Scaling Policy
    • Security and compliance
    • Transparency

    Learn

    • Blog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Help and security

    • Availability
    • Status
    • Support
    • Discord

    Terms and policies

    • Privacy policy
    • Responsible disclosure policy
    • Terms of service: Commercial
    • Terms of service: Consumer
    • Usage policy
    Capacità del modello

    Streaming dei Messaggi

    Come eseguire lo streaming incrementale delle risposte dei messaggi utilizzando server-sent events

    Quando crei un Message, puoi impostare "stream": true per eseguire lo streaming incrementale della risposta utilizzando server-sent events (SSE).

    Streaming con gli SDK

    Gli SDK Python e TypeScript offrono molteplici modi di streaming. L'SDK PHP fornisce streaming tramite createStream(). L'SDK Python consente sia stream sincroni che asincroni. Consulta la documentazione in ogni SDK per i dettagli.

    client = anthropic.Anthropic()
    
    with client.messages.stream(
        max_tokens=1024,
        messages=[{"role": "user", "content": "Hello"}],
        model="claude-opus-4-7",
    ) as stream:
        for text in stream.text_stream:
            print(text, end="", flush=True)

    Ottenere il messaggio finale senza gestire gli eventi

    Se non hai bisogno di elaborare il testo mentre arriva, gli SDK forniscono un modo per utilizzare lo streaming dietro le quinte mentre restituiscono l'oggetto Message completo, identico a quello che .create() restituisce. Questo è particolarmente utile per le richieste con valori max_tokens grandi, dove gli SDK richiedono lo streaming per evitare timeout HTTP.

    La chiamata .stream() mantiene la connessione HTTP attiva con server-sent events, quindi .get_final_message() (Python) o .finalMessage() (TypeScript) accumula tutti gli eventi e restituisce l'oggetto Message completo. In Go, chiami message.Accumulate(event) all'interno del ciclo di streaming per costruire lo stesso Message completo. In Java, usa MessageAccumulator.create() e chiama accumulator.accumulate(event) su ogni evento. In Ruby, chiama .accumulated_message sullo stream. Nell'SDK PHP, iteri manualmente sugli eventi dello stream per accumulare la risposta.

    Tipi di evento

    Ogni server-sent event include un tipo di evento denominato e i dati JSON associati. Ogni evento utilizza un nome di evento SSE (ad es. event: message_stop), e include il corrispondente type di evento nei suoi dati.

    Ogni stream utilizza il seguente flusso di eventi:

    1. message_start: contiene un oggetto Message con content vuoto.
    2. Una serie di blocchi di contenuto, ognuno dei quali ha un content_block_start, uno o più eventi content_block_delta, e un evento content_block_stop. Ogni blocco di contenuto ha un index che corrisponde al suo indice nell'array content del Message finale.
    3. Uno o più eventi message_delta, indicando modifiche di livello superiore all'oggetto Message finale.
    4. Un evento message_stop finale.

    I conteggi dei token mostrati nel campo usage dell'evento message_delta sono cumulativi.

    Eventi ping

    I flussi di eventi possono anche includere un numero qualsiasi di eventi ping.

    Eventi di errore

    L'API può occasionalmente inviare errori nel flusso di eventi. Ad esempio, durante periodi di utilizzo elevato, potresti ricevere un overloaded_error, che normalmente corrisponderebbe a un HTTP 529 in un contesto non in streaming:

    Example error
    event: error
    data: {"type": "error", "error": {"type": "overloaded_error", "message": "Overloaded"}}

    Altri eventi

    In conformità con la politica di versioning, nuovi tipi di evento possono essere aggiunti, e il tuo codice dovrebbe gestire i tipi di evento sconosciuti con eleganza.

    Tipi di delta del blocco di contenuto

    Ogni evento content_block_delta contiene un delta di un tipo che aggiorna il blocco content a un dato index.

    Delta di testo

    Un delta di blocco di contenuto text assomiglia a:

    Text delta
    event: content_block_delta
    data: {"type": "content_block_delta","index": 0,"delta": {"type": "text_delta", "text": "ello frien"}}

    Delta JSON di input

    I delta per i blocchi di contenuto tool_use corrispondono agli aggiornamenti per il campo input del blocco. Per supportare la massima granularità, i delta sono stringhe JSON parziali, mentre il tool_use.input finale è sempre un oggetto.

    Puoi accumulare i delta di stringa e analizzare il JSON una volta ricevuto un evento content_block_stop, utilizzando una libreria come Pydantic per fare analisi JSON parziale, o utilizzando gli SDK, che forniscono helper per accedere ai valori incrementali analizzati.

    Un delta di blocco di contenuto tool_use assomiglia a:

    Input JSON delta
    event: content_block_delta
    data: {"type": "content_block_delta","index": 1,"delta": {"type": "input_json_delta","partial_json": "{\"location\": \"San Fra"}}

    Nota: I modelli attuali supportano solo l'emissione di una proprietà di chiave e valore completa da input alla volta. Di conseguenza, quando si utilizzano gli strumenti, potrebbero esserci ritardi tra gli eventi di streaming mentre il modello sta lavorando. Una volta che una chiave e un valore di input sono accumulati, vengono emessi come più eventi content_block_delta con json parziale suddiviso in blocchi in modo che il formato possa supportare automaticamente una granularità più fine nei modelli futuri.

    Delta di pensiero

    Quando si utilizza il pensiero esteso con lo streaming abilitato, riceverai il contenuto di pensiero tramite eventi thinking_delta. Questi delta corrispondono al campo thinking dei blocchi di contenuto thinking.

    Per il contenuto di pensiero, un evento signature_delta speciale viene inviato appena prima dell'evento content_block_stop. Questa firma viene utilizzata per verificare l'integrità del blocco di pensiero.

    Quando display: "omitted" è impostato sulla configurazione del pensiero, nessun evento thinking_delta viene inviato. Il blocco di pensiero si apre, riceve un singolo signature_delta, e si chiude. Vedi Controlling thinking display.

    Un tipico delta di pensiero assomiglia a:

    Thinking delta
    event: content_block_delta
    data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "I need to find the GCD of 1071 and 462 using the Euclidean algorithm.\n\n1071 = 2 × 462 + 147"}}

    Il delta della firma assomiglia a:

    Signature delta
    event: content_block_delta
    data: {"type": "content_block_delta", "index": 0, "delta": {"type": "signature_delta", "signature": "EqQBCgIYAhIM1gbcDa9GJwZA2b3hGgxBdjrkzLoky3dl1pkiMOYds..."}}

    Risposta completa del flusso HTTP

    Utilizza gli SDK client quando utilizzi la modalità di streaming. Tuttavia, se stai creando un'integrazione API diretta, devi gestire questi eventi da solo.

    Una risposta di flusso è composta da:

    1. Un evento message_start
    2. Potenzialmente più blocchi di contenuto, ognuno dei quali contiene:
      • Un evento content_block_start
      • Potenzialmente più eventi content_block_delta
      • Un evento content_block_stop
    3. Un evento message_delta
    4. Un evento message_stop

    Potrebbero esserci eventi ping dispersi in tutta la risposta. Vedi Event types per ulteriori dettagli sul formato.

    Richiesta di streaming di base

    Response
    event: message_start
    data: {"type": "message_start", "message": {"id": "msg_1nZdL29xx5MUA1yADyHTEsnR8uuvGzszyY", "type": "message", "role": "assistant", "content": [], "model": "claude-opus-4-7", "stop_reason": null, "stop_sequence": null, "usage": {"input_tokens": 25, "output_tokens": 1}}}
    
    event: content_block_start
    data: {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}}
    
    event: ping
    data: {"type": "ping"}
    
    event: content_block_delta
    data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "Hello"}}
    
    event: content_block_delta
    data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "!"}}
    
    event: content_block_stop
    data: {"type": "content_block_stop", "index": 0}
    
    event: message_delta
    data: {"type": "message_delta", "delta": {"stop_reason": "end_turn", "stop_sequence":null}, "usage": {"output_tokens": 15}}
    
    event: message_stop
    data: {"type": "message_stop"}
    

    Richiesta di streaming con utilizzo di strumenti

    L'utilizzo di strumenti supporta lo streaming a grana fine per i valori dei parametri. Abilitalo per strumento con eager_input_streaming.

    Questa richiesta chiede a Claude di utilizzare uno strumento per segnalare il meteo.

    Response
    event: message_start
    data: {"type":"message_start","message":{"id":"msg_014p7gG3wDgGV9EUtLvnow3U","type":"message","role":"assistant","model":"claude-opus-4-7","stop_sequence":null,"usage":{"input_tokens":472,"output_tokens":2},"content":[],"stop_reason":null}}
    
    event: content_block_start
    data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
    
    event: ping
    data: {"type": "ping"}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Okay"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":","}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" let"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"'s"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" check"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" the"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" weather"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" for"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" San"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" Francisco"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":","}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" CA"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":":"}}
    
    event: content_block_stop
    data: {"type":"content_block_stop","index":0}
    
    event: content_block_start
    data: {"type":"content_block_start","index":1,"content_block":{"type":"tool_use","id":"toolu_01T1x1fJ34qAmk2tNTrN7Up6","name":"get_weather","input":{}}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":""}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"{\"location\":"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" \"San"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" Francisc"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"o,"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" CA\""}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":","}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" \"unit\": \"fah"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"renheit\"}"}}
    
    event: content_block_stop
    data: {"type":"content_block_stop","index":1}
    
    event: message_delta
    data: {"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"output_tokens":89}}
    
    event: message_stop
    data: {"type":"message_stop"}

    Richiesta di streaming con pensiero esteso

    Questa richiesta abilita il pensiero esteso con streaming per vedere il ragionamento passo dopo passo di Claude.

    Response
    event: message_start
    data: {"type": "message_start", "message": {"id": "msg_01...", "type": "message", "role": "assistant", "content": [], "model": "claude-opus-4-7", "stop_reason": null, "stop_sequence": null}}
    
    event: content_block_start
    data: {"type": "content_block_start", "index": 0, "content_block": {"type": "thinking", "thinking": "", "signature": ""}}
    
    event: content_block_delta
    data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "I need to find the GCD of 1071 and 462 using the Euclidean algorithm.\n\n1071 = 2 × 462 + 147"}}
    
    event: content_block_delta
    data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\n462 = 3 × 147 + 21"}}
    
    event: content_block_delta
    data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\n147 = 7 × 21 + 0"}}
    
    event: content_block_delta
    data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\nThe remainder is 0, so GCD(1071, 462) = 21."}}
    
    event: content_block_delta
    data: {"type": "content_block_delta", "index": 0, "delta": {"type": "signature_delta", "signature": "EqQBCgIYAhIM1gbcDa9GJwZA2b3hGgxBdjrkzLoky3dl1pkiMOYds..."}}
    
    event: content_block_stop
    data: {"type": "content_block_stop", "index": 0}
    
    event: content_block_start
    data: {"type": "content_block_start", "index": 1, "content_block": {"type": "text", "text": ""}}
    
    event: content_block_delta
    data: {"type": "content_block_delta", "index": 1, "delta": {"type": "text_delta", "text": "The greatest common divisor of 1071 and 462 is **21**."}}
    
    event: content_block_stop
    data: {"type": "content_block_stop", "index": 1}
    
    event: message_delta
    data: {"type": "message_delta", "delta": {"stop_reason": "end_turn", "stop_sequence": null}}
    
    event: message_stop
    data: {"type": "message_stop"}

    Richiesta di streaming con utilizzo di strumento di ricerca web

    Questa richiesta chiede a Claude di cercare sul web informazioni meteo attuali.

    Response
    event: message_start
    data: {"type":"message_start","message":{"id":"msg_01G...","type":"message","role":"assistant","model":"claude-opus-4-7","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":2679,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":3}}}
    
    event: content_block_start
    data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"I'll check"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" the current weather in New York City for you"}}
    
    event: ping
    data: {"type": "ping"}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"."}}
    
    event: content_block_stop
    data: {"type":"content_block_stop","index":0}
    
    event: content_block_start
    data: {"type":"content_block_start","index":1,"content_block":{"type":"server_tool_use","id":"srvtoolu_014hJH82Qum7Td6UV8gDXThB","name":"web_search","input":{}}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":""}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"{\"query"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"\":"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" \"weather"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" NY"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"C to"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"day\"}"}}
    
    event: content_block_stop
    data: {"type":"content_block_stop","index":1 }
    
    event: content_block_start
    data: {"type":"content_block_start","index":2,"content_block":{"type":"web_search_tool_result","tool_use_id":"srvtoolu_014hJH82Qum7Td6UV8gDXThB","content":[{"type":"web_search_result","title":"Weather in New York City in May 2025 (New York) - detailed Weather Forecast for a month","url":"https://world-weather.info/forecast/usa/new_york/may-2025/","encrypted_content":"Ev0DCioIAxgCIiQ3NmU4ZmI4OC1k...","page_age":null},...]}}
    
    event: content_block_stop
    data: {"type":"content_block_stop","index":2}
    
    event: content_block_start
    data: {"type":"content_block_start","index":3,"content_block":{"type":"text","text":""}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":"Here's the current weather information for New York"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":" City:\n\n# Weather"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":" in New York City"}}
    
    event: content_block_delta
    data: {"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":"\n\n"}}
    
    ...
    
    event: content_block_stop
    data: {"type":"content_block_stop","index":17}
    
    event: message_delta
    data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":10682,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":510,"server_tool_use":{"web_search_requests":1}}}
    
    event: message_stop
    data: {"type":"message_stop"}

    Recupero degli errori

    Claude 4.5 e versioni precedenti

    Per i modelli Claude 4.5 e versioni precedenti, puoi recuperare una richiesta di streaming che è stata interrotta a causa di problemi di rete, timeout o altri errori riprendendo da dove il flusso è stato interrotto. Questo approccio ti consente di evitare di rielaborare l'intera risposta.

    La strategia di recupero di base prevede:

    1. Acquisire la risposta parziale: Salva tutto il contenuto ricevuto con successo prima che si verificasse l'errore
    2. Costruire una richiesta di continuazione: Crea una nuova richiesta API che includa la risposta parziale dell'assistente come inizio di un nuovo messaggio dell'assistente
    3. Riprendere lo streaming: Continua a ricevere il resto della risposta da dove è stata interrotta

    Claude 4.6

    Per i modelli Claude 4.6, dovresti aggiungere un messaggio utente che istruisce il modello a continuare da dove si era fermato. Ad esempio:

    Sample prompt
    Your previous response was interrupted and ended with [previous_response]. Continue from where you left off.

    Migliori pratiche per il recupero degli errori

    1. Usa le funzionalità dell'SDK: Sfrutta le capacità integrate dell'SDK di accumulo dei messaggi e gestione degli errori
    2. Gestisci i tipi di contenuto: Tieni presente che i messaggi possono contenere più blocchi di contenuto (text, tool_use, thinking). I blocchi di utilizzo di strumenti e pensiero esteso non possono essere recuperati parzialmente. Puoi riprendere lo streaming dal blocco di testo più recente.

    Was this page helpful?

    • Streaming con gli SDK
    • Ottenere il messaggio finale senza gestire gli eventi
    • Tipi di evento
    • Eventi ping
    • Eventi di errore
    • Altri eventi
    • Tipi di delta del blocco di contenuto
    • Delta di testo
    • Delta JSON di input
    • Delta di pensiero
    • Risposta completa del flusso HTTP
    • Richiesta di streaming di base
    • Richiesta di streaming con utilizzo di strumenti
    • Richiesta di streaming con pensiero esteso
    • Richiesta di streaming con utilizzo di strumento di ricerca web
    • Recupero degli errori
    • Claude 4.5 e versioni precedenti
    • Claude 4.6
    • Migliori pratiche per il recupero degli errori
    client = anthropic.Anthropic()
    
    with client.messages.stream(
        max_tokens=128000,
        messages=[{"role": "user", "content": "Write a detailed analysis..."}],
        model="claude-opus-4-7",
    ) as stream:
        message = stream.get_final_message()
    
    print(message.content[0].text)
    client = anthropic.Anthropic()
    
    with client.messages.stream(
        model="claude-opus-4-7",
        messages=[{"role": "user", "content": "Hello"}],
        max_tokens=256,
    ) as stream:
        for text in stream.text_stream:
            print(text, end="", flush=True)
    client = anthropic.Anthropic()
    
    tools = [
        {
            "name": "get_weather",
            "description": "Get the current weather in a given location",
            "input_schema": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA",
                    }
                },
                "required": ["location"],
            },
        }
    ]
    
    with client.messages.stream(
        model="claude-opus-4-7",
        max_tokens=1024,
        tools=tools,
        tool_choice={"type": "any"},
        messages=[
            {"role": "user", "content": "What is the weather like in San Francisco?"}
        ],
    ) as stream:
        for text in stream.text_stream:
            print(text, end="", flush=True)
    client = anthropic.Anthropic()
    
    with client.messages.stream(
        model="claude-opus-4-7",
        max_tokens=20000,
        thinking={"type": "adaptive", "display": "summarized"},
        messages=[
            {
                "role": "user",
                "content": "What is the greatest common divisor of 1071 and 462?",
            }
        ],
    ) as stream:
        for event in stream:
            if event.type == "content_block_delta":
                if event.delta.type == "thinking_delta":
                    print(event.delta.thinking, end="", flush=True)
                elif event.delta.type == "text_delta":
                    print(event.delta.text, end="", flush=True)
    client = anthropic.Anthropic()
    
    with client.messages.stream(
        model="claude-opus-4-7",
        max_tokens=1024,
        tools=[{"type": "web_search_20250305", "name": "web_search", "max_uses": 5}],
        messages=[
            {"role": "user", "content": "What is the weather like in New York City today?"}
        ],
    ) as stream:
        for text in stream.text_stream:
            print(text, end="", flush=True)