provider_options.go

  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}