Bu kılavuz, aşağıdakiler de dahil olmak üzere çok turlu etkileşimlere dayalı tüm özellikler için geçerlidir:
Yalnızca metin çıkışlı sohbet ve yinelemeli görüntü düzenleme dahil çok turlu görüşme (sohbet)
Üst düzey genel bakış
Çok adımlı etkileşimlerde, Firebase AI Logic SDK'ları görüşmenin durumunu yönetir. Bu durum, sunucu istemi şablonları kullanılırken de geçerlidir.
Çok turlu etkileşimler ve sunucu istemi şablonları için temel iş akışı, tek turlu isteklerle temelde aynıdır ancak bazı önemli farklılıklar vardır:
Firebase konsolundaki rehberli kullanıcı arayüzünü kullanarak şablonu oluşturun.
Çok turlu etkileşimler için şablonun içeriğine
{{history}}etiketini eklemeniz gerekir. Bu etiket, şablona istemci SDK'sı tarafından yönetilen görüşme turlarının nereye yerleştirileceğini bildirir.Firebase Konsoldaki test deneyimini kullanarak şablonu gerçek bir istekte test edin.
Çok turlu etkileşimlerde, konsol test deneyimi yalnızca ilk turu test etmenize yardımcı olabilir. Şablonu gerçek uygulamanızla kullanarak sonraki dönüşlerin (geçmiş) nasıl işlendiğini test edebilirsiniz.
templateGenerativeModelkullanarak uygulamanızın kodundan şablona erişin.Çok turlu etkileşimlerde
startChatvesendMessagekullanmanız gerekir (sunucu istemi şablonları kullanılmadığında çok turlu etkileşimlerde yaptığınız gibi).
İşlev çağırma ile ilgili olarak, bu sayfanın ilerleyen bölümlerinde açıklanan birkaç fark daha olduğunu unutmayın.
Çok adımlı görüşme (sohbet)
Henüz yapmadıysanız sunucu istemi şablonları kullanılmadığında çok turlu sohbetler oluşturmayla ilgili genel kılavuzu inceleyin.
Sunucu istemi şablonunun temel biçimi
Firebase AI Logic için Firebase konsolu, şablonun ön kısmını ve içeriğini belirtmeniz için rehberli bir kullanıcı arayüzü sağlar.
Sunucu istemi şablonları, Dotprompt tabanlı bir sözdizimi ve biçim kullanır. Daha fazla bilgi için Şablon biçimi, söz dizimi ve örnekler konusuna bakın.
Aşağıdaki örnek şablonda, çok turlu bir görüşme (sohbet) oluştururken şablon için en önemli bileşenler gösterilmektedir. Şablona, istemci SDK'sı tarafından yönetilen sohbet dönüşlerinin nereye yerleştirileceğini belirten {{history}} etiketinin eklendiğini unutmayın.
---
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}}
Şablonunuzu kodda kullanma
|
Bu sayfada sağlayıcıya özel içerikleri ve kodu görüntülemek için Gemini API sağlayıcınızı tıklayın. |
Aşağıdaki örnek istemci kodu, şablonun kodunuzda nasıl kullanılacağını gösterir. Çok turlu etkileşimler oluştururken templateGenerativeModel ile birlikte startChat ve sendMessage kullanımına dikkat edin.
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}");
}
İşlev çağırma
Henüz yapmadıysanız sunucu istemi şablonları kullanılmadığında işlev çağrısıyla ilgili genel kılavuzu inceleyin. Sunucu istemi şablonlarını kullanmayla ilgili bu kılavuzda, işlev çağrısının genel olarak nasıl çalıştığını bildiğiniz varsayılır.
Sunucu istemi şablonunun temel biçimi
Firebase AI Logic için Firebase konsolu, şablonun ön kısmını ve içeriğini belirtmeniz için rehberli bir kullanıcı arayüzü sağlar.
Sunucu istemi şablonları, Dotprompt tabanlı bir sözdizimi ve biçim kullanır. Daha fazla bilgi için Şablon biçimi, söz dizimi ve örnekler konusuna bakın.
Aşağıdaki örnek şablonda, işlev çağrısı kullanılırken şablon için en önemli bileşenler gösterilmektedir. Aşağıdakileri göz önünde bulundurun:
Şablonun ön kısmında,
toolsnesnesinde işlev bildirimleri sağlayarak modelin erişebildiği işlevleri listeleyin.Modelin erişebildiği her işlev için
name(zorunlu) vedescription(isteğe bağlı) değerlerini tanımlayın.Modelin erişebildiği her işlev için şemayı tanımlayın.
Aşağıdaki örnek şablonda, şablonda işlev şemaları tanımladığınız varsayılmaktadır. Ancak bunun yerine işlevin şemasını istemci kodunda sağlayabilirsiniz. Müşteri kodunda tanımlanan şema, şablonda tanımlanan tüm şemaları geçersiz kılar. Bu sayfanın ilerleyen bölümlerinde, istemci kodunda şema tanımlama ile ilgili bir şablon ve istemci kodu örneği bulabilirsiniz.
Şablonun içeriğine, şablona istemci SDK'sı tarafından yönetilen görüşme dönüşlerinin nereye yerleştirileceğini söyleyen
{{history}}etiketini ekleyin.
Şablonda tanımlanmış işlev şeması içeren örnek şablon
---
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}}
Şablonunuzu kodda kullanma
|
Bu sayfada sağlayıcıya özel içerikleri ve kodu görüntülemek için Gemini API sağlayıcınızı tıklayın. |
Aşağıdaki örnek istemci kodu, şablonun kodunuzda nasıl kullanılacağını gösterir. Aşağıdakileri göz önünde bulundurun:
Çok turlu etkileşimleri kullanırken
templateGenerativeModelile birliktestartChatvesendMessageöğelerini kullanın.İstemci kodunuzda modelin başlatılması sırasında, modelin erişebildiği işlevleri listelemeyin. Bunun yerine, işlevler şablonun ön kısmındaki
toolsnesnesinde listelenmelidir (yukarıya bakın).Aşağıdaki örnek istemci kodu, şablonda işlev şemaları tanımladığınızı varsayar. Bunun yerine şemayı istemci kodunuzda tanımlamaya karar verirseniz şablonla tanımlanan şema geçersiz kılınır. Bu sayfanın ilerleyen bölümlerinde, istemci kodunda şema tanımlama ile ilgili örnek bir şablon ve istemci kodu bulabilirsiniz.
Modelin, isteği karşılama kapsamında bir işlev çağrısı döndürüp döndürmediğini kontrol edin. Bu durumda uygulamanızın yerel mantığı yürütmesi ve sonucu modele geri göndermesi gerekir.
Şablonda tanımlanan işlev şemasına sahip örnek istemci kodu
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}");
}
İşlev çağırma: İstemci kodunda şemayı tanımlama
İşlev çağrısının sunucu istemi şablonlarıyla nasıl çalıştığıyla ilgili yukarıdaki bölümleri (özellikle şablon içeriğinde {{history}} etiketinin kullanımı) inceleyin. Bu bölümde, işlev şemanızı şablonda değil istemci kodunda tanımlamak istiyorsanız örnek bir şablon ve istemci kodu verilmiştir.
İşlev şemasını istemci kodunda tanımlama hakkında aşağıdaki noktalara dikkat edin:
Bir işlevin şemasını istemci kodunuzda tanımlarsanız (aşağıdaki örnekte gösterildiği gibi), istemci tarafı şema, bu işlev için şablon tarafından tanımlanan tüm şemaları geçersiz kılar.
İstemci kodunda işlev şemasını tanımlamak için işlev bildirimini yazın ve ardından bildirimi
startChatiçinde sağlayın. Model başlatma sırasında değil (sunucu istemi şablonları kullanılmadığında yaptığınız işlem).İşlev bildirimi
namebelirtse de şablon, modelin erişmesini istediğiniz işlevleri listelemelidir. Şablondakiname, istemci kodundakinameile eşleşmelidir.
İstemci kodunda tanımlanan işlev şemasına sahip örnek şablon
---
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}}
İşlev şemasının istemci kodunda tanımlandığı örnek istemci kodu
(Bu örnekte yer almayan ayrıntılar için yukarıdaki örnek istemci koduna bakın)
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.
...
}
// ...
Sırada ne var?
Sunucu istemi şablonlarını kullanmayla ilgili en iyi uygulamalar ve dikkat edilmesi gereken noktalar hakkında bilgi edinin.
Şablon biçimi ve söz dizimi ile ilgili ayrıntıları ve örnekleri öğrenin.
Düzenleme, kilitleme ve sürüm denetimi dahil şablonları yönetme