openrouter.go

 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}