
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: uma nova arquitetura do SDK JavaScript e React com hooks mais detalhados, API unificada para web e React Native, e uma API pública estável.
A versão 1.0.0 do ElevenAgents JavaScript e React SDK já está disponível. Esta versão é uma reestruturação completa dos pacotes @elevenlabs/client, @elevenlabs/react e @elevenlabs/react-native, com foco em performance de renderização, API unificada para web e React Native, e uma API pública estável. É uma mudança incompatível com versões anteriores, mas o conhecido hook useConversation foi mantido, e uma skill de agente de código está disponível para automatizar a atualização.
Três problemas motivaram este lançamento.
React e React Native tinham APIs diferentes, conjuntos de recursos distintos e opções de configuração variadas. O código e o conhecimento não eram reaproveitados entre as plataformas, e ferramentas de IA para programação frequentemente sugeriam APIs que só existiam em uma delas. O React Native também não tinha suporte ao modo de conexão WebSocket.
Isso acontecia porque o SDK do React Native usava um SDK de terceiros como base, em vez de construir sobre o @elevenlabs/client. Recursos e correções precisavam ser lançados duas vezes, e as plataformas ficavam cada vez mais diferentes a cada atualização.
Qualquer alteração de estado (status, modo, mudo, volume) fazia todos os componentes que usavam o estado da conversa renderizarem novamente. Não havia como assinar apenas a parte do estado que você precisava. Mesmo que seu componente só se importasse com o status da conexão, ele ainda renderizava de novo quando o estado de mudo mudava.
Isso acontecia porque o SDK usava um único context provider para todo o estado da conversa, com hooks e callbacks pouco específicos passados por objetos de opções.
Atualizar o SDK podia quebrar seu código. Classes internas como Entrada, Saída e Conexão faziam parte da API pública, e desenvolvedores dependiam de recursos nativos do navegador como conversation.output.gain.gain.value para volume e conversation.input.analyser para visualização de áudio. Qualquer mudança interna podia quebrar esses acessos.
Do nosso lado, a hierarquia de classes baseada em herança dificultava corrigir isso aos poucos, então foi preciso uma mudança completa.
@elevenlabs/react-native agora reexporta o @elevenlabs/react com uma camada fina de adaptação para a plataforma: cerca de 40 linhas de código, em vez de mais de mil. O mesmo ConversationProvider, os mesmos hooks, os mesmos métodos. O código feito para web funciona no React Native apenas mudando o caminho do import, o conhecimento é transferido diretamente entre plataformas e ferramentas de IA não sugerem mais APIs específicas de uma só plataforma.
| 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 | } |
Seis novos hooks permitem assinar partes específicas do estado da conversa. Os componentes só renderizam novamente quando os dados que usam mudam.
Um indicador de status que antes renderizava a cada mudança de estado agora só renderiza quando o status da conexão muda:
| 1 | import { useConversationStatus } from '@elevenlabs/react'; |
| 2 | |
| 3 | function StatusBadge() { |
| 4 | const { status } = useConversationStatus(); |
| 5 | return <span>{status}</span>; |
| 6 | } |
useConversation continua disponívelO conhecido hook useConversation ainda existe e retorna os mesmos dados: status, modo, estado de mudo e todos os métodos de controle. Ele é um atalho prático sobre os hooks detalhados citados acima. Usuários atuais podem migrar para ConversationProvider + useConversation como primeiro passo, e depois adotar os hooks detalhados onde a performance de renderização for importante.
| 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 permite que componentes React registrem ferramentas que o agente pode usar. As ferramentas acompanham o ciclo de vida do componente: registram ao montar, removem ao desmontar e sempre usam o valor mais recente do 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 | } |
Isso é útil quando o handler da ferramenta precisa acessar estado ou props do componente que não estão disponíveis no nível do provider.
Classes internas (Entrada, Saída, wake lock) agora são privadas. A API pública expõe métodos documentados em vez de recursos nativos do navegador:
setVolume({ volume }) substitui conversation.output.gain.gain.value = vgetInputByteFrequencyData() substitui conversation.input.analyser.getByteFrequencyData()setMicMuted(true) substitui conversation.input.setMuted(true)Isso significa que a implementação de áudio pode ser trocada (por exemplo, mudando a camada de transporte) sem quebrar o código do usuário.
ConversationProvider aceita as props isMuted e onMutedChange para gerenciamento externo de estado. Isso é útil para manter o estado de mudo entre sessões ou sincronizá-lo com o estado da aplicação.
| 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 | } |
Quando essas props não são usadas, o estado de mudo é gerenciado internamente como antes.
Conversas por voz agora usam WebRTC por padrão e conversas só de texto usam WebSocket. Não é mais necessário definir connectionType manualmente na maioria dos casos. Se precisar de um tipo específico, ainda é possível passar explicitamente.
Esta é uma mudança incompatível que exige atualização das integrações existentes. Principais mudanças:
Conversation agora é um objeto namespace e um alias de tipo, não uma classe. instanceof e herança não funcionam mais.useConversation exige um ConversationProvider como ancestral.Entrada e Saída foram substituídas por métodos documentados na instância da conversa.ElevenLabsProvider foi substituído por ConversationProvider do @elevenlabs/react-native.Para ver todas as mudanças incompatíveis, consulte o changelog.
Uma skill dedicada está disponível para automatizar a atualização. Ela lê sua integração atual, aplica as mudanças necessárias na API e atualiza os imports. Assim, cuida da parte mecânica da migração para o ConversationProvider, substituindo referências de classes removidas e atualizando chamadas de métodos.
Essa skill é especialmente útil para projetos grandes, onde a migração envolve vários arquivos.
| 1 | npx skills add elevenlabs/packages |
A documentação do SDK foi atualizada para refletir a nova API:
Instale o pacote para sua plataforma:
| 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 reexporta tudo do @elevenlabs/client, então não é necessário instalar ambos.
Envolva seu app com o ConversationProvider, use os hooks para iniciar uma sessão e consulte a documentação do SDK para ver a referência completa da API.
E como mencionamos na introdução, há uma skill de agente de código disponível para automatizar a atualização:
| 1 | npx skills add elevenlabs/packages |
Se encontrar algum problema ou tiver sugestões, abra uma issue no GitHub. O SDK é mantido ativamente e analisamos todos os relatos.

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