renderer.go 2.43 KB
Newer Older
Devon Rifkin's avatar
Devon Rifkin committed
1
2
package renderers

3
4
5
6
7
import (
	"fmt"

	"github.com/ollama/ollama/api"
)
Devon Rifkin's avatar
Devon Rifkin committed
8

9
10
type Renderer interface {
	Render(messages []api.Message, tools []api.Tool, think *api.ThinkValue) (string, error)
Devon Rifkin's avatar
Devon Rifkin committed
11
12
}

13
14
15
16
17
18
19
type (
	RendererConstructor func() Renderer
	RendererRegistry    struct {
		renderers map[string]RendererConstructor
	}
)

20
21
22
23
24
// RenderImgTags is a global flag that tells renderers to use [img] tags
// for images. This is set by the Ollama server package on init, or left as
// false for other environments where renderers are used
var RenderImgTags bool

25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
func (r *RendererRegistry) Register(name string, renderer RendererConstructor) {
	r.renderers[name] = renderer
}

var registry = RendererRegistry{
	renderers: make(map[string]RendererConstructor),
}

func Register(name string, renderer RendererConstructor) {
	registry.Register(name, renderer)
}

func RenderWithRenderer(name string, msgs []api.Message, tools []api.Tool, think *api.ThinkValue) (string, error) {
	renderer := rendererForName(name)
	if renderer == nil {
		return "", fmt.Errorf("unknown renderer %q", name)
	}
	return renderer.Render(msgs, tools, think)
}

func rendererForName(name string) Renderer {
	if constructor, ok := registry.renderers[name]; ok {
		return constructor()
	}
Devon Rifkin's avatar
Devon Rifkin committed
49
50
	switch name {
	case "qwen3-coder":
51
52
53
		renderer := &Qwen3CoderRenderer{}
		return renderer
	case "qwen3-vl-instruct":
54
		renderer := &Qwen3VLRenderer{isThinking: false, useImgTags: RenderImgTags}
55
		return renderer
Grace's avatar
Grace committed
56
	case "qwen3-vl-thinking":
57
		renderer := &Qwen3VLRenderer{isThinking: true, useImgTags: RenderImgTags}
Grace's avatar
Grace committed
58
		return renderer
Grace's avatar
Grace committed
59
60
61
	case "cogito":
		renderer := &CogitoRenderer{isThinking: true}
		return renderer
Grace's avatar
Grace committed
62
63
64
	case "deepseek-v3.1":
		renderer := &DeepSeek3Renderer{IsThinking: true, Variant: Deepseek31}
		return renderer
65
	case "olmo3":
66
67
68
69
		renderer := &Olmo3Renderer{UseExtendedSystemMessage: false}
		return renderer
	case "olmo3.1":
		renderer := &Olmo3Renderer{UseExtendedSystemMessage: true}
70
		return renderer
71
	case "olmo3-think":
72
73
74
75
76
77
		// Used for Olmo-3-7B-Think and Olmo-3.1-32B-Think (same template)
		renderer := &Olmo3ThinkRenderer{Variant: Olmo31Think}
		return renderer
	case "olmo3-32b-think":
		// Used for Olmo-3-32B-Think
		renderer := &Olmo3ThinkRenderer{Variant: Olmo3Think32B}
78
		return renderer
79
80
81
82
83
84
	case "nemotron-3-nano":
		renderer := &Nemotron3NanoRenderer{IsThinking: false}
		return renderer
	case "nemotron-3-nano-thinking":
		renderer := &Nemotron3NanoRenderer{IsThinking: true}
		return renderer
Devon Rifkin's avatar
Devon Rifkin committed
85
86
87
88
	default:
		return nil
	}
}