1// Package openai provides an implementation of the fantasy AI SDK for OpenAI's language models.
2package openai
3
4import (
5 "encoding/json"
6
7 "charm.land/fantasy"
8 "github.com/openai/openai-go/v2"
9)
10
11// ReasoningEffort represents the reasoning effort level for OpenAI models.
12type ReasoningEffort string
13
14const (
15 // ReasoningEffortMinimal represents minimal reasoning effort.
16 ReasoningEffortMinimal ReasoningEffort = "minimal"
17 // ReasoningEffortLow represents low reasoning effort.
18 ReasoningEffortLow ReasoningEffort = "low"
19 // ReasoningEffortMedium represents medium reasoning effort.
20 ReasoningEffortMedium ReasoningEffort = "medium"
21 // ReasoningEffortHigh represents high reasoning effort.
22 ReasoningEffortHigh ReasoningEffort = "high"
23)
24
25// Global type identifiers for OpenAI-specific provider data.
26const (
27 TypeProviderOptions = Name + ".options"
28 TypeProviderFileOptions = Name + ".file_options"
29 TypeProviderMetadata = Name + ".metadata"
30)
31
32// Register OpenAI provider-specific types with the global registry.
33func init() {
34 fantasy.RegisterProviderType(TypeProviderOptions, func(data []byte) (fantasy.ProviderOptionsData, error) {
35 var v ProviderOptions
36 if err := json.Unmarshal(data, &v); err != nil {
37 return nil, err
38 }
39 return &v, nil
40 })
41 fantasy.RegisterProviderType(TypeProviderFileOptions, func(data []byte) (fantasy.ProviderOptionsData, error) {
42 var v ProviderFileOptions
43 if err := json.Unmarshal(data, &v); err != nil {
44 return nil, err
45 }
46 return &v, nil
47 })
48 fantasy.RegisterProviderType(TypeProviderMetadata, func(data []byte) (fantasy.ProviderOptionsData, error) {
49 var v ProviderMetadata
50 if err := json.Unmarshal(data, &v); err != nil {
51 return nil, err
52 }
53 return &v, nil
54 })
55}
56
57// ProviderMetadata represents additional metadata from OpenAI provider.
58type ProviderMetadata struct {
59 Logprobs []openai.ChatCompletionTokenLogprob `json:"logprobs"`
60 AcceptedPredictionTokens int64 `json:"accepted_prediction_tokens"`
61 RejectedPredictionTokens int64 `json:"rejected_prediction_tokens"`
62}
63
64// Options implements the ProviderOptions interface.
65func (*ProviderMetadata) Options() {}
66
67// MarshalJSON implements custom JSON marshaling with type info for ProviderMetadata.
68func (m ProviderMetadata) MarshalJSON() ([]byte, error) {
69 type plain ProviderMetadata
70 return fantasy.MarshalProviderType(TypeProviderMetadata, plain(m))
71}
72
73// UnmarshalJSON implements custom JSON unmarshaling with type info for ProviderMetadata.
74func (m *ProviderMetadata) UnmarshalJSON(data []byte) error {
75 type plain ProviderMetadata
76 var p plain
77 if err := fantasy.UnmarshalProviderType(data, &p); err != nil {
78 return err
79 }
80 *m = ProviderMetadata(p)
81 return nil
82}
83
84// ProviderOptions represents additional options for OpenAI provider.
85type ProviderOptions struct {
86 LogitBias map[string]int64 `json:"logit_bias"`
87 LogProbs *bool `json:"log_probs"`
88 TopLogProbs *int64 `json:"top_log_probs"`
89 ParallelToolCalls *bool `json:"parallel_tool_calls"`
90 User *string `json:"user"`
91 ReasoningEffort *ReasoningEffort `json:"reasoning_effort"`
92 MaxCompletionTokens *int64 `json:"max_completion_tokens"`
93 TextVerbosity *string `json:"text_verbosity"`
94 Prediction map[string]any `json:"prediction"`
95 Store *bool `json:"store"`
96 Metadata map[string]any `json:"metadata"`
97 PromptCacheKey *string `json:"prompt_cache_key"`
98 SafetyIdentifier *string `json:"safety_identifier"`
99 ServiceTier *string `json:"service_tier"`
100 StructuredOutputs *bool `json:"structured_outputs"`
101}
102
103// Options implements the ProviderOptions interface.
104func (*ProviderOptions) Options() {}
105
106// MarshalJSON implements custom JSON marshaling with type info for ProviderOptions.
107func (o ProviderOptions) MarshalJSON() ([]byte, error) {
108 type plain ProviderOptions
109 return fantasy.MarshalProviderType(TypeProviderOptions, plain(o))
110}
111
112// UnmarshalJSON implements custom JSON unmarshaling with type info for ProviderOptions.
113func (o *ProviderOptions) UnmarshalJSON(data []byte) error {
114 type plain ProviderOptions
115 var p plain
116 if err := fantasy.UnmarshalProviderType(data, &p); err != nil {
117 return err
118 }
119 *o = ProviderOptions(p)
120 return nil
121}
122
123// ProviderFileOptions represents file options for OpenAI provider.
124type ProviderFileOptions struct {
125 ImageDetail string `json:"image_detail"`
126}
127
128// Options implements the ProviderOptions interface.
129func (*ProviderFileOptions) Options() {}
130
131// MarshalJSON implements custom JSON marshaling with type info for ProviderFileOptions.
132func (o ProviderFileOptions) MarshalJSON() ([]byte, error) {
133 type plain ProviderFileOptions
134 return fantasy.MarshalProviderType(TypeProviderFileOptions, plain(o))
135}
136
137// UnmarshalJSON implements custom JSON unmarshaling with type info for ProviderFileOptions.
138func (o *ProviderFileOptions) UnmarshalJSON(data []byte) error {
139 type plain ProviderFileOptions
140 var p plain
141 if err := fantasy.UnmarshalProviderType(data, &p); err != nil {
142 return err
143 }
144 *o = ProviderFileOptions(p)
145 return nil
146}
147
148// ReasoningEffortOption creates a pointer to a ReasoningEffort value.
149func ReasoningEffortOption(e ReasoningEffort) *ReasoningEffort {
150 return &e
151}
152
153// NewProviderOptions creates new provider options for OpenAI.
154func NewProviderOptions(opts *ProviderOptions) fantasy.ProviderOptions {
155 return fantasy.ProviderOptions{
156 Name: opts,
157 }
158}
159
160// NewProviderFileOptions creates new file options for OpenAI.
161func NewProviderFileOptions(opts *ProviderFileOptions) fantasy.ProviderOptions {
162 return fantasy.ProviderOptions{
163 Name: opts,
164 }
165}
166
167// ParseOptions parses provider options from a map.
168func ParseOptions(data map[string]any) (*ProviderOptions, error) {
169 var options ProviderOptions
170 if err := fantasy.ParseOptions(data, &options); err != nil {
171 return nil, err
172 }
173 return &options, nil
174}