تعاملات چند نوبتی با الگوهای پیام‌واره سرور


این راهنما برای هر قابلیتی که به تعاملات چندنوبتی وابسته است اعمال می‌شود، ازجمله:

نمای کلی سطح بالا

برای تعامل‌های چند نوبتی، کیت‌های توسعه نرم‌افزار Firebase AI Logic وضعیت مکالمه را مدیریت می‌کنند. این امر هنگام استفاده از الگوهای پیام‌واره سرور نیز اعمال می‌شود.

گردش کار پایه برای تعاملات چندنوبتی و الگوهای پیام‌واره سرور اساساً مشابه درخواست‌های تک‌نوبتی است، با این تفاوت‌های مهم:

  1. الگو را بااستفاده از واسط کاربر هدایت‌شونده در Firebase کنسول ایجاد کنید.

    برای تعامل‌های چندنوبتی، باید برچسب {{history}} را به محتوای الگو اضافه کنید، که به الگو می‌گوید نوبت‌های مکالمه مدیریت‌شده توسط کیت توسعه نرم‌افزار مشتری را کجا تزریق کند.

  2. الگو را در یک درخواست واقعی بااستفاده از تجربه آزمایش در کنسول Firebase آزمایش کنید.

    برای تعاملات چند نوبتی، تجربه آزمایش کنسول فقط می‌تواند به آزمایش نوبت اولیه کمک کند. بااستفاده از الگو با برنامه واقعی‌تان می‌توانید نحوه مدیریت نوبت‌های بعدی (سابقه) را آزمایش کنید.

  3. بااستفاده از templateGenerativeModel، از کد برنامه‌تان به الگو دسترسی پیدا کنید.

    برای تعاملات چندنوبتی، باید از startChat و sendMessage استفاده کنید (همان‌طور که برای تعاملات چندنوبتی وقتی از الگوهای پیام‌واره سرور استفاده نمی‌کنید استفاده می‌کنید).

توجه داشته باشید که برای فراخوانی تابع، چند تفاوت دیگر وجود دارد که در بخش مربوطه در ادامه این صفحه توضیح داده شده است.



مکالمه چندنوبتی (گپ)

اگر قبلاً این کار را نکرده‌اید، راهنمای کلی ساختن مکالمه‌های چند نوبتی (گپ) را درصورتی‌که از الگوهای پیام‌واره سرور استفاده نمی‌کنید مرور کنید.

قالب پایه الگوی پیام‌واره سرور

برای Firebase AI Logic، کنسول Firebase واسط کاربر هدایت‌شده‌ای برای شما فراهم می‌کند تا پیش‌گفتار و محتوای الگو را مشخص کنید.

الگوهای پیام‌واره سرور از نحو و قالب مبتنی بر Dotprompt استفاده می‌کنند. برای جزئیات بیشتر، به قالب الگو، دستورگان، و مثال‌ها مراجعه کنید.

الگوی نمونه زیر مهم‌ترین عناصر یک الگو را هنگام ساختن مکالمه چندنوبتی (گپ) نشان می‌دهد. به اضافه شدن برچسب {{history}} در محتوای الگو توجه کنید، که به الگو می‌گوید نوبت‌های مکالمه مدیریت‌شده توسط کیت توسعه نرم‌افزار مشتری را کجا تزریق کند.

---
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',
});

// 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.
  templateId: '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.
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 واسط کاربر هدایت‌شده‌ای را برای شما فراهم می‌کند تا پیش‌گفتار و محتوای الگو را مشخص کنید.

الگوهای پیام‌واره سرور از نحو و قالب مبتنی بر Dotprompt استفاده می‌کنند. برای جزئیات بیشتر، به قالب الگو، دستورگان، و مثال‌ها مراجعه کنید.

الگوی نمونه زیر مهم‌ترین عناصر الگو را هنگام استفاده از فراخوانی تابع نشان می‌دهد. به موارد زیر توجه کنید:

  • در پیش‌گفتار الگو، توابعی را که مدل به آن‌ها دسترسی دارد با ارائه بیانیه‌های تابع در شیء tools فهرست کنید.

    • name (الزامی) و description (اختیاری) را برای هر تابعی که مدل به آن دسترسی دارد تعریف کنید.

    • طرحواره هر تابعی را که مدل به آن دسترسی دارد تعریف کنید.

      الگوی نمونه زیر فرض می‌کند که شما طرحواره‌های تابع را در الگو تعریف می‌کنید. بااین‌حال، می‌توانید به‌جای آن طرحواره تابع را در کد کارخواه ارائه دهید. طرح تعریف‌شده در کد مشتری هر طرحی را که در الگو تعریف شده باشد ملغی می‌کند. در ادامه این صفحه، نمونه‌ای از الگو و کد مشتری برای تعریف طرحواره در کد مشتری را پیدا کنید.

  • در محتوای الگو، برچسب {{history}} را اضافه کنید که به الگو می‌گوید نوبت‌های مکالمه مدیریت‌شده توسط کیت توسعه نرم‌افزار مشتری را کجا تزریق کند.

الگوی نمونه با طرح تابع تعریف‌شده در الگو

---
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 پیش‌گفتار الگو فهرست شوند (به بالا مراجعه کنید).

  • کد کارخواه مثال زیر فرض می‌کند که شما طرحواره‌های تابع را در الگو تعریف می‌کنید. اگر درعوض تصمیم بگیرید طرحواره را در کد کارخواه خود تعریف کنید، این کار طرحواره تعریف‌شده در الگو را ملغی می‌کند. در ادامه این صفحه، الگوی نمونه و کد کارخواه برای تعریف طرحواره در کد کارخواه را ببینید.

  • بررسی کنید که آیا مدل در بخشی از برآورده کردن درخواست، فراخوانی تابع را برمی‌گرداند یا نه. اگر این‌طور است، برنامه شما باید منطق محلی را اجرا کند و سپس نتیجه را به مدل برگرداند.

کد نمونه کارخواه با طرح تابع تعریف‌شده در الگو

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',
});

// 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',
);

// 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',
  // 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: Type.OBJECT,
            properties: {
              location: {
                type: Type.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: Type.STRING,
                    description: "The city of the location."
                  },
                  state: {
                    type: Type.STRING,
                    description: "The state of the location."
                  },
                  zipCode: {
                    type: Type.INTEGER,
                    description: "Optional zip code of the location.",
                    nullable: true
                  },
                },
                required: ["city", "state"],
              },
              date: {
                type: Type.STRING,
                description: "The date for which to get the weather. Date must be in the format: YYYY-MM-DD.",
              },
              unit: {
                type: Type.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.
  ...
}

// ...



قدم بعدی چیست؟