Claude Opus 5.5 уже доступна в SeedRouter

Gemini 4 Argon API: чат на Python с нативным стримингом

Реализуйте диалог с API Gemini 4 Argon на Python: читайте нативный SSE, сохраняйте подписанные части, обрабатывайте пустые ответы и проверяйте расход токенов.

Читать в Markdown

Диалог через API Gemini 4 Argon использует нативное содержимое Gemini: contents, роли и parts. Первый запрос невелик. Сложнее правильно сохранить ответ перед отправкой уточняющего вопроса. Если восстановить ход модели только из видимого текста, можно потерять подписанное содержимое. А пустое сообщение о загрузке в истории может сделать следующий запрос недопустимым.

В этом руководстве используются стандартная библиотека Python и нативный эндпоинт SeedRouter. Оно посвящено текстовому чату и потоковой выдаче. Полный справочник API описывает весь контракт параметров; здесь мы проследим путь от одного запроса до рабочего диалога.

Перед первым запросом

Вам понадобятся Python 3, API-ключ SeedRouter и достаточный баланс аккаунта. Храните ключ в переменной окружения SEEDROUTER_API_KEY; не помещайте его в исходный код или в пакет, отправляемый браузеру. Каждое отправленное сообщение может повлечь расходы. Пример не выполняет автоматических повторов запросов или вызовов продолжения.

ID модели — gemini-4-argon; модель указывается в пути эндпоинта. Google описывает этот формат в руководстве по нативной генерации. SeedRouter использует Bearer-аутентификацию, как показано ниже.

Отправьте один запрос к API Gemini 4 Argon

curl --no-buffer --fail-with-body \
  'https://api.seedrouter.ai/v1beta/models/gemini-4-argon:streamGenerateContent?alt=sse' \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"contents":[{"role":"user","parts":[{"text":"Explain a mutex in one sentence."}]}],"generationConfig":{"maxOutputTokens":1024,"thinkingConfig":{"thinkingLevel":"low"}}}'

Ответ представляет собой последовательность событий, отправляемых сервером, а не единый JSON-документ. Каждое событие data: содержит нативный JSON Gemini. Видимый текст находится в candidates[].content.parts[].text; некоторые части содержат вместо него рассуждения или подписи. usageMetadata может прийти отдельно от текста, поэтому дочитайте поток до последнего события, прежде чем считать ответ завершённым.

Этот намеренно небольшой лимит вывода предназначен для первичной проверки работоспособности. Рассуждения тоже расходуют его, поэтому ответ может остаться незавершённым. Для более сложных задач осознанно увеличьте лимит; не превращайте незавершённый ответ в невидимый цикл повторных запросов.

Запустите диалог из двух ходов на Python

Скачайте полный пример на Python, сохраните его локально и запустите:

python3 gemini-4-argon-chat.py

Сначала спросите «Explain a mutex in one sentence», затем — «Give a Python example of that idea». Скрипт ждёт вашего ввода перед каждым запросом. Пустая строка завершает работу. Основное правило формирования истории:

user = {"role": "user", "parts": [{"text": text}]}
body = {"contents": [*history, user]}
history = [*history, user, {"role": "model", "parts": parts}]

Скачиваемый скрипт также задаёт настройки генерации, разбирает SSE-кадры, печатает только текст без рассуждений и обновляет историю лишь после причины завершения STOP при непустых parts. Ошибка API, обрыв потока или пустой ответ оставляют предыдущую историю без изменений. Скрипт не отправляет сообщение повторно без уведомления.

Короткий фрагмент выше поясняет структуру данных; для полной обработки запросов запускайте весь файл. Для ответа без потоковой передачи используется операция generateContent, а справочные примеры показывают cURL, Python, Node.js и Go.

Сохраняйте нативные parts, а не индикатор загрузки

Второй запрос должен содержать три настоящих хода: первое сообщение пользователя, завершённый ответ модели и второе сообщение пользователя. Надпись «Думает…» в интерфейсе — не дополнительный ход модели.

Ошибка вроде contents.3.parts: Too small: expected array to have >=1 items означает, что у четвёртого элемента содержимого пустой массив parts. Индексация начинается с нуля. Прежде чем менять промпт или модель, проверьте, как строится история. Индикатор загрузки относится к состоянию интерфейса; он никогда не должен превращаться в { "role": "model", "parts": [] } внутри запроса.

Сохраняйте все возвращённые части в исходном порядке, включая thoughtSignature и части, помеченные как рассуждения, даже если интерфейс их скрывает. Руководство Google по подписям рассуждений объясняет, почему эти непрозрачные поля должны сохраняться для следующих ходов. Не редактируйте, не придумывайте и не реконструируйте подписи. Храните нативную историю отдельно от текста, отображаемого в интерфейсе.

Для диалогов с инструментами действует тот же принцип сохранения. Но выполнение инструмента и возврат его результата требуют более сложного цикла приложения. Этот текстовый пример не реализует такой цикл, и его нельзя представлять как полноценного агента для программирования.

Читайте данные об использовании и обрабатывайте остановку

Для прямых запросов сохраняйте последние значения использования, полученные из потока. Не складывайте повторяющиеся накопительные снимки в рамках одного запроса. Обычный вход — это promptTokenCount минус cachedContentTokenCount; оплачиваемый выход включает и candidatesTokenCount, и thoughtsTokenCount. Руководство по ценам объясняет, как перевести эти счётчики в бюджет.

Ctrl+C останавливает пример, не отправляя новых запросов. Прекращение локального чтения не доказывает, что удалённая генерация не использовала токены. Если поток закончился до получения данных об использовании, проверьте запись в аккаунте. Пример осторожно исключает незавершённый ход из дальнейшей истории; сохранять ли частичные ответы — отдельное решение при разработке приложения.

Long decode — ещё один отдельный случай. Причина завершения CONTINUATION возобновляет исходную генерацию с токеном продолжения; это не новое сообщение пользователя. Google требует исходный запрос и последний токен без добавления частичного вывода в contents. См. руководство по long decode. Этот вводный скрипт останавливается, а не реализует автоматическое продолжение.

Что было проверено?

Базовая потоковая выдача текста прошла локальную сквозную проверку через Playground SeedRouter. Разбор данных и ведение истории в примере проверяются на синтетических потоках, в том числе с подписанными частями, пустыми ответами и прерываниями. Эти тестовые данные проверяют программное обеспечение; это не дополнительные запуски модели. Инструменты, медиа и продолжение требуют отдельных проверок возможностей, прежде чем их можно будет назвать проверенными интеграциями.

Вопросы об API

Можно ли заменить название модели OpenAI на gemini-4-argon?

Одной замены недостаточно для преобразования форматов сообщений. В руководстве используются нативные поля Gemini contents и parts. Убедитесь, что клиент поддерживает этот протокол, а также выбранную аутентификацию и эндпоинт.

Почему ответ пустой, хотя токены были использованы?

Рассуждения могут израсходовать лимит вывода. Настройки безопасности или незавершённая генерация тоже могут помешать появлению видимого текста. Проверьте причину завершения и данные об использовании. Не вставляйте пустой ход модели и не повторяйте платный запрос автоматически.

Означает ли контекст в миллион токенов миллион выходных токенов?

Нет. Вход, рассуждения и выход делят общий контекст. У длинных генераций также есть ограничения на каждый запрос, и им может потребоваться продолжение. Планируйте общий объём, а не отдельные квоты для входа и выхода.

Добавляйте функции после того, как заработает диалог

Начните с одного полного ответа, затем убедитесь, что второй ход получает исходное нативное содержимое. Добавляя вложения, инструменты или постоянное хранение, держите историю API Gemini 4 Argon отдельно от состояния интерфейса. Playground модели и руководство по доступу помогут перейти к интерактивному использованию и разобраться с требованиями к аккаунту.

Похожие руководства