model_json.go

  1package fantasy
  2
  3import (
  4	"encoding/json"
  5	"fmt"
  6)
  7
  8func (c *Call) UnmarshalJSON(data []byte) error {
  9	var aux struct {
 10		Prompt           Prompt                     `json:"prompt"`
 11		MaxOutputTokens  *int64                     `json:"max_output_tokens"`
 12		Temperature      *float64                   `json:"temperature"`
 13		TopP             *float64                   `json:"top_p"`
 14		TopK             *int64                     `json:"top_k"`
 15		PresencePenalty  *float64                   `json:"presence_penalty"`
 16		FrequencyPenalty *float64                   `json:"frequency_penalty"`
 17		Tools            []json.RawMessage          `json:"tools"`
 18		ToolChoice       *ToolChoice                `json:"tool_choice"`
 19		ProviderOptions  map[string]json.RawMessage `json:"provider_options"`
 20	}
 21
 22	if err := json.Unmarshal(data, &aux); err != nil {
 23		return err
 24	}
 25
 26	c.Prompt = aux.Prompt
 27	c.MaxOutputTokens = aux.MaxOutputTokens
 28	c.Temperature = aux.Temperature
 29	c.TopP = aux.TopP
 30	c.TopK = aux.TopK
 31	c.PresencePenalty = aux.PresencePenalty
 32	c.FrequencyPenalty = aux.FrequencyPenalty
 33	c.ToolChoice = aux.ToolChoice
 34
 35	// Unmarshal Tools slice
 36	c.Tools = make([]Tool, len(aux.Tools))
 37	for i, rawTool := range aux.Tools {
 38		tool, err := UnmarshalTool(rawTool)
 39		if err != nil {
 40			return fmt.Errorf("failed to unmarshal tool at index %d: %w", i, err)
 41		}
 42		c.Tools[i] = tool
 43	}
 44
 45	// Unmarshal ProviderOptions
 46	if len(aux.ProviderOptions) > 0 {
 47		options, err := UnmarshalProviderOptions(aux.ProviderOptions)
 48		if err != nil {
 49			return err
 50		}
 51		c.ProviderOptions = options
 52	}
 53
 54	return nil
 55}
 56
 57func (r *Response) UnmarshalJSON(data []byte) error {
 58	var aux struct {
 59		Content          json.RawMessage            `json:"content"`
 60		FinishReason     FinishReason               `json:"finish_reason"`
 61		Usage            Usage                      `json:"usage"`
 62		Warnings         []CallWarning              `json:"warnings"`
 63		ProviderMetadata map[string]json.RawMessage `json:"provider_metadata"`
 64	}
 65
 66	if err := json.Unmarshal(data, &aux); err != nil {
 67		return err
 68	}
 69
 70	r.FinishReason = aux.FinishReason
 71	r.Usage = aux.Usage
 72	r.Warnings = aux.Warnings
 73
 74	// Unmarshal ResponseContent (need to know the type definition)
 75	// If ResponseContent is []Content:
 76	var rawContent []json.RawMessage
 77	if err := json.Unmarshal(aux.Content, &rawContent); err != nil {
 78		return err
 79	}
 80
 81	content := make([]Content, len(rawContent))
 82	for i, rawItem := range rawContent {
 83		item, err := UnmarshalContent(rawItem)
 84		if err != nil {
 85			return fmt.Errorf("failed to unmarshal content at index %d: %w", i, err)
 86		}
 87		content[i] = item
 88	}
 89	r.Content = content
 90
 91	// Unmarshal ProviderMetadata
 92	if len(aux.ProviderMetadata) > 0 {
 93		metadata, err := UnmarshalProviderMetadata(aux.ProviderMetadata)
 94		if err != nil {
 95			return err
 96		}
 97		r.ProviderMetadata = metadata
 98	}
 99
100	return nil
101}
102
103func (s *StreamPart) UnmarshalJSON(data []byte) error {
104	var aux struct {
105		Type             StreamPartType             `json:"type"`
106		ID               string                     `json:"id"`
107		ToolCallName     string                     `json:"tool_call_name"`
108		ToolCallInput    string                     `json:"tool_call_input"`
109		Delta            string                     `json:"delta"`
110		ProviderExecuted bool                       `json:"provider_executed"`
111		Usage            Usage                      `json:"usage"`
112		FinishReason     FinishReason               `json:"finish_reason"`
113		Error            error                      `json:"error"`
114		Warnings         []CallWarning              `json:"warnings"`
115		SourceType       SourceType                 `json:"source_type"`
116		URL              string                     `json:"url"`
117		Title            string                     `json:"title"`
118		ProviderMetadata map[string]json.RawMessage `json:"provider_metadata"`
119	}
120
121	if err := json.Unmarshal(data, &aux); err != nil {
122		return err
123	}
124
125	s.Type = aux.Type
126	s.ID = aux.ID
127	s.ToolCallName = aux.ToolCallName
128	s.ToolCallInput = aux.ToolCallInput
129	s.Delta = aux.Delta
130	s.ProviderExecuted = aux.ProviderExecuted
131	s.Usage = aux.Usage
132	s.FinishReason = aux.FinishReason
133	s.Error = aux.Error
134	s.Warnings = aux.Warnings
135	s.SourceType = aux.SourceType
136	s.URL = aux.URL
137	s.Title = aux.Title
138
139	// Unmarshal ProviderMetadata
140	if len(aux.ProviderMetadata) > 0 {
141		metadata, err := UnmarshalProviderMetadata(aux.ProviderMetadata)
142		if err != nil {
143			return err
144		}
145		s.ProviderMetadata = metadata
146	}
147
148	return nil
149}