Loading...
    • Panduan Pengembang
    • Referensi API
    • MCP
    • Sumber daya
    • Catatan rilis
    Search...
    ⌘K
    Langkah pertama
    Pengenalan ClaudeMulai cepat
    Model & harga
    Ikhtisar modelMemilih modelYang baru di Claude 4.6Panduan migrasiPenghentian modelHarga
    Bangun dengan Claude
    Ikhtisar fiturMenggunakan Messages APIMenangani alasan berhentiPraktik terbaik prompting
    Manajemen konteks
    Jendela konteksKompresiPengeditan konteks
    Kemampuan
    Caching promptPemikiran diperpanjangPemikiran adaptifUpayaStreaming pesanPemrosesan batchKutipanDukungan multibahasaPenghitungan tokenEmbeddingsVisiDukungan PDFFiles APIHasil pencarianOutput terstruktur
    Alat
    IkhtisarCara mengimplementasikan penggunaan alatStreaming alat berbutir halusAlat BashAlat eksekusi kodePemanggilan alat terprogramAlat penggunaan komputerAlat editor teksAlat pengambilan webAlat pencarian webAlat memoriAlat pencarian alat
    Keterampilan Agen
    IkhtisarMulai cepatPraktik terbaikKeterampilan untuk perusahaanMenggunakan Keterampilan dengan API
    Agent SDK
    IkhtisarMulai cepatTypeScript SDKTypeScript V2 (pratinjau)Python SDKPanduan migrasi
    Input streamingStreaming respons secara real-timeMenangani alasan berhentiMenangani izinPersetujuan pengguna dan inputKontrol eksekusi dengan hookManajemen sesiCheckpointing fileOutput terstruktur di SDKHosting Agent SDKPenyebaran agen AI dengan amanMemodifikasi prompt sistemMCP di SDKAlat kustomSubagen di SDKPerintah garis miring di SDKKeterampilan agen di SDKPelacakan biaya dan penggunaanDaftar tugasPlugin di SDK
    MCP di API
    Konektor MCPServer MCP jarak jauh
    Claude di platform pihak ketiga
    Amazon BedrockMicrosoft FoundryVertex AI
    Rekayasa prompt
    IkhtisarGenerator promptGunakan template promptPenyempurna promptJadilah jelas dan langsungGunakan contoh (prompting multishot)Biarkan Claude berpikir (CoT)Gunakan tag XMLBerikan Claude peran (prompt sistem)Rantai prompt kompleksTips konteks panjangTips pemikiran diperpanjang
    Uji & evaluasi
    Tentukan kriteria kesuksesanKembangkan kasus ujiMenggunakan alat evaluasiMengurangi latensi
    Perkuat penjaga
    Kurangi halusinasiTingkatkan konsistensi outputMitigasi jailbreakStreaming penolakanKurangi kebocoran promptJaga Claude tetap dalam karakter
    Administrasi dan pemantauan
    Ikhtisar Admin APIResidensi dataRuang kerjaAPI penggunaan dan biayaClaude Code Analytics APIRetensi data nol
    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
    • Catalog
    • 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
    • Catalog
    • 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
    Panduan

    Streaming respons secara real-time

    Dapatkan respons real-time dari Agent SDK saat teks dan pemanggilan alat mengalir

    Secara default, Agent SDK menghasilkan objek AssistantMessage lengkap setelah Claude selesai menghasilkan setiap respons. Untuk menerima pembaruan inkremental saat teks dan pemanggilan alat dihasilkan, aktifkan streaming pesan parsial dengan menetapkan include_partial_messages (Python) atau includePartialMessages (TypeScript) ke true dalam opsi Anda.

    Halaman ini mencakup streaming output (menerima token secara real-time). Untuk mode input (cara Anda mengirim pesan), lihat Kirim pesan ke agen. Anda juga dapat streaming respons menggunakan Agent SDK melalui CLI.

    Aktifkan streaming output

    Untuk mengaktifkan streaming, atur include_partial_messages (Python) atau includePartialMessages (TypeScript) ke true dalam opsi Anda. Ini menyebabkan SDK menghasilkan pesan StreamEvent yang berisi peristiwa API mentah saat tiba, selain AssistantMessage dan ResultMessage yang biasa.

    Kode Anda kemudian perlu:

    1. Memeriksa tipe setiap pesan untuk membedakan StreamEvent dari tipe pesan lainnya

    Was this page helpful?

    • Aktifkan streaming output
    • Referensi StreamEvent
    • Alur pesan
    • Streaming respons teks
    • Streaming pemanggilan alat
    • Bangun UI streaming
    • Keterbatasan yang diketahui
    • Langkah berikutnya
  1. Untuk StreamEvent, ekstrak bidang event dan periksa type-nya
  2. Cari peristiwa content_block_delta di mana delta.type adalah text_delta, yang berisi potongan teks sebenarnya
  3. Contoh di bawah ini mengaktifkan streaming dan mencetak potongan teks saat tiba. Perhatikan pemeriksaan tipe bersarang: pertama untuk StreamEvent, kemudian untuk content_block_delta, kemudian untuk text_delta:

    from claude_agent_sdk import query, ClaudeAgentOptions
    from claude_agent_sdk.types import StreamEvent
    import asyncio
    
    async def stream_response():
        options = ClaudeAgentOptions(
            include_partial_messages=True,
            allowed_tools=["Bash", "Read"],
        )
    
        async for message in query(prompt="List the files in my project", options=options):
            if isinstance(message, StreamEvent):
                event = message.event
                if event.get("type") == "content_block_delta":
                    delta = event.get("delta", {})
                    if delta.get("type") == "text_delta":
                        print(delta.get("text", ""), end="", flush=True)
    
    asyncio.run(stream_response())

    Referensi StreamEvent

    Ketika pesan parsial diaktifkan, Anda menerima peristiwa streaming API Claude mentah yang dibungkus dalam objek. Tipe memiliki nama berbeda di setiap SDK:

    • Python: StreamEvent (impor dari claude_agent_sdk.types)
    • TypeScript: SDKPartialAssistantMessage dengan type: 'stream_event'

    Keduanya berisi peristiwa API Claude mentah, bukan teks terakumulasi. Anda perlu mengekstrak dan mengakumulasi delta teks sendiri. Berikut adalah struktur setiap tipe:

    @dataclass
    class StreamEvent:
        uuid: str                      # Unique identifier for this event
        session_id: str                # Session identifier
        event: dict[str, Any]          # The raw Claude API stream event
        parent_tool_use_id: str | None # Parent tool ID if from a subagent

    Bidang event berisi peristiwa streaming mentah dari Claude API. Tipe peristiwa umum meliputi:

    Tipe PeristiwaDeskripsi
    message_startAwal pesan baru
    content_block_startAwal blok konten baru (teks atau penggunaan alat)
    content_block_deltaPembaruan inkremental ke konten
    content_block_stopAkhir blok konten
    message_deltaPembaruan tingkat pesan (alasan berhenti, penggunaan)
    message_stopAkhir pesan

    Alur pesan

    Dengan pesan parsial diaktifkan, Anda menerima pesan dalam urutan ini:

    StreamEvent (message_start)
    StreamEvent (content_block_start) - text block
    StreamEvent (content_block_delta) - text chunks...
    StreamEvent (content_block_stop)
    StreamEvent (content_block_start) - tool_use block
    StreamEvent (content_block_delta) - tool input chunks...
    StreamEvent (content_block_stop)
    StreamEvent (message_delta)
    StreamEvent (message_stop)
    AssistantMessage - complete message with all content
    ... tool executes ...
    ... more streaming events for next turn ...
    ResultMessage - final result

    Tanpa pesan parsial diaktifkan (include_partial_messages di Python, includePartialMessages di TypeScript), Anda menerima semua tipe pesan kecuali StreamEvent. Tipe umum meliputi SystemMessage (inisialisasi sesi), AssistantMessage (respons lengkap), ResultMessage (hasil akhir), dan CompactBoundaryMessage (menunjukkan kapan riwayat percakapan dipadatkan).

    Streaming respons teks

    Untuk menampilkan teks saat dihasilkan, cari peristiwa content_block_delta di mana delta.type adalah text_delta. Ini berisi potongan teks inkremental. Contoh di bawah ini mencetak setiap potongan saat tiba:

    from claude_agent_sdk import query, ClaudeAgentOptions
    from claude_agent_sdk.types import StreamEvent
    import asyncio
    
    async def stream_text():
        options = ClaudeAgentOptions(include_partial_messages=True)
    
        async for message in query(prompt="Explain how databases work", options=options):
            if isinstance(message, StreamEvent):
                event = message.event
                if event.get("type") == "content_block_delta":
                    delta = event.get("delta", {})
                    if delta.get("type") == "text_delta":
                        # Print each text chunk as it arrives
                        print(delta.get("text", ""), end="", flush=True)
    
        print()  # Final newline
    
    asyncio.run(stream_text())

    Streaming pemanggilan alat

    Pemanggilan alat juga streaming secara inkremental. Anda dapat melacak kapan alat dimulai, menerima input mereka saat dihasilkan, dan melihat kapan mereka selesai. Contoh di bawah ini melacak alat saat ini yang dipanggil dan mengakumulasi input JSON saat mengalir. Ini menggunakan tiga tipe peristiwa:

    • content_block_start: alat dimulai
    • content_block_delta dengan input_json_delta: potongan input tiba
    • content_block_stop: pemanggilan alat selesai
    from claude_agent_sdk import query, ClaudeAgentOptions
    from claude_agent_sdk.types import StreamEvent
    import asyncio
    
    async def stream_tool_calls():
        options = ClaudeAgentOptions(
            include_partial_messages=True,
            allowed_tools=["Read", "Bash"],
        )
    
        # Track the current tool and accumulate its input JSON
        current_tool = None
        tool_input = ""
    
        async for message in query(prompt="Read the README.md file", options=options):
            if isinstance(message, StreamEvent):
                event = message.event
                event_type = event.get("type")
    
                if event_type == "content_block_start":
                    # New tool call is starting
                    content_block = event.get("content_block", {})
                    if content_block.get("type") == "tool_use":
                        current_tool = content_block.get("name")
                        tool_input = ""
                        print(f"Starting tool: {current_tool}")
    
                elif event_type == "content_block_delta":
                    delta = event.get("delta", {})
                    if delta.get("type") == "input_json_delta":
                        # Accumulate JSON input as it streams in
                        chunk = delta.get("partial_json", "")
                        tool_input += chunk
                        print(f"  Input chunk: {chunk}")
    
                elif event_type == "content_block_stop":
                    # Tool call complete - show final input
                    if current_tool:
                        print(f"Tool {current_tool} called with: {tool_input}")
                        current_tool = None
    
    asyncio.run(stream_tool_calls())

    Bangun UI streaming

    Contoh ini menggabungkan streaming teks dan alat menjadi UI yang kohesif. Ini melacak apakah agen saat ini menjalankan alat (menggunakan bendera in_tool) untuk menampilkan indikator status seperti [Using Read...] saat alat berjalan. Teks mengalir secara normal ketika tidak dalam alat, dan penyelesaian alat memicu pesan "done". Pola ini berguna untuk antarmuka obrolan yang perlu menunjukkan kemajuan selama tugas agen multi-langkah.

    from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
    from claude_agent_sdk.types import StreamEvent
    import asyncio
    import sys
    
    async def streaming_ui():
        options = ClaudeAgentOptions(
            include_partial_messages=True,
            allowed_tools=["Read", "Bash", "Grep"],
        )
    
        # Track whether we're currently in a tool call
        in_tool = False
    
        async for message in query(
            prompt="Find all TODO comments in the codebase",
            options=options
        ):
            if isinstance(message, StreamEvent):
                event = message.event
                event_type = event.get("type")
    
                if event_type == "content_block_start":
                    content_block = event.get("content_block", {})
                    if content_block.get("type") == "tool_use":
                        # Tool call is starting - show status indicator
                        tool_name = content_block.get("name")
                        print(f"\n[Using {tool_name}...]", end="", flush=True)
                        in_tool = True
    
                elif event_type == "content_block_delta":
                    delta = event.get("delta", {})
                    # Only stream text when not executing a tool
                    if delta.get("type") == "text_delta" and not in_tool:
                        sys.stdout.write(delta.get("text", ""))
                        sys.stdout.flush()
    
                elif event_type == "content_block_stop":
                    if in_tool:
                        # Tool call finished
                        print(" done", flush=True)
                        in_tool = False
    
            elif isinstance(message, ResultMessage):
                # Agent finished all work
                print(f"\n\n--- Complete ---")
    
    asyncio.run(streaming_ui())

    Keterbatasan yang diketahui

    Beberapa fitur SDK tidak kompatibel dengan streaming:

    • Extended thinking: ketika Anda secara eksplisit menetapkan max_thinking_tokens (Python) atau maxThinkingTokens (TypeScript), pesan StreamEvent tidak dipancarkan. Anda hanya akan menerima pesan lengkap setelah setiap giliran. Perhatikan bahwa pemikiran dinonaktifkan secara default di SDK, jadi streaming berfungsi kecuali Anda mengaktifkannya.
    • Structured output: hasil JSON muncul hanya di ResultMessage.structured_output akhir, bukan sebagai delta streaming. Lihat structured outputs untuk detail.

    Langkah berikutnya

    Sekarang yang Anda dapat streaming teks dan pemanggilan alat secara real-time, jelajahi topik terkait ini:

    • Interactive vs one-shot queries: pilih antara mode input untuk kasus penggunaan Anda
    • Structured outputs: dapatkan respons JSON yang diketik dari agen
    • Permissions: kontrol alat mana yang dapat digunakan agen