Tutorial API Grok Voice Think Fast 2.0: Bangun Agen Suara Real-Time di Python
Pelajari cara menggunakan Grok Voice Think Fast 2.0 untuk membangun agen suara real-time yang menangani percakapan lisan, memanggil tool, mengelola interupsi, dan melanjutkan sesi yang terputus.
Grok Voice Think Fast 2.0 dari SpaceXAI adalah model speech-to-speech. Anda mengirim audio melalui WebSocket dan ia mengirimkan audio kembali; di antaranya, model dapat bernalar dan terus berbicara sementara panggilan fungsi yang dipilihnya sudah berjalan. Tidak ada langkah terpisah untuk speech-to-text, tidak ada langkah terpisah untuk text-to-speech.
SpaceXAI mengumumkan Think Fast 2.0 pada 29 Juli 2026: audio pertama lebih cepat, perilaku full-duplex lebih stabil (mendengarkan sambil berbicara alih-alih bergiliran ketat), dan pemanggilan tool yang mengeksekusi lebih awal dalam satu giliran. Saya akan singkat soal tolok ukur, karena yang penting untuk tutorial adalah apa yang berubah di kode Anda.
Kita akan membangun agen suara dukungan pelanggan untuk toko online. Penelepon dapat menanyakan pesanan, mengubah instruksi pengiriman, membatalkan, menyela agen di tengah kalimat, dan melanjutkan percakapan setelah koneksi terputus. Ini jalur API, bukan Voice Agent Builder tanpa kode yang dijelaskan oleh tutorial Grok Voice Agent Builder kami. Mulailah dari sana untuk versi berbasis konsol.
Apa Itu Grok Voice Think Fast 2.0?
Grok Voice Think Fast 2.0 adalah model terbaru SpaceXAI untuk Speech to Speech API, nama produk di balik apa yang kebanyakan orang sebut Grok Voice. Jika Anda masih menganggap perusahaannya sebagai xAI, sama saja: perusahaan tersebut dilebur ke SpaceX dan berganti nama menjadi SpaceXAI pada 6 Juli 2026. API tidak ikut rebranding, jadi setiap pengenal di bawah tetap bertuliskanxai, dari variabel XAI_API_KEY hingga hostapi.x.ai.
Tumpukan suara tradisional merangkai tiga layanan: speech-to-text, model bahasa, lalu text-to-speech, dan setiap lompatan menambah latensi serta titik di mana konteks bisa hilang. Think Fast 2.0 merangkum semuanya menjadi satu model yang menerima audio atau teks dan menghasilkan audio atau teks melalui koneksi yang sama.
WebSocket speech-to-speech versus arsitektur pipeline tiga layanan. Gambar oleh Penulis.
Untuk agen yang bertindak alih-alih hanya berbicara, yang penting adalah penalaran dan ucapan berjalan paralel. SpaceXAI mengatakan pemanggilan tool "biasanya" mulai dieksekusi sebelum agen menyelesaikan kalimat pertamanya, dan kata itu memang berarti.
Pada tolok ukur yang dikutip SpaceXAI dari Artificial Analysis, Think Fast 2.0 meraih 82,9% pada Speech to Speech Index dibanding 75,7% untuk 1.0, dan memangkas waktu ke audio pertama dari 1,25 detik menjadi 0,70 detik. Angka vendor pada tolok ukur umum adalah hipotesis tentang alur penelepon Anda, bukan rencana pengujian.
Ada tiga string model yang akan Anda lihat: grok-voice-latest, grok-voice-think-fast-2.0, dan grok-voice-think-fast-1.0. Alias berguna saat prototyping dan tidak cukup stabil untuk yang lain.
Saat saya uji pada 4 Agustus 2026, grok-voice-latest masih mengarah ke grok-voice-think-fast-1.0, dengan catatan rilis SpaceXAI menjadwalkan perpindahan ke Think Fast 2.0 untuk hari berikutnya. Pergantian itu adalah perubahan harga sekaligus perubahan model, $0,08 per menit audio dibanding $0,05 untuk 1.0, jadi alias yang tidak dipatok versi menjadi lebih mahal tanpa satu baris kode Anda berubah. Patok string versi pada apa pun yang Anda deploy.
Apa yang Akan Kita Bangun
Agen mencakup pertanyaan umum pada jalur dukungan: melihat pesanan, mencari dari email saat penelepon tidak punya nomor, mengubah instruksi pengiriman, membatalkan, membuka atau memeriksa tiket, dan mengalihkan panggilan ke manusia. Interupsi dan koneksi terputus akan muncul di sepanjang jalan.
Ini terdiri dari beberapa berkas kecil, bukan satu skrip, karena tiap bagian punya tugas berbeda dan Anda akan ingin mengujinya terpisah. Inilah strukturnya:
config.py memuat kunci API dan menyimpan string model, sample rate, dan URL endpoint
voice_client.pymembungkus WebSocket, melacak penagihan, dan menyediakan helper kirim/terima
tools.py mendefinisikan fungsi pesanan dan penyimpanan pesanan kecil di memori sebagai pengganti database nyata
assistant.pymenyimpan prompt sistem, konfigurasi sesi, dan event loop yang mengikat semuanya
token_server.py adalah endpoint FastAPI kecil yang mencetak token sesaat
app_streamlit.py menempatkan klien yang sama di balik panggilan langsung di browser, yang akan saya bahas kembali setelah bagian pengujian
Alur pembelajaran berjalan dari terminal. Demo menambahkan mikrofon.
Prasyarat
Anda memerlukan akun SpaceXAI dengan kunci API, pengaturan penagihan yang didanai (tidak ada level gratis permanen, dan kredit promosi akun baru tidak akan mencukupi), serta cukup nyaman dengan asyncio dan WebSocket untuk mengikuti tanpa penjelasan baris-per-baris tentang await.
Contoh quick-start SpaceXAI menggunakan paket websockets mentah alih-alih SDK khusus, dan kita juga begitu. Dokumentasi tidak menyatakan versi Python yang dibutuhkan. Saya menguji pada 3.11.
Simpan kunci API di server. Jika aplikasi browser atau mobile berbicara langsung ke Voice API, ia mendapatkan token sesaat alih-alih kunci asli Anda, dibahas pada bagian keamanan di bawah.
Menyiapkan proyek
Setiap berkas di bawah ada di repo proyek, jadi Anda bisa mengklonnya alih-alih menyalin potongan kode:
git clone https://github.com/KhalidAbdelaty/grok-voice-think-fast-2.0.git
cd grok-voice-think-fast-2.0
pip install-r requirements.txtDidukung oleh
websockets membawa koneksi realtime danpython-dotenv membaca kunci Anda. Sisanya untuk endpoint token dan demo browser. Letakkan kunci Anda di .env:
Itu sebagian besar penyiapannya. Koneksi adalah bagian yang menarik.
Memahami Grok Voice Realtime API
Grok Voice adalah nama produk. Yang benar-benar Anda tulis kodenya adalah endpoint WebSocket di wss://api.x.ai/v1/realtime, dan seluruh percakapan terjadi sebagai aliran event JSON melalui satu soket itu.
Siklus hidup event
Koneksi mengikuti pola tetap: server mengirim session.createddan conversation.created segera setelah Anda terhubung, Anda mengirim session.updateuntuk mengonfigurasi voice dan tool, server mengonfirmasi dengan session.updated, dan dari sana Anda membuat item percakapan dan meminta respons. Saya menjalankan ini dengan kunci langsung dan urutannya persis seperti di dokumen.
session.update(klien) mengonfigurasi voice, instruksi, tool, dan format audio
conversation.item.create(klien) menambahkan pesan pengguna, pesan asisten, atau hasil tool
response.create(klien) meminta model untuk berbicara; VAD server mengirim ini untuk Anda secara otomatis
response.output_audio.delta dan response.output_audio_transcript.delta(server) mengalirkan balasan saat dihasilkan
response.done(server) menutup giliran
Ada dua hal yang sering menjebak orang. Halaman dokumentasi Speech to Speech yang saya tautkan di atas menyebut event conversation.item.created selama melanjutkan sesi, tetapi referensi event kanonik hanya mencantumkan conversation.item.added, dan itulah yang tiba di setiap pengujian yang saya jalankan, jadi kodinglah berdasarkan itu. Anda juga akan melihat event pingtak terdokumentasi beberapa detik setelah kebanyakan koneksi, disebutkan agar Anda tidak membacanya sebagai error.
Format audio dan transport
Codec dan transport adalah pilihan terpisah. Codec, disetel di audio.input.formatdanaudio.output.format, adalah audio/pcm (Linear16, bawaan 24000 Hz), audio/pcmu atauaudio/pcma(G.711 pada 8 kHz, untuk telepon), atauaudio/opus (24 kHz). Transport adalah cara byte tersebut dikirim di wire:
json (bawaan) mengirim audio sebagai teks base64 di dalam input_audio_buffer.appenddan response.output_audio.delta, mudah untuk logging dan debug
binarymengirim byte codec mentah sebagai frame biner WebSocket, melewati overhead base64 dengan biaya loop penerima yang harus bercabang pada jenis pesan
Mulai dengan JSON. Setiap contoh di dokumen menggunakannya, mudah diinspeksi, dan overhead base64 bukanlah penghambat untuk build agen dukungan. Pindah ke biner jika Anda mengukur alasan yang kuat.
Kompatibilitas dengan OpenAI Realtime API
Lewati jika Anda belum pernah menyentuh OpenAI Realtime API. Bagi yang lain, Speech to Speech API mengikuti OpenAI Realtime API cukup dekat sehingga sebagian besar kode klien dapat dipindahkan dengan mengganti base URL dan kunci, tetapi bukan pengganti sempurna.
Transkrip tiba sebagai conversation.item.input_audio_transcription.updated di sini alih-alih delta milik OpenAI, beberapa event OpenAI tidak didukung, dan SpaceXAI menambahkan ekstensi sendiri: force_message untuk baris pengungkapan yang terprogram,resumption untuk sambungan ulang, dan replaceuntuk memperbaiki pengucapan nama merek sebelum text-to-speech.
Membangun Agen Suara Real-Time
Cukup soal protokol. Berikut klien yang berbicara dengannya.
Menyambungkan dan mengonfigurasi sesi
Koneksi dibuka dengan bearer token dan parameter kueri model, dan pesan pertama yang Anda kirim mengonfigurasi semua perilaku agen:
import asyncio
import json
import os
import websockets
MODEL ="grok-voice-think-fast-2.0"# pin the version, not grok-voice-latestasyncdefconnect():
url =f"wss://api.x.ai/v1/realtime?model={MODEL}"
ws =await websockets.connect(
url, additional_headers={"Authorization":f"Bearer {os.environ['XAI_API_KEY']}"})await ws.send(json.dumps({"type":"session.update","session":{"voice":"eve","instructions": SYSTEM_PROMPT,"turn_detection":{"type":"server_vad"},"tools": ORDER_TOOLS,"resumption":{"enabled":True},}}))return wsDidukung oleh
instructions adalah prompt sistem, dan model ini menginginkan yang singkat. Catatan migrasi SpaceXAI menyarankan untuk menyederhanakan prompt yang ditulis untuk model suara era GPT ketimbang memindahkannya mentah-mentah. Prompt saya menyuruh agen menjaga jawaban tetap singkat, bertanya satu per satu, dan membacakan apa pun yang akan ditulis sebelum bertindak. Konfirmasi lisan adalah nicety UX, bukan kontrol keamanan. Aplikasi Anda tetap menegakkan otorisasi pada aksi tulisnya.
Satu hal yang mengejutkan saya: string model yang tidak dikenali tidak memunculkan error saat koneksi, melainkan diam-diam jatuh kembali kegrok-voice-think-fast-1.0. Menurunkan permintaan berbayar karena salah ketik, tanpa memberi tahu, adalah default yang aneh. Log bidang session.model pada session.created sekali saat startup dan periksa apakah Anda mendapatkan yang diminta.
Keluaran terminal menampilkan session.created setelah tersambung. Gambar oleh Penulis.
Melakukan streaming audio pengguna
Dengan turn_detection.type disetel ke server_vad, Anda hanya perlu terus menambahkan audio. Server memutuskan kapan penelepon berhenti berbicara dan memicu respons untuk Anda. Setel ke null dan Anda yang memutuskan sendiri, mengkomit buffer secara eksplisit saat Anda yakin gilirannya selesai.
asyncdefsend_audio_chunk(ws, pcm_bytes:bytes):await ws.send(json.dumps({"type":"input_audio_buffer.append","audio": base64.b64encode(pcm_bytes).decode(),}))Didukung oleh
Server VAD punya tiga kenop, dan menyetelnya salah adalah cara paling umum saya melihat agen suara terasa rusak sementara tidak ada error di log. Tidak satu pun muncul pada echo session.updated secara bawaan, jadi periksa terhadap dokumen alih-alih berasumsi.
threshold (0,1 hingga 0,9, bawaan 0,85), seberapa keras audio agar dihitung sebagai ucapan; naikkan di ruangan bising, turunkan jika penutur pelan sering terlewat
silence_duration_ms, berapa lama penelepon hening sebelum server mengakhiri gilirannya; terlalu pendek memotong orang di tengah pikiran, terlalu lama terasa lamban
prefix_padding_ms (bawaan 333), potongan audio yang disimpan tepat sebelum ucapan terdeteksi, agar suku kata pertama tidak terpotong
Setel silence_duration_mslebih dulu jika penelepon sering terpotong saat jeda berpikir. Itu yang saya ubah sebelum menyentuh dua kenop lainnya.
Menerima dan memutar respons
Audio tiba dalam potongan kecil sebagai response.output_audio.delta, dan poin dari streaming adalah Anda memutar setiap potongan begitu mendarat alih-alih menunggu response.done.
asyncdefplay_response(ws):asyncfor message in ws:
event = json.loads(message)if event["type"]=="response.output_audio.delta":
chunk = base64.b64decode(event["delta"])
speaker.write(chunk)# your playback call goes hereelif event["type"]=="response.output_audio_transcript.delta":print(event["delta"], end="", flush=True)Didukung oleh
Simpan transkrip bahkan di produksi. Ini alat debug termurah saat penelepon berkata agen "mengucapkan sesuatu yang aneh."
Menambahkan Tool ke Agen Suara
Agen suara yang hanya berbicara adalah chatbot dengan mikrofon.
Membuat tool pesanan
Setiap tool adalah skema JSON plus fungsi Python biasa di sisi kita. Model tidak pernah menyentuh database, ia hanya melihat apa yang dikembalikan fungsi kita.
ORDER_TOOLS =[{"type":"function","name":"check_order_status","description":"Look up the status, ETA, and delivery instructions for an order.","parameters":{"type":"object","properties":{"order_number":{"type":"string","description":"e.g. ORD-1042"},},"required":["order_number"],},},# find_orders, update_delivery_instructions, cancel_order,# create_support_ticket, check_ticket_status and transfer_to_human# all follow the same shape]Didukung oleh
Operasi baca seperti check_order_status aman diulangi jika terjadi timeout. Operasi tulis tidak: mengulangi update_delivery_instructions setelah timeout ambigu dapat menerapkan perubahan yang sama dua kali. Baris konfirmasi di prompt tidak menghentikannya, jadi beri tulis kunci idempoten atau pemeriksaan duplikasi.
Letakkan juga penolakan di fungsi. cancel_order mengembalikan alasan dan alternatif alih-alih membatalkan pesanan yang sudah dikirim, karena prompt yang mengatakan "jangan pernah membatalkan pesanan yang sudah dikirim" adalah saran sementara fungsi yang menolak adalah aturan.
Menangani loop pemanggilan tool
Empat langkah, dan urutannya lebih penting dari yang terlihat. Model mengirim response.function_call_arguments.done, kode Anda menjalankan fungsi, Anda mengirim hasil kembali sebagai item function_call_output, dan barulah Anda meminta model untuk melanjutkan.
asyncdefhandle_tool_call(ws, event):
args = json.loads(event["arguments"])
result = execute(event["name"], args)# never raises; errors come back as {"error": ...}await ws.send(json.dumps({"type":"conversation.item.create","item":{"type":"function_call_output","call_id": event["call_id"],"output": json.dumps(result),},}))Didukung oleh
Jika model membutuhkan lebih dari satu tool untuk satu permintaan, ia menembakkan beberapa event function_call_arguments.donesebelum audio apa pun diputar. Selesaikan semuanya dan kirim setiap hasil sebelum satu response.create pun. Mengirimnya terlalu cepat membuat model menjawab tanpa konteks dari panggilan yang masih berjalan.
Ada jebakan yang didokumentasikan SpaceXAI dan tetap saya alami di percobaan pertama: mengirim response.create tepat saat hasil tool Anda dikirim bisa tumpang tindih dengan kalimat pembuka yang masih diputar agen. Dalam satu kali jalan, agen membuka dengan "Saya akan memeriksa status pesanan ORD-1042 sekarang" dan memanggil tool di tengah kalimat, jadi respons yang langsung dikirim akan menimpa kalimat pembukanya sendiri.
Tunggu audio giliran saat ini selesai, dan tampilkan status "berpikir" singkat di antaranya.
Alur panggilan tool sebelum melanjutkan respons. Gambar oleh Penulis.
Mengelola Interupsi dan Status Percakapan
Ada dua masalah terpisah. Penelepon berbicara di atas agen di tengah respons, dan WebSocket terputus dan perlu dilanjutkan kembali.
Mendukung interupsi yang natural
Dengan server_vad aktif, barge-in otomatis di sisi server: begitu mendeteksi penelepon berbicara lagi, ia memberi sinyal input_audio_buffer.speech_started dan menghentikan generasi respons lama. Tugas Anda adalah separuh jabat tangan di klien, mengosongkan audio yang sudah antre agar agen diam alih-alih menyelesaikan kalimat yang tak lagi diminta.
if event["type"]=="input_audio_buffer.speech_started":
playback_queue.clear()Didukung oleh
Untuk sesi manual tanpa VAD, response.cancel melakukan hal yang sama atas permintaan. Ada juga conversation.item.truncateuntuk memangkas item asisten ke apa yang benar-benar terdengar. Dokumen mengonfirmasi fitur ini ada namun tidak kapan harus menembakkannya selama barge-in langsung, jadi uji waktunya sendiri.
Saya menguji ini dengan perubahan instruksi pengiriman di tengah respons: mulai permintaan, sela dengan alamat berbeda saat konfirmasi agen masih berjalan. Yang penting adalah apakah agen menerapkan instruksi yang dikoreksi alih-alih diam-diam menyelesaikan yang lama, bukan apakah audio berhenti. Pastikan terhadap catatan pesanan, bukan keheningan. Demo browser di akhir memungkinkan Anda mendengar ini.
Melanjutkan sesi yang terputus
Melanjutkan sesi bersifat opt-in dan ini bukan memori. Setel resumption.enabled: true pada session.update, ambil ID dari event conversation.created, dan jika soket terputus, sambungkan ulang dengan ?conversation_id=<id> di URL dan lakukan opt-in lagi pada koneksi baru.
asyncdefreconnect(conversation_id):
url =f"wss://api.x.ai/v1/realtime?model={MODEL}&conversation_id={conversation_id}"
ws =await websockets.connect(url, additional_headers=auth_header)await ws.send(json.dumps({"type":"session.update","session":{"resumption":{"enabled":True}}}))return wsDidukung oleh
Giliran yang di-cache, transkrip, pemanggilan tool, dan hasil tool akan diputar ulang sebelum pertanyaan Anda berikutnya, dan cache hilang setelah 30 menit tanpa aktivitas. Saya mengujinya dengan menanyakan pesanan, memutus koneksi, lalu menyambung lagi untuk pertanyaan lanjutan tanpa mengulang; agen melanjutkan ETA dengan benar.
Satu hal tak terdokumentasi: pemutaran ulang tidak mendarat seketika, jadi pertanyaan yang dikirim tepat saat soket terbuka bisa mendahuluinya dan kembali tanpa ingatan tentang giliran sebelumnya. Beri jeda sedetik sebelum Anda menyalahkan resumption.
Log terminal dari sesi yang dilanjutkan. Gambar oleh Penulis.
Jangan gunakan ini sebagai pengganti menyimpan status pesanan ke database Anda sendiri. Jika cache kedaluwarsa atau penelepon menelepon lagi besok, Anda mulai dari nol konteks, dan itu memang dirancang demikian.
Mengamankan dan Memantau Agen
Jangan pernah menempatkan kunci API permanen di kode browser atau mobile. Jika klien terhubung langsung alih-alih melalui server Anda, cetak token berumur pendek:
from fastapi import FastAPI
import httpx, os
app = FastAPI()@app.post("/session")asyncdefcreate_session():asyncwith httpx.AsyncClient()as client:
response =await client.post("https://api.x.ai/v1/realtime/client_secrets",
headers={"Authorization":f"Bearer {os.environ['XAI_API_KEY']}"},
json={"expires_after":{"seconds":300}},)return response.json()# {"value": "xai-realtime-client-secret-...", "expires_at": ...}Didukung oleh
Browser tidak dapat menyetel header Authorization kustom pada handshake WebSocket, jadi ia meneruskan token melalui header sec-websocket-protocol, diawali dengan xai-client-secret..
Server mencetak token, browser bergabung ke panggilan. Gambar oleh Penulis.
Penagihan berjalan pada dua meter. Audio, yang dikirim atau diterima, berjalan pada $0,08 per menit seperti yang disebutkan sebelumnya, yaitu $4,80 per jam, dan setiap conversation.item.create yang bukan audio dan bukan function_call_output dikenai biaya tetap $0,004. response.create tidak ditagih sama sekali. Setiap response.done membawa objek usage, yang dalam uji saya melaporkan output_audio_seconds bersama billable_audio_seconds terpisah. Tagih dari itu, bukan dari perkiraan.
Batas terdokumentasi pada Speech to Speech API adalah 10 sesi bersamaan per tim dan batas sesi 120 menit, keduanya di us-east-1. Jangan merencanakan kapasitas dari angka Voice Agent API, yang berbeda.
Soal privasi, bersikaplah presisi. FAQ keamanan SpaceXAI mengatakan permintaan dan respons API disimpan terenkripsi selama 30 hari untuk pemantauan penyalahgunaan dan tidak digunakan untuk pelatihan tanpa izin, serta tim dapat mengaktifkan Zero Data Retention, meskipun ZDR menghapus riwayat percakapan agen suara yang dipersisten dan karenanya tidak bekerja dengan resumption.
Jika Anda mengungkapkan bahwa panggilan direkam atau ditangani AI, di situlah ekstensi force_message yang saya sebutkan sebelumnya berperan. Baris tersebut diputar persis seperti yang ditulis alih-alih apa pun yang diparafrasekan model.
Menguji Agen Suara
Status 200 pada handshake WebSocket tidak memberi tahu apakah agen melakukan hal yang benar. Ujilah hasilnya, bukan hanya koneksinya.
Pencarian pesanan yang bersih, memeriksa jawaban lisan melawan catatan, bukan hanya bahwa respons tiba
Respons yang disela, memastikan pemutaran berhenti dan agen menanggapi permintaan baru
Pembaruan pengiriman yang memerlukan konfirmasi, diperiksa terhadap catatan pesanan
Penolakan, seperti membatalkan pesanan terkirim, di mana agen harus menjelaskan aturan alih-alih meminta maaf
Nomor pesanan tidak dikenal, memastikan agen mengatakannya alih-alih mengarang status
Tool yang mengembalikan error, memastikan agen mengatakannya alih-alih macet
Penyambungan ulang dan resumption, termasuk jeda pemutaran ulang yang saya alami tadi
Audio bising, ucapan cepat, dan penelepon yang mengeja nomor serta alamat
Sebagian besar saya jalankan dengan kunci langsung saat menulis ini. Kegagalan menarik bersifat perilaku, bukan error: waktu resumption di atas, dan ambang VAD di luar rentang yang diterima alih-alih ditolak—jenis hal yang dikirim dalam keadaan diam-diam rusak jika Anda hanya menguji skenario bahagia. Tambahkan juga uji multibahasa, dan lihat FAQ untuk seluk-beluk cara menamai bahasa.
Dua di antaranya tidak bisa diuji dengan mengetik.app_streamlit.py adalah halaman Streamlit yang menempatkan panggilan langsung di browser: mikrofon melakukan streaming ke WebSocket yang sama melalui WebRTC, suara agen mengalir kembali, dan soket tetap terbuka sepanjang waktu.
Menyela agen di tengah kalimat. Video oleh Penulis.
Bicaralah di atas agen dan ia berhenti, karena speech_started tiba dan halaman membuang audio yang mengantre. Ini adalah jabat tangan dari bagian interupsi, berjalan nyata.
Perhatikan catatan pesanan alih-alih transkrip: agen membacakan perubahan pengiriman dan mengatakan selesai, dan catatan tersebut entah berubah atau tidak. Gunakan headphone. Pada speaker terbuka agen akan mendengar dirinya sendiri, menganggapnya sebagai barge-in, dan memotong kalimatnya sendiri—ini pratinjau dari apa yang dilakukan penelepon di speakerphone.
Batasan Grok Voice Think Fast 2.0 dan Pertimbangan Deployment
Rencanakan hal-hal ini: pemanggilan tool yang gagal di tengah giliran, model yang mengucapkan konfirmasi lebih yakin daripada keberhasilan aksinya, VAD yang disetel untuk kantor sunyi berantakan di jalur telepon, dan penelepon yang berubah pikiran di tengah kalimat.
Untuk pembayaran, akses akun, atau penelepon yang terdengar bingung atau kesal, alihkan ke manusia. Beri model tool transfer_to_human untuk itu: tanpa tool, ia akan berimprovisasi meminta maaf alih-alih mengeskalasi.
Tumpukan modular speech-to-text, model bahasa, text-to-speech masih punya tempatnya: kontrol terpisah atas tiap komponen dan transkrip deterministik sebelum penalaran apa pun terjadi, dengan biaya lebih banyak pekerjaan integrasi. Dan jika beban kerja Anda tidak membutuhkan percakapan dua arah langsung sama sekali, chatbot teks atau pekerjaan transkripsi batch lebih sederhana dan lebih murah daripada pipeline real-time yang tidak ada yang ajak bicara.
Kesimpulan
Di seluruh pengujian pada artikel ini,grok-voice-think-fast-2.0sebagian besar melakukan seperti yang dikatakan dokumentasi. Siklus hidup event bertahan, koneksi yang terputus kembali dengan giliran sebelumnya tetap ada, dan model memanggil tool sambil masih mengucapkan kalimat pembuka.
Di luar ketidakcocokan penamaan pada conversation.item.added, hal yang perlu ditandai adalah betapa banyak pekerjaan tersisa di sisi Anda dari soket: antrean pemutaran, kapan harus diam, kapan belum perlu bertanya lagi.
Memulai proyek hari ini, default saya adalah string model ber-versi alih-alih alias, server_vad dengan silence_duration_ms disetel sebelum dua kenop lainnya, transport JSON sampai ada kebutuhan terukur untuk biner, resumption.enabled pada session.update pertama, dan session.model dicatat saat startup.
Kebiasaan yang akan saya bawa ke agen suara mana pun: periksa operasi tulis terhadap catatan alih-alih konfirmasi lisan, letakkan penolakan di tool alih-alih prompt, biarkan pemutaran mengalir habis sebelum response.create berikutnya, dan uji terhadap aksen nyata, kebisingan nyata, dan tool yang gagal seperti kegagalan sebenarnya.
Perluasan yang jelas adalah telepon (SpaceXAI mendokumentasikan dukungan SIP secara langsung), klien browser dengan token sesaat, koneksi MCP ke CRM nyata, dan versi multibahasa yang benar. Dan jika Voice Agent API yang saya bandingkan batas sesi tadi lebih dekat dengan kebutuhan Anda, tutorial Grok Voice Agent API kami membahas jalur itu.
Saya seorang data engineer dan pembangun komunitas yang bekerja lintas pipeline data, cloud, dan perkakas AI sambil menulis tutorial praktis dan berdampak tinggi untuk DataCamp dan pengembang yang sedang berkembang.
FAQs
Apakah grok-voice-latest aman digunakan di produksi?⌄
Tidak benar-benar aman, seperti yang saya sebutkan pada bagian versi di atas. Perubahannya terjadi pada tanggal yang dipilih SpaceXAI, bukan Anda, dan membawa tagihan Anda bersamanya. Patok grok-voice-think-fast-2.0 dan simpan alias untuk eksperimen lokal di mana pergantian mendadak tidak mendarat pada panggilan pelanggan langsung.
Apakah Grok Voice Think Fast 2.0 mendukung bahasa selain bahasa Inggris?⌄
Ya, lebih dari dua puluh didokumentasikan dengan deteksi otomatis, dan Anda dapat membiasakan transkripsi ke bahasa tertentu dengan language_hint. Perhatikan bahwa Spanyol dan Portugis memerlukan kode regional seperti es-MX atau pt-BR. es atau pt polos tidak diterima, dan kode yang tidak dikenali diabaikan diam-diam lalu kembali ke deteksi otomatis, jadi salah ketik di sini tidak menimbulkan biaya namun juga tidak berdampak apa pun.
Bisakah saya mengubah voice, dan ada berapa banyak?⌄
eve adalah yang ada di dokumen dan yang saya gunakan, dengan ara, rex, sal, dan leo juga tersedia, plus ID voice kustom. GET /v1/tts/voices mengembalikan daftar saat ini. Jika tempo bicaranya mengganggu Anda, audio.output.speed menerima 0,7 hingga 1,5.
Bisakah saya membuat agen menjawab lebih cepat dari sekarang?⌄
Coba reasoning.effort, yang saya lewati pada walkthrough karena bawaannya biasanya tepat. Nilai bawaan adalah "high" dan juga menerima "none", yang mengurangi seberapa banyak perencanaan yang dilakukan model per giliran. Baik untuk alur pencarian sederhana. Saya tidak akan mengubahnya untuk apa pun yang harus memilih di antara tool.
Apakah saya perlu SDK resmi SpaceXAI untuk membangunnya?⌄
Tidak, sama seperti bagian prasyarat menyebutkan. Paket websockets biasa atau klien kompatibel OpenAI yang diarahkan ke base URL api.x.ai keduanya berfungsi. Satu hal yang perlu diketahui: xai-sdk resmi adalah klien gRPC terpisah yang tidak berbicara ke WebSocket ini, jadi jangan mencari metode realtime di dalamnya. Untuk titik awal selain milik saya, xai-cookbook memiliki contoh iOS, web, WebRTC, dan telepon.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Temukan potensi penuh dari LLMs melalui kursus konseptual kami yang mencakup aplikasi LLMs, metode pelatihan, pertimbangan etika, dan penelitian terbaru.
Grok Voice Think Fast 2.0 dari SpaceXAI adalah model speech-to-speech. Anda mengirim audio melalui WebSocket dan ia mengirimkan audio kembali; di antaranya, model dapat bernalar dan terus berbicara sementara panggilan fungsi yang dipilihnya sudah berjalan. Tidak ada langkah terpisah untuk speech-to-text, tidak ada langkah terpisah untuk text-to-speech.
SpaceXAI mengumumkan Think Fast 2.0 pada 29 Juli 2026: audio pertama lebih cepat, perilaku full-duplex lebih stabil (mendengarkan sambil berbicara alih-alih bergiliran ketat), dan pemanggilan tool yang mengeksekusi lebih awal dalam satu giliran. Saya akan singkat soal tolok ukur, karena yang penting untuk tutorial adalah apa yang berubah di kode Anda.
Kita akan membangun agen suara dukungan pelanggan untuk toko online. Penelepon dapat menanyakan pesanan, mengubah instruksi pengiriman, membatalkan, menyela agen di tengah kalimat, dan melanjutkan percakapan setelah koneksi terputus. Ini jalur API, bukan Voice Agent Builder tanpa kode yang dijelaskan oleh tutorial Grok Voice Agent Builder kami. Mulailah dari sana untuk versi berbasis konsol.
Apa Itu Grok Voice Think Fast 2.0?
Grok Voice Think Fast 2.0 adalah model terbaru SpaceXAI untuk Speech to Speech API, nama produk di balik apa yang kebanyakan orang sebut Grok Voice. Jika Anda masih menganggap perusahaannya sebagai xAI, sama saja: perusahaan tersebut dilebur ke SpaceX dan berganti nama menjadi SpaceXAI pada 6 Juli 2026. API tidak ikut rebranding, jadi setiap pengenal di bawah tetap bertuliskan
xai, dari variabelXAI_API_KEYhingga hostapi.x.ai.Tumpukan suara tradisional merangkai tiga layanan: speech-to-text, model bahasa, lalu text-to-speech, dan setiap lompatan menambah latensi serta titik di mana konteks bisa hilang. Think Fast 2.0 merangkum semuanya menjadi satu model yang menerima audio atau teks dan menghasilkan audio atau teks melalui koneksi yang sama.
WebSocket speech-to-speech versus arsitektur pipeline tiga layanan. Gambar oleh Penulis.
Untuk agen yang bertindak alih-alih hanya berbicara, yang penting adalah penalaran dan ucapan berjalan paralel. SpaceXAI mengatakan pemanggilan tool "biasanya" mulai dieksekusi sebelum agen menyelesaikan kalimat pertamanya, dan kata itu memang berarti.
Pada tolok ukur yang dikutip SpaceXAI dari Artificial Analysis, Think Fast 2.0 meraih 82,9% pada Speech to Speech Index dibanding 75,7% untuk 1.0, dan memangkas waktu ke audio pertama dari 1,25 detik menjadi 0,70 detik. Angka vendor pada tolok ukur umum adalah hipotesis tentang alur penelepon Anda, bukan rencana pengujian.
Ada tiga string model yang akan Anda lihat:
grok-voice-latest,grok-voice-think-fast-2.0, dangrok-voice-think-fast-1.0. Alias berguna saat prototyping dan tidak cukup stabil untuk yang lain.Saat saya uji pada 4 Agustus 2026,
grok-voice-latestmasih mengarah kegrok-voice-think-fast-1.0, dengan catatan rilis SpaceXAI menjadwalkan perpindahan ke Think Fast 2.0 untuk hari berikutnya. Pergantian itu adalah perubahan harga sekaligus perubahan model, $0,08 per menit audio dibanding $0,05 untuk 1.0, jadi alias yang tidak dipatok versi menjadi lebih mahal tanpa satu baris kode Anda berubah. Patok string versi pada apa pun yang Anda deploy.Apa yang Akan Kita Bangun
Agen mencakup pertanyaan umum pada jalur dukungan: melihat pesanan, mencari dari email saat penelepon tidak punya nomor, mengubah instruksi pengiriman, membatalkan, membuka atau memeriksa tiket, dan mengalihkan panggilan ke manusia. Interupsi dan koneksi terputus akan muncul di sepanjang jalan.
Ini terdiri dari beberapa berkas kecil, bukan satu skrip, karena tiap bagian punya tugas berbeda dan Anda akan ingin mengujinya terpisah. Inilah strukturnya:
config.pymemuat kunci API dan menyimpan string model, sample rate, dan URL endpointvoice_client.pymembungkus WebSocket, melacak penagihan, dan menyediakan helper kirim/terimatools.pymendefinisikan fungsi pesanan dan penyimpanan pesanan kecil di memori sebagai pengganti database nyataassistant.pymenyimpan prompt sistem, konfigurasi sesi, dan event loop yang mengikat semuanyatoken_server.pyadalah endpoint FastAPI kecil yang mencetak token sesaatapp_streamlit.pymenempatkan klien yang sama di balik panggilan langsung di browser, yang akan saya bahas kembali setelah bagian pengujianAlur pembelajaran berjalan dari terminal. Demo menambahkan mikrofon.
Prasyarat
Anda memerlukan akun SpaceXAI dengan kunci API, pengaturan penagihan yang didanai (tidak ada level gratis permanen, dan kredit promosi akun baru tidak akan mencukupi), serta cukup nyaman dengan
asynciodan WebSocket untuk mengikuti tanpa penjelasan baris-per-baris tentangawait.Contoh quick-start SpaceXAI menggunakan paket
websocketsmentah alih-alih SDK khusus, dan kita juga begitu. Dokumentasi tidak menyatakan versi Python yang dibutuhkan. Saya menguji pada 3.11.Simpan kunci API di server. Jika aplikasi browser atau mobile berbicara langsung ke Voice API, ia mendapatkan token sesaat alih-alih kunci asli Anda, dibahas pada bagian keamanan di bawah.
Menyiapkan proyek
Setiap berkas di bawah ada di repo proyek, jadi Anda bisa mengklonnya alih-alih menyalin potongan kode:
websocketsmembawa koneksi realtime danpython-dotenvmembaca kunci Anda. Sisanya untuk endpoint token dan demo browser. Letakkan kunci Anda di.env:Itu sebagian besar penyiapannya. Koneksi adalah bagian yang menarik.
Memahami Grok Voice Realtime API
Grok Voice adalah nama produk. Yang benar-benar Anda tulis kodenya adalah endpoint WebSocket di
wss://api.x.ai/v1/realtime, dan seluruh percakapan terjadi sebagai aliran event JSON melalui satu soket itu.Siklus hidup event
Koneksi mengikuti pola tetap: server mengirim
session.createddanconversation.createdsegera setelah Anda terhubung, Anda mengirimsession.updateuntuk mengonfigurasi voice dan tool, server mengonfirmasi dengansession.updated, dan dari sana Anda membuat item percakapan dan meminta respons. Saya menjalankan ini dengan kunci langsung dan urutannya persis seperti di dokumen.session.update(klien) mengonfigurasi voice, instruksi, tool, dan format audioconversation.item.create(klien) menambahkan pesan pengguna, pesan asisten, atau hasil toolresponse.create(klien) meminta model untuk berbicara; VAD server mengirim ini untuk Anda secara otomatisresponse.output_audio.deltadanresponse.output_audio_transcript.delta(server) mengalirkan balasan saat dihasilkanresponse.done(server) menutup giliranAda dua hal yang sering menjebak orang. Halaman dokumentasi Speech to Speech yang saya tautkan di atas menyebut event
conversation.item.createdselama melanjutkan sesi, tetapi referensi event kanonik hanya mencantumkanconversation.item.added, dan itulah yang tiba di setiap pengujian yang saya jalankan, jadi kodinglah berdasarkan itu. Anda juga akan melihat eventpingtak terdokumentasi beberapa detik setelah kebanyakan koneksi, disebutkan agar Anda tidak membacanya sebagai error.Format audio dan transport
Codec dan transport adalah pilihan terpisah. Codec, disetel di
audio.input.formatdanaudio.output.format, adalahaudio/pcm(Linear16, bawaan 24000 Hz),audio/pcmuatauaudio/pcma(G.711 pada 8 kHz, untuk telepon), atauaudio/opus(24 kHz). Transport adalah cara byte tersebut dikirim di wire:json(bawaan) mengirim audio sebagai teks base64 di dalaminput_audio_buffer.appenddanresponse.output_audio.delta, mudah untuk logging dan debugbinarymengirim byte codec mentah sebagai frame biner WebSocket, melewati overhead base64 dengan biaya loop penerima yang harus bercabang pada jenis pesanMulai dengan JSON. Setiap contoh di dokumen menggunakannya, mudah diinspeksi, dan overhead base64 bukanlah penghambat untuk build agen dukungan. Pindah ke biner jika Anda mengukur alasan yang kuat.
Kompatibilitas dengan OpenAI Realtime API
Lewati jika Anda belum pernah menyentuh OpenAI Realtime API. Bagi yang lain, Speech to Speech API mengikuti OpenAI Realtime API cukup dekat sehingga sebagian besar kode klien dapat dipindahkan dengan mengganti base URL dan kunci, tetapi bukan pengganti sempurna.
Transkrip tiba sebagai
conversation.item.input_audio_transcription.updateddi sini alih-alihdeltamilik OpenAI, beberapa event OpenAI tidak didukung, dan SpaceXAI menambahkan ekstensi sendiri:force_messageuntuk baris pengungkapan yang terprogram,resumptionuntuk sambungan ulang, danreplaceuntuk memperbaiki pengucapan nama merek sebelum text-to-speech.Membangun Agen Suara Real-Time
Cukup soal protokol. Berikut klien yang berbicara dengannya.
Menyambungkan dan mengonfigurasi sesi
Koneksi dibuka dengan bearer token dan parameter kueri model, dan pesan pertama yang Anda kirim mengonfigurasi semua perilaku agen:
instructionsadalah prompt sistem, dan model ini menginginkan yang singkat. Catatan migrasi SpaceXAI menyarankan untuk menyederhanakan prompt yang ditulis untuk model suara era GPT ketimbang memindahkannya mentah-mentah. Prompt saya menyuruh agen menjaga jawaban tetap singkat, bertanya satu per satu, dan membacakan apa pun yang akan ditulis sebelum bertindak. Konfirmasi lisan adalah nicety UX, bukan kontrol keamanan. Aplikasi Anda tetap menegakkan otorisasi pada aksi tulisnya.Satu hal yang mengejutkan saya: string model yang tidak dikenali tidak memunculkan error saat koneksi, melainkan diam-diam jatuh kembali ke
grok-voice-think-fast-1.0. Menurunkan permintaan berbayar karena salah ketik, tanpa memberi tahu, adalah default yang aneh. Log bidangsession.modelpadasession.createdsekali saat startup dan periksa apakah Anda mendapatkan yang diminta.Keluaran terminal menampilkan session.created setelah tersambung. Gambar oleh Penulis.
Melakukan streaming audio pengguna
Dengan
turn_detection.typedisetel keserver_vad, Anda hanya perlu terus menambahkan audio. Server memutuskan kapan penelepon berhenti berbicara dan memicu respons untuk Anda. Setel kenulldan Anda yang memutuskan sendiri, mengkomit buffer secara eksplisit saat Anda yakin gilirannya selesai.Server VAD punya tiga kenop, dan menyetelnya salah adalah cara paling umum saya melihat agen suara terasa rusak sementara tidak ada error di log. Tidak satu pun muncul pada echo
session.updatedsecara bawaan, jadi periksa terhadap dokumen alih-alih berasumsi.threshold(0,1 hingga 0,9, bawaan 0,85), seberapa keras audio agar dihitung sebagai ucapan; naikkan di ruangan bising, turunkan jika penutur pelan sering terlewatsilence_duration_ms, berapa lama penelepon hening sebelum server mengakhiri gilirannya; terlalu pendek memotong orang di tengah pikiran, terlalu lama terasa lambanprefix_padding_ms(bawaan 333), potongan audio yang disimpan tepat sebelum ucapan terdeteksi, agar suku kata pertama tidak terpotongSetel
silence_duration_mslebih dulu jika penelepon sering terpotong saat jeda berpikir. Itu yang saya ubah sebelum menyentuh dua kenop lainnya.Menerima dan memutar respons
Audio tiba dalam potongan kecil sebagai
response.output_audio.delta, dan poin dari streaming adalah Anda memutar setiap potongan begitu mendarat alih-alih menungguresponse.done.Simpan transkrip bahkan di produksi. Ini alat debug termurah saat penelepon berkata agen "mengucapkan sesuatu yang aneh."
Menambahkan Tool ke Agen Suara
Agen suara yang hanya berbicara adalah chatbot dengan mikrofon.
Membuat tool pesanan
Setiap tool adalah skema JSON plus fungsi Python biasa di sisi kita. Model tidak pernah menyentuh database, ia hanya melihat apa yang dikembalikan fungsi kita.
Operasi baca seperti
check_order_statusaman diulangi jika terjadi timeout. Operasi tulis tidak: mengulangiupdate_delivery_instructionssetelah timeout ambigu dapat menerapkan perubahan yang sama dua kali. Baris konfirmasi di prompt tidak menghentikannya, jadi beri tulis kunci idempoten atau pemeriksaan duplikasi.Letakkan juga penolakan di fungsi.
cancel_ordermengembalikan alasan dan alternatif alih-alih membatalkan pesanan yang sudah dikirim, karena prompt yang mengatakan "jangan pernah membatalkan pesanan yang sudah dikirim" adalah saran sementara fungsi yang menolak adalah aturan.Menangani loop pemanggilan tool
Empat langkah, dan urutannya lebih penting dari yang terlihat. Model mengirim
response.function_call_arguments.done, kode Anda menjalankan fungsi, Anda mengirim hasil kembali sebagai itemfunction_call_output, dan barulah Anda meminta model untuk melanjutkan.Jika model membutuhkan lebih dari satu tool untuk satu permintaan, ia menembakkan beberapa event
function_call_arguments.donesebelum audio apa pun diputar. Selesaikan semuanya dan kirim setiap hasil sebelum saturesponse.createpun. Mengirimnya terlalu cepat membuat model menjawab tanpa konteks dari panggilan yang masih berjalan.Ada jebakan yang didokumentasikan SpaceXAI dan tetap saya alami di percobaan pertama: mengirim
response.createtepat saat hasil tool Anda dikirim bisa tumpang tindih dengan kalimat pembuka yang masih diputar agen. Dalam satu kali jalan, agen membuka dengan "Saya akan memeriksa status pesanan ORD-1042 sekarang" dan memanggil tool di tengah kalimat, jadi respons yang langsung dikirim akan menimpa kalimat pembukanya sendiri.Tunggu audio giliran saat ini selesai, dan tampilkan status "berpikir" singkat di antaranya.
Alur panggilan tool sebelum melanjutkan respons. Gambar oleh Penulis.
Mengelola Interupsi dan Status Percakapan
Ada dua masalah terpisah. Penelepon berbicara di atas agen di tengah respons, dan WebSocket terputus dan perlu dilanjutkan kembali.
Mendukung interupsi yang natural
Dengan
server_vadaktif, barge-in otomatis di sisi server: begitu mendeteksi penelepon berbicara lagi, ia memberi sinyalinput_audio_buffer.speech_starteddan menghentikan generasi respons lama. Tugas Anda adalah separuh jabat tangan di klien, mengosongkan audio yang sudah antre agar agen diam alih-alih menyelesaikan kalimat yang tak lagi diminta.Untuk sesi manual tanpa VAD,
response.cancelmelakukan hal yang sama atas permintaan. Ada jugaconversation.item.truncateuntuk memangkas item asisten ke apa yang benar-benar terdengar. Dokumen mengonfirmasi fitur ini ada namun tidak kapan harus menembakkannya selama barge-in langsung, jadi uji waktunya sendiri.Saya menguji ini dengan perubahan instruksi pengiriman di tengah respons: mulai permintaan, sela dengan alamat berbeda saat konfirmasi agen masih berjalan. Yang penting adalah apakah agen menerapkan instruksi yang dikoreksi alih-alih diam-diam menyelesaikan yang lama, bukan apakah audio berhenti. Pastikan terhadap catatan pesanan, bukan keheningan. Demo browser di akhir memungkinkan Anda mendengar ini.
Melanjutkan sesi yang terputus
Melanjutkan sesi bersifat opt-in dan ini bukan memori. Setel
resumption.enabled: truepadasession.update, ambil ID dari eventconversation.created, dan jika soket terputus, sambungkan ulang dengan?conversation_id=<id>di URL dan lakukan opt-in lagi pada koneksi baru.Giliran yang di-cache, transkrip, pemanggilan tool, dan hasil tool akan diputar ulang sebelum pertanyaan Anda berikutnya, dan cache hilang setelah 30 menit tanpa aktivitas. Saya mengujinya dengan menanyakan pesanan, memutus koneksi, lalu menyambung lagi untuk pertanyaan lanjutan tanpa mengulang; agen melanjutkan ETA dengan benar.
Satu hal tak terdokumentasi: pemutaran ulang tidak mendarat seketika, jadi pertanyaan yang dikirim tepat saat soket terbuka bisa mendahuluinya dan kembali tanpa ingatan tentang giliran sebelumnya. Beri jeda sedetik sebelum Anda menyalahkan resumption.
Log terminal dari sesi yang dilanjutkan. Gambar oleh Penulis.
Jangan gunakan ini sebagai pengganti menyimpan status pesanan ke database Anda sendiri. Jika cache kedaluwarsa atau penelepon menelepon lagi besok, Anda mulai dari nol konteks, dan itu memang dirancang demikian.
Mengamankan dan Memantau Agen
Jangan pernah menempatkan kunci API permanen di kode browser atau mobile. Jika klien terhubung langsung alih-alih melalui server Anda, cetak token berumur pendek:
Browser tidak dapat menyetel header
Authorizationkustom pada handshake WebSocket, jadi ia meneruskan token melalui headersec-websocket-protocol, diawali denganxai-client-secret..Server mencetak token, browser bergabung ke panggilan. Gambar oleh Penulis.
Penagihan berjalan pada dua meter. Audio, yang dikirim atau diterima, berjalan pada $0,08 per menit seperti yang disebutkan sebelumnya, yaitu $4,80 per jam, dan setiap
conversation.item.createyang bukan audio dan bukanfunction_call_outputdikenai biaya tetap $0,004.response.createtidak ditagih sama sekali. Setiapresponse.donemembawa objekusage, yang dalam uji saya melaporkanoutput_audio_secondsbersamabillable_audio_secondsterpisah. Tagih dari itu, bukan dari perkiraan.Batas terdokumentasi pada Speech to Speech API adalah 10 sesi bersamaan per tim dan batas sesi 120 menit, keduanya di
us-east-1. Jangan merencanakan kapasitas dari angka Voice Agent API, yang berbeda.Soal privasi, bersikaplah presisi. FAQ keamanan SpaceXAI mengatakan permintaan dan respons API disimpan terenkripsi selama 30 hari untuk pemantauan penyalahgunaan dan tidak digunakan untuk pelatihan tanpa izin, serta tim dapat mengaktifkan Zero Data Retention, meskipun ZDR menghapus riwayat percakapan agen suara yang dipersisten dan karenanya tidak bekerja dengan resumption.
Jika Anda mengungkapkan bahwa panggilan direkam atau ditangani AI, di situlah ekstensi
force_messageyang saya sebutkan sebelumnya berperan. Baris tersebut diputar persis seperti yang ditulis alih-alih apa pun yang diparafrasekan model.Menguji Agen Suara
Status 200 pada handshake WebSocket tidak memberi tahu apakah agen melakukan hal yang benar. Ujilah hasilnya, bukan hanya koneksinya.
Sebagian besar saya jalankan dengan kunci langsung saat menulis ini. Kegagalan menarik bersifat perilaku, bukan error: waktu resumption di atas, dan ambang VAD di luar rentang yang diterima alih-alih ditolak—jenis hal yang dikirim dalam keadaan diam-diam rusak jika Anda hanya menguji skenario bahagia. Tambahkan juga uji multibahasa, dan lihat FAQ untuk seluk-beluk cara menamai bahasa.
Dua di antaranya tidak bisa diuji dengan mengetik.
app_streamlit.pyadalah halaman Streamlit yang menempatkan panggilan langsung di browser: mikrofon melakukan streaming ke WebSocket yang sama melalui WebRTC, suara agen mengalir kembali, dan soket tetap terbuka sepanjang waktu.