renderer.go 1.26 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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
type (
	RendererConstructor func() Renderer
	RendererRegistry    struct {
		renderers map[string]RendererConstructor
	}
)

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
44
45
	switch name {
	case "qwen3-coder":
46
47
48
49
50
		renderer := &Qwen3CoderRenderer{}
		return renderer
	case "qwen3-vl-instruct":
		renderer := &Qwen3VLRenderer{false}
		return renderer
Grace's avatar
Grace committed
51
52
53
	case "qwen3-vl-thinking":
		renderer := &Qwen3VLRenderer{true}
		return renderer
Devon Rifkin's avatar
Devon Rifkin committed
54
55
56
57
	default:
		return nil
	}
}