2026, Jan 05 00:02

Как запустить batch‑предсказание Gemini в Vertex AI без 400 INVALID_ARGUMENT

Почему batches.create в Vertex AI Gemini падает с 400 INVALID_ARGUMENT и как исправить: правильное окружение и запуск batch из GCS с Google GenAI SDK.

Пакетное предсказание с Gemini в Vertex AI выглядит простым, пока упрямый 400 INVALID_ARGUMENT не останавливает запуск на этапе batches.create. Сбивает с толку, что ошибку провоцируют даже примерные источники вроде gs://cloud-samples-data/batch/prompt_for_batch_gemini_predict.jsonl или ссылка bq://. Ниже — краткий разбор, что именно приводит к сбою и как добиться чистого запуска с помощью Google GenAI SDK при входном пути из GCS.

Воспроизводим ошибку

Ниже приведённый фрагмент создаёт пакетную задачу с текстовыми подсказками для gemini-2.0-flash-001 и опрашивает её до завершения. Вызов падает с 400 INVALID_ARGUMENT при обращении к batches.create. Логика минимальна, для src используется GCS-URI.

import time
import os

from google import genai
from google.genai.types import CreateBatchJobConfig, JobState, HttpOptions

os.environ["GOOGLE_GENAI_USE_VERTEXAI"] = "True"

a i_cli = genai.Client(
    api_key=creds.token,
    http_options=HttpOptions(api_version="v1")
)

result_uri = "gs://llm_marking_up/movie_categorization_results"

batch_job = ai_cli.batches.create(
    model="gemini-2.0-flash-001",
    src="gs://cloud-samples-data/batch/prompt_for_batch_gemini_predict.jsonl",
    config=CreateBatchJobConfig(dest=result_uri),
)
print(f"Job name: {batch_job.name}")
print(f"Job state: {batch_job.state}")

final_states = {
    JobState.JOB_STATE_SUCCEEDED,
    JobState.JOB_STATE_FAILED,
    JobState.JOB_STATE_CANCELLED,
    JobState.JOB_STATE_PAUSED,
}

while batch_job.state not in final_states:
    time.sleep(30)
    batch_job = ai_cli.batches.get(name=batch_job.name)
    print(f"Job state: {batch_job.state}")

Что на самом деле не так

Дело не в самом JSONL-файле и не в формате gs://. Проблема в окружении: SDK и конфигурация среды выполнения должны быть согласованы с ожиданиями Vertex AI. Если это несоответствие есть, сервис отвечает INVALID_ARGUMENT, даже когда src указывает на валидный пример в Cloud Storage. Успешный запуск подтверждает, что ввод из GCS работает, как только окружение настроено корректно.

Исправление, которое разблокирует пакетные предсказания

Рабочая конфигурация держится на трёх шагах. Во‑первых, обновите Google GenAI SDK, чтобы клиент соответствовал текущему поведению бэкенда. Во‑вторых, экспортируйте нужные переменные окружения Google Cloud, чтобы Vertex AI знал, какой проект и регион использовать. В‑третьих, применяйте аутентификацию через учетные данные по умолчанию GCP и не передавайте api_key при создании клиента.

pip install --upgrade google-genai
export GOOGLE_CLOUD_PROJECT=your_project_id
export GOOGLE_CLOUD_LOCATION=us-central1
export GOOGLE_GENAI_USE_VERTEXAI=True

С этими настройками Python‑код остаётся минимальным и стабильным. Логика прежняя: создаём пакетную задачу для gemini-2.0-flash-001 с источником JSONL в GCS и опрашиваем до терминального состояния.

import time
import os

from google import genai
from google.genai.types import CreateBatchJobConfig, JobState, HttpOptions

os.environ["GOOGLE_GENAI_USE_VERTEXAI"] = "True"

a i_cli = genai.Client(
    http_options=HttpOptions(api_version="v1")
)

result_uri = "gs://llm_marking_up/movie_categorization_results"

batch_job = ai_cli.batches.create(
    model="gemini-2.0-flash-001",
    src="gs://cloud-samples-data/batch/prompt_for_batch_gemini_predict.jsonl",
    config=CreateBatchJobConfig(dest=result_uri),
)
print(f"Job name: {batch_job.name}")
print(f"Job state: {batch_job.state}")

final_states = {
    JobState.JOB_STATE_SUCCEEDED,
    JobState.JOB_STATE_FAILED,
    JobState.JOB_STATE_CANCELLED,
    JobState.JOB_STATE_PAUSED,
}

while batch_job.state not in final_states:
    time.sleep(30)
    batch_job = ai_cli.batches.get(name=batch_job.name)
    print(f"Job state: {batch_job.state}")

При успешном запуске выводятся переходы состояний, а завершение происходит со статусом JOB_STATE_SUCCEEDED; файл результата batch_prompt_for_batch_gemini_predict.jsonl появляется в указанном бакете GCS.

Job name: projects/xxx/locations/us-central1/batchPredictionJobs/xxx
Job state: JOB_STATE_PENDING
Job state: JOB_STATE_RUNNING
...
Job state: JOB_STATE_SUCCEEDED

Почему это важно для пакетных задач в Vertex AI

Конвейеры пакетных предсказаний для генеративных моделей чувствительны к версиям SDK и границам проекта. Актуальный SDK и явно заданные GOOGLE_CLOUD_PROJECT и GOOGLE_CLOUD_LOCATION предотвращают непонятные ошибки валидации запросов. Использование учетных данных по умолчанию сохраняет согласованность с потоком аутентификации Google Cloud и помогает избежать рассинхронизации между API‑ключами и настройками Vertex AI.

Итоги

Если batches.create возвращает 400 INVALID_ARGUMENT для пакетной задачи Gemini, сначала синхронизируйте SDK и окружение, вместо того чтобы искать проблему в формате данных. Обновите google-genai, экспортируйте GOOGLE_CLOUD_PROJECT и GOOGLE_CLOUD_LOCATION, установите GOOGLE_GENAI_USE_VERTEXAI=True и используйте учетные данные GCP по умолчанию. В этой конфигурации документированный ввод из GCS, например gs://cloud-samples-data/batch/prompt_for_batch_gemini_predict.jsonl, запускается штатно и сохраняет результаты в ваш бакет.