Course
Когда я впервые открыл сессию браузера GPT-Live-1, я ожидал обычный голосовой цикл: говоришь, ждёшь, затем слышишь ответ. Вместо этого микрофон оставался открыт, пока ассистент отвечал. Разговор ощущался менее жёстким, но приложению по-прежнему приходилось управлять работой, происходящей за кулисами.
OpenAI впервые представила GPT-Live в ChatGPT в июле, а затем выпустила GPT-Live-1 в API на этой неделе, как раз перед началом этой сборки. Наш учебник по GPT-Realtime-2.1 описывает подход с одной моделью, а наше руководство по GPT Live Transcribe фокусируется на живых субтитрах. Здесь вы создадите голосового обучающего ассистента, который ищет реальные ресурсы DataCamp и сохраняет план только после подтверждения.
Я называю его Voice Learning Assistant от DataCamp. Это прототип из учебника, а не промышленный DataCamp AI Assistant. Проект проводит одного обучающегося от озвученной цели к сохранённому плану.
Конкретные выводы
GPT-Live-1 отделяет устный обмен от работы бэкенда. Четыре наблюдения формируют работу ассистента.
- WebRTC и бэкенд идут разными путями: медиа-треки передают речь, а делегация Responses обрабатывает поиск и вызовы инструментов.
- Устное прерывание не отменяет работу бэкенда: версии задач защищают действия приложения, но делегация Responses не может полностью исключить каждую старую выдачу из следующего ответа.
- Дельты транскрипта — не финальные ходы беседы: сетевые задержки варьируются, интервалы пользователя и ассистента могут перекрываться, и ни одно событие транскрипта не помечает авторитетно завершённый ход.
- Вызов функции — это не разрешение на сохранение: приложение ждёт второго подтверждения, прежде чем записать план.
Эти выводы относятся к данному сценарию создания плана обучения. Другая подсказка или сеть могут изменить поведение, а клиентская делегация меняет границу контроля.
Что такое GPT-Live-1?
GPT-Live-1 — полно-дуплексная голосовая модель OpenAI. Она обрабатывает речевые ходы и прерывания, включая паузы между ними, а затем отправляет более долгую работу, такую как поиск или вызовы инструментов, на бэкенд.

Для обучающегося первое заметное отличие — в этих паузах.
Как работает полно-дуплексный разговор
Full duplex меняет очередность ходов. Вы можете сделать паузу, чтобы подумать, или перебить ассистента, а он может остановиться, чтобы услышать поправку. Руководство по подсказкам OpenAI показывает разделы подсказки для коротких подтверждений и прерываний.
Это важно для обучающего ассистента. Человек, описывающий карьерную цель, может делать паузы, начинать заново или добавить ограничение на полпути. Модель, которая ждёт фразу вроде «ну, пожалуй, примерно пять часов в неделю», позволяет обучающемуся думать вслух.
Разделение голосовой и бэкенд-работы
Делегация переносит задачу на бэкенд, но не передаёт управление приложением. Приложение всё равно решает, кто может действовать и разрешено ли сохранение. Оно также владеет сохранённым состоянием задачи.
GPT-Live-1 и GPT-Realtime-2.1
Если вы использовали GPT-Realtime-2.1, вы могли задуматься, заменяет ли его GPT-Live-1. Нет.
GPT-Realtime-2.1 обрабатывает прослушивание, рассуждение и выбор инструментов в одной модели через v1/realtime и тарифицируется по аудио- и текстовым токенам. GPT-Live-1 использует v1/live/sessions, тарифицирует голосовой слой посекундно и отправляет рассуждение на отдельный бэкенд.
Realtime-2.1 — не более старая и не «урезанная» опция. Это просто другой дизайн.
Создаём голосового обучающего ассистента на GPT-Live-1
Приложение принимает озвученную цель и превращает её в упорядоченный список реальных ресурсов DataCamp. Голосовая сессия остаётся открытой во время работы бэкенда. Когда запрос меняется, приложение обновляет версию задачи перед выполнением действия бэкенда.
Ничего не записывается, пока обучающийся снова не подтвердит это в приложении.
Архитектура приложения GPT-Live-1
Страница браузера держит соединение WebRTC и микрофон, а сервер создаёт сессию GPT-Live-1 и хранит ключ API. Бэкенд Responses (gpt-5.6-sol) использует веб-поиск и функцию save_learning_plan . Текущая версия задачи и подтверждённый план остаются в состоянии приложения.
Версия задачи определяет, какое действие бэкенда приложение примет, если запрос меняется во время поиска. Используйте репозиторий на GitHub для полностью запускаемого приложения; следующие разделы сосредоточены на его пути GPT-Live.

Браузер, GPT-Live-1 и бэкенд-модель соединены. Изображение автора.
Как настроить GPT-Live-1 на Python
Вам нужен проект OpenAI с доступом к GPT-Live-1 (бесплатный тариф его не поддерживает), Python и браузер, работающий по HTTPS или на localhost, чтобы появилось окно запроса к микрофону. Я использовал Python 3.11 и openai 3.13.0. Live API требует как минимум openai 3.12.0; в более старых версиях у клиента нет атрибута .live.
Ограничения по числу одновременных сессий зависят от вашего тарифа. Проверьте лимит проекта, прежде чем открывать много вкладок браузера.
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install openai fastapi uvicorn python-dotenv streamlit requests
На macOS или Linux активируйте окружение с помощью source .venv/bin/activate . Создайте файл .env в корне проекта и добавьте это значение.
OPENAI_API_KEY=sk-...
python-dotenv загружает этот файл автоматически после импорта на сервере, поэтому ключ не нужно помещать в код.
Клиент OpenAI() читает ту же переменную окружения, если вы не передаёте ключ.
Хранение ключа API на сервере
Браузер никогда не видит ваш проектный ключ. Он отправляет предложение WebRTC на ваш сервер, который с помощью ключа создаёт сессию. После обмена SDP браузер отправляет аудио в OpenAI по WebRTC, не получая этот ключ.
Вызов GPT-Live внутри /api/session создаёт сессию из SDP-предложения. В том же запросе передаются голосовые инструкции, бэкенд-модель, веб-поиск и функция сохранения.
result = client.live.create(
session={
"model": "gpt-live-1",
"instructions": LIVE_INSTRUCTIONS,
"delegation": {
"type": "responses",
"responses": {
"model": "gpt-5.6-sol",
"instructions": BACKEND_INSTRUCTIONS,
"tools": [
{
"type": "web_search",
"filters": {
"allowed_domains": ["datacamp.com", "www.datacamp.com"]
},
},
SAVE_LEARNING_PLAN_TOOL,
],
"tool_choice": "auto",
},
},
},
transport={"type": "webrtc", "sdp": sdp},
)
Этот вызов отправляет запрос на POST /v1/live/sessions и возвращает идентификатор сессии с SDP-ответом. HTTP-запрос запускает сессию, поэтому не отправляйте отдельное событие session.start после этого.
Образцовый сервер принимает запросы из браузера только с localhost:8501 и 127.0.0.1:8501. Это правило — для локального использования.
При развёртывании замените эти источники и аутентифицируйте оба эндпойнта /api/session и /api/save-plan. Ограничьте частоту создания сессий, так как каждый запрос может стоить денег и расходовать конкуррентность. Клиент может отправить confirmed: true сам, поэтому публичный сервер не может считать это поле доказательством того, кто сделал запрос.
Как создать сессию GPT-Live-1 через WebRTC
Следуя руководству OpenAI по WebRTC, браузер запрашивает доступ к микрофону и открывает RTCPeerConnection. Используйте документированную метку дата-канала oai-events и создайте его до генерации SDP-предложения. Этот канал переносит JSON-события в обоих направлениях после старта сессии.

WebRTC запускается, передаёт аудио, затем закрывается. Изображение автора.
Подключение микрофона и аудиовывода
Сама медиа-настройка — это обычный WebRTC. События GPT-Live используют дата-канал, созданный в последней строке.
const connection = new RTCPeerConnection();
connection.addEventListener("track", (event) => {
audio.srcObject = new MediaStream([event.track]);
audio.play();
});
const microphone = await navigator.mediaDevices.getUserMedia({ audio: true });
for (const track of microphone.getAudioTracks()) {
connection.addTrack(track, microphone);
}
const events = connection.createDataChannel("oai-events");
После создания предложения браузер вызывает setLocalDescription() и ждёт окончания сбора ICE. Он отправляет локальный SDP на /api/session, затем применяет ответ OpenAI с помощью setRemoteDescription(). Аудио микрофона и речь ассистента идут по медиа-трекам, поэтому отдельные запросы распознавания речи и синтеза речи не нужны.
Аудио не относится к oai-events. Не отправляйте session.input_audio.append и не ждите session.output_audio.delta на дата-канале WebRTC.
Для дата-канала действует иное правило по времени. Ждите session.started перед отправкой события через oai-events. В моей первой попытке я отправил его слишком рано, и соединение его проигнорировало.
Полезной ошибки не было, что сделало маленькую ошибку порядка раздражающей при отладке.
Стриминг событий транскрипта GPT-Live
Если вам не нужны видимые субтитры, можно пропустить этот подраздел; аудиосоединение уже готово.
session.input_transcript.delta и session.output_transcript.delta возвращают текстовые фрагменты с миллисекундными смещениями для живых субтитров. В документации OpenAI отмечено, что фрагменты транскрипта — не завершённые ходы. Доставка может быть неравномерной, а интервалы пользователя и ассистента — перекрываться.
Добавляйте фрагменты транскрипта на экран по мере их поступления, но не запускайте из них работу бэкенда. Решение о делегации принимает модель.
Как составить промпт для GPT-Live-1 для естественного диалога
Инструкции модели Live должны быть короткими. Руководство OpenAI предлагает помещать подробные шаги задачи в промпт бэкенда. Я оставил процедуру задачи там, а промпт Live сосредоточил на речи.
Этот фрагмент отделяет голосовое поведение от задачи по плану обучения. Правила речи находятся выше условий, запускающих делегацию.
You are Sage, a warm, encouraging voice learning coach for DataCamp learners.
Speak naturally at an unhurried pace. Be clear and direct, not overly cheerful.
Backchannel policy: Use moderate backchannels without competing with the response.
Interruption policy: Stop speaking when the learner interrupts, and listen.
Delegation policy:
Backend tools:
- learning_plan_research: search DataCamp resources and assemble a personalized learning plan.
- save_learning_plan: propose the current plan for app confirmation when the learner asks to save.
Delegate to the backend when:
- The learner states or changes a goal, skill level, or weekly time.
- A correction changes the plan already requested.
- The learner asks to save the plan.
Do not delegate for greetings, small clarifications, or a result already given.
Saving: a proposed save only asks the app to confirm. Do not say the plan is saved until the app reports a saved result.
After a save, keep the conversation open and ask what the learner wants next.
Эти правила оставляют приветствия в слое Live и отправляют запросы на исследование или сохранение на бэкенд. Подтверждение по-прежнему остаётся за приложением.
Обработка пауз, подтверждений и прерываний
Строки о бэкченнеле и прерывании подсказывают ассистенту, как реагировать вокруг пауз. «Умеренный бэкченнел» просит о редких подтверждениях вроде «угу», не заполняя каждую тишину. Я выбрал такой уровень, чтобы оставить обучающемуся пространство для мыслей; урок с более длинными паузами может требовать ещё меньше подтверждений.
Измените эту строку, если вашему приложению нужно иное поведение; добавление «никогда не говори, пока пользователь говорит» также уберёт бэкченнел.
Отделение голосовых инструкций от инструкций по задаче
У двух промптов разные роли. Промпт Live управляет речью и передачей, а промпт бэкенда — исследованием и форматом ответа. Руководство OpenAI не рекомендует размещать подробные шаги поиска в голосовых инструкциях.
Как добавить делегацию бэкенда GPT-Live
Разделение, описанное ранее, отражается в поле delegation сессии. Когда обучающийся формулирует цель, GPT-Live отправляет задачу модели, которая может искать по нашему каталогу курсов и составлять план.
GPT-Live-1 предлагает делегацию Responses и клиентскую делегацию. Делегация Responses позволяет OpenAI управлять вызовом бэкенда, а клиентская передаёт его вашему коду. Я использовал делегацию Responses, чтобы избежать ещё одной бэкенд-петли в этом приложении.
Настройка бэкенд-модели
Я использовал gpt-5.6-sol. В руководстве по делегации OpenAI в качестве стартового примера используется gpt-5.6-terra и указан gpt-5.6-luna для более дешёвых задач. С Sol бэкенд возвращал запрошенную структуру плана.
Оставьте tool_choice в значении auto — чтобы бэкенд мог выбирать веб-поиск или функцию сохранения. Режим делегации фиксируется при запуске; чтобы перейти на клиентскую делегацию, закройте текущую сессию и создайте новую.
Определение моментов для делегации
Правило в промпте Live простое: приветствия и короткие вопросы остаются в модели Live, а план обучения или изменения к нему идут на бэкенд. Ничто в API не принуждает к этой границе. Тестируйте её на типичных запросах вашего приложения, потому что выбор делает сама модель.
Как добавить веб-поиск по ресурсам DataCamp
После делегации у бэкенда одна задача: превратить цель обучающегося в короткий список ресурсов DataCamp со ссылками. Я дал ему инструмент web_search с параметром filters.allowed_domains , установленным на datacamp.com и www.datacamp.com. Считайте этот фильтр инструкцией к поиску, а не доказательством, что каждая ссылка верна.
Пример цели просит путь по data engineering с 5 часами в неделю, некоторыми знаниями Python и без опыта SQL. Ответ начинается со статьи How to Learn Data Engineering From Scratch in 2026 и трека Associate Data Engineer in SQL.
Оставшиеся элементы смешивают проект, курс по базам данных в Python, ещё один трек и завершающий проект по конвейерам данных. Каждый указанный URL открывает существующую страницу DataCamp.
Преобразование результатов поиска в план обучения
Промпт бэкенда просит четыре–семь упорядоченных элементов. Каждый элемент содержит заголовок, URL, краткое обоснование и тип course, project, track или article. Комбинация следует заявленным предпочтениям формата и недельному времени обучающегося.
Я не просил модель угадывать длительность курса, если она не указана на странице. Точное число в таком случае заявляло бы больше, чем подтверждает источник.
Как продолжать говорить, пока работает бэкенд
GPT-Live может поддерживать активную голосовую сессию, пока бэкенд Responses работает. Если обучающийся добавит требование «практические проекты» до возврата первого плана, исходная бэкенд-работа не отменяется автоматически.
Обновление запроса во время выполнения
Устная коррекция не отменяет и не переписывает автоматически работу, уже начатую бэкендом. Прерывание речи ассистента и изменение задачи — это разные действия. Приложение решает, что делать со старым результатом.
Сервер отслеживает счётчик task_version и увеличивает его при каждом новом запуске делегации. Когда приходит результат, приложение проверяет его версию перед выполнением; собственный обработчик логирует старый результат и не исполняет его.
У делегации Responses здесь есть предел: модель Live получает результат бэкенда напрямую, поэтому проверка версии не может полностью контролировать её следующий устный ответ. Клиентская делегация позволяет вашему коду отбросить старый результат до того, как он дойдёт до модели. Таким образом, версия задачи защищает действия приложения, а не каждое слово ассистента.

Версии задач сохраняют новые ограничения активными. Изображение автора.
После завершения первого ответа бэкенда я отправил уточнение: нужны практические проекты и не для начинающих по Python. Обновлённый семиэлементный план начинался с Introduction to SQL, затем включал один трек, два курса и четыре проекта, включая Exploring London's Travel Network и Building a Retail Data Pipeline. Это демонстрирует доработку через завершённые ходы; ничего не говорит об остановке активного ответа.
Отправка обновлений бэкенда голосовой модели
Во время работы бэкенда три события append могут обновить модель Live: session.thinking.append добавляет контекст, который не должен быть озвучен, session.commentary.append добавляет текст для проговаривания своими словами, а session.instructions.append изменяет инструкции.
Каждое добавление несёт простую строку максимум в 500 токенов. Эти события обновляют контекст или поведение модели Live; они не изменяют и не отменяют уже запущенную задачу бэкенда Responses. Инструкция может перенаправить текущее поведение Live, а комментарий предоставляет информацию, которую модель должна озвучить.
Панель показывает прогресс бэкенда, но не отправляет эти append-события. При делегации Responses обновления из вашего приложения всё ещё можно отправлять через oai-events, но они используют delegation_id: null. Ненулевые delegation_id используются для клиентских задач.
Держите task_id и task_version в состоянии приложения, а не используйте для этого delegation_id.
Как добавить вызов функций для подтверждённого сохранения
В этом приложении ответ модели сам по себе ничего не сохраняет. Бэкенд использует save_learning_plan для предложения ожидаемого действия, а /api/save-plan выполняет фактическую запись.
Вызовы функций бэкенда приходят внутри response.event. Обработчик ждёт вложенный элемент response.output_item.done, затем читает его call_id, name и arguments.
Ожидание завершённого элемента важно, потому что ранние события могут содержать только часть вызова. Приложение парсит аргументы, но пока не запускает функцию.
SAVE_LEARNING_PLAN_TOOL = {
"type": "function",
"name": "save_learning_plan",
"description": "Propose the current learning plan for confirmation when the learner asks to save.",
"parameters": {
"type": "object",
"properties": {
"goal": {"type": "string"},
"weekly_hours": {"type": "number"},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {"type": "string"},
"url": {"type": "string"},
"reason": {"type": "string"},
"type": {
"type": "string",
"enum": ["course", "project", "track", "article"],
},
},
"required": ["title", "url", "reason", "type"],
"additionalProperties": False,
},
},
},
"required": ["goal", "weekly_hours", "items"],
"additionalProperties": False,
},
"strict": True,
}
Схема даёт приложению фиксированный набор полей для отображения перед тем, как попросить обучающегося о подтверждении. Поле type сохраняет явное различение курсов, проектов, треков и статей в сохранённых данных.

Терминал показывает типизированные аргументы функции сохранения. Изображение автора.
Требование подтверждения перед действием
Когда обучающийся просит сохранить, бэкенд вызывает save_learning_plan с полным планом. Виджет сохраняет эти аргументы и показывает окно подтверждения, но вызов по-прежнему является лишь предложением.
Оставленный без ответа вызов заблокировал бы делегированный ответ и последующие ходы бэкенда. Виджет сразу отвечает ему результатом «ожидает подтверждения», затем отправляет response.create, чтобы разговор продолжился.
events.send(JSON.stringify({
type: "response.item.create",
item: {
type: "function_call_output",
call_id: callId,
output: JSON.stringify({
status: "awaiting_user_confirmation",
saved: false,
}),
},
}));
events.send(JSON.stringify({ type: "response.create" }));
На этом этапе файл не записывается. Ассистент может направить обучающегося к кнопке «Подтвердить и сохранить», не блокируя последующую делегированную работу.
Эндпойнт /api/save-plan откажется записывать, если confirmed — true не установлено. Поскольку транскрипт может быть неточным или неполным, одного устного запроса недостаточно, чтобы сохранить план.

Подтверждение отделяет запросы от сохранённых действий. Изображение автора.
Возврат подтверждённого сохранения в разговор
Щелчок «Подтвердить» отправляет /api/save-plan ожидающий план и confirmed: true. После того как сервер вернёт ID плана, виджет отправляет session.commentary.append с delegation_id: null поскольку исходный вызов функции уже был отвечен.
const saveResponse = await fetch(${SERVER}/api/save-plan, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
confirmed: true,
plan: pendingFunctionCall.args,
}),
});
const saveResult = await saveResponse.json();
events.send(JSON.stringify({
type: "session.commentary.append",
delegation_id: null,
content: The plan was saved as ${saveResult.plan_id}.,
}));
Обновление через commentary сообщает модели Live о завершённой записи и позволяет ей вслух подтвердить сохранение. Ранний вызов функции остаётся закрытым, а голосовая сессия доступна для следующего запроса обучающегося.
Как запустить голосового ассистента на GPT-Live-1
Ранее упомянутый репозиторий на GitHub содержит сервер FastAPI, интерфейс на Streamlit и виджет WebRTC в папке app/. После клонирования откройте два терминала в этой папке. Запустите uvicorn server:app --host 127.0.0.1 --port 8000 в одном и streamlit run streamlit_app.py в другом.
Интерфейс Streamlit оборачивает тот же сервер и виджет, которые использовались на протяжении всей сборки. Он размещает живой разговор рядом с планом обучения и активностью бэкенда, а панель обновляется без сброса вызова.
Видео ниже следует за озвученной целью, поиском бэкенда, пересмотренным планом и подтверждённым сохранением. Вызов остаётся открытым после сохранения, чтобы обучающийся мог продолжить.
Одна записанная сессия не показывает, как приложение ведёт себя при каждом акценте, сетевом состоянии или неясной фразе.
Стоимость GPT-Live-1 и заметки для продакшена
OpenAI указывает цену голосового слоя в $0.05 за минуту, тарификация посекундная без округления вверх. Токены бэкенд-модели, веб-поиск и другие инструменты оплачиваются отдельно. Общая стоимость — это плата за голосовую сессию плюс расходы на gpt-5.6-sol, web_search и любые другие инструменты, использованные в сессии.
Стоимость сессии и неактивные соединения
Счётчик тикает всё время, пока сессия открыта, включая тишину и работу бэкенда. Отключение микрофона этот таймер не останавливает. Закрывайте неактивные соединения через session.close, ждите session.closed, затем останавливайте локальные треки микрофона и peer-соединение.
Создание сессии в начале списывает 15 секунд голосового времени, затем зачитывает эту сумму в счёт текущей длительности. Это не дополнительная плата сверх сессии.
session.usage.updated сообщает общее число секунд на текущий момент, а не добавленные с прошлого события. Когда вызов завершается, session.closed.usage.seconds содержит финальное значение. Складывание снапшотов приведёт к двойному учёту времени.
Хранение состояния задач вне GPT-Live-1
У GPT-Live-1 окно контекста 128 000 токенов, включая аудио-токены, не попадающие в транскрипт. После 90% использования старые детали могут быть суммированы или опущены. Поэтому сохранённый план, флаг подтверждения и версия задачи живут в состоянии сервера.
Репозиторий сохраняет состояние, принадлежащее приложению, для каждой беседы, а не рассматривает память Live как единственный источник истины.
Мультипользовательскому приложению нужны записи с ключами по пользователю и сессии и проверка доступа перед чтением или изменением плана. Держите эти проверки в коде приложения, а не в промпте. Привяжите подтверждение к версии плана и давайте каждому сохранению уникальный ID, чтобы повторная попытка не записала его дважды.
Для телефонных звонков OpenAI также документирует SIP и партнёрские интеграции. Здесь браузерная сборка остаётся на WebRTC.
Итоги
Открытый микрофон — лишь половина этой схемы. Как показал раздел о версиях задач, делегация Responses удерживает вызов бэкенда внутри сессии Live, но старый результат всё же может достичь голосового слоя после того, как приложение отклонит его действие.
Используйте делегацию Responses для черновиков, которые можно исправить в следующем ходу. Выбирайте клиентскую делегацию, когда старый результат ни при каких условиях не должен попасть в голосовую модель. В обоих случаях держите права, версии задач и сохранённые данные на сервере.
Вопросы и ответы
Можно ли менять голос GPT-Live-1 во время сессии?
Нет. В руководстве по сессиям указано, что голос задаётся при старте сессии. Для его смены нужна новая сессия.
Принимает ли GPT-Live-1 изображения или видео?
Не напрямую. На странице модели GPT-Live-1 перечислены текст и аудио как типы ввода и вывода, а не изображения или видео. Делегированный бэкенд с возможностью зрения может проанализировать изображение и вернуть текст для беседы Live.
Можно ли сохранять и форкать сессию GPT-Live-1?
Да. Установите store: true при создании исходной сессии; сохранённые записи истекают через 30 дней, а Zero Data Retention принудительно выключает хранение. Форк создаёт отдельную Live-сессию и ID, а не переоткрывает исходное соединение.
Обучает ли OpenAI модели на данных сессий GPT-Live-1?
Нет, по умолчанию — нет. В руководстве по контролю данных указано, что /v1/live/sessions исключены из обучения и допускают Zero Data Retention с ограничениями.
Поддерживает ли GPT-Live-1 структурированные выводы?
Не в голосовой модели. Используйте бэкенд-модель или схему функции, когда приложению нужны структурированные данные.