Cómo escribir complementos de Genkit

Las funciones de Firebase Genkit están diseñadas para que se extiendan a través de complementos. Los complementos de Genkit son módulos configurables que pueden proporcionar modelos, recuperadores, indexadores, almacenes de seguimientos y mucho más. Ya viste los complementos en acción con solo usar Genkit:

import {
	"github.com/firebase/genkit/go/ai"
	"github.com/firebase/genkit/go/plugins/vertexai"
}
// Default to the value of GCLOUD_PROJECT for the project,
// and "us-central1" for the location.
// To specify these values directly, pass a vertexai.Config value to Init.
if err := vertexai.Init(ctx, nil); err != nil {
	return err
}

El complemento de Vertex AI toma la configuración (como el ID del proyecto de Google Cloud del usuario) y registra una variedad de nuevos modelos, incorporadores y más con el registro de Genkit. El registro sirve como un servicio de búsqueda para acciones con nombre en el entorno de ejecución y potencia la IU local de Genkit para ejecutar e inspeccionar modelos, instrucciones y mucho más.

Cómo crear un complemento

En Go, un complemento Genkit es simplemente un paquete que se adhiere a un pequeño conjunto de convenciones. Un solo módulo puede contener varios complementos.

ID del proveedor

Cada complemento debe tener una cadena de identificador único que lo distinga de otros complementos. Genkit usa este identificador como un espacio de nombres para cada recurso que defina tu complemento y, así, evitar conflictos de nombres con otros complementos.

Por ejemplo, si tu complemento tiene un ID yourplugin y proporciona un modelo llamado text-generator, el identificador del modelo completo será yourplugin/text-generator.

No es necesario exportar el ID de proveedor, pero debes definirlo una vez para el complemento y usarlo de forma coherente cuando una función de Genkit lo requiera.

const providerID = "yourplugin"

Exportaciones estándar

Cada complemento debe definir y exportar los siguientes símbolos:

  • Una función Init() con una declaración como la siguiente:

    func Init(ctx context.Context, cfg *Config) (err error)
    

    Omite los parámetros que no uses (por ejemplo, es posible que no tengas un parámetro cfg si tu complemento no proporciona ninguna opciónd e configuración para todo el complemento).

    En esta función, realiza los pasos de configuración que requiera tu complemento. Por ejemplo:

    • Confirma que se hayan especificado los valores de configuración necesarios y asigna los valores predeterminados a cualquier parámetro de configuración opcional no especificado.
    • Verifica que las opciones de configuración proporcionadas sean válidas juntas.
    • Crea los recursos compartidos que requiera el resto del complemento. Por ejemplo, crea clientes para cualquier servicio al que acceda tu complemento.

    En la medida de lo posible, los recursos proporcionados por el complemento no deben dar por sentado que el usuario realizó una acción distinta de llamar a Init.

    Debes definir y exportar esta función incluso si el complemento no requiere una inicialización. En este caso, Init puede solo devolver un error nil.

  • Un tipo de struct Config. Este tipo debe encapsular toda las opciones de configuración aceptadas por Init.

    Para cualquier opción de complemento que sea un valor secreto, como claves de API, debes ofrecer una opción Config y una variable de entorno predeterminada para configurarla. Esto permite que tu complemento aproveche las funciones de administración de secretos que ofrecen muchos proveedores de hosting (como Cloud Secret Manager, que puedes usar con Cloud Run). Por ejemplo:

    type Config struct {
    	ExampleAPIKey string
    }
    
    func Init(cfg *Config) (err error) {
    	apiKey := cfg.ExampleAPIKey
    	if apiKey == "" {
    		apiKey = os.Getenv("EXAMPLE_API_KEY")
    	}
    	if apiKey == "" {
    		return fmt.Errorf(`the Example plug-in requires you to specify an API
     key for the Example service, either by passing it to example.Init() or by
     setting the EXAMPLE_API_KEY environment variable`)
    	}
    
    	return nil
    }
    

Cómo compilar funciones de complementos

Un solo complemento puede activar muchos elementos nuevos en Genkit. Por ejemplo, el complemento de Vertex AI activa varios modelos nuevos, así como un incorporador.

Complementos de modelos

Los complementos de modelos de Genkit agregan uno o más modelos de IA generativa al registro de Genkit. Un modelo representa cualquier modelo generativo capaz de recibir instrucciones como entradas y generar texto, contenido multimedia o datos como resultados.

Consulta Cómo escribir un complemento de modelo de Genkit.

Complementos de telemetría

Los complementos de telemetría de Genkit configuran la instrumentación de OpenTelemetry de Genkit para exportar seguimientos, métricas y registros a una herramienta de supervisión o visualización en particular.

Consulta Cómo escribir un complemento de telemetría de Genkit.

Cómo publicar un complemento

Los complementos de Genkit se pueden publicar como paquetes normales de Go. Para aumentar su visibilidad, tu paquete debe tener genkit en alguna parte de su nombre para que se pueda encontrar con una simple búsqueda en pkg.go.dev. Cualquiera de las siguientes son buenas opciones:

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