0.5에서 이전

Genkit 0.9에서는 전반적인 기능을 개선하는 기능 개선사항과 함께 여러 중대한 변경사항이 도입되었습니다. Genkit 0.5로 애플리케이션을 개발한 경우 최신 버전으로 업그레이드할 때 애플리케이션 코드를 업데이트해야 합니다. 이 가이드에서는 가장 중요한 변경사항을 간략히 설명하고 기존 애플리케이션을 원활하게 이전하는 단계를 제공합니다.

빠른 시작 가이드

다음 단계에 따라 Genkit 0.5에서 Genkit 0.9로 빠르게 이전할 수 있습니다. 아래의 상세 변경 로그에서 이러한 변경사항에 대해 자세히 알아보세요.

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에서 genkitzod 가져오기

    import { z, genkit } from 'genkit';
    

4. 코드 업데이트

configureGenkit 블록 삭제

이제 Genkit 구성이 인스턴스별로 이루어집니다. 원격 분석 및 로깅은 Genkit 인스턴스와 별개로 전역적으로 구성됩니다.

  • configureGenkitai = 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 변경사항

명령줄 인터페이스 (CLI)가 Genkit 0.9에서 대대적으로 업데이트되었습니다. Genkit을 시작하는 명령어가 변경되었으며 CLI가 자체 독립형 패키지로 분리되어 이제 별도로 설치해야 합니다.

CLI를 설치하려면 다음 안내를 따르세요.

npm i -g genkit-cli

genkit start 명령어에 몇 가지 변경사항이 적용되었습니다.

Genkit 애플리케이션 코드 + 개발자 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

개발자 UI만 시작합니다.

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 구성

이전에는 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와 같은 모든 핵심 개발자 대상 API 메서드가 이 인스턴스를 통해 호출됩니다.

이는 이전 방식과 달리 흐름과 도구가 전 세계적으로 등록됩니다.

이전:

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에서는 스트리밍 흐름을 정의하고 호출하기 위한 문법을 간소화했습니다.

첫째, defineFlowdefineStreamingFlow가 분리되었습니다. 스트리밍할 흐름이 있는 경우 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 클래스 메서드가 getter 속성으로 대체됨

이전에는 output() 또는 text()와 같은 클래스 메서드를 사용하여 응답의 구조화된 출력 또는 텍스트에 액세스했습니다.

Genkit 0.9에서는 이러한 메서드가 getter 속성으로 대체되었습니다. 이렇게 하면 응답을 더 쉽게 처리할 수 있습니다.

이전:

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 - 멀티턴 개선사항

멀티턴 대화의 경우 이전 toHistory() 메서드가 messages로 대체되어 대화 기록을 처리하는 방식이 더욱 간소화되었습니다.

이전:

const history = response.toHistory();

신규:

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

10. Streamlined 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');