Plugin 系统与 genkit() 门面:如何把能力装进注册表
30 秒导读: 上一章讲了「一切皆 Action、注册表按 key 存取」。这一章讲这些 Action 是怎么被装进注册表的——你写
googleAI()、ollama()这些插件,genkit()把它们收编成统一的PluginProvider;真正的模型/嵌入器不在启动时就全建好,而是等你第一次用某个 key(如/model/googleai/gemini-2.5-flash)去查时,才被懒初始化 + 按需解析出来。本章聚焦「组合与寻址」这一层,不重复第 1 章的 Action 内部机制。
1. 这是什么(零基础也能懂)
一句话定义: genkit() 是一个工厂函数,你给它一份配置(要装哪些插件、默认用哪个模型),它还你一个 ai 对象——之后 ai.generate(...)、ai.defineFlow(...)、ai.defineTool(...) 全从这一个对象出。
它解决什么问题: 一个 AI 应用要用到一堆「外部能力」——Gemini 模型、OpenAI 模型、向量库、嵌入器……这些能力来自第三方包(@genkit-ai/google-genai 之类)。问题是:
- 怎么让「装一个包」= 「多一批可用的模型」,而用户代码几乎不用改?
- Gemini 有几十上百个模型,难道启动时就把每个都建成对象?(慢、浪费)
Genkit 的答案就是本章两个主角:Plugin(把能力打包) 和 懒解析(用到才建)。
用起来什么样: 一段最小真实代码——注意用户只碰 ai 这一个对象:
// 示意,非源码(取自 Genkit 常见用法)
import { genkit } from 'genkit';
import { googleAI } from '@genkit-ai/google-genai';
const ai = genkit({
plugins: [googleAI()], // 把 Gemini 这一批能力装进来
model: googleAI.model('gemini-2.5-flash'), // 设默认模型
});
const { text } = await ai.generate('给我讲个冷笑话'); // 只跟 ai 打交道
一句话直觉: 把 genkit() 想成手机的应用商店 + 主屏幕:插件是「装上去的 App」,注册表是「装了哪些 App 的列表」,而 App 图标点开才真正加载——你没点的 App 不占内存。Genkit 里「点开」= 「第一次用某个模型的名字去 generate」。