ينطبق هذا الدليل على أي إمكانية تعتمد على التفاعلات المتعدّدة الأدوار، بما في ذلك:
محادثة مترابطة (محادثة)، بما في ذلك المحادثة التي تعرض نصًا فقط و تعديل الصور بشكل متكرّر
نظرة عامة على مستوى عالٍ
بالنسبة إلى التفاعلات المتعدّدة الأدوار، تدير حِزم تطوير البرامج (SDK) لمنطق الذكاء الاصطناعي في Firebase حالة المحادثة.Firebase AI Logic وينطبق ذلك أيضًا عند استخدام نماذج طلبات الخادم.
إنّ سير العمل الأساسي للتفاعلات في المحادثات المترابطة ونماذج طلبات الخادم هو نفسه بشكل أساسي سير العمل للطلبات ذات الدور الواحد، مع بعض الاختلافات المهمة:
يمكنك إنشاء النموذج باستخدام واجهة المستخدم الإرشادية في الـ Firebase console.
بالنسبة إلى التفاعلات في المحادثات المترابطة، عليك إضافة العلامة
{{history}}في محتوى النموذج، ما يشير إلى مكان إدخال أدوار المحادثة التي تديرها حزمة تطوير البرامج (SDK) من جهة العميل.يمكنك اختبار النموذج في طلب حقيقي باستخدام تجربة الاختبار في وحدة تحكم Firebase.
بالنسبة إلى التفاعلات المتعدّدة الأدوار، لا يمكن لتجربة الاختبار في وحدة التحكّم المساعدة إلا في اختبار الدور الأوّلي. يمكنك اختبار كيفية التعامل مع الأدوار اللاحقة (السجلّ) باستخدام النموذج مع تطبيقك الفعلي.
يمكنك الوصول إلى النموذج من رمز تطبيقك باستخدام
templateGenerativeModel.بالنسبة إلى المحادثات المترابطة، عليك استخدام
startChatوsendMessage(تمامًا كما تفعل بالنسبة إلى المحادثات المترابطة عندما لا تستخدم نماذج طلبات الخادم).
يُرجى العِلم أنّه بالنسبة إلى استدعاء الدالة، هناك بعض الاختلافات الإضافية الموضّحة في هذا القسم لاحقًا في هذه الصفحة.
محادثة مترابطة (محادثة)
إذا لم يسبق لك ذلك، يُرجى مراجعة الـ دليل العام لإنشاء محادثات مترابطة (محادثة) عندما لا تستخدم نماذج طلبات الخادم.
التنسيق الأساسي لنموذج طلب الخادم
بالنسبة إلى Firebase AI Logic، توفّر وحدة تحكم Firebase واجهة مستخدم إرشادية لتحديد البيانات الوصفية ومحتويات النموذج.
تستخدم نماذج طلبات الخادم تنسيقًا وبنية استنادًا إلى Dotprompt. لمزيد من التفاصيل، يُرجى الاطّلاع على تنسيق النموذج وبنيته وأمثلة عليه.
يعرض نموذج القالب أدناه أهم مكوّنات النموذج عند إنشاء محادثة مترابطة (محادثة). يُرجى العِلم بإضافة العلامة
{{history}} في محتوى النموذج،
ما يشير إلى مكان إدراج أدوار المحادثة التي تديرها
حزمة تطوير البرامج (SDK) من جهة العميل.
---
model: 'gemini-3.5-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
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);
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}}، ما يشير إلى مكان إدراج أدوار المحادثة التي تديرها حزمة تطوير البرامج (SDK) من جهة العميل.
نموذج يتضمّن مخطّط دالة محدّدًا في النموذج
---
model: gemini-3.5-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
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),
);
}
}
}
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.5-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
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.
...
Unity
// ...
// 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.
...
}
// ...
ما هي الخطوات التالية؟
تعرَّف على أفضل الممارسات والاعتبارات لاستخدام نماذج طلبات الخادم.
إدارة النماذج، بما في ذلك تعديلها وقفلها والتحكّم في إصداراتها.