Bermigrasi dari 0.5

Genkit 0.9 memperkenalkan sejumlah perubahan yang dapat menyebabkan gangguan bersama dengan peningkatan fitur yang meningkatkan fungsi secara keseluruhan. Jika telah mengembangkan aplikasi dengan Genkit 0.5, Anda harus mengupdate kode aplikasi saat mengupgrade ke versi terbaru. Panduan ini menguraikan perubahan yang paling signifikan dan menawarkan langkah-langkah untuk memigrasikan aplikasi yang ada dengan lancar.

Panduan memulai cepat

Langkah-langkah berikut akan membantu Anda bermigrasi dari Genkit 0.5 ke Genkit 0.9 dengan cepat. Baca informasi selengkapnya tentang perubahan ini dalam Log Perubahan mendetail di bawah.

1. Menginstal CLI baru

  • Meng-uninstal CLI lama

    npm uninstall -g genkit && npm uninstall genkit
    
  • Menginstal CLI baru

    npm i -D genkit-cli
    

2. Memperbarui dependensi

  • Menghapus setiap paket inti Genkit

    npm uninstall @genkit-ai/ai @genkit-ai/core @genkit-ai/dotprompt @genkit-ai/flow
    
  • Menginstal paket genkit gabungan baru

    npm i --save genkit
    
  • Mengupgrade semua versi plugin (contoh di bawah)

    npm upgrade @genkit-ai/firebase
    

3. Mengubah impor

  • Menghapus impor untuk setiap paket inti Genkit

    import { … } from '@genkit-ai/ai';
    import { … } from '@genkit-ai/core';
    import { … } from '@genkit-ai/flow';
    
  • Menghapus impor zod

    import * as z from 'zod';
    
  • Mengimpor genkit dan zod dari genkit

    import { z, genkit } from 'genkit';
    

4. Memperbarui kode

Menghapus blok configureGenkit

Konfigurasi untuk Genkit kini dilakukan per instance. Telemetri dan logging dikonfigurasi secara global dan terpisah dari instance Genkit.

  • Ganti configureGenkit dengan blok ai = genkit({...}). Hanya simpan konfigurasi plugin.

    import { genkit } from 'genkit';
    
    const ai = genkit({ plugins: [...]});
    
  • Mengonfigurasi telemetri menggunakan enableFirebaseTelemetry atau enableGoogleCloudTelemetry

    Untuk Firebase:

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

    Untuk Google Cloud:

    import { enableGoogleCloudTelemetry } from '@genkit-ai/google-cloud';
    
    enableGoogleCloudTelemetry({...});
    
  • Tetapkan level logging secara independen ```js import { logger } from 'genkit/logging';

    logger.setLogLevel('debug'); ```

Lihat dokumentasi Pemantauan dan Logging untuk mengetahui detail selengkapnya tentang cara mengonfigurasi telemetri dan logging.

Lihat dokumentasi Memulai untuk mengetahui detail selengkapnya tentang cara mengonfigurasi instance Genkit.

Memigrasikan tindakan Genkit untuk dipanggil dari instance genkit

Tindakan (alur, alat, pengambil, pengindeksan, dll.) ditentukan per instance. Baca Log Perubahan untuk semua fitur yang perlu Anda ubah, tetapi berikut adalah contoh beberapa fitur umum.

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. Menjalankan aplikasi

# run the DevUI and your js code
genkit start -- <command to run node>
# run a defined flow
genkit flow:run <flowName>

Log perubahan

1. Perubahan CLI

Antarmuka command line (CLI) telah mengalami update yang signifikan di Genkit 0.9. Perintah untuk memulai Genkit telah berubah, dan CLI telah dipisahkan ke dalam paket mandirinya sendiri, yang kini harus Anda instal secara terpisah.

Untuk menginstal CLI:

npm i -g genkit-cli

Beberapa perubahan telah dilakukan pada perintah genkit start:

Memulai kode aplikasi Genkit + UI Dev secara bersamaan:

genkit start -- [start command]
genkit start -- tsx src/index.ts
genkit start -- go run main.go

Mode tonton juga didukung:

genkit start -- tsx --watch src/index.ts

HANYA memulai kode aplikasi Anda dalam mode pengembangan Genkit:

genkit start --noui -- <start command>
genkit start --noui -- tsx src/index.ts

HANYA Memulai UI Developer:

genkit start

Sebelumnya, perintah genkit start akan memulai UI Dev dan kode aplikasi Anda secara bersamaan. Jika memiliki pipeline CI/CD yang mengandalkan perintah ini, Anda mungkin perlu memperbarui pipeline.

UI Dev akan berinteraksi langsung dengan server alur untuk mengetahui alur mana yang terdaftar dan memungkinkan Anda memanggilnya langsung dengan input sampel.

2. Paket dan impor yang disederhanakan

Sebelumnya, library Genkit dipisahkan menjadi beberapa modul, yang perlu Anda instal dan impor satu per satu. Modul ini kini telah digabungkan menjadi satu impor. Selain itu, modul Zod kini diekspor ulang oleh Genkit.

Lama:

npm i @genkit-ai/core @genkit-ai/ai @genkit-ai/flow @genkit-ai/dotprompt

Baru:

npm i genkit

Lama:

import { … } from '@genkit-ai/ai';
import { … } from '@genkit-ai/core';
import { … } from '@genkit-ai/flow';
import * as z from 'zod';

Baru:

import { genkit, z } from 'genkit';

Plugin Genkit masih harus diinstal dan diimpor satu per satu.

3. Mengonfigurasi Genkit

Sebelumnya, inisialisasi Genkit dilakukan satu kali secara global dengan memanggil fungsi configureGenkit. Semua resource Genkit (alur, alat, perintah, dll.) akan otomatis terhubung dengan konfigurasi global ini.

Genkit 0.9 memperkenalkan instance Genkit, yang masing-masing mengenkapsulasi konfigurasi. Lihat contoh berikut:

Lama:

import { configureGenkit } from '@genkit-ai/core';

configureGenkit({
  telemetry: {
    instrumentation: ...,
    logger: ...
  }
});

Baru:

import { genkit } from 'genkit';
import { logger } from 'genkit/logging';
import { enableFirebaseTelemetry } from '@genkit-ai/firebase';

logger.setLogLevel('debug');
enableFirebaseTelemetry({...});

const ai = genkit({ ... });

Mari kita uraikan:

  • configureGenkit() telah diganti dengan genkit(), dan menampilkan instance Genkit yang dikonfigurasi, bukan menyiapkan konfigurasi secara global.
  • Fungsi inisialisasi Genkit kini ada dalam paket genkit.
  • Logging dan telemetri masih dikonfigurasi secara global menggunakan metode eksplisit mereka sendiri. Konfigurasi ini berlaku secara seragam di semua instance Genkit.

4. Menentukan alur dan memulai server alur secara eksplisit

Setelah memiliki instance Genkit yang dikonfigurasi, Anda harus menentukan alur. Semua metode API inti yang ditampilkan kepada developer seperti defineFlow, defineTool, dan onFlow kini dipanggil melalui instance ini.

Hal ini berbeda dengan cara sebelumnya, saat alur dan alat didaftarkan secara global.

Lama:

import { defineFlow, defineTool, onFlow } from '@genkit-ai/core';

defineFlow(...);
defineTool(...);

onFlow(...);

Baru:

// 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});

Mulai sekarang, semua alur yang ingin Anda sediakan harus didaftarkan secara eksplisit dalam array flows di atas.

5. Alat dan Perintah harus ditentukan secara statis

Di Genkit versi sebelumnya, Anda dapat menentukan alat dan perintah secara dinamis saat runtime, langsung dari dalam alur.

Di Genkit 0.9, perilaku ini tidak lagi diizinkan. Sebagai gantinya, Anda harus menentukan semua tindakan dan alur di luar eksekusi alur (yaitu secara statis).

Perubahan ini menerapkan pemisahan definisi tindakan yang lebih ketat dari eksekusi.

Jika ada kode Anda yang ditentukan secara dinamis, kode tersebut harus difaktorkan ulang. Jika tidak, error akan ditampilkan saat runtime saat alur dieksekusi.

❌ JANGAN:

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

✅ LAKUKAN:

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

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

6. API Baru untuk Alur Streaming

Di Genkit 0.9, kami telah menyederhanakan sintaksis untuk menentukan alur streaming dan memanggilnya.

Pertama, defineFlow dan defineStreamingFlow telah dipisahkan. Jika memiliki alur yang dimaksudkan untuk di-streaming, Anda harus memperbarui kode untuk menentukannya melalui defineStreamingFlow.

Kedua, alih-alih memanggil fungsi stream() dan response() yang terpisah, aliran data dan respons kini merupakan nilai yang ditampilkan langsung dari alur. Perubahan ini menyederhanakan streaming alur.

Lama:

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());

Baru:

const myStreamingFlow = ai.defineStreamingFlow(...);
const { stream, response } = await myStreamingFlow(...);

for await (const chunk of stream) {
  console.log(chunk);
}

console.log(await response);

7. Metode class GenerateResponse diganti dengan properti pengambil

Sebelumnya, Anda biasa mengakses output terstruktur atau teks respons menggunakan metode class, seperti output() atau text().

Di Genkit 0.9, metode tersebut telah diganti dengan properti pengambil. Hal ini menyederhanakan penggunaan respons.

Lama:

const response = await generate({ prompt: 'hi' });
console.log(response.text());

Baru:

const response = await ai.generate('hi');
console.log(response.text);

Hal yang sama berlaku untuk output:

Lama:

console.log(response.output());

Baru:

console.log(response.output);

8. Pembuatan Kandidat Dihapus

Genkit 0.9 menyederhanakan penanganan respons dengan menghapus atribut candidates. Sebelumnya, respons dapat berisi beberapa kandidat, yang perlu Anda tangani secara eksplisit. Sekarang, hanya kandidat pertama yang ditampilkan langsung dalam respons datar.

Setiap kode yang mengakses kandidat secara langsung tidak akan berfungsi lagi.

Lama:

const response = await generate({
 messages: [ { role: 'user', content: ...} ]
});
console.log(response.candidates); // previously you could access candidates directly

Baru:

const response = await ai.generate({
 messages: [ { role: 'user', content: ...} ]
});
console.log(response.message); // single candidate is returned directly in a flat response

9. Generate API - Peningkatan Multi-Giliran

Untuk percakapan multi-giliran, metode toHistory() lama telah diganti dengan messages, yang lebih menyederhanakan cara penanganan histori percakapan.

Lama:

const history = response.toHistory();

Baru:

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

10. Chat API yang Disederhanakan

Di Genkit 0.9, Chat API telah didesain ulang untuk memudahkan pengelolaan dan interaksi sesi. Berikut cara memanfaatkannya untuk pengalaman chat sinkron dan streaming:

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');