הסקת מסקנות גמישה

תיאור: איך לבצע אופטימיזציה של העלויות באמצעות היקש ברמת Flex

‫Gemini Flex API הוא מסלול הסקה שמציע הפחתת עלויות ב-50% בהשוואה לתעריפים הרגילים, בתמורה לזמן אחזור משתנה ולזמינות לפי יכולת. הוא מיועד לעומסי עבודה שיכולים לסבול זמן אחזור ודורשים עיבוד סינכרוני, אבל לא צריכים את הביצועים בזמן אמת של ה-API הרגיל.

איך משתמשים ב-Flex

כדי להשתמש ברמת Flex, מציינים את service_tier בתור flex בגוף הבקשה. כברירת מחדל, אם לא מציינים את השדה הזה, הבקשות משתמשות ברמה הרגילה.

Python

from google import genai

client = genai.Client()

try:
    response = client.models.generate_content(
        model="gemini-3.8-flash",
        contents="Analyze this dataset for trends...",
        config={"service_tier": "flex"},
    )
    print(response.text)
except Exception as e:
    print(f"Flex request failed: {e}")

JavaScript

import {GoogleGenAI} from '@google/genai';

const ai = new GoogleGenAI({});

async function main() {
  try {
    const response = await ai.models.generateContent({
      model: "gemini-3.8-flash",
      contents: "Analyze this dataset for trends...",
      config: { serviceTier: "flex" },
    });
    console.log(response.text);
  } catch (e) {
    console.log(`Flex request failed: ${e}`);
  }
}

await main();

Go

package main

import (
    "context"
    "fmt"
    "log"
    "google.golang.org/genai"
)

func main() {
    ctx := context.Background()
    client, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }

    result, err := client.Models.GenerateContent(
        ctx,
        "gemini-3.8-flash",
        genai.Text("Analyze this dataset for trends..."),
        &genai.GenerateContentConfig{
            ServiceTier: "flex",
        },
    )
    if err != nil {
        log.Printf("Flex request failed: %v", err)
        return
    }
    fmt.Println(result.Text())
}

REST

curl -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash:generateContent?key=$GEMINI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "contents": [{
    "parts":[{"text": "Summarize the latest research on quantum computing."}]
  }],
  "service_tier": "flex"
}'

איך פועל היקש ברמת Flex

היקש ברמת Flex ב-Gemini מגשר על הפער בין ה-API הרגיל לבין זמן העיבוד של 24 שעות ב-Batch API. הוא משתמש בקיבולת מחשוב 'ניתנת להפחתה' מחוץ לשעות השיא כדי לספק פתרון חסכוני למשימות ברקע ולתהליכי עבודה רציפים.

תכונה שרירים של סלע עדיפות רגיל Batch
תמחור 50% הנחה 75%-100% יותר מבתוכנית Standard מחיר מלא 50% הנחה
זמן אחזור דקות (יעד של 1-15 דקות) נמוך (שניות) שניות לדקות עד 24 שעות
אמינות הכי טוב שאפשר (ניתן להשמטה) גבוהה (לא נושרת) גבוהה / בינונית-גבוהה גבוה (לתפוקה)
ממשק סינכרוני סינכרוני סינכרוני אסינכרוני

יתרונות עיקריים

  • יעילות בעלויות: חיסכון משמעותי בהערכות של סביבות שאינן סביבות ייצור, בסוכנים ברקע ובהעשרת נתונים.
  • תהליך פשוט: אין צורך לנהל אובייקטים של אצווה, מזהי משימות או דגימות. פשוט מוסיפים פרמטר אחד לבקשות הקיימות.
  • תהליכי עבודה סינכרוניים: מתאים במיוחד לשרשראות API רציפות שבהן הבקשה הבאה תלויה בפלט של הבקשה הקודמת, ולכן הוא גמיש יותר מ-Batch ל-Agentic Workflows.

תרחישים לדוגמה

  • הערכות אופליין: הפעלת בדיקות רגרסיה או טבלאות של "מודל שפה גדול כשופט".
  • סוכנים ברקע: משימות רציפות כמו עדכוני CRM, בניית פרופילים או ניהול תוכן, שבהן עיכוב של כמה דקות הוא קביל.
  • מחקר בהגבלת תקציב: ניסויים אקדמיים שדורשים נפח טוקנים גבוה בתקציב מוגבל.

מגבלות קצב

התנועה של "היקש ברמת Flex" נכללת במגבלות הקצב הכלליות שלכם, ולא מציעה מגבלות קצב מורחבות כמו Batch API.

קיבולת שניתן להקצות

תנועת הנתונים של Flex מטופלת בעדיפות נמוכה יותר. אם יש עלייה חדה בתנועה הרגילה, יכול להיות שבקשות Flex יופקעו או יפונו כדי להבטיח קיבולת למשתמשים בעדיפות גבוהה. אם אתם מחפשים הסקה בעדיפות גבוהה, עיינו בקטע הסקה בעדיפות גבוהה.

קודי שגיאה

אם הקיבולת של Flex לא זמינה או שהמערכת עמוסה, ה-API יחזיר קודי שגיאה סטנדרטיים:

  • ‫503 Service Unavailable: המערכת עמוסה כרגע.
  • ‫429 Too Many Requests: חריגה ממגבלות הקצב או ניצול מלא של המשאבים.

באחריות הלקוח

  • אין חלופה בצד השרת: כדי למנוע חיובים לא צפויים, המערכת לא תשדרג באופן אוטומטי בקשה ב-Flex לרמה Standard אם הקיבולת של Flex מלאה.
  • ניסיונות חוזרים: אתם צריכים להטמיע לוגיקה משלכם לביצוע ניסיונות חוזרים בצד הלקוח, עם השהיה מעריכית לפני ניסיון חוזר (exponential backoff).
  • זמן קצוב לתפוגה: בקשות Flex עשויות להמתין בתור, לכן מומלץ להגדיל את הזמן הקצוב לתפוגה בצד הלקוח ל-10 דקות או יותר כדי למנוע סגירה מוקדמת של החיבור.

שינוי חלונות הזמן הקצוב לתפוגה

אפשר להגדיר פסק זמן לכל בקשה עבור API בארכיטקטורת REST וספריות לקוח, ופסק זמן גלובלי רק כשמשתמשים בספריות לקוח.

חשוב לוודא שזמן הקצוב לתפוגה בצד הלקוח מכסה את חלון הסבלנות של השרת (למשל, יותר מ-600 שניות לתורי המתנה של Flex). ערכי הזמן הקצוב לתפוגה בערכות ה-SDK צריכים להיות באלפיות השנייה.

זמנים קצובים לתפוגה לכל בקשה

Python

from google import genai

client = genai.Client()

try:
    response = client.models.generate_content(
        model="gemini-3.8-flash",
        contents="why is the sky blue?",
        config={
            "service_tier": "flex",
            "http_options": {"timeout": 900000}
        },
    )
except Exception as e:
    print(f"Flex request failed: {e}")

# Example with streaming
try:
    response = client.models.generate_content_stream(
        model="gemini-3.8-flash",
        contents=["List 5 ideas for a sci-fi movie."],
        config={
            "service_tier": "flex",
            "http_options": {"timeout": 60000}
        }
        # Per-request timeout for the streaming operation
    )
    for chunk in response:
        print(chunk.text, end="")

except Exception as e:
    print(f"An error occurred during streaming: {e}")

JavaScript

 import {GoogleGenAI} from '@google/genai';

 const client = new GoogleGenAI({});

 async function main() {
     try {
         const response = await client.models.generateContent({
             model: "gemini-3.8-flash",
             contents: "why is the sky blue?",
             config: {
               serviceTier: "flex",
               httpOptions: {timeout: 900000}
             },
         });
     } catch (e) {
         console.log(`Flex request failed: ${e}`);
     }

     // Example with streaming
     try {
         const response = await client.models.generateContentStream({
             model: "gemini-3.8-flash",
             contents: ["List 5 ideas for a sci-fi movie."],
             config: {
                 serviceTier: "flex",
                 httpOptions: {timeout: 60000}
             },
         });
         for await (const chunk of response.stream) {
             process.stdout.write(chunk.text());
         }
     } catch (e) {
         console.log(`An error occurred during streaming: ${e}`);
     }
 }

 await main();

Go

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "google.golang.org/api/iterator"
    "google.golang.org/genai"
)

func main() {
    ctx := context.Background()
    client, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }
    defer client.Close()

    timeoutCtx, cancel := context.WithTimeout(ctx, 900*time.Second)
    defer cancel()

    _, err = client.Models.GenerateContent(
        timeoutCtx,
        "gemini-3.8-flash",
        genai.Text("why is the sky blue?"),
        &genai.GenerateContentConfig{
            ServiceTier: "flex",
        },
    )
    if err != nil {
        fmt.Printf("Flex request failed: %v\n", err)
    }

    // Example with streaming
    streamTimeoutCtx, streamCancel := context.WithTimeout(ctx, 60*time.Second)
    defer streamCancel()

    iter := client.Models.GenerateContentStream(
        streamTimeoutCtx,
        "gemini-3.8-flash",
        genai.Text("List 5 ideas for a sci-fi movie."),
        &genai.GenerateContentConfig{
            ServiceTier: "flex",
        },
    )
    for {
        response, err := iter.Next()
        if err == iterator.Done {
            break
        }
        if err != nil {
            fmt.Printf("An error occurred during streaming: %v\n", err)
            break
        }
        fmt.Print(response.Candidates[0].Content.Parts[0])
    }
}

REST

כשמבצעים קריאות REST, אפשר לשלוט בזמן הקצוב לתפוגה באמצעות שילוב של כותרות HTTP ואפשרויות של curl:

  • הכותרת X-Server-Timeout (זמן קצוב לתפוגה בצד השרת): הכותרת הזו מציעה משך זמן מומלץ לתפוגה (ברירת מחדל היא 600 שניות) לשרת Gemini API. השרת ינסה לפעול בהתאם, אבל אין הבטחה שזה יקרה. הערך צריך להיות בשניות.

  • ‫--max-time ב-curl (זמן קצוב לתפוגה בצד הלקוח): האפשרות curl --max-time <seconds> מגדירה מגבלה קשיחה על משך הזמן הכולל (בשניות) שבו curl ימתין להשלמת הפעולה כולה. זהו אמצעי הגנה בצד הלקוח.

 # Set a server timeout hint of 120 seconds and a client-side curl timeout of 125 seconds.
 curl --max-time 125 \
   -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.8-flash:generateContent?key=$GEMINI_API_KEY" \
   -H "Content-Type: application/json" \
   -H "X-Server-Timeout: 120" \
   -d '{
   "contents": [{
     "parts":[{"text": "Summarize the latest research on quantum computing."}]
   }],
   "service_tier": "flex"
 }'

חסימות גלובליות

אם רוצים שלכל הקריאות ל-API שמתבצעות דרך מכונה ספציפית של genai.Client (ספריות לקוח בלבד) יהיה זמן קצוב לתפוגה כברירת מחדל, אפשר להגדיר את זה כשמפעילים את הלקוח באמצעות http_options ו-genai.types.HttpOptions.

Python

from google import genai
from google.genai import types

global_timeout_ms = 120000

client_with_global_timeout = genai.Client(
    http_options=types.HttpOptions(timeout=global_timeout_ms)
)

try:
    # Calling generate_content using global timeout...
    response = client_with_global_timeout.models.generate_content(
        model="gemini-3.8-flash",
        contents="Summarize the history of AI development since 2000.",
        config={"service_tier": "flex"},
    )
    print(response.text)

    # A per-request timeout will *override* the global timeout for that specific call.
    shorter_timeout = 30000
    response = client_with_global_timeout.models.generate_content(
        model="gemini-3.8-flash",
        contents="Provide a very brief definition of machine learning.",
        config={
            "service_tier": "flex",
            "http_options":{"timeout": shorter_timeout}
        }  # Overrides the global timeout
    )

    print(response.text)

except TimeoutError:
    print(
        f"A GenerateContent call timed out. Check if the global or per-request timeout was exceeded."
    )
except Exception as e:
    print(f"An error occurred: {e}")

JavaScript

import {GoogleGenAI} from '@google/genai';

const globalTimeoutMs = 120000;

const clientWithGlobalTimeout = new GoogleGenAI({httpOptions: {timeout: globalTimeoutMs}});

async function main() {
    try {
        // Calling generate_content using global timeout...
        const response1 = await clientWithGlobalTimeout.models.generateContent({
            model: "gemini-3.8-flash",
            contents: "Summarize the history of AI development since 2000.",
            config: { serviceTier: "flex" },
        });
        console.log(response1.text());

        // A per-request timeout will *override* the global timeout for that specific call.
        const shorterTimeout = 30000;
        const response2 = await clientWithGlobalTimeout.models.generateContent({
            model: "gemini-3.8-flash",
            contents: "Provide a very brief definition of machine learning.",
            config: {
                serviceTier: "flex",
                httpOptions: {timeout: shorterTimeout}
            }  // Overrides the global timeout
        });

        console.log(response2.text());

    } catch (e) {
        if (e.name === 'TimeoutError' || e.message?.includes('timeout')) {
            console.log(
                "A GenerateContent call timed out. Check if the global or per-request timeout was exceeded."
            );
        } else {
            console.log(`An error occurred: ${e}`);
        }
    }
}

await main();

Go

 package main

 import (
     "context"
     "fmt"
     "log"
     "time"

     "google.golang.org/genai"
 )

 func main() {
     ctx := context.Background()
     client, err := genai.NewClient(ctx, nil)
     if err != nil {
         log.Fatal(err)
     }
     defer client.Close()

     model := client.GenerativeModel("gemini-3.8-flash")

     // Go uses context for timeouts, not client options.
     // Set a default timeout for requests.
     globalTimeout := 120 * time.Second
     fmt.Printf("Using default timeout of %v seconds.\n", globalTimeout.Seconds())

     fmt.Println("Calling generate_content (using default timeout)...")
     ctx1, cancel1 := context.WithTimeout(ctx, globalTimeout)
     defer cancel1()
     resp1, err := model.GenerateContent(ctx1, genai.Text("Summarize the history of AI development since 2000."), &genai.GenerateContentConfig{ServiceTier: "flex"})
     if err != nil {
         log.Printf("Request 1 failed: %v", err)
     } else {
         fmt.Println("GenerateContent 1 successful.")
         fmt.Println(resp1.Text())
     }

     // A different timeout can be used for other requests.
     shorterTimeout := 30 * time.Second
     fmt.Printf("\nCalling generate_content with a shorter timeout of %v seconds...\n", shorterTimeout.Seconds())
     ctx2, cancel2 := context.WithTimeout(ctx, shorterTimeout)
     defer cancel2()
     resp2, err := model.GenerateContent(ctx2, genai.Text("Provide a very brief definition of machine learning."), &genai.GenerateContentConfig{
         ServiceTier: "flex",
     })
     if err != nil {
         log.Printf("Request 2 failed: %v", err)
     } else {
         fmt.Println("GenerateContent 2 successful.")
         fmt.Println(resp2.Text())
     }
 }

הטמעה של ניסיונות חוזרים

מכיוון ש-Flex הוא שירות שניתן להשיל, והוא נכשל עם שגיאות 503, הנה דוגמה להטמעה אופציונלית של לוגיקת ניסיון חוזר כדי להמשיך עם בקשות שנכשלו:

Python

import time
from google import genai

client = genai.Client()

def call_with_retry(max_retries=3, base_delay=5):
    for attempt in range(max_retries):
        try:
            return client.models.generate_content(
                model="gemini-3.8-flash",
                contents="Analyze this batch statement.",
                config={"service_tier": "flex"},
            )
        except Exception as e:
            # Check for 503 Service Unavailable or 429 Rate Limits
            print(e.code)
            if attempt < max_retries - 1:
                delay = base_delay * (2 ** attempt) # Exponential Backoff
                print(f"Flex busy, retrying in {delay}s...")
                time.sleep(delay)
            else:
                # Fallback to standard on last strike (Optional)
                print("Flex exhausted, falling back to Standard...")
                return client.models.generate_content(
                    model="gemini-3.8-flash",
                    contents="Analyze this batch statement."
                )

# Usage
response = call_with_retry()
print(response.text)

JavaScript

 import {GoogleGenAI} from '@google/genai';

 const ai = new GoogleGenAI({});

 async function sleep(ms) {
   return new Promise(resolve => setTimeout(resolve, ms));
 }

 async function callWithRetry(maxRetries = 3, baseDelay = 5) {
   for (let attempt = 0; attempt < maxRetries; attempt++) {
     try {
       console.log(`Attempt ${attempt + 1}: Calling Flex tier...`);
       const response = await ai.models.generateContent({
         model: "gemini-3.8-flash",
         contents: "Analyze this batch statement.",
         config: { serviceTier: 'flex' },
       });
       return response;
     } catch (e) {
       if (attempt < maxRetries - 1) {
         const delay = baseDelay * (2 ** attempt);
         console.log(`Flex busy, retrying in ${delay}s...`);
         await sleep(delay * 1000);
       } else {
         console.log("Flex exhausted, falling back to Standard...");
         return await ai.models.generateContent({
           model: "gemini-3.8-flash",
           contents: "Analyze this batch statement.",
         });
       }
     }
   }
 }

 async function main() {
     const response = await callWithRetry();
     console.log(response.text);
 }

 await main();

Go

 package main

 import (
     "context"
     "fmt"
     "log"
     "math"
     "time"

     "google.golang.org/genai"
 )

 func callWithRetry(ctx context.Context, client *genai.Client, maxRetries int, baseDelay time.Duration) (*genai.GenerateContentResponse, error) {
     modelName := "gemini-3.8-flash"
     content := genai.Text("Analyze this batch statement.")
     flexConfig := &genai.GenerateContentConfig{
         ServiceTier: "flex",
     }

     for attempt := 0; attempt < maxRetries; attempt++ {
         log.Printf("Attempt %d: Calling Flex tier...", attempt+1)
         resp, err := client.Models.GenerateContent(ctx, modelName, content, flexConfig)
         if err == nil {
             return resp, nil
         }

         log.Printf("Attempt %d failed: %v", attempt+1, err)

         if attempt < maxRetries-1 {
             delay := time.Duration(float64(baseDelay) * math.Pow(2, float64(attempt)))
             log.Printf("Flex busy, retrying in %v...", delay)
             time.Sleep(delay)
         } else {
             log.Println("Flex exhausted, falling back to Standard...")
             return client.Models.GenerateContent(ctx, modelName, content)
         }
     }
     return nil, fmt.Errorf("retries exhausted") // Should not be reached
 }

 func main() {
     ctx := context.Background()
     client, err := genai.NewClient(ctx, nil)
     if err != nil {
         log.Fatal(err)
     }
     defer client.Close()

     resp, err := callWithRetry(ctx, client, 3, 5*time.Second)
     if err != nil {
         log.Fatalf("Failed after retries: %v", err)
     }
     fmt.Println(resp.Text())
 }

תמחור

התמחור של היקש ברמת Flex הוא 50% מה-API הרגיל, והחיוב הוא לפי טוקן.

מודלים נתמכים

המודלים הבאים תומכים בהיקש ברמת Flex:

מודל היקש ברמת Flex
Gemini 4 Argon ✔️
Gemini 3.8 Flash ✔️
‫Gemini 3.6 Flash ✔️
Gemini 3.5 Flash-Lite ✔️
‫Gemini 3.1 Flash-Lite ✔️
גרסת טרום-השקה של Gemini 3.1 Pro ✔️
גרסת טרום-השקה של Gemini 3 Flash ✔️
תצוגה מקדימה של תמונות ב-Gemini 3 Pro ✔️
Gemini 2.5 Pro ✔️
Gemini 2.5 Flash ✔️
Gemini 2.5 Flash Image ✔️
Gemini 2.5 Flash-Lite ✔️

המאמרים הבאים

אפשר לקרוא על אפשרויות נוספות של הסקת מסקנות ואופטימיזציה ב-Gemini: