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