| 421 | |
| 422 | |
| 423 | async def _normalize_openai_request( |
| 424 | request: ChatCompletionRequest, |
| 425 | ) -> NormalizedGenerationRequest: |
| 426 | if request.messages: |
| 427 | prompt, images, video_media_id = await _extract_prompt_and_images_from_openai_messages( |
| 428 | request.messages |
| 429 | ) |
| 430 | if request.image and not images: |
| 431 | images.append(await _load_image_bytes_from_uri(request.image)) |
| 432 | model = _resolve_request_model(request.model, request, images=images) |
| 433 | initial_image_count = len(images) |
| 434 | images = await _append_openai_reference_images(model, request.messages, images) |
| 435 | if len(images) != initial_image_count: |
| 436 | model = _resolve_request_model(request.model, request, images=images) |
| 437 | return NormalizedGenerationRequest( |
| 438 | model=model, |
| 439 | prompt=prompt, |
| 440 | images=images, |
| 441 | messages=request.messages, |
| 442 | video_media_id=video_media_id, |
| 443 | ) |
| 444 | |
| 445 | if request.contents: |
| 446 | gemini_request = GeminiGenerateContentRequest( |
| 447 | contents=_coerce_gemini_contents(request.contents), |
| 448 | generationConfig=request.generationConfig, |
| 449 | ) |
| 450 | normalized = await _normalize_gemini_request(request.model, gemini_request) |
| 451 | normalized.messages = request.messages |
| 452 | return normalized |
| 453 | |
| 454 | raise HTTPException(status_code=400, detail="Messages or contents cannot be empty") |
| 455 | |
| 456 | |
| 457 | async def _normalize_gemini_request( |