1package openrouter
2
3import (
4 "encoding/json"
5
6 "charm.land/fantasy"
7 "charm.land/fantasy/openai"
8 "github.com/openai/openai-go/v2/option"
9)
10
11type options struct {
12 openaiOptions []openai.Option
13 languageModelOptions []openai.LanguageModelOption
14}
15
16const (
17 DefaultURL = "https://openrouter.ai/api/v1"
18 Name = "openrouter"
19)
20
21type Option = func(*options)
22
23func New(opts ...Option) fantasy.Provider {
24 providerOptions := options{
25 openaiOptions: []openai.Option{
26 openai.WithName(Name),
27 openai.WithBaseURL(DefaultURL),
28 },
29 languageModelOptions: []openai.LanguageModelOption{
30 openai.WithLanguageModelPrepareCallFunc(languagePrepareModelCall),
31 openai.WithLanguageModelUsageFunc(languageModelUsage),
32 openai.WithLanguageModelStreamUsageFunc(languageModelStreamUsage),
33 openai.WithLanguageModelStreamExtraFunc(languageModelStreamExtra),
34 openai.WithLanguageModelExtraContentFunc(languageModelExtraContent),
35 },
36 }
37 for _, o := range opts {
38 o(&providerOptions)
39 }
40
41 providerOptions.openaiOptions = append(providerOptions.openaiOptions, openai.WithLanguageModelOptions(providerOptions.languageModelOptions...))
42 return openai.New(providerOptions.openaiOptions...)
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 structToMapJSON(s any) (map[string]any, error) {
70 var result map[string]any
71 jsonBytes, err := json.Marshal(s)
72 if err != nil {
73 return nil, err
74 }
75 err = json.Unmarshal(jsonBytes, &result)
76 if err != nil {
77 return nil, err
78 }
79 return result, nil
80}