#!/usr/bin/env bash # STATUS: UNVERIFIED (ACCOUNT_RESTRICTED) — 2026-09-18 every batchGenerateContent create (this body included) returned # 400 FAILED_PRECONDITION "Precondition check failed." on our free-tier key (Batch API: "Free Tier: Not available"). # On a paid key: 200 Operation {name: batches/…, metadata.state: BATCH_STATE_PENDING}; poll GET /v1beta/{name} until done. # Run: bash examples/gemini/batch/batch-inline.sh set -euo pipefail cd "$(dirname "$0")/../../.." source scripts/lib.sh MODEL="${GEMINI_MODEL:-gemini-3.5-flash-lite}" OUT=$(mktemp); trap 'rm -f "$OUT"' EXIT gemini POST "/v1beta/models/$MODEL:batchGenerateContent" -d '{"batch":{"display_name":"atlas-example","input_config":{"requests":{"requests":[ {"request":{"contents":[{"parts":[{"text":"Reply with OK."}]}],"generationConfig":{"maxOutputTokens":8}},"metadata":{"key":"r1"}}, {"request":{"contents":[{"parts":[{"text":"Reply with OK."}]}],"generationConfig":{"maxOutputTokens":8}},"metadata":{"key":"r2"}}]}}}}' > "$OUT" log_request gemini POST "/v1beta/models/{model}:batchGenerateContent" "$GEMINI_STATUS" 0.0001 "example batch-inline.sh create" echo "HTTP $GEMINI_STATUS"; cat "$OUT"; echo NAME=$(python3 -c "import json,sys; print(json.load(open(sys.argv[1])).get('name',''))" "$OUT") [ -n "$NAME" ] || exit 0 for _ in $(seq 1 15); do # poll ≤ 5 min sleep 20 gemini GET "/v1beta/$NAME" > "$OUT"; log_request gemini GET "/v1beta/batches/{id}" "$GEMINI_STATUS" 0 "example batch poll" python3 -c "import json,sys; d=json.load(open(sys.argv[1])); print('state', d.get('metadata',{}).get('state'), 'done', d.get('done'))" "$OUT" [ "$(python3 -c "import json,sys; print(json.load(open(sys.argv[1])).get('done', False))" "$OUT")" = "True" ] && break done python3 -c "import json,sys; d=json.load(open(sys.argv[1])); print(json.dumps(d.get('response', d.get('error')), indent=1)[:1500])" "$OUT" gemini DELETE "/v1beta/$NAME" > /dev/null; log_request gemini DELETE "/v1beta/batches/{id}" "$GEMINI_STATUS" 0 "example batch delete"