Genkit 1.0 содержит множество улучшений, улучшающих общую функциональность; в нем также есть некоторые важные изменения. Если вы разрабатываете приложения с помощью Genkit 0.9, вам необходимо обновить код приложения при обновлении до последней версии Genkit. В этом руководстве описаны наиболее существенные изменения и объясняется, как плавно перенести существующие приложения.
Бета-API
Мы представляем нестабильный бета-канал API и оставляем API-интерфейсы сеанса, чата и клиента Genkit в бета-версии, поскольку продолжаем их совершенствовать. Более конкретно, следующие функции в настоящее время находятся в beta
пространстве имен:
-
ai.chat
-
ai.createSession
-
ai.loadSession
-
ai.currentSession
-
ai.defineFormat
-
ai.defineInterrupt
Старый:
import { genkit } from 'genkit';
const ai = genkit({...})
const session = ai.createSession({ ... })
Новый:
import { genkit } from 'genkit/beta';
const ai = genkit({...})
const session = ai.createSession({ ... })
Старый:
import { runFlow, streamFlow } from 'genkit/client';
Новый:
import { runFlow, streamFlow } from 'genkit/beta/client';
Представляем новый пакет @genkit-ai/express
Этот новый пакет содержит утилиты, упрощающие создание сервера Express.js с помощью Genkit. Более подробную информацию об этом вы можете найти на этой странице .
startFlowServer
перешел из части объекта genkit в этот новый пакет @genkit-ai/express
; чтобы использовать startFlowServer, вам необходимо обновить импорт.
Старый:
const ai = genkit({ ... });
ai.startFlowServer({
flows: [myFlow1, myFlow2],
});
Новый:
import { startFlowServer } from '@genkit-ai/express';
startFlowServer({
flows: [myFlow1, myFlow2],
});
Изменения в потоках
В потоках версии 1.0 есть несколько изменений:
-
ai.defineStreamingFlow
был объединен вai.defineFlow
, -
onFlow
заменен наonCallGenkit
, -
run
переместился вai.run
, - Есть изменения в работе с авторизацией.
Функция run
для пользовательских блоков трассировки перемещена в часть объекта genkit
; вместо этого используйте ai.run
для его вызова.
Старый:
ai.defineFlow({name: 'banana'}, async (input) => {
const step = await run('myCode', async () => {
return 'something'
});
})
Новый:
ai.defineFlow({name: 'banana'}, async (input) => {
const step = await ai.run('myCode', async () => {
return 'something'
});
})
ai.defineStreamingFlow
удален; вместо этого используйте ai.defineFlow
. Кроме того, streamingCallback
перемещена в поле внутри второго аргумента функции потока и теперь называется sendChunk
.
Старый:
const flow = ai.defineStreamingFlow({name: 'banana'}, async (input, streamingCallback) => {
streamingCallback({chunk: 1});
})
const {stream} = await flow()
for await (const chunk of stream) {
// ...
}
Новый:
const flow = ai.defineFlow({name: 'banana'}, async (input, {context, sendChunk}) => {
sendChunk({chunk: 1});
})
const {stream, output} = flow.stream(input);
for await (const chunk of stream) {
// ...
}
Аутентификация FlowAuth теперь называется контекстом. Вы можете получить доступ к авторизации как к полю внутри контекста:
Старый:
ai.defineFlow({name: 'banana'}, async (input) => {
const auth = getFlowAuth();
// ...
})
Новый:
ai.defineFlow({name: 'banana'}, async (input, { context }) => {
const auth = context.auth;
})
onFlow
перемещен в пакет firebase-functions/https
и переименован в onCallGenkit
. В следующем фрагменте показан пример его использования.
Старый
import { onFlow } from "@genkit-ai/firebase/functions";
export const generatePoem = onFlow(
ai,
{
name: "jokeTeller",
inputSchema: z.string().nullable(),
outputSchema: z.string(),
streamSchema: z.string(),
},
async (type, streamingCallback) => {
const { stream, response } = await ai.generateStream(
`Tell me a longish ${type ?? "dad"} joke.`
);
for await (const chunk of stream) {
streamingCallback(chunk.text);
}
return (await response).text;
}
);
Новый:
import { onCallGenkit } from "firebase-functions/https";
import { defineSecret } from "firebase-functions/params";
import { genkit, z } from "genkit";
const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");
const ai = genkit({
plugins: [googleAI()],
model: gemini15Flash,
});
export const jokeTeller = ai.defineFlow(
{
name: "jokeTeller",
inputSchema: z.string().nullable(),
outputSchema: z.string(),
streamSchema: z.string(),
},
async (type, { sendChunk }) => {
const { stream, response } = ai.generateStream(
`Tell me a longish ${type ?? "dad"} joke.`
);
for await (const chunk of stream) {
sendChunk(chunk.text);
}
return (await response).text;
}
);
export const tellJoke = onCallGenkit({ secrets: [apiKey] }, jokeTeller);
Политики аутентификации были удалены из defineFlow
. Обработка политик аутентификации теперь зависит от сервера.
Старый:
export const simpleFlow = ai.defineFlow(
{
name: 'simpleFlow',
authPolicy: (auth, input) => {
// auth policy
},
},
async (input) => {
// Flow logic here...
}
);
В следующем фрагменте показан пример обработки аутентификации в Express.
Новый:
import { UserFacingError } from 'genkit';
import { ContextProvider, RequestData } from 'genkit/context';
import { expressHandler, startFlowServer } from '@genkit-ai/express';
const context: ContextProvider<Context> = (req: RequestData) => {
return {
auth: parseAuthToken(req.headers['authorization']),
};
};
export const simpleFlow = ai.defineFlow(
{
name: 'simpleFlow',
},
async (input, { context }) => {
if (!context.auth) {
throw new UserFacingError("UNAUTHORIZED", "Authorization required.");
}
if (input.uid !== context.auth.uid) {
throw new UserFacingError("UNAUTHORIZED", "You may only summarize your own profile data.");
}
// Flow logic here...
}
);
const app = express();
app.use(express.json());
app.post(
'/simpleFlow',
expressHandler(simpleFlow, { context })
);
app.listen(8080);
// or
startFlowServer(
flows: [withContextProvider(simpleFlow, context)],
port: 8080
);
Более подробную информацию можно найти в документации по аутентификации .
В следующем фрагменте показан пример обработки аутентификации в Cloud Functions для Firebase:
import { genkit } from 'genkit';
import { onCallGenkit } from 'firebase-functions/https';
const ai = genkit({ ... });;
const simpleFlow = ai.defineFlow({
name: 'simpleFlow',
}, async (input) => {
// Flow logic here...
});
export const selfSummary = onCallGenkit({
authPolicy: (auth, data) => auth?.token?.['email_verified'] && auth?.token?.['admin'],
}, simpleFlow);
Подсказки
Мы внесли несколько изменений и улучшений в подсказки.
Вы можете определить отдельные шаблоны для подсказок и системных сообщений:
const hello = ai.definePrompt({
name: 'hello',
system: 'talk like a pirate.',
prompt: 'hello {{ name }}',
input: {
schema: z.object({
name: z.string()
})
}
});
const { text } = await hello({name: 'Genkit'});
Альтернативно вы можете определить подсказки с несколькими сообщениями в поле сообщений:
const hello = ai.definePrompt({
name: 'hello',
messages: '{{ role "system" }} talk like a pirate. {{ role "user" }} hello {{ name }}',
input: {
schema: z.object({
name: z.string()
})
}
});
Вместо шаблонов подсказок вы можете использовать функцию:
ai.definePrompt({
name: 'hello',
prompt: async (input, { context }) => {
return `hello ${input.name}`
},
input: {
schema: z.object({
name: z.string()
})
}
});
Вы можете получить доступ к контексту (включая информацию аутентификации) из приглашения:
const hello = ai.definePrompt({
name: 'hello',
messages: 'hello {{ @auth.email }}',
});
Функции потоковой передачи не требуют await
Старый:
const { stream, response } = await ai.generateStream(`hi`);
const { stream, output } = await myflow.stream(`hi`);
Новый:
const { stream, response } = ai.generateStream(`hi`);
const { stream, output } = myflow.stream(`hi`);
Встраивание имеет новый тип возврата
Мы добавили поддержку мультимодальных вложений. Вместо того, чтобы возвращать только один вектор внедрения, Embed возвращает массив объектов внедрения, каждый из которых содержит вектор внедрения и метаданные.
Старый:
const response = await ai.embed({embedder, content, options}); // returns number[]
Новый:
const response = await ai.embed({embedder, content, options}); // returns Embedding[]
const firstEmbeddingVector = response[0].embedding; // is number[]