Genkit 1.0 มีการปรับปรุงฟีเจอร์หลายอย่างที่ช่วยเพิ่มฟังก์ชันการทำงานโดยรวม รวมถึงการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบด้วย หากคุณพัฒนาแอปพลิเคชันด้วย Genkit 0.9 คุณจะต้องอัปเดตโค้ดแอปพลิเคชันเมื่ออัปเกรด Genkit เป็นเวอร์ชันล่าสุด คู่มือนี้จะกล่าวถึงการเปลี่ยนแปลงที่สำคัญที่สุดและอธิบายวิธีย้ายข้อมูลแอปพลิเคชันที่มีอยู่อย่างราบรื่น
API เบต้า
เราจะเปิดตัวช่องทาง API เวอร์ชันเบต้าที่ไม่เสถียร และปล่อยให้ API ไคลเอ็นต์ของเซสชัน แชท และ Genkit อยู่ในเวอร์ชันเบต้าต่อไปขณะที่เราปรับแต่ง API เหล่านี้ต่อไป กล่าวโดยละเอียดคือ ขณะนี้ฟังก์ชันต่อไปนี้อยู่ในเนมสเปซ 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
ได้ย้ายไปยังช่องภายในอาร์กิวเมนต์ที่ 2 ของฟังก์ชันโฟลว์และเปลี่ยนชื่อเป็น 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[]