Multimodal Live API

Multimodal Live API מאפשר אינטראקציות דו-כיווניות בווידאו ובקול עם זמן אחזור נמוך באמצעות Gemini. באמצעות Multimodal Live API, תוכלו לספק למשתמשי הקצה חוויה של שיחות קוליות טבעיות דמויות-אנושיות, וגם את היכולת להפריע לתשובות של המודל באמצעות פקודות קוליות. המודל יכול לעבד קלט של טקסט, אודיו ווידאו, ולספק פלט של טקסט ואודיו.

יכולות

Multimodal Live API כולל את היכולות העיקריות הבאות:

  • מולטימודליות: המודל יכול לראות, לשמוע ולדבר.
  • אינטראקציה בזמן אמת עם זמן אחזור נמוך: תקבלו תשובות מהירות.
  • זיכרון סשן: המודל שומר את הזיכרון של כל האינטראקציות בסשן יחיד, ומזכיר מידע ששמעתם או ראיתם בעבר.
  • תמיכה בקריאה לפונקציות, בהרצת קוד וב'חיפוש ככלי': מאפשרת שילוב עם שירותים חיצוניים ומקורות נתונים.
  • זיהוי אוטומטי של פעילות קול (VAD): המודל יכול לזהות במדויק את הרגעים שבהם המשתמש מתחיל ומפסיק לדבר. כך אפשר ליצור אינטראקציות טבעיות ושיחות, ומשתמשים יכולים להפסיק את המודל בכל שלב.

אתם יכולים לנסות את Multimodal Live API ב-Google AI Studio.

שנתחיל?

Multimodal Live API הוא ממשק API עם מצב שמשתמש ב-WebSockets.

בקטע הזה נספק דוגמה לשימוש ב-Multimodal Live API ליצירת טקסט מטקסט, באמצעות Python מגרסה 3.9 ואילך.

התקנת ספריית Gemini API

כדי להתקין את החבילה google-genai, משתמשים בפקודה pip הבאה:

!pip3 install google-genai

ייבוא יחסי תלות

כדי לייבא יחסי תלות:

from google import genai

שליחה וקבלה של הודעת טקסט

import asyncio
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'})
model_id = "gemini-2.0-flash-exp"
config = {"response_modalities": ["TEXT"]}

async def main():
    async with client.aio.live.connect(model=model_id, config=config) as session:
        while True:
            message = input("User> ")
            if message.lower() == "exit":
                break
            await session.send(message, end_of_turn=True)

            async for response in session.receive():
                if response.text is None:
                    continue
                print(response.text, end="")

if __name__ == "__main__":
    asyncio.run(main())

מדריך לשילוב

בקטע הזה נסביר איך פועל השילוב עם Multimodal Live API.

ביקורים

סשן מייצג חיבור WebSocket יחיד בין הלקוח לבין שרת Gemini.

אחרי שלקוח יוצר חיבור חדש, הסשן יכול להחליף הודעות עם השרת כדי:

  • שליחת טקסט, אודיו או וידאו לשרת Gemini.
  • לקבל תשובות מהשרת של Gemini בצורת אודיו, טקסט או קריאה לפונקציה.

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

דוגמה להגדרה:

{​​
  "model": string,
  "generation_config": {
    "candidate_count": integer,
    "max_output_tokens": integer,
    "temperature": number,
    "top_p": number,
    "top_k": integer,
    "presence_penalty": number,
    "frequency_penalty": number,
    "response_modalities": string,
    "speech_config":object
  },

  "system_instruction": "",
  "tools":[]
}

מידע נוסף זמין במאמר BidiGenerateContentSetup.

שליחת הודעות

ההודעות הן מחרוזות בפורמט JSON שמתחלפות בחיבור WebSocket.

כדי לשלוח הודעה, הלקוח צריך לשלוח הודעת לקוח נתמכת במחרוזת בפורמט JSON באמצעות אחד מהם בחיבור WebSocket פתוח.

הודעות לקוח נתמכות

בטבלה הבאה מפורטות ההודעות הנתמכות מהלקוח:

הודעה תיאור
BidiGenerateContentSetup הגדרות הסשן שיישלחו בהודעה הראשונה
BidiGenerateContentClientContent עדכון מצטבר של התוכן של השיחה הנוכחית שנשלח מהלקוח
BidiGenerateContentRealtimeInput קלט אודיו או וידאו בזמן אמת
BidiGenerateContentToolResponse תגובה להודעה ToolCallMessage שהתקבלה מהשרת

קבלת הודעות

כדי לקבל הודעות מ-Gemini, צריך להאזין לאירוע 'message' ב-WebSocket, ואז לנתח את התוצאה בהתאם להגדרה של הודעות השרת הנתמכות.

אפשר לעיין במאמרים הבאים:

ws.addEventListener("message", async (evt) => {
  if (evt.data instanceof Blob) {
    // Process the received data (audio, video, etc.)
  } else {
    // Process JSON response
  }
});

הודעות שרת נתמכות

בטבלה הבאה מפורטות הודעות השרת הנתמכות:

הודעה תיאור
BidiGenerateContentSetupComplete הודעת BidiGenerateContentSetup מהלקוח, שנשלחת בסיום ההתקנה
BidiGenerateContentServerContent תוכן שנוצר על ידי המודל בתגובה להודעה של לקוח
BidiGenerateContentToolCall בקשה ללקוח להריץ את קריאות הפונקציה ולהחזיר את התשובות עם המזהים התואמים
BidiGenerateContentToolCallCancellation ההודעה נשלחת כשקריאה לפונקציה מבוטלת כי המשתמש מפריע לפלט של המודל

עדכוני תוכן מצטברים

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

הודעה לדוגמה עם הקשר:

{
  "client_content": {
    "turns": [
      {
          "parts":[
          {
            "text": ""
          }
        ],
        "role":"user"
      },
      {
          "parts":[
          {
            "text": ""
          }
        ],
        "role":"model"
      }
    ],
    "turn_complete": true
  }
}

שימו לב: חלקי התוכן יכולים להיות מסוג functionResponse, אבל אסור להשתמש ב-BidiGenerateContentClientContent כדי לספק תגובה לקריאות הפונקציה שהמודל מנפיק. במקום זאת, צריך להשתמש ב-BidiGenerateContentToolResponse. צריך להשתמש ב-BidiGenerateContentClientContent רק כדי להגדיר את ההקשר הקודם או כדי לספק קלט טקסט לשיחה.

סטרימינג של אודיו ווידאו

קריאה לפונקציה

צריך להצהיר על כל הפונקציות בתחילת הסשן על ידי שליחת הגדרות של כלים כחלק מההודעה BidiGenerateContentSetup.

מידע נוסף על קריאה לפונקציות זמין במדריך בנושא קריאה לפונקציות.

מהנחיה אחת, המודל יכול ליצור מספר קריאות לפונקציות ואת הקוד הנדרש כדי לשרשר את הפלט שלהן. הקוד הזה מופעל בסביבת חול (sandbox), ויוצר הודעות BidiGenerateContentToolCall. הביצוע מושהה עד שהתוצאות של כל קריאה לפונקציה יהיו זמינות, וכך מובטח עיבוד רציף.

הלקוח צריך להשיב ב-BidiGenerateContentToolResponse.

מקורות קלט ופלט של אודיו משפיעים לרעה על היכולת של המודל להשתמש בקריאה לפונקציות.

פורמטים של אודיו

Multimodal Live API תומך בפורמטים הבאים של אודיו:

  • פורמט אודיו לקלט: אודיו PCM גולמי של 16 ביט ב-16kHz little-endian
  • פורמט אודיו בפלט: אודיו PCM גולמי של 16 ביט בקצב 24kHz ב-little-endian

הוראות למערכת

אתם יכולים לספק הוראות למערכת כדי לשלוט טוב יותר בפלט של המודל ולציין את הטון ואת הרגש של התשובות הקוליות.

הוראות המערכת מתווספות להנחיה לפני תחילת האינטראקציה, ונשארות בתוקף במשך כל הסשן.

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

הפרעות

המשתמשים יכולים להפסיק את הפלט של המודל בכל שלב. כשהמערכת לזיהוי פעילות קול (VAD) מזהה הפרעה, היצירה המתמשכת מבוטלת ונמחקת. רק המידע שכבר נשלח ללקוח נשמר בהיסטוריית הסשנים. לאחר מכן השרת שולח הודעה מסוג BidiGenerateContentServerContent כדי לדווח על ההפרעה.

בנוסף, שרת Gemini משמיד את כל הקריאות לפונקציות בהמתנה ושולח הודעה מסוג BidiGenerateContentServerContent עם המזהים של הקריאות שבוטלו.

קולות

Multimodal Live API תומך בקולות הבאים: Aoede,‏ Charon,‏ Fenrir,‏ Kore ו-Puck.

כדי לציין קול, מגדירים את voice_name בתוך האובייקט speech_config, כחלק מהגדרת הסשן.

זוהי הייצוג של אובייקט speech_config ב-JSON:

{
  "voice_config": {
    "prebuilt_voice_config ": {
      "voice_name": <var>VOICE_NAME</var>
    }
  }
}

מגבלות

כשמתכננים את הפרויקט, חשוב לקחת בחשבון את המגבלות הבאות של Multimodal Live API ו-Gemini 2.0.

אימות לקוח

Multimodal Live API מספק אימות רק בין שרתים, ולא מומלץ לשימוש ישיר בלקוח. כדי לבצע אימות מאובטח באמצעות Multimodal Live API, צריך לנתב את הקלט של הלקוח דרך שרת אפליקציות ביניים.

לאפליקציות לאינטרנט ולנייד, מומלץ להשתמש בשילוב של השותפים שלנו ב-Daily.

היסטוריית השיחות

המודל עוקב אחרי אינטראקציות במהלך הסשן, אבל היסטוריית השיחות לא נשמרת. כשסשן מסתיים, ההקשר התואם נמחק.

כדי לשחזר סשן קודם או לספק למודל הקשר היסטורי של אינטראקציות של משתמשים, האפליקציה צריכה לנהל יומן שיחות משלה ולהשתמש בהודעת BidiGenerateContentClientContent כדי לשלוח את המידע הזה בתחילת סשן חדש.

משך הסשן המקסימלי

משך הסשן מוגבל ל-15 דקות עבור אודיו או ל-2 דקות עבור אודיו ווידאו. כשמשך הסשן חורג מהמגבלה, החיבור מסתיים.

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

זיהוי פעילות קול (VAD)

המודל מבצע זיהוי אוטומטי של פעילות קול (VAD) על מקור קלט אודיו רציף. VAD תמיד מופעל, ואי אפשר לשנות את הפרמטרים שלו.

מספר הטוקנים

אין תמיכה בספירת אסימונים.

הגבלות קצב

חלות עליך מגבלות הקצב הבאות:

  • 3 סשנים בו-זמנית לכל מפתח API
  • 4 מיליון טוקנים לדקה

הודעות ואירועים

BidiGenerateContentClientContent

עדכון מצטבר של השיחה הנוכחית שנשלח מהלקוח. כל התוכן הזה מצורף ללא תנאים להיסטוריית השיחות, ומשמש כחלק מההנחיה למודל ליצירת תוכן.

הודעה כאן תפריע ליצירת מודל כלשהי.

שדות
turns[]

Content

זה שינוי אופציונלי. התוכן שמצורף לשיחה הנוכחית עם המודל.

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

turn_complete

bool

זה שינוי אופציונלי. אם הערך הוא true, המשמעות היא שיצירת התוכן בשרת צריכה להתחיל עם ההנחיה שנצברה כרגע. אחרת, השרת ימתין להודעות נוספות לפני שהוא יתחיל את היצירה.

BidiGenerateContentRealtimeInput

קלט של משתמש שנשלח בזמן אמת.

יש כמה הבדלים בין BidiGenerateContentClientContent לבין BidiGenerateContentClientContent:

  • ניתן לשלוח אותם באופן רציף ללא הפרעה ליצירת המודל.
  • אם יש צורך לשלב נתונים שמקובצים בין BidiGenerateContentClientContent ל-BidiGenerateContentRealtimeInput, השרת מנסה לבצע אופטימיזציה כדי לקבל את התגובה הטובה ביותר, אבל אין ערובה לכך.
  • סיום תורו לא מצוין באופן מפורש, אלא נגזר מפעילות המשתמש (לדוגמה, סיום הדיבור).
  • עוד לפני סיום התור, הנתונים עוברים עיבוד מצטבר כדי לבצע אופטימיזציה להתחלה מהירה של התשובה מהמודל.
  • תמיד מגיע ישירות מהמשתמשים ונשלח בזמן אמת. אפשר לשלוח אותם ברציפות ללא הפסקות. המודל מזהה באופן אוטומטי את תחילת הדיבור של המשתמש ואת סיום הדיבור שלו, ומתחיל או מפסיק את הסטרימינג של התשובה בהתאם. הנתונים מעובדים באופן מצטבר כשהם מגיעים, כדי לצמצם את זמן האחזור.
שדות
media_chunks[]

Blob

זה שינוי אופציונלי. נתוני בייט מוטמעים לקלט מדיה.

BidiGenerateContentServerContent

עדכון מצטבר של השרת שנוצר על ידי המודל בתגובה להודעות של לקוחות.

התוכן נוצר במהירות האפשרית, ולא בזמן אמת. לקוחות יכולים לבחור לאגור את הנתונים ולנגן אותם בזמן אמת.

שדות
turn_complete

bool

פלט בלבד. אם הערך הוא True, המשמעות היא שהמודל הושלם. היצירה תתחיל רק בתגובה להודעות נוספות מהלקוח. אפשר להגדיר אותו לצד content, כדי לציין ש-content הוא הרכיב האחרון בסיבוב.

interrupted

bool

פלט בלבד. אם הערך הוא true, המשמעות היא שהודעה של לקוח הפריעה ליצירת המודל הנוכחית. אם הלקוח מפעיל את התוכן בזמן אמת, זה סימן טוב להפסיק ולרוקן את תור ההפעלה הנוכחי.

grounding_metadata

GroundingMetadata

פלט בלבד. מטא-נתונים של התוכן שנוצר.

model_turn

Content

פלט בלבד. התוכן שהמודל יצר כחלק מהשיחה הנוכחית עם המשתמש.

BidiGenerateContentSetup

ההודעה שתישלח בהודעת הלקוח הראשונה והיחידה. מכיל הגדרות שחלות למשך סשן הסטרימינג.

לקוחות צריכים להמתין להודעה BidiGenerateContentSetupComplete לפני שליחת הודעות נוספות.

שדות
model

string

חובה. שם המשאב של הדגם. זהו מזהה שמשמש את המודל.

פורמט: models/{model}

generation_config

GenerationConfig

זה שינוי אופציונלי. הגדרות היצירה.

אין תמיכה בשדות הבאים:

  • response_logprobs
  • response_mime_type
  • logprobs
  • response_schema
  • stop_sequence
  • routing_config
  • audio_timestamp
system_instruction

Content

זה שינוי אופציונלי. המשתמש סיפק הוראות מערכת עבור המודל.

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

tools[]

Tool

זה שינוי אופציונלי. רשימה של Tools שהמודל עשוי להשתמש בה כדי ליצור את התשובה הבאה.

Tool הוא קטע קוד שמאפשר למערכת לקיים אינטראקציה עם מערכות חיצוניות כדי לבצע פעולה או קבוצת פעולות מחוץ לידע ולהיקף של המודל.

BidiGenerateContentSetupComplete

אין שדות לסוג הזה.

נשלחה בתגובה להודעת BidiGenerateContentSetup מהלקוח.

BidiGenerateContentToolCall

מבקשים מהלקוח להריץ את function_calls ולהחזיר את התשובות עם הערכים התואמים של id.

שדות
function_calls[]

FunctionCall

פלט בלבד. קריאת הפונקציה שרוצים לבצע.

BidiGenerateContentToolCallCancellation

הודעה ללקוח על כך ש-ToolCallMessage שהונפק בעבר עם הערכים של id שצוינו לא היה אמור להתבצע וצריך לבטל אותו. אם היו תופעות לוואי לקריאות האלה לכלי, לקוחות עשויים לנסות לבטל את הקריאות לכלי. ההודעה הזו מופיעה רק במקרים שבהם הלקוחות מפריעים לתור של השרת.

שדות
ids[]

string

פלט בלבד. המזהים של הקריאות לכלי שרוצים לבטל.

BidiGenerateContentToolResponse

תגובה שנוצרה על ידי הלקוח לתגובה ToolCall שהתקבלה מהשרת. אובייקטים ספציפיים מסוג FunctionResponse מותאמים לאובייקטים המתאימים מסוג FunctionCall באמצעות השדה id.

חשוב לזכור שבקריאות לפונקציות של ממשקי GenerateContent API חד-כיווניים ושל ממשקי GenerateContent API בסטרימינג לשרת, הקריאה מתבצעת על ידי החלפה של החלקים Content, ואילו בקריאות לפונקציות של ממשקי GenerateContent API דו-כיווניים, הקריאה מתבצעת באמצעות קבוצת ההודעות הייעודית הזו.

שדות
function_responses[]

FunctionResponse

זה שינוי אופציונלי. התגובה לקריאות הפונקציה.

מידע נוסף על סוגי קבצים נפוצים

מידע נוסף על סוגי המשאבים הנפוצים של ממשקי API, Blob, ‏ Content, ‏ FunctionCall, ‏ FunctionResponse,‏ GenerationConfig, ‏ GroundingMetadata ו-Tool, זמין במאמר יצירת תוכן.