(
normalized: NormalizedGenerationRequest,
response_model: str,
base_url_override: Optional[str] = None,
)
| 741 | |
| 742 | |
| 743 | async def _iterate_gemini_stream( |
| 744 | normalized: NormalizedGenerationRequest, |
| 745 | response_model: str, |
| 746 | base_url_override: Optional[str] = None, |
| 747 | ): |
| 748 | handler = _ensure_generation_handler() |
| 749 | async for chunk in handler.handle_generation( |
| 750 | model=normalized.model, |
| 751 | prompt=normalized.prompt, |
| 752 | images=normalized.images if normalized.images else None, |
| 753 | stream=True, |
| 754 | base_url_override=base_url_override, |
| 755 | video_media_id=normalized.video_media_id, |
| 756 | ): |
| 757 | if chunk.startswith("data: "): |
| 758 | payload_text = chunk[6:].strip() |
| 759 | if payload_text == "[DONE]": |
| 760 | continue |
| 761 | payload = _parse_handler_result(payload_text) |
| 762 | if "error" in payload: |
| 763 | yield ( |
| 764 | f"data: {json.dumps(_build_gemini_error_payload(_get_error_status_code(payload), payload['error'].get('message', 'Generation failed')), ensure_ascii=False)}\n\n" |
| 765 | ) |
| 766 | return |
| 767 | |
| 768 | event = await _convert_openai_stream_chunk_to_gemini_event( |
| 769 | payload, |
| 770 | response_model, |
| 771 | ) |
| 772 | if event: |
| 773 | yield event |
| 774 | continue |
| 775 | |
| 776 | payload = _parse_handler_result(chunk) |
| 777 | if "error" in payload: |
| 778 | yield ( |
| 779 | f"data: {json.dumps(_build_gemini_error_payload(_get_error_status_code(payload), payload['error'].get('message', 'Generation failed')), ensure_ascii=False)}\n\n" |
| 780 | ) |
| 781 | return |
| 782 | |
| 783 | event = await _convert_openai_stream_chunk_to_gemini_event( |
| 784 | payload, |
| 785 | response_model, |
| 786 | ) |
| 787 | if event: |
| 788 | yield event |
| 789 | |
| 790 | |
| 791 | @router.get("/v1/models") |
no test coverage detected