PluginBench
Skill
Official
Pass
Audit score 90

developing-genkit-go

firebase/agent-skills

Develop AI-powered applications in Go with Genkit—generation, flows, tools, and structured output across model providers.

What is developing-genkit-go?

Genkit Go is an AI SDK for building AI features, agents, flows, and tools in Go with a unified interface. Use it when you need to add generation, prompts, streaming, tool calling, or multi-model support to a Go application.

  • Define and execute AI flows with tracing and observability
  • Generate text and structured data from LLMs with streaming support
  • Define tools and enable model tool-calling with interrupts and resumption
  • Create reusable prompts with Handlebars templating via .prompt files
  • Apply middleware for retry, fallback, tool approval, and skill composition
  • Serve flows as HTTP endpoints and test via Developer UI or CLI

How to install developing-genkit-go

npx skills add https://github.com/firebase/agent-skills --skill developing-genkit-go
Prerequisites
  • Go 1.18 or later
  • API key for at least one model provider (Google AI, Vertex AI, Anthropic, OpenAI, or Ollama)
  • Genkit CLI (install via `curl -sL cli.genkit.dev | bash`)
Claude Code
Cursor
Windsurf
Cline

How to use developing-genkit-go

  1. 1.Initialize Genkit with `genkit.Init()` and load a model provider plugin
  2. 2.Define flows using `genkit.DefineFlow()` to wrap AI logic
  3. 3.Call `genkit.GenerateText()` or `genkit.Generate()` within flows to invoke models
  4. 4.Define tools with `genkit.DefineTool()` if the model needs to call external functions
  5. 5.Create `.prompt` files for complex prompts or use inline prompts for simple cases
  6. 6.Register flows as HTTP handlers with `genkit.Handler()` and serve them
  7. 7.Test flows using `genkit flow:run` CLI command or the Developer UI at `genkit start`

Use cases

Good for
  • Build a chatbot or agent that calls external tools and APIs
  • Create a multi-step workflow that chains generation and tool calls
  • Generate structured JSON output (e.g., extracted data, classifications)
  • Stream long-form responses to users in real-time
  • Deploy AI features as HTTP services with built-in tracing
Who it's for
  • Go developers building AI features or agents
  • Backend engineers adding LLM capabilities to existing services
  • Teams needing observability and testing for AI workflows

developing-genkit-go FAQ

Do I need to store the *Genkit instance as a global?

No. Pass the `*Genkit` instance returned by `genkit.Init()` explicitly to all Genkit functions. This is the core pattern and avoids global state.

How do I enable streaming responses?

Use `genkit.DefineStreamingFlow()` instead of `genkit.DefineFlow()`, or pass streaming options to `GenerateText()`. The Developer UI and CLI support `--stream` for testing.

What's the best way to handle complex prompts?

Use `.prompt` files with Handlebars templating and separate prompt content from Go code. Code-defined prompts work well for simple, single-line cases.

How do I improve structured output quality?

Add `jsonschema:"description=..."` struct tags to output types. Models use these descriptions to understand what each field should contain.

Which middleware should I use for common patterns?

Genkit provides built-in middleware for `Retry`, `Fallback`, `ToolApproval`, `Filesystem`, and `Skills`. Compose them via `ai.WithUse()` before writing custom middleware.

Full instructions (SKILL.md)

Source of truth, from firebase/agent-skills.


name: developing-genkit-go description: Develop AI-powered applications using Genkit in Go. Use when the user asks to build AI features, agents, flows, or tools in Go using Genkit, or when working with Genkit Go code involving generation, prompts, streaming, tool calling, or model providers. metadata: genkit-managed: true

Genkit Go

Genkit Go is an AI SDK for Go that provides generation, structured output, streaming, tool calling, prompts, and flows with a unified interface across model providers.

Hello World

package main

import (
	"context"
	"fmt"
	"log"
	"net/http"

	"github.com/genkit-ai/genkit/go/ai"
	"github.com/genkit-ai/genkit/go/genkit"
	"github.com/genkit-ai/genkit/go/plugins/googlegenai"
	"github.com/genkit-ai/genkit/go/plugins/server"
)

func main() {
	ctx := context.Background()
	g := genkit.Init(ctx, genkit.WithPlugins(&googlegenai.GoogleAI{}))

	genkit.DefineFlow(g, "jokeFlow", func(ctx context.Context, topic string) (string, error) {
		return genkit.GenerateText(ctx, g,
			ai.WithModelName("googleai/gemini-flash-latest"),
			ai.WithPrompt("Tell me a joke about %s", topic),
		)
	})

	mux := http.NewServeMux()
	for _, f := range genkit.ListFlows(g) {
		mux.HandleFunc("POST /"+f.Name(), genkit.Handler(f))
	}
	log.Fatal(server.Start(ctx, "127.0.0.1:8080", mux))
}

Core Features

Load the appropriate reference based on what you need:

FeatureReferenceWhen to load
Initializationreferences/getting-started.mdSetting up genkit.Init, plugins, the *Genkit instance pattern
Generationreferences/generation.mdGenerate, GenerateText, GenerateData, streaming, output formats
Promptsreferences/prompts.mdDefinePrompt, DefineDataPrompt, .prompt files, schemas
Toolsreferences/tools.mdDefineTool, tool interrupts, RestartWith/RespondWith
Middlewarereferences/middleware.mdai.Middleware, ai.WithUse, Hooks (Generate/Model/Tool), built-ins (Retry, Fallback, ToolApproval, Filesystem, Skills)
Flows & HTTPreferences/flows-and-http.mdDefineFlow, DefineStreamingFlow, genkit.Handler, HTTP serving
Model Providersreferences/providers.mdGoogle AI, Vertex AI, Anthropic, OpenAI-compatible, Ollama setup

Genkit CLI

Check if installed: genkit --version

Installation:

curl -sL cli.genkit.dev | bash

Key commands:

# Start app with Developer UI (tracing, flow testing) at http://localhost:4000
genkit start -- go run .
genkit start -o -- go run .   # also opens browser

# Run a flow directly from the CLI
genkit flow:run myFlow '{"data": "input"}'
genkit flow:run myFlow '{"data": "input"}' --stream   # with streaming
genkit flow:run myFlow '{"data": "input"}' --wait      # wait for completion

# Look up Genkit documentation
genkit docs:search "streaming" go
genkit docs:list go
genkit docs:read go/flows.md

See references/getting-started.md for full CLI and Developer UI details.

Key Guidance

  • Pass g explicitly. The *Genkit instance returned by genkit.Init is the central registry. Pass it to all Genkit functions rather than storing it as a global. This is a core pattern throughout the SDK.
  • Wrap AI logic in flows. Flows give you tracing, observability, HTTP deployment via genkit.Handler, and the ability to test from the Developer UI and CLI. Any generation call worth keeping should live in a flow.
  • Use jsonschema:"description=..." struct tags on output types. The model uses these descriptions to understand what each field should contain. Without them, structured output quality drops significantly.
  • Write good tool descriptions. The model decides which tools to call based on their description string. Vague descriptions lead to missed or incorrect tool calls.
  • Use .prompt files for complex prompts. They separate prompt content from Go code, support Handlebars templating, and can be iterated on without recompilation. Code-defined prompts are better for simple, single-line cases.
  • Reach for built-in middleware before writing one. Retry, Fallback, ToolApproval, Filesystem, and Skills cover the common cross-cutting needs and compose with each other via ai.WithUse. See references/middleware.md. When you do write custom middleware, allocate per-call state in closures captured by New, and guard anything that WrapTool mutates because tools may run concurrently.
  • Look up the latest model IDs. Model names change frequently. Check provider documentation for current model IDs rather than relying on hardcoded names. See references/providers.md.