(c *gin.Context)
| 160 | } |
| 161 | |
| 162 | func TextHelper(c *gin.Context) (newAPIError *types.NewAPIError) { |
| 163 | |
| 164 | relayInfo := relaycommon.GenRelayInfo(c) |
| 165 | |
| 166 | // get & validate textRequest 获取并验证文本请求 |
| 167 | textRequest, err := getAndValidateTextRequest(c, relayInfo) |
| 168 | |
| 169 | if err != nil { |
| 170 | return types.NewError(err, types.ErrorCodeInvalidRequest) |
| 171 | } |
| 172 | |
| 173 | // 将 textRequest 存储到 context 中供后续使用 |
| 174 | c.Set("text_request", textRequest) |
| 175 | |
| 176 | if textRequest.WebSearchOptions != nil { |
| 177 | c.Set("chat_completion_web_search_context_size", textRequest.WebSearchOptions.SearchContextSize) |
| 178 | } |
| 179 | |
| 180 | if setting.ShouldCheckPromptSensitive() { |
| 181 | words, err := checkRequestSensitive(textRequest, relayInfo) |
| 182 | if err != nil { |
| 183 | common.LogWarn(c, fmt.Sprintf("user sensitive words detected: %s", strings.Join(words, ", "))) |
| 184 | return types.NewError(err, types.ErrorCodeSensitiveWordsDetected) |
| 185 | } |
| 186 | } |
| 187 | |
| 188 | err = helper.ModelMappedHelper(c, relayInfo, textRequest) |
| 189 | if err != nil { |
| 190 | return types.NewError(err, types.ErrorCodeChannelModelMappedError) |
| 191 | } |
| 192 | |
| 193 | // 获取 promptTokens,如果上下文中已经存在,则直接使用 |
| 194 | var promptTokens int |
| 195 | if value, exists := c.Get("prompt_tokens"); exists { |
| 196 | promptTokens = value.(int) |
| 197 | relayInfo.PromptTokens = promptTokens |
| 198 | } else { |
| 199 | promptTokens, err = getPromptTokens(textRequest, relayInfo) |
| 200 | // count messages token error 计算promptTokens错误 |
| 201 | if err != nil { |
| 202 | return types.NewError(err, types.ErrorCodeCountTokenFailed) |
| 203 | } |
| 204 | c.Set("prompt_tokens", promptTokens) |
| 205 | } |
| 206 | |
| 207 | priceData, err := helper.ModelPriceHelper(c, relayInfo, promptTokens, int(math.Max(float64(textRequest.MaxTokens), float64(textRequest.MaxCompletionTokens)))) |
| 208 | if err != nil { |
| 209 | return types.NewError(err, types.ErrorCodeModelPriceError) |
| 210 | } |
| 211 | |
| 212 | // pre-consume quota 预消耗配额 |
| 213 | preConsumedQuota, userQuota, newApiErr := preConsumeQuota(c, priceData.ShouldPreConsumedQuota, relayInfo) |
| 214 | if newApiErr != nil { |
| 215 | return newApiErr |
| 216 | } |
| 217 | defer func() { |
| 218 | if newApiErr != nil { |
| 219 | returnPreConsumedQuota(c, relayInfo, userQuota, preConsumedQuota) |
no test coverage detected