// Package prompt enriches a raw user prompt before it reaches a backend. The // only enrichment today is style-preset suffixes; future passes can add // negative-prompt resolution, safety filters, etc. package prompt import ( _ "embed" "fmt" "sort" "strings" "gopkg.in/yaml.v3" ) //go:embed styles.yaml var stylesYAML []byte type stylesFile struct { Styles map[string]string `yaml:"styles"` } var defaultStyles map[string]string func init() { var f stylesFile if err := yaml.Unmarshal(stylesYAML, &f); err != nil { panic(fmt.Sprintf("prompt: parse embedded styles.yaml: %v", err)) } defaultStyles = f.Styles } // Styles returns the names of registered style presets, sorted. func Styles() []string { out := make([]string, 0, len(defaultStyles)) for k := range defaultStyles { out = append(out, k) } sort.Strings(out) return out } // HasStyle reports whether name is a known preset. func HasStyle(name string) bool { _, ok := defaultStyles[name] return ok } // Apply returns the prompt with the named style preset appended. Unknown // styles return an error rather than silently passing the prompt through — // surprising the caller with missing style is worse than a hard error. func Apply(prompt, style string) (string, error) { if style == "" { return prompt, nil } suffix, ok := defaultStyles[style] if !ok { return "", fmt.Errorf("unknown style %q, available: %v", style, Styles()) } if strings.TrimSpace(prompt) == "" { return suffix, nil } return prompt + ", " + suffix, nil }