105 lines
2.5 KiB
Go
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 }
|
|
}
|