אינטראקציות מרובות עם תבניות של הנחיות לשרת


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

סקירה כללית ברמה גבוהה

באינטראקציות עם כמה פניות, ערכות ה-SDK של Firebase AI Logic מנהלות את מצב השיחה. ההגדרה הזו רלוונטית גם כשמשתמשים בתבניות לפרומפטים בשרת.

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

  1. יוצרים את התבנית באמצעות ממשק המשתמש המודרך במסוף Firebase.

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

  2. בודקים את התבנית בבקשה אמיתית באמצעות חוויית הבדיקה במסוף Firebase.

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

  3. אפשר לגשת לתבנית מקוד האפליקציה באמצעות templateGenerativeModel.

    באינטראקציות עם כמה פניות, צריך להשתמש ב-startChat וב-sendMessage (בדיוק כמו באינטראקציות עם כמה פניות כשלא משתמשים בתבניות לפרומפטים בצד השרת).

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



שיחה עם זיכרון (צ'אט)

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

הפורמט הבסיסי של תבנית לפרומפט בשרת

ב-Firebase AI Logic, מסוף Firebase מספק ממשק משתמש מודרך שבו אתם יכולים לציין את ה-frontmatter ואת התוכן של התבנית.

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

בתבנית לדוגמה שבהמשך מוצגים הרכיבים החשובים ביותר של תבנית כשיוצרים שיחה עם כמה פניות (צ'אט). שימו לב לתוספת של התג {{history}} בתוכן של התבנית, שמציין לתבנית איפה להוסיף את חילופי הדברים בשיחה שמנוהלים על ידי ה-SDK של הלקוח.

---
model: 'gemini-3.8-flash'
---

{{role "system"}}
You help customers with their invoices, including answering questions or providing their invoices to them.
If an invoice is requested, it must be a clearly structured invoice document that uses a tabular or clearly delineated list format for line items.

{{history}}

שימוש בתבנית בקוד

כדי לראות תוכן וקוד שספציפיים לספק, לוחצים על הספק Gemini API בדף הזה.

קוד הלקוח לדוגמה שבהמשך מראה איך להשתמש בתבנית בקוד שלכם. שימו לב לשימוש ב-templateGenerativeModel יחד עם startChat ו-sendMessage כשאתם יוצרים אינטראקציות רב-שלביות.

Swift

For Swift, using server prompt templates with multi-turn interactions is not yet supported. Check back soon!

Kotlin


// ...

// Initialize the Gemini Developer API backend service.
// Create a `TemplateGenerativeModel` instance.
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
                        .templateGenerativeModel()

// Start a chat session with a template.
val chatSession = model.startChat(
  // Specify your template ID.
  templateId= "my-chat-template-v1-0-0",
  inputs = emptyMap()
)

// Send messages.
// The template's system instructions and model config apply to every turn automatically.
// The SDK automatically manages the state of the conversation.
val response = chatSession.sendMessage(
  content("user") { text("I need a copy of my invoice.") }
)

val text = response.text
println(text)

Java


// ...

// Initialize the Gemini Developer API backend service
// Create a `TemplateGenerativeModel` instance.
TemplateGenerativeModel templateModel = FirebaseAI.getInstance(GenerativeBackend.googleAI())
    .templateGenerativeModel();
// Initialize TemplateChat with history and inputs
TemplateChat templateChat = templateModel.startChat(
    // Specify your template ID.
    "my-chat-template-v1-0-0",
    Map.of(),
    Collections.emptyList()
);
TemplateChatFutures chatFutures = TemplateChatFutures.from(templateChat);

// Send messages.
// The template's system instructions and model config apply to every turn automatically.
// The SDK automatically manages the state of the conversation.
Content prompt = new Content.Builder().addText("I need a copy of my invoice.").build();
ListenableFuture responseFuture = chatFutures.sendMessage(prompt);

Futures.addCallback(responseFuture, new FutureCallback() {
  @Override
  public void onSuccess(GenerateContentResponse result) {
    System.out.println("Response: " + result.getText());
  }

  @Override
  public void onFailure(Throwable t) {
    t.printStackTrace();
  }
}, executor);

Web


// ...

// Initialize the Gemini Developer API backend service.
const ai = getAI(app, { backend: new GoogleAIBackend() });

// Create a `TemplateGenerativeModel` instance.
const model = getTemplateGenerativeModel(ai);

// Start a chat session with a template.
const chatSession = model.startChat({
  // Specify your template ID.
  templateId: 'my-chat-template-v1-0-0',
  templateVariables: {},
});

// Send messages.
// The template's system instructions and model config apply to every turn automatically.
// The SDK automatically manages the state of the conversation.
const result = await chatSession.sendMessage("I need a copy of my invoice.");

const text = result.response.text();
console.log(text);

Dart


// ...

// Initialize the Gemini Developer API backend service.
// Create a `TemplateGenerativeModel` instance.
final model = FirebaseAI.googleAI().templateGenerativeModel();

// Start a chat session with a template.
final chatSession = model.startChat(
  // Specify your template ID.
  'my-chat-template-v1-0-0',
  inputs: {},
);

// Send messages.
// The template's system instructions and model config apply to every turn automatically.
// The SDK automatically manages the state of the conversation.
final response = await chatSession.sendMessage(
  Content.text('I need a copy of my invoice.'),
);

final text = response.text;
print(text);

Unity


// ...

// Initialize the Gemini Developer API backend service.
var firebaseAI = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());

// Create a `TemplateGenerativeModel` instance.
var model = firebaseAI.GetTemplateGenerativeModel();

// Start a chat session with a template.
var chatSession = model.StartChat(
    // Specify your template ID.
    "my-chat-template-v1-0-0"
);

// Send messages.
// The template's system instructions and model config apply to every turn automatically.
// The SDK automatically manages the state of the conversation.
try
{
   var response = await chatSession.SendMessageAsync(ModelContent.Text("I need a copy of my invoice."));
   Debug.Log($"Response Text: {response.Text}");
}
catch (Exception e) {
  Debug.LogError($"An error occurred: {e.Message}");
}



בקשה להפעלת פונקציה

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

הפורמט הבסיסי של תבנית לפרומפט בשרת

ב-Firebase AI Logic, מסוף Firebase מספק ממשק משתמש מודרך שבו אתם יכולים לציין את ה-frontmatter ואת התוכן של התבנית.

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

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

  • ב-frontmatter של התבנית, מפרטים את הפונקציות שלמודל יש גישה אליהן על ידי הוספת הצהרות על פונקציות באובייקט tools.

    • מגדירים את name (חובה) ואת description (אופציונלי) לכל פונקציה שלמודל יש גישה אליה.

    • מגדירים את הסכימה לכל פונקציה שלמודל יש גישה אליה.

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

  • בתוכן של התבנית, מוסיפים את התג {{history}}, שמציין לתבנית איפה להוסיף את חילופי הדברים בשיחה שמנוהלים על ידי ה-SDK של הלקוח.

תבנית לדוגמה עם סכימת פונקציה שמוגדרת בתבנית

---
model: gemini-3.8-flash
tools:
  - name: fetchWeather
    description: Get the weather conditions for a specific city on a specific date.
    input:
      schema:
        location(object, The name of the city and its state for which to get the weather. Only cities in the USA are supported.):
          city: string, The city of the location.
          state: string, The state of the location.
        date: string, The date for which to get the weather. Date must be in the format YYYY-MM-DD.

---

What was the weather like in Boston, Massachusetts on 10/17 in year 2024?

{{history}}

שימוש בתבנית בקוד

כדי לראות תוכן וקוד שספציפיים לספק, לוחצים על הספק Gemini API בדף הזה.

קוד הלקוח לדוגמה שבהמשך מראה איך להשתמש בתבנית בקוד שלכם. שימו לב לנקודות הבאות:

  • כשמשתמשים באינטראקציות רב-שלביות, כדאי להשתמש ב-templateGenerativeModel יחד עם startChat ו-sendMessage.

  • במהלך ההפעלה של המודל בקוד הלקוח, אל תפרטו את הפונקציות שלמודל יש גישה אליהן. במקום זאת, צריך לרשום את הפונקציות באובייקט tools של ה-frontmatter של התבנית (ראו למעלה).

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

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

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

Swift

For Swift, using server prompt templates with multi-turn interactions is not yet supported. Check back soon!

Kotlin


// ...

// Initialize the Gemini Developer API backend service.
// Create a `TemplateGenerativeModel` instance.
val model = Firebase.ai(backend = GenerativeBackend.googleAI())
    .templateGenerativeModel()

// Start a chat session with a template that has functions listed as tools.
val chatSession = model.startChat(
    // Specify your template ID
    templateId = "my-function-calling-template-v1-0-0",
    inputs = emptyMap()
)

// Send a message that might trigger a function call.
val response = chatSession.sendMessage(
    content("user") { text(userMessage) }
)

// When the model responds with one or more function calls, invoke the function(s).
// Note that this is the same as when *not* using server prompt templates.
val functionCalls = response.functionCalls
val fetchWeatherCall = functionCalls.find { it.name == "fetchWeather" }

// Forward the structured input data from the model to the hypothetical external API.
val functionResponse = fetchWeatherCall?.let {
  // Alternatively, if your `Location` class is marked as @Serializable, you can use
  // val location = Json.decodeFromJsonElement(it.args["location"]!!)
  val location = Location(
      it.args["location"]!!.jsonObject["city"]!!.jsonPrimitive.content,
      it.args["location"]!!.jsonObject["state"]!!.jsonPrimitive.content
  )
  val date = it.args["date"]!!.jsonPrimitive.content
  fetchWeather(location, date)
}

Java

// ...


// Initialize the Gemini Developer API backend service.
// Create a `TemplateGenerativeModel` instance.
TemplateGenerativeModel model = FirebaseAI.getInstance(GenerativeBackend.googleAI())
    .templateGenerativeModel();


// Start a chat session with a template that has functions listed as tools.
TemplateChat chatSession = model.startChat(
    // Specify your template ID.
    "my-function-calling-template-v1-0-0",
    Map.of(), // Inputs
    List.of() // History
);
TemplateChatFutures chatFutures = TemplateChatFutures.from(chatSession);

// Send a message that might trigger a function call.
Content prompt = new Content.Builder().addText(userMessage).build();
ListenableFuture responseFuture = chatFutures.sendMessage(prompt);

Futures.addCallback(responseFuture, new FutureCallback() {
  @Override
  public void onSuccess(GenerateContentResponse result) {
    // When the model responds with one or more function calls, invoke the function(s).
    // Note that this is the same as when *not* using server prompt templates.
    for (FunctionCallPart callPart : result.getFunctionCalls()) {
      if ("fetchWeather".equals(callPart.getName())) {
        // Forward the structured input data from the model to the hypothetical external API.
        JsonObject location = (JsonObject) callPart.getArgs().get("location");
        String city = ((JsonPrimitive) location.get("city")).getContent();
        String state = ((JsonPrimitive) location.get("state")).getContent();
        String date = ((JsonPrimitive) callPart.getArgs().get("date")).getContent();
        Object response = fetchWeather(city, state, date);
      }
    }
  }

  @Override
  public void onFailure(Throwable t) {
    t.printStackTrace();
  }
}, executor);

Web


// ...

// Initialize the Gemini Developer API backend service.
const ai = getAI(app, { backend: new GoogleAIBackend() });

// Create a `TemplateGenerativeModel` instance.
const model = getTemplateGenerativeModel(ai);

// Start a chat session with a template that has functions listed as tools.
const chatSession = model.startChat({
  // Specify your template ID
  templateId: 'my-function-calling-template-v1-0-0',
  templateVariables: {},
});

// Send a message that might trigger a function call.
const result = await chatSession.sendMessage(userMessage);

// When the model responds with one or more function calls, invoke the function(s).
// Note that this is the same as when *not* using server prompt templates.
const functionCalls = result.response.functionCalls();
let functionCall;
let functionResult;

if (functionCalls.length > 0) {
  for (const call of functionCalls) {
    if (call.name === "fetchWeather") {
      // Forward the structured input data prepared by the model
      // to the hypothetical external API.
      functionResult = await fetchWeather(call.args);
      functionCall = call;
    }
  }
}

Dart


// ...

// Initialize the Gemini Developer API backend service.
// Create a `TemplateGenerativeModel` instance.
final model = FirebaseAI.googleAI().templateGenerativeModel();

// Start a chat session with a template that has functions listed as tools.
var chatSession = model.startChat(
    // Specify your template ID
    'my-function-calling-template-v1-0-0',
    inputs: {},
);

// Send a message that might trigger a function call.
var response = await chatSession.sendMessage(
    Content.text(userMessage),
);

// Check if the model wants to call a function.
// Note that this is the same as when *not* using server prompt templates.
final functionCalls = response?.functionCalls.toList();
// When the model responds with one or more function calls, invoke the function(s).
if (functionCalls != null && functionCalls.isNotEmpty) {
  for (final functionCall in functionCalls) {
    if (functionCall.name == 'fetchWeather') {
      Map<String, dynamic> location =
          functionCall.args['location']! as Map<String, dynamic>;
      var date = functionCall.args['date']! as String;
      var city = location['city'] as String;
      var state = location['state'] as String;
      final functionResult =
          await fetchWeather(Location(city, state), date);
      // Send the response to the model so that it can use the result to
      // generate text for the user.
      response = await chatSession.sendMessage(
        Content.functionResponse(functionCall.name, functionResult),
      );
    }
  }
}

Unity


// ...

// Initialize the Gemini Developer API backend service.
var firebaseAI = FirebaseAI.GetInstance(FirebaseAI.Backend.GoogleAI());

// Create a `TemplateGenerativeModel` instance.
var model = firebaseAI.GetTemplateGenerativeModel();

// Start a chat session with a template that has functions listed as tools.
var chatSession = model.StartChat(
    // Specify your template ID
    "my-function-calling-template-v1-0-0"
);

try
{
   // Send a message that might trigger a function call.
   var response = await chatSession.SendMessageAsync(ModelContent.Text(userMessage));
   var functionResponses = new List();

  // When the model responds with one or more function calls, invoke the function(s).
  // Note that this is the same as when *not* using server prompt templates.
  foreach (var functionCall in response.FunctionCalls) {
    if (functionCall.Name == "fetchWeather") {
      // TODO(developer): Handle invalid arguments.
      var location = functionCall.Args["location"] as Dictionary<string, object>;
      var city = location["city"] as string;
      var state = location["state"] as string;
      var date = functionCall.Args["date"] as string;

      functionResponses.Add(ModelContent.FunctionResponse(
        name: functionCall.Name,
        // Forward the structured input data prepared by the model
        // to the hypothetical external API.
        response: FetchWeather(city: city, state: state, date: date)
      ));
    }
    // TODO(developer): Handle other potential function calls, if any.
  }

  // Send the function responses back to the model.
  var functionResponseResult = await chatSession.SendMessageAsync(functionResponses);
}
catch (Exception e) {
  Debug.LogError($"An error occurred: {e.Message}");
}


קריאה להפעלת פונקציות – הגדרת סכימה בקוד הלקוח

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

שימו לב לנקודות הבאות לגבי הגדרת סכימת פונקציה בקוד הלקוח:

  • אם מגדירים סכימה של פונקציה בקוד הלקוח (כמו בדוגמה שבהמשך), הסכימה בצד הלקוח תחליף כל סכימה שהוגדרה בתבנית של הפונקציה הזו.

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

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

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

---
model: gemini-3.8-flash
tools:
  - name: fetchWeather
    description: Get the weather conditions for a specific city on a specific date.
---

What was the weather like in Boston, Massachusetts on 10/17 in year 2024, formatted in CELSIUS?

{{history}}

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

Swift

For Swift, using server prompt templates with multi-turn interactions is not yet supported. Check back soon!

Kotlin

// ...

// Initialize your desired Gemini API backend service.
// Create a `TemplateGenerativeModel` instance.
...

// Define the schema for any functions listed in your template.
val fetchWeatherTool = functionDeclarations(
    functionDeclarations = listOf(
        FunctionDeclaration(
            name = "fetchWeather",
            description = "Returns the weather for a given location at a given time",
            parameters = mapOf(
                "location" to Schema.obj(
                    description = "The name of the city and its state for which to get the weather. Only cities in the USA are supported.",
                    properties = mapOf(
                        "city" to Schema.string(
                            description = "The city of the location."
                        ),
                        "state" to Schema.string(
                            description = "The state of the location."
                        ),
                        "zipCode" to Schema.string(
                            description = "Optional zip code of the location.",
                            nullable = true
                        )
                    ),
                    optionalProperties = listOf("zipCode")
                ),
                "date" to Schema.string(
                    description = "The date for which to get the weather. Date must be in the format: YYYY-MM-DD."
                ),
                "unit" to Schema.enumeration(
                    description = "The temperature unit.",
                    values = listOf("CELSIUS", "FAHRENHEIT"),
                    nullable = true
                )

            ),
            optionalParameters = listOf("unit"),
        )
    )
)

// Start a chat session with a template that has functions listed as tools.
var chatSessionWithSchemaOverride = model.startChat(
    // Specify your template ID.
    templateId = "my-function-calling-template-with-no-function-schema-v1-0-0",
    // In `startChat`, provide the schema for any functions listed in your template.
    // This client-side schema will override any schema defined in the template.
    tools = listOf(fetchWeatherTool)
)

// Send a message that might trigger a function call.
...

// When the model responds with one or more function calls, invoke the function(s).
// Note that this is the same as when *not* using server prompt templates.
...

// Forward the structured input data from the model to the hypothetical external API.
...

Java

TemplateFunctionDeclaration tool = new TemplateFunctionDeclaration(
    "fetchWeather", // Name
    JsonSchema.obj( // Parameters
        Map.of(
            "location", JsonSchema.obj(
                Map.of(
                    "city", JsonSchema.string(
                        "The city of the location."
                    ),
                    "state", JsonSchema.string(
                        "The state of the location."
                    ),
                    "zipCode", JsonSchema.string(
                        "Optional zip code of the location",
                        true // Nullable
                    )
                ),
                List.of("zipCode"),
                ""
            ),
            "date", JsonSchema.string(
                "The date for which to get the weather. Date must be in the format: YY-MM-DD."
            ),
            "unit", JsonSchema.enumeration(
                List.of("CELSIUS", "FAHRENHEIT"),
                "The temperature unit.",
                true // Nullable
            )
        )
    ),
    JsonSchema.string(
        "A description of the current weather."
    )
);

// Initialize the Gemini Developer API backend service.
// Create a `TemplateGenerativeModel` instance.
TemplateGenerativeModel templateModel = FirebaseAI.getInstance(GenerativeBackend.googleAI())
    .templateGenerativeModel(
        new RequestOptions(),
        List.of(TemplateTool.functionDeclarations(List.of(tool), List.of()))
    );

// In `startChat`, provide the schema for any functions listed in your template.
// This client-side schema will override any schema defined in the template.
TemplateChat chat = templateModel.startChat(
    // Specify your template ID.
    "my-function-calling-template-with-no-function-schema-v1-0-0",
    Map.of(),
    List.of()
);
TemplateChatFutures futures = TemplateChatFutures.from(chat);

// Send a message that might trigger a function call.
...

// When the model responds with one or more function calls, invoke the function(s).
// Note that this is the same as when *not* using server prompt templates.
...

// Forward the structured input data from the model to the hypothetical external API.
...

Web

// ...

// Initialize your desired Gemini API backend service.
...

// Create a `TemplateGenerativeModel` instance.
...

// Start a chat session with a template that has functions listed as tools.
const chatSessionWithSchemaOverride = model.startChat({
  // Specify your template ID.
  templateId: 'my-function-calling-template-with-no-function-schema-v1-0-0',
  templateVariables: {},
  // In `startChat`, provide the schema for any functions listed in your template.
  // This client-side schema will override any schema defined in the template.
  tools: [
    {
      functionDeclarations: [
        {
          name: "fetchWeather",
          parameters: {
            type: SchemaType.OBJECT,
            properties: {
              location: {
                type: SchemaType.OBJECT,
                description: "The name of the city and its state for which to get the weather. Only cities in the USA are supported.",
                properties: {
                  city: {
                    type: SchemaType.STRING,
                    description: "The city of the location."
                  },
                  state: {
                    type: SchemaType.STRING,
                    description: "The state of the location."
                  },
                  zipCode: {
                    type: SchemaType.INTEGER,
                    description: "Optional zip code of the location.",
                    nullable: true
                  },
                },
                required: ["city", "state"],
              },
              date: {
                type: SchemaType.STRING,
                description: "The date for which to get the weather. Date must be in the format: YYYY-MM-DD.",
              },
              unit: {
                type: SchemaType.STRING,
                description: "The temperature unit.",
                enum: ["CELSIUS", "FAHRENHEIT"],
                nullable: true,
              },
            },
            required: ["location", "date"],
          },
        },
      ],
    }
  ],
});

// Send a message that might trigger a function call.
...

// When the model responds with one or more function calls, invoke the function(s).
// Note that this is the same as when *not* using server prompt templates.
...

Dart

// ...

// Initialize your desired Gemini API backend service.
// Create a `TemplateGenerativeModel` instance.
...

// Start a chat session with a template that has functions listed as tools.
final chatSessionWithSchemaOverride = model?.startChat(
      // Specify your template ID.
      'my-function-calling-template-with-no-function-schema-v1-0-0',
      inputs: {},
      // In `startChat`, provide the schema for any functions listed in your template.
      // This client-side schema will override any schema defined in the template.
      tools: [
        TemplateTool.functionDeclarations(
          [
            TemplateFunctionDeclaration(
              'fetchWeather',
              parameters: {
                'location': JSONSchema.object(
                  description:
                      'The name of the city and its state for which to get '
                      'the weather. Only cities in the USA are supported.',
                  properties: {
                    'city': JSONSchema.string(
                      description: 'The city of the location.',
                    ),
                    'state': JSONSchema.string(
                      description: 'The state of the location.',
                    ),
                    'zipCode': JSONSchema.integer(
                      description: 'Optional zip code of the location.',
                      nullable: true,
                    ),
                  },
                  optionalProperties: ['zipCode'],
                ),
                'date': JSONSchema.string(
                  description: 'The date for which to get the weather. '
                      'Date must be in the format: YYYY-MM-DD.',
                ),
                'unit': JSONSchema.enumString(
                  enumValues: ['CELSIUS', 'FAHRENHEIT'],
                  description: 'The temperature unit.',
                  nullable: true,
                ),
              },
              optionalParameters: ['unit'],
            ),
          ],
        ),
      ],
    );

// Send a message that might trigger a function call.
...

// Check if the model wants to call a function.
// Note that this is the same as when *not* using server prompt templates.
...

Unity

// ...

// Initialize your chosen Gemini API backend service.
...

// Create a `TemplateGenerativeModel` instance.
...

// Define the schema for any functions listed in your template.
var fetchWeatherTool = new TemplateTool.FunctionDeclaration(
    name: "fetchWeather",
    parameters: new Dictionary<string, JsonSchema>() {
        { "location", JsonSchema.Object(
            description: "The name of the city and its state for which to get the weather. Only cities in the USA are supported.",
            properties: new Dictionary<string, JsonSchema>() {
                { "city", JsonSchema.String(description: "The city of the location.") },
                { "state", JsonSchema.String(description: "The state of the location.") },
                { "zipCode", JsonSchema.Int(description: "Optional zip code of the location.", nullable: true) }
            },
            optionalProperties: new[] { "zipCode" })
        },
        { "date", JsonSchema.String(description: "The date for which to get the weather. Date must be in the format: YYYY-MM-DD.")},
        { "unit", JsonSchema.Enum(
            values: new[] { "CELSIUS", "FAHRENHEIT" },
            description: "The temperature unit.",
            nullable: true)
        }
    },
    optionalParameters: new[] { "unit" }
);

// Start a chat session with a template that has functions listed as tools.
var chatSessionWithSchemaOverride = model.StartChat(
    // Specify your template ID.
    templateId: "my-function-calling-template-with-no-function-schema-v1-0-0",
    // In `startChat`, provide the schema for any functions listed in your template.
    // This client-side schema will override any schema defined in the template.
    tools: new[] { fetchWeatherTool }
);

try
{
   // Send a message that might trigger a function call.
   ...

  // When the model responds with one or more function calls, invoke the function(s).
  // Note that this is the same as when *not* using server prompt templates.
  ...
}

// ...



מה השלב הבא?