openaicompat.go

 1// Package openaicompat provides an implementation of the fantasy AI SDK for OpenAI-compatible APIs.
 2package openaicompat
 3
 4import (
 5	"charm.land/fantasy"
 6	"charm.land/fantasy/providers/openai"
 7	"github.com/openai/openai-go/v2/option"
 8)
 9
10type options struct {
11	openaiOptions        []openai.Option
12	languageModelOptions []openai.LanguageModelOption
13	sdkOptions           []option.RequestOption
14}
15
16const (
17	// Name is the name of the OpenAI-compatible provider.
18	Name = "openai-compat"
19)
20
21// Option defines a function that configures OpenAI-compatible provider options.
22type Option = func(*options)
23
24// New creates a new OpenAI-compatible provider with the given options.
25func New(opts ...Option) (fantasy.Provider, error) {
26	providerOptions := options{
27		openaiOptions: []openai.Option{
28			openai.WithName(Name),
29		},
30		languageModelOptions: []openai.LanguageModelOption{
31			openai.WithLanguageModelPrepareCallFunc(PrepareCallFunc),
32			openai.WithLanguageModelStreamExtraFunc(StreamExtraFunc),
33			openai.WithLanguageModelExtraContentFunc(ExtraContentFunc),
34			openai.WithLanguageModelToPromptFunc(ToPromptFunc),
35		},
36	}
37	for _, o := range opts {
38		o(&providerOptions)
39	}
40
41	providerOptions.openaiOptions = append(
42		providerOptions.openaiOptions,
43		openai.WithSDKOptions(providerOptions.sdkOptions...),
44		openai.WithLanguageModelOptions(providerOptions.languageModelOptions...),
45	)
46	return openai.New(providerOptions.openaiOptions...)
47}
48
49// WithBaseURL sets the base URL for the OpenAI-compatible provider.
50func WithBaseURL(url string) Option {
51	return func(o *options) {
52		o.openaiOptions = append(o.openaiOptions, openai.WithBaseURL(url))
53	}
54}
55
56// WithAPIKey sets the API key for the OpenAI-compatible provider.
57func WithAPIKey(apiKey string) Option {
58	return func(o *options) {
59		o.openaiOptions = append(o.openaiOptions, openai.WithAPIKey(apiKey))
60	}
61}
62
63// WithName sets the name for the OpenAI-compatible provider.
64func WithName(name string) Option {
65	return func(o *options) {
66		o.openaiOptions = append(o.openaiOptions, openai.WithName(name))
67	}
68}
69
70// WithHeaders sets the headers for the OpenAI-compatible provider.
71func WithHeaders(headers map[string]string) Option {
72	return func(o *options) {
73		o.openaiOptions = append(o.openaiOptions, openai.WithHeaders(headers))
74	}
75}
76
77// WithHTTPClient sets the HTTP client for the OpenAI-compatible provider.
78func WithHTTPClient(client option.HTTPClient) Option {
79	return func(o *options) {
80		o.openaiOptions = append(o.openaiOptions, openai.WithHTTPClient(client))
81	}
82}
83
84// WithSDKOptions sets the SDK options for the OpenAI-compatible provider.
85func WithSDKOptions(opts ...option.RequestOption) Option {
86	return func(o *options) {
87		o.sdkOptions = append(o.sdkOptions, opts...)
88	}
89}