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}