#!/bin/bash # ----------------------------------------------------------------------------- # Gemini API Replay Script # ----------------------------------------------------------------------------- # Purpose: # This script is used to replay a Gemini API request using a raw JSON payload. # It is particularly useful for debugging the exact requests made by the # Gemini CLI. # # Prerequisites: # 1. Export your Gemini API key: # export GEMINI_API_KEY="your_api_key_here" # # 2. Generate a request payload from the Gemini CLI: # Inside the CLI, run the `/chat debug` command. This will save the most # recent API request to a file named `gcli-request-.json`. # # Usage: # ./scripts/send_gemini_request.sh --payload --model [--stream] # # Options: # --payload Path to the JSON request payload. # --model The Gemini model ID (e.g., gemini-3-flash-preview). # --stream (Optional) Use the streaming API endpoint. Defaults to non-streaming. # # Example: # ./scripts/send_gemini_request.sh --payload gcli-request.json --model gemini-3-flash-preview # ----------------------------------------------------------------------------- set -e -E # Load environment variables from .env if it exists if [ -f ".env" ]; then echo "Loading environment variables from .env file..." set -a # Automatically export all variables source .env set +a fi # Function to print usage usage() { echo "Usage: $0 --payload --model [--stream]" echo "Ensure GEMINI_API_KEY environment variable is set." exit 1 } STREAM_MODE=false # Parse command line arguments while [[ "$#" -gt 0 ]]; do case $1 in --payload) PAYLOAD_FILE="$2"; shift ;; --model) MODEL_ID="$2"; shift ;; --stream) STREAM_MODE=true ;; *) echo "Unknown parameter passed: $1"; usage ;; esac shift done # Validate inputs if [ -z "$PAYLOAD_FILE" ] || [ -z "$MODEL_ID" ]; then echo "Error: Missing required arguments." usage fi if [ -z "$GEMINI_API_KEY" ]; then echo "Error: GEMINI_API_KEY environment variable is not set." exit 1 fi if [ ! -f "$PAYLOAD_FILE" ]; then echo "Error: Payload file '$PAYLOAD_FILE' does not exist." exit 1 fi # API Endpoint definition if [ "$STREAM_MODE" = true ]; then GENERATE_CONTENT_API="streamGenerateContent" echo "Mode: Streaming" else GENERATE_CONTENT_API="generateContent" echo "Mode: Non-streaming (Default)" fi echo "Sending request to model: $MODEL_ID" echo "Using payload from: $PAYLOAD_FILE" echo "----------------------------------------" # Make the cURL request. If non-streaming, pipe through jq for readability if available. if [ "$STREAM_MODE" = false ] && command -v jq &> /dev/null; then curl -s -X POST \ -H "Content-Type: application/json" \ "https://generativelanguage.googleapis.com/v1beta/models/${MODEL_ID}:${GENERATE_CONTENT_API}?key=${GEMINI_API_KEY}" \ -d "@${PAYLOAD_FILE}" | jq . else curl -X POST \ -H "Content-Type: application/json" \ "https://generativelanguage.googleapis.com/v1beta/models/${MODEL_ID}:${GENERATE_CONTENT_API}?key=${GEMINI_API_KEY}" \ -d "@${PAYLOAD_FILE}" fi echo -e "\n----------------------------------------"