
eDreams ODIGEO scales agentic AI with ElevenLabs to power the future of conversational travel
Achieving double-digit improvements in resolution speed and transfer rates across five languages
ElevenAgents React SDK v1.0.0 : une refonte du SDK JavaScript et React avec des hooks plus précis, une API unifiée sur le web et React Native, et une API publique stable.
La version 1.0.0 du SDK JavaScript et React ElevenAgents est maintenant disponible. Cette version est une refonte complète des @elevenlabs/client, @elevenlabs/react, et @elevenlabs/react-native axée sur les performances de rendu, une API unifiée sur le web et React Native, et une API publique stable. C’est un changement majeur, mais le hook familier useConversation est conservé, et une compétence d’agent de codage est disponible pour automatiser la mise à jour.
Trois problèmes ont motivé cette version.
React et React Native avaient des APIs différentes, des fonctionnalités différentes et des options de configuration distinctes. Le code et les connaissances ne se transféraient pas entre les plateformes, et les outils d’IA suggéraient souvent des APIs qui n’existaient que sur une seule plateforme. React Native ne proposait pas non plus de mode connexion WebSocket.
En interne, cela venait du fait que le SDK React Native utilisait un SDK tiers React Native au lieu de se baser sur @elevenlabs/client. Les fonctionnalités et correctifs devaient être publiés deux fois, et les deux plateformes s’éloignaient à chaque version.
Chaque changement d’état (statut, mode, sourdine, volume) relançait le rendu de tous les composants utilisant l’état de la conversation. Impossible de s’abonner uniquement à la partie nécessaire. Même si votre composant ne s’intéressait qu’au statut de connexion, il se relançait aussi quand l’état de sourdine changeait.
Cela venait du fait que le SDK utilisait un seul provider de contexte couvrant tout l’état de la conversation, avec seulement quelques hooks généraux et des callbacks passés dans les options.
Mettre à jour le SDK risquait de casser votre code. Des classes internes comme Entrée, Sortie, et Connexion faisaient partie de l’API publique, et les développeurs utilisaient directement des primitives du navigateur comme conversation.output.gain.gain.value pour le volume et conversation.input.analyser pour la visualisation audio. Tout changement interne pouvait casser ces accès.
De notre côté, une hiérarchie de classes basée sur l’héritage rendait difficile une correction progressive, donc une rupture nette était nécessaire.
@elevenlabs/react-native ré-exporte maintenant @elevenlabs/react avec une fine couche d’adaptation spécifique à la plateforme : environ 40 lignes de code au lieu de plus d’un millier. Même ConversationProvider, mêmes hooks, mêmes méthodes. Le code écrit pour le web fonctionne sur React Native en changeant simplement le chemin d’import, les connaissances se transfèrent directement, et les outils d’IA ne proposent plus d’APIs spécifiques à une plateforme.
| 1 | // On React Native, change this import to '@elevenlabs/react-native'. |
| 2 | import { |
| 3 | ConversationProvider, |
| 4 | useConversationControls, |
| 5 | useConversationStatus, |
| 6 | } from '@elevenlabs/react'; |
| 7 | |
| 8 | function App() { |
| 9 | return ( |
| 10 | <ConversationProvider> |
| 11 | <Agent /> |
| 12 | </ConversationProvider> |
| 13 | ); |
| 14 | } |
| 15 | |
| 16 | function Agent() { |
| 17 | const { startSession, endSession } = useConversationControls(); |
| 18 | const { status } = useConversationStatus(); |
| 19 | |
| 20 | if (status === 'connected') { |
| 21 | return <button onClick={endSession}>End</button>; |
| 22 | } |
| 23 | |
| 24 | return ( |
| 25 | <button onClick={() => startSession({ agentId: 'agent_7101k5zvyjhmfg983brhmhkd98n6' })}> |
| 26 | Start |
| 27 | </button> |
| 28 | ); |
| 29 | } |
Six nouveaux hooks permettent de s’abonner à une partie précise de l’état de la conversation. Les composants ne se relancent que lorsque les données qu’ils utilisent changent.
Un indicateur de statut qui se relançait à chaque changement d’état ne se relance plus que lorsque le statut de connexion change :
| 1 | import { useConversationStatus } from '@elevenlabs/react'; |
| 2 | |
| 3 | function StatusBadge() { |
| 4 | const { status } = useConversationStatus(); |
| 5 | return <span>{status}</span>; |
| 6 | } |
useConversation est toujours làLe hook familier useConversation existe toujours et retourne la même structure de données : statut, mode, état de sourdine et toutes les méthodes de contrôle. C’est un raccourci pratique basé sur les hooks précis décrits ci-dessus. Les utilisateurs actuels peuvent migrer vers ConversationProvider + useConversation comme première étape, puis adopter progressivement les hooks précis là où les performances de rendu sont importantes.
| 1 | import { useConversation } from '@elevenlabs/react'; |
| 2 | |
| 3 | function Agent() { |
| 4 | const { status, isSpeaking, isMuted, setMuted, startSession, endSession } = useConversation(); |
| 5 | // Same API shape as before, just requires a ConversationProvider ancestor. |
| 6 | } |
useConversationClientTool permet aux composants React d’enregistrer des outils que l’agent peut utiliser. Les outils sont liés au cycle de vie du composant : ils s’enregistrent au montage, se désenregistrent au démontage, et utilisent toujours la dernière valeur de la closure.
| 1 | import { useConversationClientTool } from '@elevenlabs/react'; |
| 2 | import { useState } from 'react'; |
| 3 | |
| 4 | function MapComponent() { |
| 5 | const [location, setLocation] = useState({ lat: 0, lng: 0 }); |
| 6 | |
| 7 | useConversationClientTool('getLocation', () => { |
| 8 | return `${location.lat},${location.lng}`; |
| 9 | }); |
| 10 | |
| 11 | useConversationClientTool('setLocation', (params: { lat: number; lng: number }) => { |
| 12 | setLocation(params); |
| 13 | return 'Location updated'; |
| 14 | }); |
| 15 | |
| 16 | return <Map center={location} />; |
| 17 | } |
C’est utile quand le gestionnaire d’un outil a besoin d’accéder à l’état ou aux props du composant qui ne sont pas disponibles au niveau du provider.
Les classes internes (Entrée, Sortie, wake lock) sont maintenant privées. L’API publique expose des méthodes documentées au lieu de primitives du navigateur :
setVolume({ volume }) remplace conversation.output.gain.gain.value = vgetInputByteFrequencyData() remplace conversation.input.analyser.getByteFrequencyData()setMicMuted(true) remplace conversation.input.setMuted(true)Cela signifie que l’implémentation audio sous-jacente peut être remplacée (par exemple, changer de couche de transport) sans casser le code utilisateur.
ConversationProvider accepte les props isMuted et onMutedChange pour une gestion externe de l’état. Pratique pour garder l’état de sourdine entre les sessions ou le synchroniser avec l’état global de l’application.
| 1 | import { ConversationProvider } from '@elevenlabs/react'; |
| 2 | import { useState } from 'react'; |
| 3 | |
| 4 | function App() { |
| 5 | const [muted, setMuted] = useState(false); |
| 6 | |
| 7 | return ( |
| 8 | <ConversationProvider isMuted={muted} onMutedChange={setMuted}> |
| 9 | <YourComponents /> |
| 10 | </ConversationProvider> |
| 11 | ); |
| 12 | } |
Si ces props sont omises, l’état de sourdine est géré en interne comme avant.
Les conversations vocales utilisent désormais WebRTC par défaut et les conversations texte uniquement utilisent WebSocket. Plus besoin de définir connectionType manuellement dans la plupart des cas. Si vous avez besoin d’un type de connexion spécifique, vous pouvez toujours le préciser.
C’est un changement majeur qui nécessite de mettre à jour vos intégrations existantes. Les principaux changements en résumé :
Conversation est maintenant un objet namespace et un alias de type, plus une classe. instanceof et l’héritage ne fonctionnent plus.useConversation nécessite un ConversationProvider parent.Entrée et Sortie sont remplacés par des méthodes documentées sur l’instance de conversation.ElevenLabsProvider est remplacé par ConversationProvider de @elevenlabs/react-native.Pour la liste complète des changements majeurs, consultez le journal des modifications.
Une compétence dédiée est disponible pour automatiser la mise à jour. Elle lit votre intégration actuelle, applique les changements nécessaires à l’API et met à jour les imports. Elle s’occupe de la migration technique vers ConversationProvider, remplace les références de classes supprimées et met à jour les appels de méthodes.
Cette compétence est particulièrement utile pour les grands projets où la migration concerne plusieurs fichiers.
| 1 | npx skills add elevenlabs/packages |
La documentation du SDK a été mise à jour pour refléter la nouvelle API :
Installez le package adapté à votre plateforme :
| 1 | # React (web) |
| 2 | npm install @elevenlabs/react |
| 3 | |
| 4 | # React Native (Expo) |
| 5 | npx expo install @elevenlabs/react-native @livekit/react-native @livekit/react-native-webrtc |
| 6 | |
| 7 | # Vanilla JavaScript |
| 8 | npm install @elevenlabs/client |
@elevenlabs/react ré-exporte tout depuis @elevenlabs/client, donc inutile d’installer les deux.
Encapsulez votre application dans un ConversationProvider, utilisez les hooks pour démarrer une session, et consultez la documentation du SDK pour l’ensemble de l’API.
Et comme mentionné plus haut, une compétence d’agent de codage est disponible pour automatiser la mise à jour :
| 1 | npx skills add elevenlabs/packages |
Si vous rencontrez un problème ou avez des suggestions, ouvrez une issue sur GitHub. Le SDK est activement maintenu et nous examinons chaque signalement.

Achieving double-digit improvements in resolution speed and transfer rates across five languages
.webp&w=3840&q=95)
ElevenLabs' integration with IBM watsonx Orchestrate will help businesses to deliver natural, multilingual conversational experiences at scale