فراخوانی تابع، دریافت خروجی داده های ساختاریافته از مدل های تولیدی را برای شما آسان تر می کند. سپس می توانید از این خروجی ها برای فراخوانی API های دیگر و برگرداندن داده های پاسخ مربوطه به مدل استفاده کنید. به عبارت دیگر، فراخوانی تابع به شما کمک می کند تا مدل های تولیدی را به سیستم های خارجی متصل کنید تا محتوای تولید شده شامل به روزترین و دقیق ترین اطلاعات باشد.
می توانید مدل های Gemini را با توضیحاتی در مورد عملکردها ارائه دهید. اینها توابعی هستند که شما به زبان برنامه خود می نویسید (یعنی توابع Google Cloud نیستند). مدل ممکن است از شما بخواهد که یک تابع را فراخوانی کنید و نتیجه را برای کمک به مدل در رسیدگی به درخواست شما ارسال کنید.
اگر قبلاً این کار را نکردهاید، برای کسب اطلاعات بیشتر ، مقدمه فراخوانی تابع را بررسی کنید.
پروژه خود را تنظیم کنید
قبل از فراخوانی Gemini API، باید پروژه خود را راهاندازی کنید، که شامل تنظیم کلید API، افزودن SDK به وابستگیهای میخانه و تنظیم اولیه مدل میشود.
برای استفاده از Gemini API، به یک کلید API نیاز دارید. اگر قبلاً یکی ندارید، یک کلید در Google AI Studio ایجاد کنید.
کلید API خود را ایمن کنید
کلید API خود را ایمن نگه دارید. ما قویاً توصیه میکنیم که کلید API را مستقیماً در کد خود وارد نکنید ، یا فایلهایی را که حاوی کلید هستند را در سیستمهای کنترل نسخه بررسی کنید. درعوض، باید از یک فروشگاه مخفی برای کلید API خود استفاده کنید.
این آموزش فرض می کند که شما به کلید API خود به عنوان یک متغیر محیط فرآیند دسترسی دارید. اگر در حال توسعه یک برنامه Flutter هستید، می توانید از String.fromEnvironment
استفاده کنید و --dart-define=API_KEY=$API_KEY
برای flutter build
یا flutter run
برای کامپایل با کلید API ارسال کنید زیرا محیط فرآیند هنگام اجرای برنامه متفاوت خواهد بود. .
برای استفاده از Gemini API در برنامه خود، باید بسته google_generative_ai
را به برنامه Dart یا Flutter خود add
:
دارت
dart pub add google_generative_ai
بال بال زدن
flutter pub add google_generative_ai
قبل از اینکه بتوانید هر گونه تماس API را برقرار کنید، باید مدل تولیدی را وارد و مقداردهی اولیه کنید. این مقدار اولیه اولیه است. بعداً در این آموزش، آن را برای فراخوانی تابع به روز خواهید کرد.
import 'package:google_generative_ai/google_generative_ai.dart';
// Access your API key as an environment variable (see "Set up your API key" above)
final apiKey = Platform.environment['API_KEY'];
if (apiKey == null) {
print('No \$API_KEY environment variable');
exit(1);
}
// Use a model that supports function calling, like Gemini 1.0 Pro.
// See "Supported models" in the "Introduction to function calling" page.
final model = GenerativeModel(model: 'MODEL_NAME', apiKey: apiKey);
یک تماس تابع تنظیم کنید
برای این آموزش، مدل را با یک API مبادله ارز فرضی که از پارامترهای زیر پشتیبانی میکند تعامل خواهید داشت:
پارامتر | تایپ کنید | ضروری | شرح |
---|---|---|---|
currencyDate | رشته | آره | تاریخ دریافت نرخ ارز (که همیشه باید در قالب YYYY-MM-DD باشد یا اگر بازه زمانی مشخص نشده باشد latest مقدار باشد) |
currencyFrom | رشته | آره | ارز برای تبدیل |
currencyTo | رشته | نه | ارز برای تبدیل |
نمونه درخواست API
{
"currencyDate": "2024-04-17",
"currencyFrom": "USD",
"currencyTo": "SEK"
}
نمونه پاسخ API
{
"base": "USD",
"date": "2024-04-17",
"rates": {"SEK": 0.091}
}
مرحله 1 : تابعی را ایجاد کنید که درخواست API را ایجاد می کند
اگر قبلاً این کار را نکردهاید، با ایجاد تابعی که درخواست API را ایجاد میکند، شروع کنید.
برای اهداف نمایشی در این آموزش، به جای ارسال یک درخواست API واقعی، مقادیر کدگذاری شده را با همان قالبی که یک API واقعی برمی گرداند، برمی گردانید.
Future<Map<String, Object?>> findExchangeRate(
Map<String, Object?> arguments,
) async =>
// This hypothetical API returns a JSON such as:
// {"base":"USD","date":"2024-04-17","rates":{"SEK": 0.091}}
{
'date': arguments['currencyDate'],
'base': arguments['currencyFrom'],
'rates': <String, Object?>{arguments['currencyTo'] as String: 0.091}
};
مرحله 2 : یک اعلان تابع ایجاد کنید
اعلان تابعی را ایجاد کنید که به مدل مولد منتقل می کنید (مرحله بعدی این آموزش).
تا جایی که ممکن است جزئیات را در توضیحات تابع و پارامتر بگنجانید. مدل مولد از این اطلاعات برای تعیین اینکه کدام تابع را انتخاب کند و چگونه مقادیر پارامترهای فراخوانی تابع را ارائه کند، استفاده می کند.
final exchangeRateTool = FunctionDeclaration(
'findExchangeRate',
'Returns the exchange rate between currencies on given date.',
Schema(SchemaType.object, properties: {
'currencyDate': Schema(SchemaType.string,
description: 'A date in YYYY-MM-DD format or '
'the exact value "latest" if a time period is not specified.'),
'currencyFrom': Schema(SchemaType.string,
description: 'The currency code of the currency to convert from, '
'such as "USD".'),
'currencyTo': Schema(SchemaType.string,
description: 'The currency code of the currency to convert to, '
'such as "USD".')
}, requiredProperties: [
'currencyDate',
'currencyFrom'
]));
مرحله 3 : اعلان تابع را در طول اولیه سازی مدل مشخص کنید
اعلان تابع را هنگام مقداردهی اولیه مدل مولد با ارسال آن به پارامتر tools
مدل مشخص کنید:
final model = GenerativeModel(
// Use a model that supports function calling, like Gemini 1.0 Pro
// See "Supported models" in the "Introduction to function calling" page.
model: 'gemini-1.0-pro',
apiKey: apiKey,
// Specify the function declaration.
tools: [
Tool(functionDeclarations: [exchangeRateTool])
],
);
مرحله 4 : یک فراخوانی تابع ایجاد کنید
اکنون می توانید مدل را با تابع تعریف شده درخواست کنید.
روش پیشنهادی برای استفاده از فراخوانی تابع از طریق رابط چت است، زیرا فراخوانی های تابع به خوبی در ساختار چند نوبتی چت قرار می گیرند.
final chat = model.startChat();
final prompt = 'How much is 50 US dollars worth in Swedish krona?';
// Send the message to the generative model.
var response = await chat.sendMessage(Content.text(prompt));
final functionCalls = response.functionCalls.toList();
// When the model response with a function call, invoke the function.
if (functionCalls.isNotEmpty) {
final functionCall = functionCalls.first;
final result = switch (functionCall.name) {
// Forward arguments to the hypothetical API.
'findExchangeRate' => await findExchangeRate(functionCall.args),
// Throw an exception if the model attempted to call a function that was
// not declared.
_ => throw UnimplementedError(
'Function not implemented: ${functionCall.name}')
};
// Send the response to the model so that it can use the result to generate
// text for the user.
response = await chat
.sendMessage(Content.functionResponse(functionCall.name, result));
}
// When the model responds with non-null text content, print it.
if (response.text case final text?) {
print(text);
}