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


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

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

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

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

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

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

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

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

  3. با استفاده از templateGenerativeModel از کد برنامه خود به قالب دسترسی پیدا کنید.

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

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



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

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

قالب اولیه یک الگوی اعلان سرور

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

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

الگوی نمونه زیر مهمترین اجزای یک الگو را هنگام ساخت یک مکالمه چند نوبتی (چت) نشان می‌دهد. به اضافه شدن {% verbatim %}{% endverbatim %} توجه کنید. {% verbatim %}{% endverbatim %} تگ {% verbatim %}{% endverbatim %} در محتوای قالب، که به قالب می‌گوید نوبت‌های مکالمه مدیریت‌شده توسط SDK کلاینت را کجا تزریق کند.

---
model: 'gemini-3-flash-preview'
---

{{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}}

از قالب خود در کد استفاده کنید

برای مشاهده محتوا و کد مخصوص ارائه‌دهنده در این صفحه، روی ارائه‌دهنده API Gemini خود کلیک کنید.

کد کلاینت نمونه زیر نحوه استفاده از الگو را در کد شما نشان می‌دهد. به استفاده از templateGenerativeModel به همراه startChat و sendMessage هنگام ساخت تعاملات چند نوبتی توجه کنید.

سویفت

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

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

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);

وحدت


// ...

// 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 (اختیاری) را تعریف کنید.

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

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

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

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

---
model: gemini-3-flash-preview
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}}

از قالب خود در کد استفاده کنید

برای مشاهده محتوا و کد مخصوص ارائه‌دهنده در این صفحه، روی ارائه‌دهنده API Gemini خود کلیک کنید.

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

  • هنگام استفاده از تعاملات چند نوبتی، templateGenerativeModel به همراه startChat و sendMessage استفاده کنید.

  • در طول مقداردهی اولیه مدل در کد کلاینت خود، توابعی را که مدل به آنها دسترسی دارد فهرست نکنید . در عوض، توابع باید در شیء tools از frontmatter قالب فهرست شوند (به بالا مراجعه کنید).

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

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

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

سویفت

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

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

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

وحدت


// ...

// 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}");
}


فراخوانی تابع - تعریف طرحواره در کد کلاینت

حتماً بخش‌های بالا در مورد نحوه‌ی عملکرد فراخوانی تابع با قالب‌های اعلان سرور (به‌ویژه استفاده از {% verbatim %}{% endverbatim %} را مرور کنید. {% verbatim %}{% endverbatim %} تگ {% verbatim %}{% endverbatim %} در محتوای قالب). این بخش در اینجا یک نمونه قالب و کد کلاینت ارائه می‌دهد اگر می‌خواهید طرحواره تابع خود را در کد کلاینت (به جای قالب) تعریف کنید.

به نکات زیر در مورد تعریف طرحواره تابع در کد کلاینت توجه کنید:

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

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

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

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

---
model: gemini-3-flash-preview
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}}

مثال کد کلاینت با طرحواره تابع تعریف شده در کد کلاینت
(برای جزئیات حذف شده از این مثال، به کد کلاینت مثال بالا مراجعه کنید)

سویفت

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

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

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.
...

وحدت

// ...

// Initialize your desired 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.
  ...
}

// ...



بعدش چی؟