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- 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`)
How to use developing-genkit-go
- 1.Initialize Genkit with `genkit.Init()` and load a model provider plugin
- 2.Define flows using `genkit.DefineFlow()` to wrap AI logic
- 3.Call `genkit.GenerateText()` or `genkit.Generate()` within flows to invoke models
- 4.Define tools with `genkit.DefineTool()` if the model needs to call external functions
- 5.Create `.prompt` files for complex prompts or use inline prompts for simple cases
- 6.Register flows as HTTP handlers with `genkit.Handler()` and serve them
- 7.Test flows using `genkit flow:run` CLI command or the Developer UI at `genkit start`
Use cases
- 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
- 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
No. Pass the `*Genkit` instance returned by `genkit.Init()` explicitly to all Genkit functions. This is the core pattern and avoids global state.
Use `genkit.DefineStreamingFlow()` instead of `genkit.DefineFlow()`, or pass streaming options to `GenerateText()`. The Developer UI and CLI support `--stream` for testing.
Use `.prompt` files with Handlebars templating and separate prompt content from Go code. Code-defined prompts work well for simple, single-line cases.
Add `jsonschema:"description=..."` struct tags to output types. Models use these descriptions to understand what each field should contain.
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:
| Feature | Reference | When to load |
|---|---|---|
| Initialization | references/getting-started.md | Setting up genkit.Init, plugins, the *Genkit instance pattern |
| Generation | references/generation.md | Generate, GenerateText, GenerateData, streaming, output formats |
| Prompts | references/prompts.md | DefinePrompt, DefineDataPrompt, .prompt files, schemas |
| Tools | references/tools.md | DefineTool, tool interrupts, RestartWith/RespondWith |
| Middleware | references/middleware.md | ai.Middleware, ai.WithUse, Hooks (Generate/Model/Tool), built-ins (Retry, Fallback, ToolApproval, Filesystem, Skills) |
| Flows & HTTP | references/flows-and-http.md | DefineFlow, DefineStreamingFlow, genkit.Handler, HTTP serving |
| Model Providers | references/providers.md | Google 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
gexplicitly. The*Genkitinstance returned bygenkit.Initis 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
.promptfiles 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, andSkillscover the common cross-cutting needs and compose with each other viaai.WithUse. See references/middleware.md. When you do write custom middleware, allocate per-call state in closures captured byNew, and guard anything thatWrapToolmutates 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.
Related skills
More from firebase/agent-skills and the wider catalog.
firebase-basics
Firebase CLI setup, authentication, and project management for agent workflows
firebase-auth-basics
Set up Firebase Authentication for user sign-in, management, and secure data access.
firebase-hosting-basics
Deploy static web apps, SPAs, and microservices to Firebase Hosting with a single command.
firebase-app-hosting-basics
Deploy full-stack Next.js and Angular apps with Firebase App Hosting.
firebase-data-connect
Build and deploy PostgreSQL-backed Firebase backends with GraphQL, auto-generated queries, and type-safe SDKs.
developing-genkit-js
Develop AI-powered applications using Genkit in Node.js/TypeScript with flows, tools, and multi-provider support.