go-ollama/call_options.go
2026-06-11 20:01:48 +02:00

105 lines
2.5 KiB
Go

package gollama
import (
"encoding/json"
"time"
"github.com/ollama/ollama/api"
)
// CallOption configures a single completion or chat request.
type CallOption func(*callConfig)
type callConfig struct {
model string
opts OptionSet
system string
raw bool
keepAlive *api.Duration
think *api.ThinkValue
format json.RawMessage
truncate *bool
shift *bool
stream *bool
}
func (c *Client) mergeCallConfig(callOpts ...CallOption) (*callConfig, error) {
cfg := &callConfig{opts: c.defaultOpts}
for _, opt := range callOpts {
opt(cfg)
}
model, err := c.resolveModel(cfg.model)
if err != nil {
return nil, err
}
cfg.model = model
return cfg, nil
}
func (cfg *callConfig) optionsMap() (map[string]any, error) {
return cfg.opts.toMap()
}
func boolPtr(v bool) *bool { return &v }
// WithModel sets the model for a single call.
func WithModel(name string) CallOption {
return func(c *callConfig) { c.model = name }
}
// WithOptions merges per-call generation options.
func WithOptions(opts OptionSet) CallOption {
return func(c *callConfig) { c.opts = c.opts.Merge(opts) }
}
// WithSystem sets a system prompt for the call.
func WithSystem(system string) CallOption {
return func(c *callConfig) { c.system = system }
}
// WithKeepAlive controls how long the model stays loaded after the request.
func WithKeepAlive(d time.Duration) CallOption {
return func(c *callConfig) {
c.keepAlive = &api.Duration{Duration: d}
}
}
// WithThink enables thinking/reasoning for supported models.
func WithThink(enabled bool) CallOption {
return func(c *callConfig) {
c.think = &api.ThinkValue{Value: enabled}
}
}
// WithThinkLevel sets thinking level ("high", "medium", "low", "max").
func WithThinkLevel(level string) CallOption {
return func(c *callConfig) {
c.think = &api.ThinkValue{Value: level}
}
}
// WithFormatJSON requests JSON output format.
func WithFormatJSON() CallOption {
return func(c *callConfig) { c.format = json.RawMessage(`"json"`) }
}
// WithFormatSchema requests structured output matching a JSON schema.
func WithFormatSchema(schema any) CallOption {
return func(c *callConfig) {
b, err := json.Marshal(schema)
if err == nil {
c.format = b
}
}
}
// WithTruncate truncates chat history when context is exceeded.
func WithTruncate(enabled bool) CallOption {
return func(c *callConfig) { c.truncate = &enabled }
}
// WithShift shifts chat history when context is exceeded.
func WithShift(enabled bool) CallOption {
return func(c *callConfig) { c.shift = &enabled }
}