编写 Genkit 插件

Genkit 的功能设计为通过插件进行扩展。Genkit 插件是可配置的模块,可以提供模型、检索器、索引器、跟踪记录存储区等。您已经通过使用 Genkit 看到了插件的实际运用:

import (
    "github.com/firebase/genkit/go/ai"
    "github.com/firebase/genkit/go/genkit"
    "github.com/firebase/genkit/go/plugins/googlegenai"
    "github.com/firebase/genkit/go/plugins/server"
)
g, err := genkit.Init(ctx,
    ai.WithPlugins(
        &googlegenai.GoogleAI{APIKey: ...},
        &googlegenai.VertexAI{ProjectID: "my-project", Location: "us-central1"},
    ),
)

Vertex AI 插件会接受配置(例如用户的 Google Cloud 项目 ID),并通过 Genkit 注册表注册各种新模型、嵌入器等。该注册表可在运行时作为命名操作的查找服务,并为 Genkit 的本地界面提供支持,以运行和检查模型、提示等。

创建插件

在 Go 中,Genkit 插件遵循一小部分惯例的软件包。一个模块可以包含数个插件。

提供方 ID

每个插件都必须具有一个唯一的标识符字符串,以便将自身与其他插件区分开来。Genkit 会将此标识符用作插件定义的每个资源的命名空间,以防止与其他插件发生命名冲突。

比方说,如果您的插件具有 ID yourplugin 并提供名为 text-generator 的模型,则完整的模型标识符将为 yourplugin/text-generator

此提供方 ID 需要导出,应在插件中统一定义,并在 Genkit 函数调用中保持一致使用。

const providerID = "yourplugin"

标准导出

每个插件都应定义并导出以下符号,以符合 genkit.Plugin 接口:

  • 一个结构体类型,用于封装插件接受的所有配置选项。

    对于任何密钥值插件选项(例如 API 密钥),您都应提供配置选项和默认环境变量来对其进行配置。这样,您的插件就可以利用许多托管服务提供商(例如 Cloud Secret Manager,您可以将其与 Cloud Run 搭配使用)提供的 Secret 管理功能。例如:

    type MyPlugin struct {
        APIKey string
        // Other options you may allow to configure...
    }
    
  • 结构体上的 Name() 方法,用于返回提供方 ID。

  • 结构体上的 Init() 方法,声明如下所示:

    func (m *MyPlugin) Init(ctx context.Context, g *genkit.Genkit) error
    

    在此函数中,执行插件所需的所有设置步骤。例如:

    • 确认所有必需的配置值都已指定,并为所有未指定的可选设置分配默认值。
    • 确认给定的配置选项是否有效。
    • 创建插件其余部分所需的所有共享资源。例如,为您的插件所访问的所有服务创建客户端。

    在可能的情况下,插件提供的资源不应依赖其他插件已先于本插件安装。

    当用户将插件传递到 WithPlugins() 选项时,系统会在 genkit.Init() 期间自动调用此方法。

构建插件功能

单个插件可以在 Genkit 中激活许多新功能。例如,Vertex AI 插件会激活数个新模型以及一个嵌入器。

模型插件

Genkit 模型插件会向 Genkit 注册表添加一个或多个生成式 AI 模型。模型代表能够接收提示作为输入并生成文本、媒体或数据作为输出的任何生成模型。

请参阅编写 Genkit 模型插件

遥测插件

Genkit 遥测插件会配置 Genkit 的 OpenTelemetry 插桩,以将跟踪记录、指标和日志导出到特定的监控或可视化工具。

请参阅编写 Genkit 遥测插件

发布插件

Genkit 插件可以作为常规 Go 软件包发布。为了提高可发现性,您的软件包的名称中应包含 genkit,这样用户只需简单搜索 pkg.go.dev 即可找到该软件包。以下任何选项都是不错的选择:

  • github.com/yourorg/genkit-plugins/servicename
  • github.com/yourorg/your-repo/genkit/servicename