
Developing Genkit Go
Build Genkit-powered AI flows, tools, streaming, and structured output in Go when your product needs server-side agents.
Overview
developing-genkit-go is an agent skill for the Build phase that guides solo builders implementing AI flows, agents, tools, and model providers with Genkit in Go.
Install
npx skills add https://github.com/firebase/agent-skills --skill developing-genkit-goWhat is this skill?
- Genkit Go SDK: generation, structured output, streaming, and tool calling
- DefineFlow plus HTTP server handlers for deployable AI endpoints
- Google AI Gemini plugin patterns in hello-world and core references
- Reference table maps features to getting-started, prompts, tools, and providers docs
- Core feature reference table covering initialization, generation, structured output, streaming, tool calling, prompts, a
Adoption & trust: 49.3k installs on skills.sh; 345 GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You want AI generation, streaming, or tool calling in a Go service but need a structured Genkit path instead of ad-hoc OpenAI snippets.
Who is it for?
Go backends where Firebase Genkit should orchestrate LLM calls, tools, and HTTP-served flows.
Skip if: Non-Go stacks, frontend-only chat UIs, or teams not ready to run Go HTTP services.
When should I use this skill?
User asks to build AI features, agents, flows, or tools in Go using Genkit, or when editing Genkit Go code involving generation, prompts, streaming, tool calling, or model providers.
What do I get? / Deliverables
You get working Genkit Init patterns, DefineFlow handlers, and reference-driven steps for prompts, tools, and providers ready to extend into production APIs.
- Genkit flows and HTTP handlers
- AI generation and tool-calling Go code
- Server entrypoint wiring for listed flows
Recommended Skills
Journey fit
Genkit Go development is core product construction for AI backends, not launch SEO or production incident response. The skill centers on agents, flows, tool calling, and model providers—best shelved under Build → agent-tooling.
How it compares
Go-native Genkit SDK skill, not a generic prompt-engineering or browser automation workflow.
Common Questions / FAQ
Who is developing-genkit-go for?
Solo builders and small teams writing Go services who need Genkit flows, agents, and tool calling with provider plugins like Google AI.
When should I use developing-genkit-go?
During Build agent-tooling when you add AI features, flows, streaming, or tools in Go—especially after you have a repo and can run a Genkit HTTP server locally.
Is developing-genkit-go safe to install?
It implies model API calls and server code; review the Security Audits panel on this Prism page and restrict API keys and network permissions in your agent environment.
SKILL.md
READMESKILL.md - Developing Genkit Go
# 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 ```go 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](references/getting-started.md) | Setting up `genkit.Init`, plugins, the `*Genkit` instance pattern | | Generation | [references/generation.md](references/generation.md) | `Generate`, `GenerateText`, `GenerateData`, streaming, output formats | | Prompts | [references/prompts.md](references/prompts.md) | `DefinePrompt`, `DefineDataPrompt`, `.prompt` files, schemas | | Tools | [references/tools.md](references/tools.md) | `DefineTool`, tool interrupts, `RestartWith`/`RespondWith` | | Middleware | [references/middleware.md](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](references/flows-and-http.md) | `DefineFlow`, `DefineStreamingFlow`, `genkit.Handler`, HTTP serving | | Model Providers | [references/providers.md](references/providers.md) | Google AI, Vertex AI, Anthropic, OpenAI-compatible, Ollama setup | ## Genkit CLI Check if installed: `genkit --version` **Installation:** ```bash curl -sL cli.genkit.dev | bash ``` **Key commands:** ```bash # 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](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 descriptio