Voix xAI Realtime
La classe XAIRealtimeVoice fournit des fonctionnalités d’interaction vocale en temps réel à l’aide de l’API xAI Grok Voice Agent. Elle implémente le contrat temps réel MastraVoice de Mastra et prend en charge le streaming audio bidirectionnel, les tours de texte, la VAD côté serveur, les voix xAI, les Tools de fonction et les Tools xAI côté serveur.
Exemple d’utilisationLien direct vers Exemple d’utilisation
import { Agent } from '@mastra/core/agent'
import { getMicrophoneStream, playAudio } from '@mastra/node-audio'
import { XAIRealtimeVoice } from '@mastra/voice-xai-realtime'
const voice = new XAIRealtimeVoice({
apiKey: process.env.XAI_API_KEY,
model: 'grok-voice-think-fast-1.0',
speaker: 'eve',
instructions: 'You are a concise voice assistant.',
turnDetection: { type: 'server_vad' },
})
const agent = new Agent({
id: 'voice-agent',
name: 'Voice Agent',
instructions: 'You are a helpful voice assistant.',
model: 'xai/grok-4.3',
voice,
})
await agent.voice.connect()
agent.voice.on('speaker', audioStream => {
playAudio(audioStream)
})
agent.voice.on('writing', ({ text, role }) => {
console.log(`${role}: ${text}`)
})
await agent.voice.speak('How can I help you today?')
const microphoneStream = getMicrophoneStream()
await agent.voice.send(microphoneStream)
agent.voice.close()
ConfigurationLien direct vers Configuration
Options du constructeurLien direct vers Options du constructeur
apiKey?:
ephemeralToken?:
model?:
speaker?:
instructions?:
turnDetection?:
audio?:
serverTools?:
session?:
url?:
debug?:
Modèle VoiceConfigLien direct vers Modèle VoiceConfig
Vous pouvez également utiliser la structure de configuration vocale partagée de Mastra :
const voice = new XAIRealtimeVoice({
speaker: 'ara',
realtimeConfig: {
model: 'grok-voice-think-fast-1.0',
apiKey: process.env.XAI_API_KEY,
options: {
instructions: 'Answer briefly.',
turnDetection: { type: 'server_vad', threshold: 0.85 },
},
},
})
AuthentificationLien direct vers Authentification
Utilisez apiKey ou XAI_API_KEY pour les applications côté serveur. Ce Provider est conçu pour les environnements d’exécution Node.js côté serveur. Si vous générez déjà des tokens éphémères xAI sur votre serveur, vous pouvez en transmettre un comme ephemeralToken ; le Provider utilise alors le protocole WebSocket xai-client-secret.<token> au lieu d’un en-tête d’autorisation. Si apiKey et ephemeralToken sont tous deux configurés, le Provider utilise le token éphémère.
MéthodesLien direct vers Méthodes
connect()Lien direct vers connect
Établit la connexion WebSocket et envoie le session.update initial.
requestContext?:
Renvoie : Promise<void>
close()Lien direct vers close
Ferme la connexion WebSocket, termine les flux de locuteur actifs et efface les événements en file d’attente, l’état des appels de fonction en attente et le contexte de requête. disconnect() est un alias de close().
Renvoie : void
addInstructions()Lien direct vers addinstructions
Définit les instructions de la session. Si la connexion WebSocket est ouverte, le Provider envoie un session.update. La transmission de undefined stocke une chaîne vide et efface les instructions actives de la session actuelle ou de la connexion suivante.
instructions?:
Renvoie : void
addTools()Lien direct vers addtools
Enregistre les Tools de fonction Mastra et, lorsque la connexion est établie, actualise les Tools de la session avec session.update.
tools?:
Renvoie : void
updateConfig()Lien direct vers updateconfig
Envoie un événement session.update contenant des champs de session xAI supplémentaires.
sessionConfig:
Renvoie : void
speak()Lien direct vers speak
Envoie un tour de texte à l’aide de conversation.item.create, puis demande une réponse.
input:
options.speaker?:
options.response?:
Renvoie : Promise<void>
send()Lien direct vers send
Envoie des fragments audio en streaming et en temps réel avec input_audio_buffer.append.
send() nécessite une connexion ouverte. Utilisez-la pour l’audio en direct d’un microphone après la résolution de connect(). Les fragments du flux lisible doivent être des fragments audio binaires (Buffer, ArrayBuffer ou un tableau typé).
audioData:
eventId?:
Renvoie : Promise<void>
listen()Lien direct vers listen
Envoie un flux audio fini avec input_audio_buffer.append. Par défaut, valide le tampon d’entrée et demande une réponse.
audioData:
options.commit?:
options.createResponse?:
Renvoie : Promise<void>
answer()Lien direct vers answer
Envoie response.create pour demander à xAI de poursuivre la conversation.
Renvoie : Promise<void>
commitAudioBuffer() and clearAudioBuffer()Lien direct vers commitaudiobuffer-and-clearaudiobuffer
Envoient les événements client xAI Realtime correspondants pour permettre un contrôle manuel des tours.
Renvoie : Promise<void>
cancelResponse()Lien direct vers cancelresponse
Envoie response.cancel pour interrompre une réponse en cours.
responseId?:
eventId?:
Renvoie : Promise<void>
ÉvénementsLien direct vers Événements
XAIRealtimeVoice associe les événements du serveur xAI Realtime aux événements vocaux Mastra :
speaker: émet un flux lisible pour l’audio de l’assistant.speaking: émet les deltas audio de l’assistant.speaking.done: émet un événement lorsque la réponse audio de l’assistant se termine.writing: émet les deltas de texte de l’assistant et les transcriptions de l’entrée utilisateur.error: émet les erreurs d’exécution xAI et du Provider. Émet également les erreurs d’exécution des Tools et les arguments mal formés des appels de fonction. Les erreurs de Tools incluentdetails.call_idetdetails.name.close: émet un événement lorsque la connexion WebSocket se ferme.tool-call-start: émet un événement avant l’exécution d’un Tool de fonction Mastra.tool-call-result: émet un événement après le retour d’un Tool de fonction Mastra.
Les noms d’événements xAI bruts sont également émis ; vous pouvez donc vous abonner à des événements tels que response.output_audio.delta, response.text.delta, response.function_call_arguments.done et response.done.
ToolsLien direct vers Tools
Tools de fonction MastraLien direct vers Tools de fonction Mastra
Les Tools ajoutés avec addTools() sont convertis en Tools de fonction xAI et inclus dans session.update.
import { createTool } from '@mastra/core/tools'
import { z } from 'zod'
const weatherTool = createTool({
id: 'getWeather',
description: 'Get current weather for a location.',
inputSchema: z.object({
location: z.string(),
}),
execute: async ({ location }) => {
return { location, temperature: 22 }
},
})
voice.addTools({ getWeather: weatherTool })
Lorsque xAI émet response.function_call_arguments.done, le Provider exécute le Tool Mastra correspondant et envoie un élément function_call_output. Si xAI émet plusieurs appels de fonction pour une même réponse, le Provider attend tous les résultats des Tools ainsi que l’événement response.done de la réponse avant d’envoyer un seul response.create de poursuite.
Tools xAI côté serveurLien direct vers Tools xAI côté serveur
Les Tools xAI côté serveur sont transmis dans la configuration de la session et exécutés par xAI. Les Tools transmis dans session.tools et serverTools sont fusionnés :
const voice = new XAIRealtimeVoice({
apiKey: process.env.XAI_API_KEY,
serverTools: [
{ type: 'web_search' },
{ type: 'x_search', allowed_x_handles: ['xai'] },
{ type: 'file_search', vector_store_ids: ['collection_123'], max_num_results: 10 },
{
type: 'mcp',
server_url: 'https://mcp.example.com/mcp',
server_label: 'business-tools',
allowed_tools: ['lookup_order'],
},
],
})
Formats audioLien direct vers Formats audio
Le format d’entrée et de sortie par défaut est PCM16 à 24 kHz. Vous pouvez également configurer les fréquences d’échantillonnage PCM prises en charge ou les codecs de téléphonie :
const voice = new XAIRealtimeVoice({
audio: {
input: { format: { type: 'audio/pcm', rate: 16000 } },
output: { format: { type: 'audio/pcm', rate: 16000 } },
},
})
Les types de formats pris en charge sont audio/pcm, audio/pcmu et audio/pcma. PCM prend en charge les fréquences d’échantillonnage documentées de 8 kHz à 48 kHz. audio/pcmu et audio/pcma sont des codecs de téléphonie G.711 qui utilisent 8 kHz.