При использовании Google Gemini API переход с AI Studio на Vertex AI — это путь, который проходят многие разработчики. Однако небольшое различие в параметре role заставляет многих спотыкаться на ровном месте:
[&{Please use a valid role: user, model. (request id: xxx) 400 }]
Корень этой ошибки 400 в том, что Vertex AI строго требует, чтобы каждый объект в массиве contents содержал поле role, в то время как AI Studio позволяет опускать его при одиночных запросах (single-turn).
В этой статье мы подробно разберем различия в формате тела запроса между Vertex AI и AI Studio и предложим готовые решения для разных сценариев.

Обзор ключевых различий между Vertex AI и AI Studio
Прежде чем исправлять ошибку 400, давайте разберемся в фундаментальных отличиях двух платформ.
Различия в позиционировании платформ
| Параметр сравнения | AI Studio (Google AI) | Vertex AI |
|---|---|---|
| Целевая аудитория | Быстрое прототипирование для разработчиков | Корпоративное промышленное развертывание |
| Способ аутентификации | API Key | Service Account / OAuth |
| Лимиты (Rate limits) | Базовые, не для коммерции | Промышленные, поддержка коммерции |
| Поле role | Можно опустить в одном ходе | Обязательно к заполнению |
| Формат эндпоинта | generativelanguage.googleapis.com | {region}-aiplatform.googleapis.com |
| Доступные платформы | APIYI (apiyi.com), официальный API | APIYI (apiyi.com), Google Cloud |
Почему возникает ошибка role 400
Vertex AI — это платформа корпоративного уровня, поэтому проверка формата запросов там гораздо строже. Если в теле вашего запроса отсутствует поле role, Vertex AI немедленно вернет ответ:
{
"error": {
"code": 400,
"message": "Please use a valid role: user, model.",
"status": "INVALID_ARGUMENT"
}
}

🎯 Совет эксперта: При переходе с AI Studio на Vertex AI мы рекомендуем использовать платформу APIYI (apiyi.com) для тестирования вызовов. Эта платформа предоставляет унифицированный интерфейс API и автоматически обрабатывает различия в параметрах между разными площадками, что помогает быстро проверить работоспособность вашего технического решения.
Подробный разбор формата тела запроса Vertex AI
Корректный формат запроса Vertex AI
Тело запроса к Gemini API в Vertex AI должно строго соответствовать следующей структуре:
{
"contents": [
{
"role": "user",
"parts": [
{
"text": "解释一下什么是大语言模型"
}
]
}
],
"generationConfig": {
"temperature": 0.7,
"maxOutputTokens": 2048
}
}
Допустимые значения параметра role
Vertex AI принимает только два значения для поля role:
| Значение role | Значение | Сценарий использования |
|---|---|---|
user |
Ввод пользователя | Вопросы или инструкции, отправляемые модели |
model |
Ответ модели | История ответов в многораундовом диалоге |
Примеры: как неправильно и как правильно
❌ Ошибка: отсутствует поле role (стиль AI Studio)
{
"contents": [
{
"parts": [
{
"text": "Hello, how are you?"
}
]
}
]
}
✅ Правильно: поле role указано (стиль Vertex AI)
{
"contents": [
{
"role": "user",
"parts": [
{
"text": "Hello, how are you?"
}
]
}
]
}
Подробный разбор формата тела запроса AI Studio
«Гибкий» режим AI Studio
AI Studio (Google AI) предъявляет менее строгие требования к формату. В сценариях с одиночным запросом поле role можно опустить:
{
"contents": [
{
"parts": [
{
"text": "What is machine learning?"
}
]
}
]
}
Сравнение тела запроса на двух платформах

| Поле | AI Studio | Vertex AI |
|---|---|---|
contents |
Обязательно | Обязательно |
contents[].role |
Опционально (в один раунд) | Обязательно |
contents[].parts |
Обязательно | Обязательно |
contents[].parts[].text |
Обязательно | Обязательно |
systemInstruction |
Поддерживается | Поддерживается |
generationConfig |
Опционально | Опционально |
Сценарий многораундового диалога
В многораундовых диалогах форматы на обеих платформах становятся идентичными — необходимо явно указывать role:
{
"contents": [
{
"role": "user",
"parts": [{"text": "你好,请介绍一下自己"}]
},
{
"role": "model",
"parts": [{"text": "你好!我是 Gemini,由 Google 开发的 AI 助手..."}]
},
{
"role": "user",
"parts": [{"text": "你能做什么?"}]
}
]
}
3 полных решения для разных сценариев
Сценарий 1: Вызов Vertex AI через Python SDK
При использовании официального Python SDK от Google убедитесь, что вы правильно передаете параметр role:
from google import genai
from google.genai.types import Content, Part
# Инициализация клиента
client = genai.Client(
vertexai=True,
project="your-project-id",
location="us-central1"
)
# Правильный формат запроса — параметр role обязателен
contents = [
Content(
role="user",
parts=[Part(text="Что такое Vertex AI?")]
)
]
response = client.models.generate_content(
model="gemini-2.0-flash",
contents=contents
)
print(response.text)
Сценарий 2: Прямой вызов через REST API
Прямой вызов Vertex AI REST API с помощью curl или любого HTTP-клиента:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://us-central1-aiplatform.googleapis.com/v1/projects/YOUR_PROJECT/locations/us-central1/publishers/google/models/gemini-2.0-flash:generateContent" \
-d '{
"contents": [
{
"role": "user",
"parts": [
{"text": "Объясни базовые принципы квантовых вычислений"}
]
}
],
"generationConfig": {
"temperature": 0.7,
"maxOutputTokens": 1024
}
}'
💡 Быстрый старт: Для быстрой сборки прототипов рекомендуем платформу APIYI (apiyi.com). Она предоставляет готовые к работе API-интерфейсы, которые унифицируют различия в форматах между Vertex AI и AI Studio. Никаких сложных настроек — интеграция занимает всего 5 минут.
Сценарий 3: Вызов в формате, совместимом с OpenAI
Если ваш код написан под OpenAI SDK, вы можете использовать совместимый формат:
import openai
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # Используем унифицированный интерфейс APIYI
)
# Формат, совместимый с OpenAI, автоматически обрабатывает role
response = client.chat.completions.create(
model="gemini-2.0-flash",
messages=[
{"role": "user", "content": "Что такое нейронная сеть?"}
]
)
print(response.choices[0].message.content)
Особенности Vertex AI Express Mode
Что такое Vertex AI Express Mode
Vertex AI Express Mode — это промежуточный вариант между AI Studio и стандартным Vertex AI:
| Характеристика | AI Studio | Vertex AI Express | Vertex AI Standard |
|---|---|---|---|
| Способ аутентификации | API-ключ | API-ключ | Сервисный аккаунт |
| Лимиты (Rate limits) | Базовые | Промышленный уровень | Промышленный уровень |
| Коммерческая лицензия | Нет | Да | Да |
| Требования к role | Необязательно | Обязательно | Обязательно |
| Эндпоинт | generativelanguage | aiplatform | aiplatform |
Требования к параметру role в Express Mode
Хотя Express Mode использует аутентификацию по API-ключу (как и AI Studio), он наследует строгие требования к формату Vertex AI: поле role обязательно для заполнения.
# Пример для Express Mode — поле role обязательно
import requests
url = "https://us-central1-aiplatform.googleapis.com/v1/projects/YOUR_PROJECT/locations/us-central1/publishers/google/models/gemini-2.0-flash:generateContent"
headers = {
"Content-Type": "application/json",
"X-Goog-Api-Key": "YOUR_API_KEY"
}
data = {
"contents": [
{
"role": "user", # Обязательно к заполнению!
"parts": [{"text": "Hello World"}]
}
]
}
response = requests.post(url, headers=headers, json=data)
Руководство по устранению распространенных ошибок
Ошибка 1: Please use a valid role: user, model
Причина: в объектах массива contents отсутствует поле role.
Решение:
{
"contents": [
{
+ "role": "user",
"parts": [{"text": "..."}]
}
]
}
Ошибка 2: Invalid role value
Причина: в поле role указано недопустимое значение (например, "system" или "assistant").
Решение: Vertex AI принимает только значения user и model, он не поддерживает system или assistant внутри массива contents.
{
"contents": [
{
- "role": "assistant",
+ "role": "model",
"parts": [{"text": "..."}]
}
]
}
Ошибка 3: Неверное расположение System instructions
Причина: системный промпт размещен в contents вместо поля systemInstruction.
Решение:
{
"systemInstruction": {
"parts": [{"text": "Ты — профессиональный технический консультант"}]
},
"contents": [
{
"role": "user",
"parts": [{"text": "Объясни мне, что такое API"}]
}
]
}
💰 Оптимизация затрат: Для проектов, требующих частого тестирования форматов API, можно рассмотреть вызов через платформу APIYI (apiyi.com). Она предлагает гибкую тарификацию и более выгодные цены, что отлично подходит для небольших команд и индивидуальных разработчиков в процессе отладки.
Чек-лист для миграции
При переходе с AI Studio на Vertex AI используйте этот список, чтобы убедиться в правильности формата запросов:
Обязательные изменения
| Что проверить | Написание в AI Studio | Написание в Vertex AI |
|---|---|---|
Поле role |
Можно пропустить | Обязательно добавить "role": "user" |
| URL эндпоинта | generativelanguage.googleapis.com | {region}-aiplatform.googleapis.com |
| Способ аутентификации | x-goog-api-key |
Authorization: Bearer |
| Путь к модели | models/gemini-pro | publishers/google/models/gemini-pro |
Пример миграции кода
До (AI Studio):
import google.generativeai as genai
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content("Hello")
После (Vertex AI):
from google import genai
from google.genai.types import Content, Part
client = genai.Client(vertexai=True, project="your-project", location="us-central1")
contents = [
Content(role="user", parts=[Part(text="Hello")]) # role обязателен
]
response = client.models.generate_content(
model="gemini-2.0-flash",
contents=contents
)
Обработка role в мультимодальных запросах
Запросы с изображениями и текстом
При отправке мультимодального запроса, содержащего изображения, вам всё так же нужно указывать role:
{
"contents": [
{
"role": "user",
"parts": [
{"text": "Опиши содержание этого изображения"},
{
"inlineData": {
"mimeType": "image/jpeg",
"data": "BASE64_ENCODED_IMAGE"
}
}
]
}
]
}
Использование файлов из Cloud Storage
{
"contents": [
{
"role": "user",
"parts": [
{"text": "Проанализируй основное содержание этого видео"},
{
"fileData": {
"mimeType": "video/mp4",
"fileUri": "gs://your-bucket/video.mp4"
}
}
]
}
]
}

Часто задаваемые вопросы (FAQ)
Q1: Почему в AI Studio можно пропустить role, а в Vertex AI — нет?
AI Studio задумывался как инструмент для быстрого прототипирования, поэтому требования к формату там довольно гибкие. Vertex AI, напротив, является корпоративной платформой, где важна строгая структура запросов для обеспечения стабильности и удобства поддержки системы. На платформе APIYI (apiyi.com) можно получить бесплатные тестовые кредиты, чтобы быстро проверить требования к форматам на разных площадках.
Q2: Поддерживает ли Vertex AI роль system?
Нет, не поддерживает. В Vertex AI поле role принимает только два значения: user и model. Для системных указаний нужно использовать отдельное поле systemInstruction:
{
"systemInstruction": {
"parts": [{"text": "Ваш системный промпт"}]
},
"contents": [...]
}
Q3: Как маппится роль assistant из формата OpenAI?
Роль assistant в формате OpenAI соответствует роли model в Vertex AI. Если вы используете унифицированный интерфейс APIYI (apiyi.com), этот маппинг выполняется автоматически.
Q4: Как быстро проверить правильность формата запроса?
Рекомендуем следующие способы проверки:
- Тестирование через платформу APIYI: система проверит формат запроса и подскажет, если есть ошибки.
- Google Cloud Console: в Vertex AI Studio есть визуальный интерфейс для тестов.
- Локальное Mock-тестирование: сначала отладьте логику в AI Studio, а затем адаптируйте формат для миграции в Vertex AI.
Q5: Одинаков ли формат запросов для Vertex AI Express Mode и стандартного режима?
Да, структура тела запроса (request body) в обоих случаях идентична и требует обязательного указания поля role. Основная разница заключается в способе аутентификации (API Key против Service Account).
Итоги
Главное различие в форматах запросов Vertex AI и AI Studio заключается в обязательности поля role:
| Платформа | Требование к role | Допустимые значения |
|---|---|---|
| AI Studio | Опционально для одного сообщения, обязательно для диалога | user, model |
| Vertex AI | Всегда обязательно | user, model |
| Vertex AI Express | Всегда обязательно | user, model |
Основные шаги для исправления ошибки 400:
- Убедитесь, что каждый объект в массиве
contentsсодержит"role": "user"или"role": "model". - Используйте поле
systemInstructionвместо роли для системных промптов. - Маппите
assistantиз формата OpenAI вmodel.
Чтобы не тратить время на ручную настройку, рекомендуем использовать APIYI (apiyi.com). Платформа автоматически решает вопросы совместимости разных API, позволяя вам сосредоточиться на разработке логики приложения.
Дополнительные материалы:
- Официальная документация Vertex AI: cloud.google.com/vertex-ai/docs
- Справочник Gemini API: ai.google.dev/api
- Руководство по миграции: cloud.google.com/vertex-ai/generative-ai/docs/migrate/migrate-google-ai
📝 Автор: Техническая команда APIYI | Специализируемся на интеграции и оптимизации больших языковых моделей
🔗 Техническая поддержка: Посетите APIYI (apiyi.com) для получения ресурсов и помощи в разработке