(w http.ResponseWriter, r *http.Request)
| 208 | } |
| 209 | |
| 210 | func (s *Server) handleOpenAIWithLabels(w http.ResponseWriter, r *http.Request) { |
| 211 | s.logger.Debug(r.Context(), "handling OpenAI request") |
| 212 | defer s.logger.Debug(r.Context(), "handled OpenAI request") |
| 213 | |
| 214 | ctx := r.Context() |
| 215 | requestID := uuid.New() |
| 216 | now := time.Now() |
| 217 | |
| 218 | var req llmRequest |
| 219 | if err := json.NewDecoder(r.Body).Decode(&req); err != nil { |
| 220 | s.logger.Error(ctx, "failed to parse OpenAI request", slog.Error(err)) |
| 221 | http.Error(w, "invalid request body", http.StatusBadRequest) |
| 222 | return |
| 223 | } |
| 224 | |
| 225 | if s.artificialLatency > 0 { |
| 226 | time.Sleep(s.artificialLatency) |
| 227 | } |
| 228 | |
| 229 | var resp openAIResponse |
| 230 | resp.ID = fmt.Sprintf("chatcmpl-%s", requestID.String()[:8]) |
| 231 | resp.Object = "chat.completion" |
| 232 | resp.Created = now.Unix() |
| 233 | resp.Model = req.Model |
| 234 | |
| 235 | var responseContent string |
| 236 | if s.responsePayloadSize > 0 { |
| 237 | pattern := "x" |
| 238 | repeated := strings.Repeat(pattern, s.responsePayloadSize) |
| 239 | responseContent = repeated[:s.responsePayloadSize] |
| 240 | } else { |
| 241 | responseContent = "This is a mock response from OpenAI." |
| 242 | } |
| 243 | |
| 244 | resp.Choices = []struct { |
| 245 | Index int `json:"index"` |
| 246 | Message openAIMessage `json:"message"` |
| 247 | FinishReason string `json:"finish_reason"` |
| 248 | }{ |
| 249 | { |
| 250 | Index: 0, |
| 251 | Message: openAIMessage{ |
| 252 | Role: "assistant", |
| 253 | Content: responseContent, |
| 254 | }, |
| 255 | FinishReason: "stop", |
| 256 | }, |
| 257 | } |
| 258 | |
| 259 | resp.Usage.PromptTokens = 10 |
| 260 | resp.Usage.CompletionTokens = 5 |
| 261 | resp.Usage.TotalTokens = 15 |
| 262 | |
| 263 | responseBody, _ := json.Marshal(resp) |
| 264 | |
| 265 | if req.Stream { |
| 266 | s.sendOpenAIStream(ctx, w, resp) |
| 267 | } else { |
no test coverage detected