Размышления в контексте Live API

API Gemini Live обеспечивает двустороннюю голосовую связь в режиме реального времени с моделями Gemini.

Стандартные голосовые модели хорошо подходят для мгновенного диалога. Вы говорите модели, и она сразу же генерирует голосовой ответ. Но когда запрос требует планирования, сложного анализа или использования внешних инструментов, прямые ответы достигают предела. Модель должна либо отвечать без объяснений, либо молча ждать завершения работы инструментов.

Функция Thinking in the Live API ( gemini-3.8-live-extended-thinking ) добавляет фоновое логическое мышление к голосовым сессиям в реальном времени. Модель планирует и вызывает асинхронные инструменты в фоновом режиме, одновременно произнося естественные разговорные фразы-паразиты, чтобы поддерживать активное взаимодействие.

Эта архитектура изменяет жизненный цикл диалога двумя ключевыми способами:

  • Вводные фразы в диалогах : Модель озвучивает промежуточные обновления (например, "Проверяю варианты рейсов"), одновременно выполняя инструменты в фоновом режиме.
  • Отслеживание статуса взаимодействия : Поскольку модель может произносить несколько раз за один запрос, сервер отправляет interaction_status: "IN_PROGRESS" во время фоновой обработки и interaction_status: "IDLE" после завершения всей задачи.

На следующей диаграмме сравниваются циклы взаимодействия между стандартными сеансами голосовой связи в реальном времени и сеансами, основанными на логическом мышлении:

Сравнение вызовов функций API в реальном времени и отслеживания состояния.

Выбор подходящей модели

При выборе между gemini-3.8-live и gemini-3.8-live-extended-thinking следует учитывать три основных фактора: задержку ответа, сложность задачи и обработку состояния клиента.

Когда использовать Gemini 3.8 Live?

Используйте gemini-3.8-live для голосовых агентов с низкой задержкой, где важна немедленная смена реплик и задачи выполняются напрямую.

  • Разговорные голосовые помощники : сортировка обращений клиентов, языковая практика, голосовой поиск и интерактивное повествование.
  • Быстрое выполнение инструментов : рабочие процессы, в которых внешние инструменты возвращают результат в течение миллисекунд (например, считывание показаний датчиков или управление интеллектуальными устройствами).
  • Простая клиентская логика : приложения, в которых каждый ход пользователя получает один ответ от модели, а turnComplete: true надежно сигнализирует о том, что сессия неактивна.

Когда использовать Gemini 3.8 Live Extended Thinking

Используйте gemini-3.8-live-extended-thinking когда вашему агенту необходимо оценить сложные данные, спланировать несколько шагов или работать с инструментами, выполнение которых занимает несколько секунд.

  • Многоэтапная диагностика и поддержка : специалисты технической поддержки диагностируют проблемы системы на основе анализа множества журналов, кодов ошибок и проверок конфигурации.
  • Скоординированный поиск данных : туристические и бронирующие агенты, которые ищут авиабилеты, запрашивают информацию об отелях и сравнивают цены с помощью параллельных вызовов API.
  • Обучение STEM-дисциплинам и программированию : образовательные агенты, которые проверяют формулы, отлаживают код или разбирают многоэтапную логику, прежде чем дать объяснение.
  • Задержка инструмента маскировки : В случаях, когда длительно работающие функции создают неловкую тишину для слушателя.

Краткое описание ключевых различий

В следующей таблице приведены технические различия между обеими моделями:

Особенность Gemini 3.8 Live Близнецы 3.8 Живи расширенным мышлением
Основные варианты использования Голосовые агенты с низкой задержкой, прямые команды, быстрые инструменты. Многоэтапное решение проблем, комплексное планирование, многоинструментальные рабочие процессы.
Конечная точка модели gemini-3.8-live gemini-3.8-live-extended-thinking
Архитектура рассуждений Чередование рассуждений с фиксированным профилем задержки ( thinking_level не поддерживается) Настраиваемый уровень фонового анализа ( thinking_level : low , medium , high ; MINIMAL не поддерживается)
Границы поворота turnComplete: true завершает поворот и возвращается в режим ожидания. turnComplete: true завершает реплику; interaction_status управляет жизненным циклом сессии.
Разговорные слова-паразиты Модель ожидает выполнения инструмента, прежде чем начать говорить. Модель обрабатывает промежуточные диалоговые реплики в процессе выполнения.
Выполнение инструмента Поддерживает синхронные ( BLOCKING ) и асинхронные ( NON_BLOCKING ) инструменты. Требуется объявление асинхронных ( NON_BLOCKING ) инструментов.

Пути миграции и интеграции

Выполните следующие шаги, чтобы обновить существующие голосовые приложения или интегрировать Thinking в ваши сеансы Live API.

Обновление с Gemini 3.1 Flash Live

Для существующих голосовых приложений, использующих gemini-3.1-flash-live-preview , обновление до gemini-3.8-live требует обновления строки модели и исключения thinking_level (или thinking_config ) из конфигурации настройки, поскольку thinking_level не поддерживается для gemini-3.8-live :

{
  "setup": {
    "model": "models/gemini-3.8-live"
  }
}

Сигналы "жизненный цикл поворота" и turnComplete остаются идентичными.

Принятие мышления

Для внедрения gemini-3.8-live-extended-thinking необходимо обновить три точки интеграции:

  1. Отслеживайте interaction_status вместо turnComplete : в сессиях мышления модель может генерировать промежуточные диалоговые вставки во время рассуждений. Проверяйте поле interaction_status во входящих сообщениях сервера для управления состоянием пользовательского интерфейса. Возвращайтесь в состояние ожидания только тогда, когда interaction_status имеет значение IDLE .

    Python

    status = getattr(message, "interaction_status", None)
    if status == "IDLE":
        # Ready for user input
        set_ui_state("listening")
    elif status == "IN_PROGRESS":
        # Reasoning or executing tools
        set_ui_state("thinking")
    

    JavaScript

    if (message.interactionStatus === 'IDLE') {
      // Ready for user input
      setUiState('listening');
    } else if (message.interactionStatus === 'IN_PROGRESS') {
      // Reasoning or executing tools
      setUiState('thinking');
    }
    
  2. Объявление неблокирующих функций : установите "behavior": "NON_BLOCKING" для всех объявлений функций. Модели мышления запускают инструменты асинхронно в фоновом режиме, одновременно передавая словесные обновления. Синхронные блокирующие инструменты возвращают ошибку.

    Python

    search_flights = types.FunctionDeclaration(
        name="search_flights",
        description="Searches for available flights.",
        behavior="NON_BLOCKING",
        parameters={
            "type": "OBJECT",
            "properties": {
                "destination": {"type": "STRING"},
            },
            "required": ["destination"],
        },
    )
    

    JavaScript

    const searchFlights = {
      name: 'search_flights',
      description: 'Searches for available flights.',
      behavior: 'NON_BLOCKING',
      parameters: {
        type: 'OBJECT',
        properties: {
          destination: { type: 'STRING' },
        },
        required: ['destination'],
      },
    };
    
  3. Настройка глубины рассуждений : установите thinking_config в конфигурации сессии, чтобы отрегулировать уровни рассуждений ( low , medium или high ; MINIMAL не поддерживается).

    Python

    config = types.LiveConnectConfig(
        response_modalities=["AUDIO"],
        thinking_config=types.ThinkingConfig(
            thinking_level="low",
        ),
        tools=[types.Tool(function_declarations=[search_flights])],
    )
    

    JavaScript

    const config = {
      responseModalities: [Modality.AUDIO],
      thinkingConfig: {
        thinkingLevel: 'low',
      },
      tools: [{ functionDeclarations: [searchFlights] }],
    };
    

Сравнительный анализ протоколов

В этом разделе сравниваются сообщения WebSocket, которыми обмениваются на каждом этапе сеанса работы с Live API.

Шаг 1: Настройка сессии

Обе модели подключаются к одной и той же точке доступа WebSocket:

wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1alpha.GenerativeService.BidiGenerateContent?key=$API_KEY
  • Идентичные параметры : аутентификация по URL-адресу WebSocket и ключу API.
  • Строка модели : gemini-3.8-live versus gemini-3.8-live-extended-thinking .
  • Настройка мышления : Функция ThinkingConfig добавляет thinkingConfig для регулировки глубины рассуждений.
  • Поведение инструмента : Для мышления требуется "behavior": "NON_BLOCKING" при объявлении функций.

Gemini 3.8 Live

{
  "setup": {
    "model": "models/gemini-3.8-live",
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "voiceConfig": {
          "prebuiltVoiceConfig": {
            "voiceName": "Puck"
          }
        }
      }
    }
  }
}

Близнецы 3.8 Живи расширенным мышлением

{
  "setup": {
    "model": "models/gemini-3.8-live-extended-thinking",
    "generationConfig": {
      "responseModalities": ["AUDIO"],
      "speechConfig": {
        "voiceConfig": {
          "prebuiltVoiceConfig": {
            "voiceName": "Puck"
          }
        }
      },
      "thinkingConfig": {
        "thinkingLevel": "LOW"
      }
    },
    "tools": [{
      "functionDeclarations": [{
        "name": "searchFlights",
        "description": "Searches for flights between cities.",
        "behavior": "NON_BLOCKING",
        "parameters": {
          "type": "OBJECT",
          "properties": {
            "destination": { "type": "STRING" }
          },
          "required": ["destination"]
        }
      }]
    }]
  }
}

Обе модели получают одинаковое подтверждение от сервера при подключении:

{
  "setupComplete": {}
}

Шаг 2: Ввод аудиоданных пользователем

Потоковая передача аудиосигнала одинакова для обеих моделей. Передача аудиофрагментов PCM в реальном времени с частотой 16 кГц осуществляется с помощью realtimeInput :

{
  "realtimeInput": {
    "audio": {
      "data": "UklGRiQAAABXQVZF...",
      "mimeType": "audio/pcm;rate=16000"
    }
  }
}

Шаг 3: Моделирование отклика и жизненного цикла состояний

Обе модели передают аудиофрагменты PCM с частотой 24 кГц в serverContent.modelTurn . Однако управление жизненным циклом различается:

Gemini 3.8 Последовательность обработки ответов в реальном времени

  1. Сервер транслирует аудиофрагменты для каждого хода.
  2. Сервер отправляет сообщение turnComplete: true , указывающее на то, что модель закончила говорить и сессия находится в режиме ожидания.
// 1. Audio stream chunks
{
  "serverContent": {
    "modelTurn": {
      "parts": [
        {
          "inlineData": {
            "mimeType": "audio/pcm;rate=24000",
            "data": "..."
          }
        }
      ]
    }
  }
}

// 2. Turn completion -> Signals client to switch UI to Idle/Listening
{
  "serverContent": {
    "turnComplete": true
  }
}

Gemini 3.8 Live Extended Thinking response flow

  1. Вставка в речь : Модель произносит промежуточные фразы (например, "Проверка рейсов в Сиэтл..." ) с turnComplete: true и interactionStatus: "IN_PROGRESS" .
  2. Асинхронный вызов инструмента : Сервер отправляет вызов инструмента, пока interactionStatus остается "IN_PROGRESS" , указывая на то, что сервер активно обрабатывает многошаговый процесс и ожидает ответа от инструмента.
  3. Ответ инструмента : Клиент выполняет функцию и возвращает результат.
  4. Окончательный ответ : Сервер выдает полный ответ с turnComplete: true и interactionStatus: "IDLE" .
// 1. Spoken verbal filler while background reasoning proceeds
{
  "serverContent": {
    "modelTurn": {
      "parts": [
        {
          "inlineData": {
            "mimeType": "audio/pcm;rate=24000",
            "data": "..."
          }
        }
      ]
    },
    "turnComplete": true,
    "interactionStatus": "IN_PROGRESS"
  }
}

// 2. Asynchronous tool call emitted with IN_PROGRESS status
{
  "toolCall": {
    "functionCalls": [
      {
        "id": "call_123",
        "name": "searchFlights",
        "args": {
          "destination": "Seattle"
        }
      }
    ]
  },
  "interactionStatus": "IN_PROGRESS"
}

// 3. Client executes function and returns result
{
  "toolResponse": {
    "functionResponses": [
      {
        "response": {
          "output": {
            "flight": "DL 145",
            "price": "$145"
          }
        },
        "id": "call_123"
      }
    ]
  }
}

// 4. Final spoken answer delivered -> session transitions to IDLE when done
{
  "serverContent": {
    "modelTurn": {
      "parts": [
        {
          "inlineData": {
            "mimeType": "audio/pcm;rate=24000",
            "data": "..."
          }
        }
      ]
    },
    "interactionStatus": "IDLE",
    "turnComplete": true
  }
}

примеры реализации SDK

В следующих примерах показано, как настроить Thinking и обрабатывать interaction_status с помощью SDK Google GenAI.

Python

import asyncio
from google import genai
from google.genai import types

client = genai.Client()
model = "gemini-3.8-live-extended-thinking"

# Define non-blocking function declaration
search_flights = types.FunctionDeclaration(
    name="search_flights",
    description="Searches for available flights to a destination.",
    behavior="NON_BLOCKING",
    parameters={
        "type": "OBJECT",
        "properties": {
            "destination": {"type": "STRING"}
        },
        "required": ["destination"]
    }
)

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    thinking_config=types.ThinkingConfig(
        thinking_level="low"
    ),
    tools=[types.Tool(function_declarations=[search_flights])]
)

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        print("Session connected with Thinking")

        async for message in session.receive():
            # Inspect interaction status for server lifecycle tracking
            status = getattr(message, "interaction_status", None)
            if status:
                print(f"Interaction status: {status}")

            # Handle audio output parts
            if message.server_content and message.server_content.model_turn:
                for part in message.server_content.model_turn.parts:
                    if part.inline_data:
                        # Process 24kHz audio chunk
                        pass

            # Handle asynchronous tool call
            if message.tool_call:
                for call in message.tool_call.function_calls:
                    print(f"Executing tool: {call.name}")
                    # Simulate function execution
                    response = types.FunctionResponse(
                        id=call.id,
                        name=call.name,
                        response={"result": "Flight DL 145 ($145)"}
                    )
                    await session.send_tool_response(
                        function_responses=[response]
                    )

            # Status is IDLE when reasoning and all turns are complete
            if status == "IDLE":
                print("Session is idle and ready for user input.")

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

JavaScript

import { GoogleGenAI, Modality } from '@google/genai';

const ai = new GoogleGenAI({});
const model = 'gemini-3.8-live-extended-thinking';

const searchFlights = {
  name: 'search_flights',
  description: 'Searches for available flights to a destination.',
  behavior: 'NON_BLOCKING',
  parameters: {
    type: 'OBJECT',
    properties: {
      destination: { type: 'STRING' }
    },
    required: ['destination']
  }
};

const config = {
  responseModalities: [Modality.AUDIO],
  thinkingConfig: {
    thinkingLevel: 'low'
  },
  tools: [{ functionDeclarations: [searchFlights] }]
};

async function main() {
  const session = await ai.live.connect({
    model: model,
    config: config,
    callbacks: {
      onopen: () => console.log('Session connected'),
      onmessage: async (event) => {
        const message = JSON.parse(event.data);

        if (message.interactionStatus) {
          console.log(`Interaction status: ${message.interactionStatus}`);
        }

        if (message.toolCall) {
          for (const call of message.toolCall.functionCalls) {
            console.log(`Executing tool: ${call.name}`);
            session.sendToolResponse({
              functionResponses: [{
                id: call.id,
                name: call.name,
                response: { result: 'Flight DL 145 ($145)' }
              }]
            });
          }
        }

        if (message.interactionStatus === 'IDLE') {
          console.log('Session is idle and waiting for input.');
        }
      }
    }
  });
}

main();

Что дальше?