مهاجرت از 0.5

Genkit 0.9 تعدادی از تغییرات شکسته را در کنار بهبود ویژگی هایی که عملکرد کلی را بهبود می بخشد، معرفی می کند. اگر برنامه‌هایی را با Genkit 0.5 توسعه می‌دهید، هنگام ارتقا به آخرین نسخه، باید کد برنامه خود را به‌روزرسانی کنید. این راهنما مهم‌ترین تغییرات را تشریح می‌کند و مراحلی را برای انتقال آسان برنامه‌های موجود شما ارائه می‌دهد.

راهنمای شروع سریع

مراحل زیر به شما کمک می کند تا به سرعت از Genkit 0.5 به Genkit 0.9 مهاجرت کنید. اطلاعات بیشتر درباره این تغییرات را در Changelog جزئیات زیر بخوانید.

1. CLI جدید را نصب کنید

  • CLI قدیمی را حذف نصب کنید

    npm uninstall -g genkit && npm uninstall genkit
  • CLI جدید را نصب کنید

    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 یا فعال کردن GoogleCloudTelemetry پیکربندی کنید

    برای Firebase:

    import { enableFirebaseTelemetry } from '@genkit-ai/firebase';
    
    enableFirebaseTelemetry({...});
    

    برای Google Cloud:

    import { enableGoogleCloudTelemetry } from '@genkit-ai/google-cloud';
    
    enableGoogleCloudTelemetry({...});
    
  • سطح ورود به سیستم خود را به طور مستقل تنظیم کنید

    import { logger } from 'genkit/logging';
    
    logger.setLogLevel('debug');
    

برای جزئیات بیشتر در مورد نحوه پیکربندی تله متری و ثبت گزارش، به مستندات نظارت و ثبت گزارش مراجعه کنید.

برای جزئیات بیشتر در مورد نحوه پیکربندی نمونه Genkit، به مستندات Get Started مراجعه کنید.

اقدامات Genkit را برای فراخوانی از نمونه genkit مهاجرت کنید

کنش‌ها (جریان‌ها، ابزارها، بازیابی‌کننده‌ها، نمایه‌سازها و غیره) برای هر نمونه تعریف می‌شوند. برای همه ویژگی‌هایی که باید تغییر دهید، Changelog را بخوانید، اما در اینجا نمونه‌ای از موارد متداول آورده شده است.

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

رابط خط فرمان (CLI) در Genkit 0.9 به روز رسانی های قابل توجهی را تجربه کرده است. دستور شروع Genkit تغییر کرده است و CLI به بسته مستقل خود جدا شده است که اکنون باید آن را جداگانه نصب کنید.

برای نصب CLI:

npm i -g genkit-cli

برخی تغییرات در دستور genkit start اعمال شده است:

کد برنامه Genkit + Dev UI شما را با هم شروع می کند:

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

Dev UI ONLY راه اندازی می شود:

genkit start

قبلاً، دستور genkit start ، Dev UI و کد برنامه شما را با هم شروع می کرد. اگر خطوط لوله CI/CD دارید که بر این فرمان تکیه دارند، ممکن است نیاز به به روز رسانی خط لوله داشته باشید.

Dev UI مستقیماً با سرور جریان تعامل می‌کند تا بفهمد کدام جریان‌ها ثبت شده‌اند و به شما امکان می‌دهد مستقیماً آنها را با ورودی‌های نمونه فراخوانی کنید.

2. بسته های ساده شده و واردات

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

قدیمی:

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 پیکربندی شده دارید، باید جریان های خود را تعریف کنید. همه متدهای API با برنامه‌نویس اصلی مانند 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، می‌توانید به‌طور پویا ابزارها و درخواست‌ها را در زمان اجرا، مستقیماً از درون یک جریان تعریف کنید.

در Genkit 0.9، این رفتار دیگر مجاز نیست. درعوض، باید تمام اقدامات و جریان های خارج از اجرای جریان (یعنی به صورت ایستا) را تعریف کنید.

این تغییر، جداسازی دقیق‌تری از تعاریف عمل از اجرا را اعمال می‌کند.

اگر کدهای شما به صورت پویا تعریف شده باشد، باید دوباره فاکتورسازی شوند. در غیر این صورت، هنگام اجرای جریان، یک خطا در زمان اجرا ایجاد می شود.

❌ نکن:

const flow = defineFlow({...}, async (input) => {
  const tool = defineTool({...});
  await tool(...);
});

✅ انجام دهید:

const tool = ai.defineTool({...});

const flow = ai.defineFlow({...}, async (input) => {
  await tool(...);
});

6. API جدید برای جریان جریان

در Genkit 0.9، ما سینتکس را برای تعریف جریان جریان و فراخوانی آن ساده کرده ایم.

ابتدا defineFlow و defineStreamingFlow از هم جدا شده اند. اگر جریانی دارید که قرار است پخش شود، باید کد خود را به روز کنید تا آن را از طریق defineStreamingFlow تعریف کنید.

دوم، به جای فراخوانی توابع stream() و response() جداگانه، هم stream و هم پاسخ اکنون مقادیری هستند که مستقیماً از جریان بازگردانده می شوند. این تغییر جریان جریان را ساده می کند.

قدیمی:

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 با خواص getter جایگزین شدند

قبلاً، برای دسترسی به خروجی ساختاریافته یا متن پاسخ با استفاده از متدهای کلاس، مانند output() یا text() استفاده می‌کردید.

در Genkit 0.9، آن روش ها با ویژگی های گیرنده جایگزین شده اند. این کار با پاسخ ها را ساده می کند.

قدیمی:

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. ایجاد API - پیشرفت های چند نوبتی

برای مکالمات چند نوبتی، روش قدیمی toHistory() با messages جایگزین شده است که نحوه مدیریت تاریخچه مکالمه را بیشتر ساده می کند.

قدیمی:

const history = response.toHistory();

جدید:

const response = await ai.generate({
 messages: [ { role: 'user', content: ...} ]
});
const history = response.messages;

10. API چت ساده

در Genkit 0.9، 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');