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}