تُقدّم أداة Genkit 0.9 عددًا من التغييرات الأساسية إلى جانب تحسينات على الميزات التي تُحسِّن الوظائف بشكل عام. إذا كنت تعمل على تطوير التطبيقات باستخدام Genkit 0.5، عليك تعديل رمز تطبيقك عند الترقية إلى أحدث إصدار. يوضّح هذا الدليل التغييرات الأكثر أهمية ويقدّم خطوات لنقل تطبيقاتك الحالية بسلاسة.
دليل البدء السريع
ستساعدك الخطوات التالية في نقل البيانات من Genkit 0.5 إلى Genkit 0.9 بسرعة. يمكنك الاطّلاع على مزيد من المعلومات حول هذه التغييرات في سجلّ التغييرات المفصّل أدناه.
1- تثبيت وحدة تحكم سطر الأوامر الجديدة
إلغاء تثبيت وحدة تحكم سطر الأوامر القديمة
npm uninstall -g genkit && npm uninstall genkit
تثبيت وحدة تحكم سطر الأوامر الجديدة
npm i -D genkit-cli
2- تعديل التبعيات
إزالة حِزم Genkit الأساسية الفردية
npm uninstall @genkit-ai/ai @genkit-ai/core @genkit-ai/dotprompt @genkit-ai/flow
تثبيت حزمة
genkit
المجمّعة الجديدةnpm i --save genkit
ترقية جميع إصدارات المكوّن الإضافي (مثال أدناه)
npm upgrade @genkit-ai/firebase
3- تغيير عمليات الاستيراد
إزالة عمليات الاستيراد لحِزم Genkit الأساسية الفردية
import { … } from '@genkit-ai/ai'; import { … } from '@genkit-ai/core'; import { … } from '@genkit-ai/flow';
إزالة عمليات استيراد zod
import * as z from 'zod';
استيراد
genkit
وzod
منgenkit
import { z, genkit } from 'genkit';
4. تعديل الرمز
أزِل وحدات configureGenkit.
يتم الآن ضبط Genkit لكل مثيل. يتم ضبط بيانات القياس والتسجيل على مستوى النظام بشكل منفصل عن نسخة Genkit.
استبدِل الوحدات
configureGenkit
بوحداتai = genkit({...})
. الاحتفاظ بإعدادات المكوّن الإضافي فقطimport { genkit } from 'genkit'; const ai = genkit({ plugins: [...]});
ضبط بيانات القياس عن بُعد باستخدام enableFirebaseTelemetry أو enableGoogleCloudTelemetry
بالنسبة إلى Firebase:
import { enableFirebaseTelemetry } from '@genkit-ai/firebase'; enableFirebaseTelemetry({...});
بالنسبة إلى Google Cloud:
import { enableGoogleCloudTelemetry } from '@genkit-ai/google-cloud'; enableGoogleCloudTelemetry({...});
اضبط مستوى التسجيل بشكل مستقل ```js import { logger } from 'genkit/logging';
logger.setLogLevel('debug'); ```
اطّلِع على مستندات المراقبة والتسجيل للحصول على مزيد من التفاصيل حول كيفية ضبط ميزة "إحصاءات الاستخدام" وميزة "تسجيل البيانات".
اطّلِع على مستندات البدء للحصول على مزيد من التفاصيل حول كيفية ضبط إعدادات مثيل Genkit.
نقل إجراءات Genkit ليتمّ استدعاؤها من مثيل genkit
يتم تحديد الإجراءات (عمليات المعالجة والأدوات وأدوات الاسترجاع والموسّعات وغير ذلك) لكلّ مثيل. اطّلِع على سجلّ التغييرات لمعرفة جميع الميزات التي عليك تغييرها، ولكن إليك مثالاً على بعض الميزات الشائعة.
import { genkit } from 'genkit';
import { onFlow } from '@genkit-ai/firebase/functions';
const ai = genkit({ plugins: [...]});
// Flows and tools are defined on the specific genkit instance
// and are directly callable.
const sampleFlow = ai.defineFlow(...);
const sampleTool = ai.defineTool(...);
async function callMyFlow() {
// Previously, text output could accessed via .text()
// Now it is either .output() or .text
return await sampleFlow().output();
}
// onFlow now takes the Genkit instance as first argument
// This registers the flow as a callable firebase function
onFlow(ai, ...);
const flows = [ sampleFlow, ... ];
// Start the flow server to make the registered flows callable over HTTP
ai.startFlowServer({flows});
5- تشغيله
# run the DevUI and your js code genkit start -- <command to run node>
# run a defined flow genkit flow:run <flowName>
سجلّ التغييرات
1- التغييرات في واجهة سطر الأوامر
تم إجراء تعديلات كبيرة على واجهة سطر الأوامر (CLI) في الإصدار 0.9 من Genkit. تم تغيير الأمر لبدء Genkit، وتم فصل واجهة برمجة التطبيقات (CLI) إلى حزمة مستقلة، ويجب الآن تثبيتها بشكل منفصل.
لتثبيت سطر الأوامر، اتّبِع الخطوات التالية:
npm i -g genkit-cli
تم إجراء بعض التغييرات على الأمر genkit start
:
بدء رمز تطبيق Genkit + واجهة مستخدم المطوّر معًا:
genkit start -- [start command]
genkit start -- tsx src/index.ts
genkit start -- go run main.go
يتوفّر أيضًا وضع المشاهدة:
genkit start -- tsx --watch src/index.ts
بدء رمز تطبيقك فقط في وضع المطوّر في Genkit:
genkit start --noui -- <start command>
genkit start --noui -- tsx src/index.ts
بدء واجهة مستخدم المطوّر فقط:
genkit start
في السابق، كان الأمر genkit start
يشغّل واجهة مستخدم المطوّر ورمز تطبيقك معًا. إذا كانت لديك أيّ مسارات معالجة للتكامل المستمر/النشر الدائم تعتمد على هذا الأمر، قد تحتاج إلى تعديل مسار المعالجة.
ستتفاعل واجهة مستخدم المطوّر مباشرةً مع خادم مسار الإحالة الناجحة لمعرفة مسارات الإحالة الناجحة المسجّلة والسماح لك بتشغيلها مباشرةً باستخدام نماذج الإدخال.
2- الحِزم والواردات المبسّطة
في السابق، كانت مكتبات Genkit مُقسّمة إلى عدة وحدات كان عليك تثبيتها واستيرادها بشكلٍ فردي. تم الآن دمج هذه الوحدات في عملية استيراد واحدة. بالإضافة إلى ذلك، يعيد Genkit الآن تصدير وحدة Zod.
القديم:
npm i @genkit-ai/core @genkit-ai/ai @genkit-ai/flow @genkit-ai/dotprompt
جديد:
npm i genkit
القديم:
import { … } from '@genkit-ai/ai';
import { … } from '@genkit-ai/core';
import { … } from '@genkit-ai/flow';
import * as z from 'zod';
جديد:
import { genkit, z } from 'genkit';
لا يزال يجب تثبيت وتصدير مكوّنات Genkit الإضافية بشكلٍ فردي.
3- ضبط Genkit
في السابق، كان يتمّ إعداد Genkit مرّة واحدة على مستوى النظام من خلال استدعاء الدالة configureGenkit
. سيتم ربط جميع موارد Genkit (عمليات التنقّل والأدوات والطلبات وما إلى ذلك) تلقائيًا بهذه الإعدادات الشاملة.
توفّر أداة Genkit 0.9 مثيلات Genkit
، يضمّ كلّ منها إعدادًا. راجِع الأمثلة التالية:
القديم:
import { configureGenkit } from '@genkit-ai/core';
configureGenkit({
telemetry: {
instrumentation: ...,
logger: ...
}
});
جديد:
import { genkit } from 'genkit';
import { logger } from 'genkit/logging';
import { enableFirebaseTelemetry } from '@genkit-ai/firebase';
logger.setLogLevel('debug');
enableFirebaseTelemetry({...});
const ai = genkit({ ... });
لنحلّل هذه العوامل:
- تم استبدال
configureGenkit()
بـgenkit()
، ويعرض مثيلًا منGenkit
تم ضبطه بدلاً من ضبط الإعدادات بشكل عام. - أصبحت دالة إعداد Genkit متوفّرة الآن في حزمة
genkit
. - لا يزال يتم ضبط التسجيل والإحصاءات على مستوى النظام باستخدام طرقها الصريحة. تنطبق هذه الإعدادات بشكلٍ موحّد على جميع مثيلات
Genkit
.
4. تحديد مسارات البيانات وبدء خادم مسارات البيانات بشكل صريح
بعد أن أصبح لديك مثيل Genkit
تم ضبطه، عليك تحديد عمليات النقل. يتم الآن استدعاء جميع طرق واجهة برمجة التطبيقات الأساسية الموجّهة للمطوّرين، مثل defineFlow
وdefineTool
وonFlow
، من خلال هذه النسخة.
يختلف ذلك عن الطريقة السابقة التي تم فيها تسجيل عمليات التنقّل والأدوات على مستوى العالم.
القديم:
import { defineFlow, defineTool, onFlow } from '@genkit-ai/core';
defineFlow(...);
defineTool(...);
onFlow(...);
جديد:
// Define tools and flows
const sampleFlow = ai.defineFlow(...);
const sampleTool = ai.defineTool(...);
// onFlow now takes the Genkit instance as first argument
// This registers the flow as a callable firebase function
onFlow(ai, ...);
const flows = [ sampleFlow, ... ];
// Start the flow server to make the registered flows callable over HTTP
ai.startFlowServer({flows});
اعتبارًا من الآن، يجب تسجيل جميع مسارات الإحالات الناجحة التي تريد إتاحتها بشكل صريح في صفيف flows
أعلاه.
5- يجب أن تكون الأدوات والطلبات محدّدة بشكل ثابت.
في الإصدارات السابقة من Genkit، كان بإمكانك تحديد الأدوات والطلبات بشكل ديناميكي أثناء التشغيل مباشرةً من داخل مسار.
في الإصدار 0.9 من Genkit، لم يعُد هذا السلوك مسموحًا به. بدلاً من ذلك، عليك تحديد جميع الإجراءات ومسارات الإحالات الناجحة خارج نطاق تنفيذ مسار الإحالة الناجحة (أي بشكل ثابت).
يفرض هذا التغيير فصلاً أكثر صرامة بين تعريفات الإجراءات وتنفيذها.
إذا تمّ تحديد أيّ من الرموز البرمجية ديناميكيًا، يجب إعادة تنظيمها. بخلاف ذلك، سيتم طرح خطأ أثناء التشغيل عند تنفيذ العملية.
❌ الإجراءات غير المسموح بها:
const flow = defineFlow({...}, async (input) => {
const tool = defineTool({...});
await tool(...);
});
✅ يُرجى اتّباع الخطوات التالية:
const tool = ai.defineTool({...});
const flow = ai.defineFlow({...}, async (input) => {
await tool(...);
});
6- واجهة برمجة تطبيقات جديدة لعمليات البث
في الإصدار 0.9 من Genkit، بسّطنا بنية تعريف عملية البث وتنفيذها.
أولاً، تم فصل defineFlow
وdefineStreamingFlow
. إذا كانت لديك عملية تريد بثّها، عليك تعديل الرمز لتحديدها من خلال defineStreamingFlow
.
ثانيًا، بدلاً من استدعاء دالتَي stream()
وresponse()
المنفصلتَين، أصبح كلّ من stream وresponse الآن قيمتَين يتم عرضهما مباشرةً من عملية المعالجة. ويؤدي هذا التغيير إلى تبسيط بث المحتوى.
القديم:
import { defineFlow, streamFlow } from '@genkit-ai/flow';
const myStreamingFlow = defineFlow(...);
const { stream, output } = await streamFlow(myStreamingFlow, ...);
for await (const chunk of stream()) {
console.log(chunk);
}
console.log(await output());
جديد:
const myStreamingFlow = ai.defineStreamingFlow(...);
const { stream, response } = await myStreamingFlow(...);
for await (const chunk of stream) {
console.log(chunk);
}
console.log(await response);
7- استبدال طرق فئة GenerateResponse بخصائص الحصول
في السابق، كنت تحصل على الإخراج أو النص المهيكل للردّ باستخدام طرق الفئة، مثل output()
أو text()
.
في الإصدار 0.9 من Genkit، تم استبدال هذه الطرق بسمات الحصول على البيانات. ويسهّل ذلك التعامل مع الردود.
القديم:
const response = await generate({ prompt: 'hi' });
console.log(response.text());
جديد:
const response = await ai.generate('hi');
console.log(response.text);
وينطبق الأمر نفسه على output
:
القديم:
console.log(response.output());
جديد:
console.log(response.output);
8- إيقاف إنشاء الاقتراحات
تعمل أداة Genkit 0.9 على تبسيط معالجة الردود من خلال إزالة سمة candidates
. في السابق، كان بإمكان الردود أن تحتوي على عدة مرشّحين، وكان عليك التعامل معها بشكل صريح. الآن، يتم عرض المرشح الأول فقط مباشرةً في ردّ بسيط.
ولن يعمل بعد ذلك أي رمز يصل إلى المرشحين مباشرةً.
القديم:
const response = await generate({
messages: [ { role: 'user', content: ...} ]
});
console.log(response.candidates); // previously you could access candidates directly
جديد:
const response = await ai.generate({
messages: [ { role: 'user', content: ...} ]
});
console.log(response.message); // single candidate is returned directly in a flat response
9- واجهة برمجة التطبيقات لميزة "إنشاء" - تحسينات "المحادثات المتعدّدة"
بالنسبة إلى المحادثات التي تتضمّن عدّة أدوار، تم استبدال الطريقة القديمة toHistory()
بـ messages
، ما يبسّط بشكل أكبر طريقة التعامل مع سجلّ المحادثات.
القديم:
const history = response.toHistory();
جديد:
const response = await ai.generate({
messages: [ { role: 'user', content: ...} ]
});
const history = response.messages;
10- Streamlined Chat API
في الإصدار 0.9 من Genkit، تمت إعادة تصميم Chat API لتسهيل إدارة الجلسات والتفاعل. في ما يلي كيفية الاستفادة من هذه الميزة في كلّ من تجارب المحادثة المتزامنة والمحادثة المباشرة:
import { genkit } from 'genkit';
import { gemini15Flash, googleAI } from '@genkit-ai/googleai';
const ai = genkit({
plugins: [googleAI()],
model: gemini15Flash,
});
const session = ai.createSession({ store: firestoreSessionStore() });
const chat = await session.chat({ system: 'talk like a pirate' });
let response = await chat.send('hi, my name is Pavel');
console.log(response.text()); // "hi Pavel, I'm llm"
// continue the conversation
response = await chat.send("what's my name");
console.log(response.text()); // "Pavel"
// can stream
const { response, stream } = await chat.sendStream('bye');
for await (const chunk of stream) {
console.log(chunk.text());
}
console.log((await response).text());
// can load session from the store
const prevSession = await ai.loadSession(session.id, { store });
const prevChat = await prevSession.chat();
await prevChat.send('bye');