(
request: ChatCompletionRequest,
raw_request: Request,
api_key: str = Depends(verify_api_key),
tmp_dir: Path = Depends(get_temp_dir),
image_store: Path = Depends(get_image_store_dir),
)
| 1755 | |
| 1756 | @router.post("/v1/chat/completions") |
| 1757 | async def create_chat_completion( |
| 1758 | request: ChatCompletionRequest, |
| 1759 | raw_request: Request, |
| 1760 | api_key: str = Depends(verify_api_key), |
| 1761 | tmp_dir: Path = Depends(get_temp_dir), |
| 1762 | image_store: Path = Depends(get_image_store_dir), |
| 1763 | ): |
| 1764 | base_url = str(raw_request.base_url) |
| 1765 | pool, db = GeminiClientPool(), LMDBConversationStore() |
| 1766 | try: |
| 1767 | model = _get_model_by_name(request.model) |
| 1768 | except ValueError as exc: |
| 1769 | raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(exc)) from exc |
| 1770 | if not request.messages: |
| 1771 | raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Messages required.") |
| 1772 | |
| 1773 | structured_requirement = _build_structured_requirement(request.response_format) |
| 1774 | extra_instr = [structured_requirement.instruction] if structured_requirement else None |
| 1775 | |
| 1776 | # This ensures that server-injected system instructions are part of the history |
| 1777 | msgs = _prepare_messages_for_model( |
| 1778 | request.messages, |
| 1779 | request.tools, |
| 1780 | request.tool_choice, |
| 1781 | extra_instr, |
| 1782 | ) |
| 1783 | |
| 1784 | session, client, remain = await _find_reusable_session(db, pool, model, msgs) |
| 1785 | reused_session = session is not None |
| 1786 | use_google_temporary_mode = g_config.gemini.chat_mode == ChatMode.TEMPORARY |
| 1787 | |
| 1788 | if session: |
| 1789 | if not remain: |
| 1790 | raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="No new messages.") |
| 1791 | |
| 1792 | # For reused sessions, we only need to process the remaining messages. |
| 1793 | # We don't re-inject system defaults to avoid duplicating instructions already in history. |
| 1794 | input_msgs = _prepare_messages_for_model( |
| 1795 | remain, |
| 1796 | request.tools, |
| 1797 | request.tool_choice, |
| 1798 | extra_instr, |
| 1799 | False, |
| 1800 | ) |
| 1801 | m_input, files = await _process_conversation_with_compaction( |
| 1802 | input_msgs, |
| 1803 | tmp_dir, |
| 1804 | allow_summary_compaction=use_google_temporary_mode and (g_config.gemini.oversized_context_strategy == OversizedContextStrategy.COMPACTION), |
| 1805 | reason="temporary session replay", |
| 1806 | ) |
| 1807 | |
| 1808 | logger.debug( |
| 1809 | f"Reused session {reprlib.repr(session.metadata)} - sending {len(input_msgs)} prepared messages." |
| 1810 | ) |
| 1811 | else: |
| 1812 | try: |
| 1813 | client = await pool.acquire() |
| 1814 | session = client.start_chat(model=model) |
nothing calls this directly
no test coverage detected