# Prompts ## DefinePrompt Define a reusable prompt in code with a default model and template. ```go jokePrompt := genkit.DefinePrompt(g, "joke", ai.WithModel(googlegenai.ModelRef("googleai/gemini-flash-latest", nil)), ai.WithInputType(JokeRequest{Topic: "example"}), ai.WithPrompt("Tell me a joke about {{topic}}."), ) ``` ### Execute ```go resp, err := jokePrompt.Execute(ctx, ai.WithInput(map[string]any{"topic": "cats"}), ) fmt.Println(resp.Text()) ``` ### ExecuteStream ```go stream := jokePrompt.ExecuteStream(ctx, ai.WithInput(map[string]any{"topic": "cats"}), ) for result, err := range stream { if err != nil { return err } if result.Done { break } fmt.Print(result.Chunk.Text()) } ``` ### Override Options at Execution ```go resp, err := jokePrompt.Execute(ctx, ai.WithInput(map[string]any{"topic": "cats"}), ai.WithModelName("googleai/gemini-pro-latest"), // override model ai.WithConfig(map[string]any{"temperature": 0.9}), ai.WithTools(myTool), ) ``` ## DefineDataPrompt (Typed Input/Output) Strongly-typed prompts with Go generics. ```go type JokeRequest struct { Topic string `json:"topic"` } type Joke struct { Setup string `json:"setup" jsonschema:"description=The setup"` Punchline string `json:"punchline" jsonschema:"description=The punchline"` } jokePrompt := genkit.DefineDataPrompt[JokeRequest, *Joke](g, "structured-joke", ai.WithModel(googlegenai.ModelRef("googleai/gemini-flash-latest", nil)), ai.WithPrompt("Tell me a joke about {{topic}}."), ) ``` ### Execute (typed) ```go joke, resp, err := jokePrompt.Execute(ctx, JokeRequest{Topic: "cats"}) // joke is *Joke, resp is *ModelResponse ``` ### ExecuteStream (typed) ```go stream := jokePrompt.ExecuteStream(ctx, JokeRequest{Topic: "cats"}) for result, err := range stream { if err != nil { return err } if result.Done { finalJoke := result.Output // *Joke break } fmt.Print(result.Chunk) // partial *Joke } ``` ## .prompt Files (Dotprompt) Define prompts in separate files with YAML frontmatter and Handlebars templates. ### Basic .prompt File `prompts/joke.prompt`: ``` --- model: googleai/gemini-flash-latest input: schema: topic: string --- Tell me a joke about {{topic}}. ``` ### Load and Use ```go // LookupPrompt returns Prompt (untyped: map[string]any input, string output) jokePrompt := genkit.LookupPrompt(g, "joke") resp, err := jokePrompt.Execute(ctx, ai.WithInput(map[string]any{"topic": "cats"}), ) ``` ### Typed .prompt File `prompts/structured-joke.prompt`: ``` --- model: googleai/gemini-flash-latest config: thinkingConfig: thinkingBudget: 0 input: schema: JokeRequest output: format: json schema: Joke --- Tell me a joke about {{topic}}. ``` Register Go types so the .prompt file can reference them by name: ```go genkit.DefineSchemaFor[JokeRequest](g) genkit.DefineSchemaFor[Joke](g) jokePrompt := genkit.LookupDataPrompt[JokeRequest, *Joke](g, "structured-joke") joke, resp, err := jokePrompt.Execute(ctx, JokeRequest{Topic: "cats"}) ``` ### LoadPrompt (Explicit Path) ```go prompt := genkit.LoadPrompt(g, "./prompts/countries.prompt", "countries") resp, err := prompt.Execute(ctx) ``` ### .prompt File Features **Multi-message prompts with roles:** ``` --- model: googleai/gemini-flash-latest input: schema: question: string --- {{ role "system" }} You are a helpful assistant. {{ role "user" }} {{question}} ``` **Media in prompts:** ``` --- model: googleai/gemini-flash-latest input: schema: videoUrl: string contentType: string --- {{ role "user" }} Summarize this video: {{media url=videoUrl contentType=contentType}} ``` **Conditionals and loops:** ``` --- input: schema: topic: string dietaryRestrictions?(array): string --- Write a recipe about {{topic}}. {{#if dietaryRestrictions}} Dietary restrictions: {{#each dietaryRestrictions}}{{this}}{{#unless @last}}, {{/unless}}{{/each}}. {{/if}} ``` **Inline schema in .prompt file:** ``` --- model: googleai/gemini-flash-latest input: schema: topic: string style?: string output: format: json schema: title: string body: string tags(array): string --- Write an article about {{topic}}. {{#if style}}Write in a {{style}} style.{{/if}} ``` ## Schemas ### DefineSchemaFor (from Go type) Registers a Go struct as a named schema for use in `.prompt` files. ```go genkit.DefineSchemaFor[JokeRequest](g) genkit.DefineSchemaFor[Joke](g) ``` The schema name matches the Go type name. Use `jsonschema` struct tags for metadata: ```go type Recipe struct { Title string `json:"title" jsonschema:"description=The recipe title"` Difficulty string `json:"difficulty" jsonschema:"enum=easy,enum=medium,enum=hard"` Ingredients []Ingredient `json:"ingredients"` Steps []string `json:"steps"` } type Ingredient struct { Name string `json:"name"` Amount float64 `json:"amount"` Unit string `json:"unit"` } ``` ### DefineSchema (manual JSON Schema) ```go genkit.DefineSchema(g, "Recipe", map[string]any{ "type": "object", "properties": map[string]any{ "title": map[string]any{"type": "string"}, "ingredients": map[string]any{ "type": "array", "items": map[string]any{"type": "object"}, }, }, "required": []string{"title", "ingredients"}, }) ```