0.5 से माइग्रेट करना

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 से genkit और zod इंपोर्ट करना

    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. सीएलआई में हुए बदलाव

Genkit 0.9 में, कमांड-लाइन इंटरफ़ेस (सीएलआई) में कई अहम अपडेट किए गए हैं. Genkit को शुरू करने का निर्देश बदल गया है. साथ ही, सीएलआई को अलग स्टैंडअलोन पैकेज में बांटा गया है. अब आपको इसे अलग से इंस्टॉल करना होगा.

सीएलआई इंस्टॉल करने के लिए:

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 कमांड से डेवलपर यूज़र इंटरफ़ेस (यूआई) और आपके ऐप्लिकेशन कोड, दोनों एक साथ शुरू हो जाते थे. अगर आपके पास इस कमांड पर निर्भर कोई CI/CD पाइपलाइन है, तो आपको पाइपलाइन को अपडेट करना पड़ सकता है.

डेवलपर यूज़र इंटरफ़ेस (यूआई), सीधे फ़्लो सर्वर से इंटरैक्ट करेगा, ताकि यह पता लगाया जा सके कि कौनसे फ़्लो रजिस्टर किए गए हैं. साथ ही, आपको सैंपल इनपुट की मदद से उन्हें सीधे तौर पर लागू करने की अनुमति देगा.

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 को कॉन्फ़िगर करना

पहले, configureGenkit फ़ंक्शन को कॉल करके, Genkit को एक बार ग्लोबल तौर पर शुरू किया जाता था. 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 के पिछले वर्शन में, सीधे किसी फ़्लो में जाकर, रनटाइम के दौरान टूल और प्रॉम्प्ट को डाइनैमिक तौर पर तय किया जा सकता था.

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. स्ट्रीमिंग फ़्लो के लिए नया एपीआई

Genkit 0.9 में, हमने स्ट्रीमिंग फ़्लो तय करने और उसे लागू करने के लिए सिंटैक्स को आसान बना दिया है.

सबसे पहले, defineFlow और defineStreamingFlow को अलग कर दिया गया है. अगर आपके पास ऐसा फ़्लो है जिसे स्ट्रीम करना है, तो आपको defineStreamingFlow के ज़रिए उसे तय करने के लिए, अपना कोड अपडेट करना होगा.

दूसरा, अलग-अलग 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() जैसी क्लास के तरीकों का इस्तेमाल करके, जवाब का स्ट्रक्चर्ड आउटपुट या टेक्स्ट ऐक्सेस किया जाता था.

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. Generate API - Multi-Turn enhancements

एक से ज़्यादा बार की जाने वाली बातचीत के लिए, toHistory() के पुराने तरीके को messages से बदल दिया गया है. इससे बातचीत के इतिहास को मैनेज करने का तरीका और भी आसान हो गया है.

पुराना:

const history = response.toHistory();

नया:

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

10. बेहतर Chat 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');