openrouter.go

 1package openrouter
 2
 3import (
 4	"github.com/charmbracelet/fantasy/ai"
 5	"github.com/charmbracelet/fantasy/openai"
 6	openaiSDK "github.com/openai/openai-go/v2"
 7	"github.com/openai/openai-go/v2/option"
 8)
 9
10type options struct {
11	openaiOptions []openai.Option
12}
13
14type Option = func(*options)
15
16func prepareCallWithOptions(model ai.LanguageModel, params *openaiSDK.ChatCompletionNewParams, call ai.Call) ([]ai.CallWarning, error) {
17	providerOptions := &ProviderOptions{}
18	if v, ok := call.ProviderOptions[Name]; ok {
19		providerOptions, ok = v.(*ProviderOptions)
20		if !ok {
21			return nil, ai.NewInvalidArgumentError("providerOptions", "openrouter provider options should be *openrouter.ProviderOptions", nil)
22		}
23	}
24	_ = providerOptions
25
26	// HANDLE OPENROUTER call modification here
27
28	return nil, nil
29}
30
31func New(opts ...Option) ai.Provider {
32	providerOptions := options{
33		openaiOptions: []openai.Option{
34			openai.WithHooks(openai.Hooks{
35				PrepareCallWithOptions: prepareCallWithOptions,
36			}),
37		},
38	}
39	for _, o := range opts {
40		o(&providerOptions)
41	}
42	return openai.New(providerOptions.openaiOptions...)
43}
44
45func WithBaseURL(baseURL string) Option {
46	return func(o *options) {
47		o.openaiOptions = append(o.openaiOptions, openai.WithBaseURL(baseURL))
48	}
49}
50
51func WithAPIKey(apiKey string) Option {
52	return func(o *options) {
53		o.openaiOptions = append(o.openaiOptions, openai.WithAPIKey(apiKey))
54	}
55}
56
57func WithName(name string) Option {
58	return func(o *options) {
59		o.openaiOptions = append(o.openaiOptions, openai.WithName(name))
60	}
61}
62
63func WithHeaders(headers map[string]string) Option {
64	return func(o *options) {
65		o.openaiOptions = append(o.openaiOptions, openai.WithHeaders(headers))
66	}
67}
68
69func WithHTTPClient(client option.HTTPClient) Option {
70	return func(o *options) {
71		o.openaiOptions = append(o.openaiOptions, openai.WithHTTPClient(client))
72	}
73}
74