gemini.go 7.5 KB

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