Multimodal Live API

A API Multimodal Live permite interações de voz e vídeo bidirecionais de baixa latência com o Gemini. Com a API Multimodal Live, você pode oferecer aos usuários finais a experiência de conversas por voz naturais e humanas, além de interromper as respostas do modelo usando comandos de voz. O modelo pode processar entradas de texto, áudio e vídeo e fornecer saídas de texto e áudio.

Recursos

A API Multimodal Live inclui os seguintes recursos principais:

  • Multimodalidade:o modelo pode ver, ouvir e falar.
  • Interação em tempo real com baixa latência:oferece respostas rápidas.
  • Memória de sessão:o modelo retém a memória de todas as interações em uma única sessão, recuperando informações ouvidas ou vistas anteriormente.
  • Suporte para chamada de função, execução de código e pesquisa como ferramenta:permite a integração com serviços e fontes de dados externos.
  • Detecção automatizada de atividade de voz (VAD, na sigla em inglês): o modelo pode reconhecer com precisão quando o usuário começa e para de falar. Isso permite interações conversacionais naturais e permite que os usuários interrompam o modelo a qualquer momento.

Você pode testar a API Multimodal Live no Google AI Studio.

Primeiros passos

A API Multimodal Live é uma API stateful que usa WebSockets.

Esta seção mostra um exemplo de como usar a API Multimodal Live para geração de texto para texto usando Python 3.9 ou mais recente.

Instalar a biblioteca da API Gemini

Para instalar o pacote google-genai, use o seguinte comando pip:

!pip3 install google-genai

Importar dependências

Para importar dependências:

from google import genai

Enviar e receber uma mensagem de texto

import asyncio
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'})
model_id = "gemini-2.0-flash-exp"
config = {"response_modalities": ["TEXT"]}

async def main():
    async with client.aio.live.connect(model=model_id, config=config) as session:
        while True:
            message = input("User> ")
            if message.lower() == "exit":
                break
            await session.send(message, end_of_turn=True)

            async for response in session.receive():
                if response.text is None:
                    continue
                print(response.text, end="")

if __name__ == "__main__":
    asyncio.run(main())

Guia de integração

Esta seção descreve como a integração funciona com a API Multimodal Live.

Sessões

Uma sessão representa uma única conexão WebSocket entre o cliente e o servidor Gemini.

Depois que um cliente inicia uma nova conexão, a sessão pode trocar mensagens com o servidor para:

  • Enviar texto, áudio ou vídeo para o servidor do Gemini.
  • Receba respostas de áudio, texto ou chamada de função do servidor do Gemini.

A configuração da sessão é enviada na primeira mensagem após a conexão. Uma configuração de sessão inclui o modelo, os parâmetros de geração, instruções do sistema e ferramentas.

Confira o exemplo de configuração a seguir:

{​​
  "model": string,
  "generation_config": {
    "candidate_count": integer,
    "max_output_tokens": integer,
    "temperature": number,
    "top_p": number,
    "top_k": integer,
    "presence_penalty": number,
    "frequency_penalty": number,
    "response_modalities": string,
    "speech_config":object
  },

  "system_instruction": "",
  "tools":[]
}

Para mais informações, consulte BidiGenerateContentSetup.

Enviar mensagens

As mensagens são strings formatadas em JSON trocadas pela conexão WebSocket.

Para enviar uma mensagem, o cliente precisa enviar uma mensagem de cliente com suporte em uma string formatada em JSON com uma das conexões WebSocket abertas.

Mensagens de cliente com suporte

Confira as mensagens de cliente compatíveis na tabela a seguir:

Mensagem Descrição
BidiGenerateContentSetup Configuração da sessão a ser enviada na primeira mensagem
BidiGenerateContentClientContent Atualização incremental do conteúdo da conversa atual enviada pelo cliente
BidiGenerateContentRealtimeInput Entrada de áudio ou vídeo em tempo real
BidiGenerateContentToolResponse Resposta a uma ToolCallMessage recebida do servidor

Receber mensagens

Para receber mensagens do Gemini, detecte o evento "message" do WebSocket e analise o resultado de acordo com a definição de mensagens do servidor com suporte.

Confira estes guias:

ws.addEventListener("message", async (evt) => {
  if (evt.data instanceof Blob) {
    // Process the received data (audio, video, etc.)
  } else {
    // Process JSON response
  }
});

Mensagens do servidor com suporte

Confira as mensagens do servidor compatíveis na tabela a seguir:

Mensagem Descrição
BidiGenerateContentSetupComplete Uma mensagem BidiGenerateContentSetup do cliente, enviada quando a configuração é concluída
BidiGenerateContentServerContent Conteúdo gerado pelo modelo em resposta a uma mensagem do cliente
BidiGenerateContentToolCall Solicitação para que o cliente execute as chamadas de função e retorne as respostas com os IDs correspondentes
BidiGenerateContentToolCallCancellation É enviado quando uma chamada de função é cancelada devido à interrupção da saída do modelo pelo usuário.

Atualizações incrementais de conteúdo

Use atualizações incrementais para enviar entrada de texto, estabelecer ou restaurar o contexto da sessão. Para contextos curtos, você pode enviar interações passo a passo para representar a sequência exata de eventos. Para contextos mais longos, é recomendável fornecer um único resumo de mensagem para liberar a janela de contexto para as interações de acompanhamento.

Confira o exemplo de mensagem de contexto a seguir:

{
  "client_content": {
    "turns": [
      {
          "parts":[
          {
            "text": ""
          }
        ],
        "role":"user"
      },
      {
          "parts":[
          {
            "text": ""
          }
        ],
        "role":"model"
      }
    ],
    "turn_complete": true
  }
}

Embora as partes do conteúdo possam ser do tipo functionResponse, BidiGenerateContentClientContent não pode ser usado para fornecer uma resposta às chamadas de função emitidas pelo modelo. Use BidiGenerateContentToolResponse. O BidiGenerateContentClientContent só deve ser usado para estabelecer o contexto anterior ou fornecer entrada de texto para a conversa.

Streaming de áudio e vídeo

Chamadas de função

Todas as funções precisam ser declaradas no início da sessão enviando definições de ferramentas como parte da mensagem BidiGenerateContentSetup.

Consulte o tutorial de chamada de função para saber mais.

Com um único comando, o modelo pode gerar várias chamadas de função e o código necessário para encadear as saídas. Esse código é executado em um ambiente de sandbox, gerando mensagens BidiGenerateContentToolCall posteriores. A execução é pausada até que os resultados de cada chamada de função fiquem disponíveis, o que garante o processamento sequencial.

O cliente deve responder com BidiGenerateContentToolResponse.

As entradas e saídas de áudio afetam negativamente a capacidade do modelo de usar a chamada de função.

Formatos de áudio

A API Multimodal Live é compatível com os seguintes formatos de áudio:

  • Formato de áudio de entrada: áudio PCM bruto de 16 bits a 16 kHz little-endian
  • Formato de áudio de saída: áudio PCM bruto de 16 bits a 24 kHz little-endian

Instruções do sistema

Você pode fornecer instruções do sistema para controlar melhor a saída do modelo e especificar o tom e o sentimento das respostas de áudio.

As instruções do sistema são adicionadas ao comando antes do início da interação e permanecem em vigor durante toda a sessão.

As instruções do sistema só podem ser definidas no início de uma sessão, imediatamente após a conexão inicial. Para fornecer mais entradas ao modelo durante a sessão, use atualizações de conteúdo incrementais.

Interrupções

Os usuários podem interromper a saída do modelo a qualquer momento. Quando a detecção de atividade de voz (VAD) detecta uma interrupção, a geração em andamento é cancelada e descartada. Somente as informações já enviadas ao cliente são retidas no histórico da sessão. Em seguida, o servidor envia uma mensagem BidiGenerateContentServerContent para informar a interrupção.

Além disso, o servidor Gemini descarta todas as chamadas de função pendentes e envia uma mensagem BidiGenerateContentServerContent com os IDs das chamadas canceladas.

Negras

A API Multimodal Live oferece suporte aos seguintes vozes: Aoede, Charon, Fenrir, Kore e Puck.

Para especificar uma voz, defina voice_name no objeto speech_config como parte da configuração da sessão.

Confira a representação JSON a seguir de um objeto speech_config:

{
  "voice_config": {
    "prebuilt_voice_config ": {
      "voice_name": <var>VOICE_NAME</var>
    }
  }
}

Limitações

Considere as seguintes limitações da API Multimodal Live e da Gemini 2.0 ao planejar seu projeto.

Autenticação do cliente

A API Multimodal Live só oferece autenticação de servidor para servidor e não é recomendada para uso direto do cliente. A entrada do cliente precisa ser roteada por um servidor de aplicativo intermediário para autenticação segura com a API Multimodal Live.

Para apps da Web e para dispositivos móveis, recomendamos usar a integração dos nossos parceiros no Daily.

Histórico da conversa

Embora o modelo acompanhe as interações na sessão, o histórico de conversas não é armazenado. Quando uma sessão termina, o contexto correspondente é apagado.

Para restaurar uma sessão anterior ou fornecer ao modelo o contexto histórico das interações do usuário, o aplicativo precisa manter o próprio registro de conversas e usar uma mensagem BidiGenerateContentClientContent para enviar essas informações no início de uma nova sessão.

Duração máxima da sessão

A duração da sessão é limitada a até 15 minutos de áudio ou até 2 minutos de áudio e vídeo. Quando a duração da sessão excede o limite, a conexão é encerrada.

O modelo também é limitado pelo tamanho do contexto. O envio de grandes quantidades de conteúdo com os streams de vídeo e áudio pode resultar no encerramento precoce da sessão.

Detecção de atividade de voz (VAD)

O modelo realiza automaticamente a detecção de atividade de voz (VAD, na sigla em inglês) em um stream de entrada de áudio contínuo. O VAD está sempre ativado, e os parâmetros não podem ser configurados.

Contagem de tokens

Não há suporte para a contagem de tokens.

Limites de taxas

Os seguintes limites de taxa se aplicam:

  • Três sessões simultâneas por chave de API
  • 4 milhões de tokens por minuto

Mensagens e eventos

BidiGenerateContentClientContent

Atualização incremental da conversa atual enviada pelo cliente. Todo o conteúdo aqui é adicionado incondicionalmente ao histórico de conversas e usado como parte do comando para o modelo gerar conteúdo.

Uma mensagem aqui vai interromper qualquer geração de modelo atual.

Campos
turns[]

Content

Opcional. O conteúdo anexado à conversa atual com o modelo.

Para consultas de turno único, esta é uma instância única. Para consultas com várias interações, esse é um campo repetido que contém o histórico da conversa e a solicitação mais recente.

turn_complete

bool

Opcional. Se verdadeiro, indica que a geração de conteúdo do servidor precisa começar com o comando acumulado. Caso contrário, o servidor aguarda outras mensagens antes de iniciar a geração.

BidiGenerateContentRealtimeInput

Entrada do usuário enviada em tempo real.

Isso é diferente de BidiGenerateContentClientContent de algumas maneiras:

  • Podem ser enviados continuamente sem interrupção para a geração de modelos.
  • Se for necessário misturar dados intercalados entre BidiGenerateContentClientContent e BidiGenerateContentRealtimeInput, o servidor vai tentar otimizar a melhor resposta, mas não há garantias.
  • O fim da vez não é especificado explicitamente, mas é derivado da atividade do usuário (por exemplo, fim da fala).
  • Mesmo antes do fim da jogada, os dados são processados de forma incremental para otimizar o início rápido da resposta do modelo.
  • É sempre uma entrada direta do usuário enviada em tempo real. Podem ser enviadas continuamente sem interrupções. O modelo detecta automaticamente o início e o fim da fala do usuário e inicia ou encerra a transmissão da resposta de acordo com isso. Os dados são processados de forma incremental à medida que chegam, minimizando a latência.
Campos
media_chunks[]

Blob

Opcional. Dados de bytes inline para entrada de mídia.

BidiGenerateContentServerContent

Atualização incremental do servidor gerada pelo modelo em resposta às mensagens do cliente.

O conteúdo é gerado o mais rápido possível, e não em tempo real. Os clientes podem escolher armazenar em buffer e reproduzir em tempo real.

Campos
turn_complete

bool

Apenas saída. Se verdadeiro, indica que a geração do modelo foi concluída. A geração só vai começar em resposta a outras mensagens do cliente. Pode ser definido com content, indicando que content é o último na vez.

interrupted

bool

Apenas saída. Se verdadeiro, indica que uma mensagem do cliente interrompeu a geração de modelos atual. Se o cliente estiver reproduzindo o conteúdo em tempo real, esse é um bom sinal para interromper e esvaziar a fila de reprodução atual.

grounding_metadata

GroundingMetadata

Apenas saída. Agrupar metadados para o conteúdo gerado.

model_turn

Content

Apenas saída. O conteúdo que o modelo gerou como parte da conversa atual com o usuário.

BidiGenerateContentSetup

Mensagem a ser enviada na primeira e única mensagem do cliente. Contém a configuração que será aplicada durante a sessão de streaming.

Os clientes precisam aguardar uma mensagem BidiGenerateContentSetupComplete antes de enviar outras mensagens.

Campos
model

string

Obrigatório. O nome do recurso do modelo. Ele serve como um ID para o modelo usar.

Formato: models/{model}

generation_config

GenerationConfig

Opcional. Configuração de geração.

Os seguintes campos não são aceitos:

  • response_logprobs
  • response_mime_type
  • logprobs
  • response_schema
  • stop_sequence
  • routing_config
  • audio_timestamp
system_instruction

Content

Opcional. O usuário forneceu instruções do sistema para o modelo.

Observação: use apenas texto em partes, e o conteúdo de cada parte ficará em um parágrafo separado.

tools[]

Tool

Opcional. Uma lista de Tools que o modelo pode usar para gerar a próxima resposta.

Um Tool é um código que permite ao sistema interagir com sistemas externos para realizar uma ação ou conjunto de ações fora do conhecimento e do escopo do modelo.

BidiGenerateContentSetupComplete

Esse tipo não tem campos.

Enviada em resposta a uma mensagem BidiGenerateContentSetup do cliente.

BidiGenerateContentToolCall

Solicitar que o cliente execute o function_calls e retorne as respostas com os ids correspondentes.

Campos
function_calls[]

FunctionCall

Apenas saída. A chamada de função a ser executada.

BidiGenerateContentToolCallCancellation

Notificação para o cliente de que um ToolCallMessage emitido anteriormente com os ids especificados não foi executado e precisa ser cancelado. Se houver efeitos colaterais nessas chamadas de ferramentas, os clientes poderão tentar desfazer as chamadas. Essa mensagem ocorre apenas nos casos em que os clientes interrompem as rodadas do servidor.

Campos
ids[]

string

Apenas saída. Os IDs das chamadas de ferramenta a serem canceladas.

BidiGenerateContentToolResponse

Resposta gerada pelo cliente para uma ToolCall recebida do servidor. Os objetos FunctionResponse individuais são associados aos respectivos objetos FunctionCall pelo campo id.

Nas APIs unary e de streaming do servidor, a chamada de função GenerateContent acontece trocando as partes Content, enquanto nas APIs bidi, a chamada de função acontece sobre esse conjunto dedicado de mensagens.

Campos
function_responses[]

FunctionResponse

Opcional. A resposta às chamadas de função.

Mais informações sobre tipos comuns

Para mais informações sobre os tipos de recurso de API mais usados Blob, Content, FunctionCall, FunctionResponse, GenerationConfig, GroundingMetadata e Tool, consulte Como gerar conteúdo.