dto.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. package gemini
  2. import "encoding/json"
  3. type GeminiChatRequest struct {
  4. Contents []GeminiChatContent `json:"contents"`
  5. SafetySettings []GeminiChatSafetySettings `json:"safetySettings,omitempty"`
  6. GenerationConfig GeminiChatGenerationConfig `json:"generationConfig,omitempty"`
  7. Tools []GeminiChatTool `json:"tools,omitempty"`
  8. SystemInstructions *GeminiChatContent `json:"systemInstruction,omitempty"`
  9. }
  10. type GeminiThinkingConfig struct {
  11. IncludeThoughts bool `json:"includeThoughts,omitempty"`
  12. ThinkingBudget *int `json:"thinkingBudget,omitempty"`
  13. }
  14. func (c *GeminiThinkingConfig) SetThinkingBudget(budget int) {
  15. c.ThinkingBudget = &budget
  16. }
  17. type GeminiInlineData struct {
  18. MimeType string `json:"mimeType"`
  19. Data string `json:"data"`
  20. }
  21. // UnmarshalJSON custom unmarshaler for GeminiInlineData to support snake_case and camelCase for MimeType
  22. func (g *GeminiInlineData) UnmarshalJSON(data []byte) error {
  23. type Alias GeminiInlineData // Use type alias to avoid recursion
  24. var aux struct {
  25. Alias
  26. MimeTypeSnake string `json:"mime_type"`
  27. }
  28. if err := json.Unmarshal(data, &aux); err != nil {
  29. return err
  30. }
  31. *g = GeminiInlineData(aux.Alias) // Copy other fields if any in future
  32. // Prioritize snake_case if present
  33. if aux.MimeTypeSnake != "" {
  34. g.MimeType = aux.MimeTypeSnake
  35. } else if aux.MimeType != "" { // Fallback to camelCase from Alias
  36. g.MimeType = aux.MimeType
  37. }
  38. // g.Data would be populated by aux.Alias.Data
  39. return nil
  40. }
  41. type FunctionCall struct {
  42. FunctionName string `json:"name"`
  43. Arguments any `json:"args"`
  44. }
  45. type FunctionResponse struct {
  46. Name string `json:"name"`
  47. Response map[string]interface{} `json:"response"`
  48. }
  49. type GeminiPartExecutableCode struct {
  50. Language string `json:"language,omitempty"`
  51. Code string `json:"code,omitempty"`
  52. }
  53. type GeminiPartCodeExecutionResult struct {
  54. Outcome string `json:"outcome,omitempty"`
  55. Output string `json:"output,omitempty"`
  56. }
  57. type GeminiFileData struct {
  58. MimeType string `json:"mimeType,omitempty"`
  59. FileUri string `json:"fileUri,omitempty"`
  60. }
  61. type GeminiPart struct {
  62. Text string `json:"text,omitempty"`
  63. Thought bool `json:"thought,omitempty"`
  64. InlineData *GeminiInlineData `json:"inlineData,omitempty"`
  65. FunctionCall *FunctionCall `json:"functionCall,omitempty"`
  66. FunctionResponse *FunctionResponse `json:"functionResponse,omitempty"`
  67. FileData *GeminiFileData `json:"fileData,omitempty"`
  68. ExecutableCode *GeminiPartExecutableCode `json:"executableCode,omitempty"`
  69. CodeExecutionResult *GeminiPartCodeExecutionResult `json:"codeExecutionResult,omitempty"`
  70. }
  71. // UnmarshalJSON custom unmarshaler for GeminiPart to support snake_case and camelCase for InlineData
  72. func (p *GeminiPart) UnmarshalJSON(data []byte) error {
  73. // Alias to avoid recursion during unmarshalling
  74. type Alias GeminiPart
  75. var aux struct {
  76. Alias
  77. InlineDataSnake *GeminiInlineData `json:"inline_data,omitempty"` // snake_case variant
  78. }
  79. if err := json.Unmarshal(data, &aux); err != nil {
  80. return err
  81. }
  82. // Assign fields from alias
  83. *p = GeminiPart(aux.Alias)
  84. // Prioritize snake_case for InlineData if present
  85. if aux.InlineDataSnake != nil {
  86. p.InlineData = aux.InlineDataSnake
  87. } else if aux.InlineData != nil { // Fallback to camelCase from Alias
  88. p.InlineData = aux.InlineData
  89. }
  90. // Other fields like Text, FunctionCall etc. are already populated via aux.Alias
  91. return nil
  92. }
  93. type GeminiChatContent struct {
  94. Role string `json:"role,omitempty"`
  95. Parts []GeminiPart `json:"parts"`
  96. }
  97. type GeminiChatSafetySettings struct {
  98. Category string `json:"category"`
  99. Threshold string `json:"threshold"`
  100. }
  101. type GeminiChatTool struct {
  102. GoogleSearch any `json:"googleSearch,omitempty"`
  103. GoogleSearchRetrieval any `json:"googleSearchRetrieval,omitempty"`
  104. CodeExecution any `json:"codeExecution,omitempty"`
  105. FunctionDeclarations any `json:"functionDeclarations,omitempty"`
  106. }
  107. type GeminiChatGenerationConfig struct {
  108. Temperature *float64 `json:"temperature,omitempty"`
  109. TopP float64 `json:"topP,omitempty"`
  110. TopK float64 `json:"topK,omitempty"`
  111. MaxOutputTokens uint `json:"maxOutputTokens,omitempty"`
  112. CandidateCount int `json:"candidateCount,omitempty"`
  113. StopSequences []string `json:"stopSequences,omitempty"`
  114. ResponseMimeType string `json:"responseMimeType,omitempty"`
  115. ResponseSchema any `json:"responseSchema,omitempty"`
  116. Seed int64 `json:"seed,omitempty"`
  117. ResponseModalities []string `json:"responseModalities,omitempty"`
  118. ThinkingConfig *GeminiThinkingConfig `json:"thinkingConfig,omitempty"`
  119. SpeechConfig json.RawMessage `json:"speechConfig,omitempty"` // RawMessage to allow flexible speech config
  120. }
  121. type GeminiChatCandidate struct {
  122. Content GeminiChatContent `json:"content"`
  123. FinishReason *string `json:"finishReason"`
  124. Index int64 `json:"index"`
  125. SafetyRatings []GeminiChatSafetyRating `json:"safetyRatings"`
  126. }
  127. type GeminiChatSafetyRating struct {
  128. Category string `json:"category"`
  129. Probability string `json:"probability"`
  130. }
  131. type GeminiChatPromptFeedback struct {
  132. SafetyRatings []GeminiChatSafetyRating `json:"safetyRatings"`
  133. }
  134. type GeminiChatResponse struct {
  135. Candidates []GeminiChatCandidate `json:"candidates"`
  136. PromptFeedback GeminiChatPromptFeedback `json:"promptFeedback"`
  137. UsageMetadata GeminiUsageMetadata `json:"usageMetadata"`
  138. }
  139. type GeminiUsageMetadata struct {
  140. PromptTokenCount int `json:"promptTokenCount"`
  141. CandidatesTokenCount int `json:"candidatesTokenCount"`
  142. TotalTokenCount int `json:"totalTokenCount"`
  143. ThoughtsTokenCount int `json:"thoughtsTokenCount"`
  144. PromptTokensDetails []GeminiPromptTokensDetails `json:"promptTokensDetails"`
  145. }
  146. type GeminiPromptTokensDetails struct {
  147. Modality string `json:"modality"`
  148. TokenCount int `json:"tokenCount"`
  149. }
  150. // Imagen related structs
  151. type GeminiImageRequest struct {
  152. Instances []GeminiImageInstance `json:"instances"`
  153. Parameters GeminiImageParameters `json:"parameters"`
  154. }
  155. type GeminiImageInstance struct {
  156. Prompt string `json:"prompt"`
  157. }
  158. type GeminiImageParameters struct {
  159. SampleCount int `json:"sampleCount,omitempty"`
  160. AspectRatio string `json:"aspectRatio,omitempty"`
  161. PersonGeneration string `json:"personGeneration,omitempty"`
  162. }
  163. type GeminiImageResponse struct {
  164. Predictions []GeminiImagePrediction `json:"predictions"`
  165. }
  166. type GeminiImagePrediction struct {
  167. MimeType string `json:"mimeType"`
  168. BytesBase64Encoded string `json:"bytesBase64Encoded"`
  169. RaiFilteredReason string `json:"raiFilteredReason,omitempty"`
  170. SafetyAttributes any `json:"safetyAttributes,omitempty"`
  171. }
  172. // Embedding related structs
  173. type GeminiEmbeddingRequest struct {
  174. Content GeminiChatContent `json:"content"`
  175. TaskType string `json:"taskType,omitempty"`
  176. Title string `json:"title,omitempty"`
  177. OutputDimensionality int `json:"outputDimensionality,omitempty"`
  178. }
  179. type GeminiEmbeddingResponse struct {
  180. Embedding ContentEmbedding `json:"embedding"`
  181. }
  182. type ContentEmbedding struct {
  183. Values []float64 `json:"values"`
  184. }