openaicompat.go

 1package openaicompat
 2
 3import (
 4	"github.com/charmbracelet/fantasy/ai"
 5	"github.com/charmbracelet/fantasy/openai"
 6	"github.com/openai/openai-go/v2/option"
 7)
 8
 9type options struct {
10	openaiOptions        []openai.Option
11	languageModelOptions []openai.LanguageModelOption
12}
13
14const (
15	Name = "openai-compat"
16)
17
18type Option = func(*options)
19
20func New(opts ...Option) ai.Provider {
21	providerOptions := options{
22		openaiOptions: []openai.Option{
23			openai.WithName(Name),
24		},
25		languageModelOptions: []openai.LanguageModelOption{
26			openai.WithLanguageModelPrepareCallFunc(languagePrepareModelCall),
27			openai.WithLanguageModelStreamExtraFunc(languageModelStreamExtra),
28			openai.WithLanguageModelExtraContentFunc(languageModelExtraContent),
29		},
30	}
31	for _, o := range opts {
32		o(&providerOptions)
33	}
34
35	providerOptions.openaiOptions = append(providerOptions.openaiOptions, openai.WithLanguageModelOptions(providerOptions.languageModelOptions...))
36	return openai.New(providerOptions.openaiOptions...)
37}
38
39func WithBaseURL(url string) Option {
40	return func(o *options) {
41		o.openaiOptions = append(o.openaiOptions, openai.WithBaseURL(url))
42	}
43}
44
45func WithAPIKey(apiKey string) Option {
46	return func(o *options) {
47		o.openaiOptions = append(o.openaiOptions, openai.WithAPIKey(apiKey))
48	}
49}
50
51func WithName(name string) Option {
52	return func(o *options) {
53		o.openaiOptions = append(o.openaiOptions, openai.WithName(name))
54	}
55}
56
57func WithHeaders(headers map[string]string) Option {
58	return func(o *options) {
59		o.openaiOptions = append(o.openaiOptions, openai.WithHeaders(headers))
60	}
61}
62
63func WithHTTPClient(client option.HTTPClient) Option {
64	return func(o *options) {
65		o.openaiOptions = append(o.openaiOptions, openai.WithHTTPClient(client))
66	}
67}
68
69func WithLanguageUniqueToolCallIds() Option {
70	return func(l *options) {
71		l.languageModelOptions = append(l.languageModelOptions, openai.WithLanguageUniqueToolCallIds())
72	}
73}
74
75func WithLanguageModelGenerateIDFunc(fn openai.LanguageModelGenerateIDFunc) Option {
76	return func(l *options) {
77		l.languageModelOptions = append(l.languageModelOptions, openai.WithLanguageModelGenerateIDFunc(fn))
78	}
79}