1
0

registry.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package chat
  2. import (
  3. "fmt"
  4. "strings"
  5. "sync"
  6. )
  7. // Renderer renders messages into a single prompt string.
  8. //
  9. //nolint:revive // exported API
  10. type Renderer interface {
  11. Render(messages []Message, opts Options) (string, error)
  12. }
  13. var (
  14. mu sync.RWMutex
  15. renderers = map[string]Renderer{}
  16. )
  17. // Register registers a renderer for a model architecture (e.g. "qwen3", "llama").
  18. func Register(architecture string, r Renderer) {
  19. mu.Lock()
  20. defer mu.Unlock()
  21. renderers[strings.ToLower(architecture)] = r
  22. }
  23. // RendererForArchitecture returns the renderer for the given architecture.
  24. func RendererForArchitecture(architecture string) (Renderer, bool) {
  25. mu.RLock()
  26. defer mu.RUnlock()
  27. r, ok := renderers[strings.ToLower(architecture)]
  28. return r, ok
  29. }
  30. // RenderForArchitecture renders chat messages for the given architecture.
  31. func RenderForArchitecture(architecture string, messages []Message, opts Options) (string, error) {
  32. if r, ok := RendererForArchitecture(architecture); ok {
  33. return r.Render(messages, opts)
  34. }
  35. return (&Qwen3Renderer{}).Render(messages, opts)
  36. }
  37. // MustRenderForArchitecture is a convenience helper.
  38. func MustRenderForArchitecture(architecture string, messages []Message, opts Options) string {
  39. out, err := RenderForArchitecture(architecture, messages, opts)
  40. if err != nil {
  41. panic(fmt.Errorf("render chat template: %w", err))
  42. }
  43. return out
  44. }