From 48d58ef2e8032baa5b79322173cd579207267e83 Mon Sep 17 00:00:00 2001 From: Yuzhong Zhang <141388234+BetterAndBetterII@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:41:06 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=BC=82=E6=AD=A5=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/gemini_routes.py | 4 ++-- app/services/chat/api_client.py | 6 +++--- app/services/gemini_chat_service.py | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/api/gemini_routes.py b/app/api/gemini_routes.py index a50889a..8905257 100644 --- a/app/api/gemini_routes.py +++ b/app/api/gemini_routes.py @@ -63,7 +63,7 @@ async def generate_content( logger.info(f"Using API key: {api_key}") try: - response = chat_service.generate_content( + response = await chat_service.generate_content( model=model_name, request=request, api_key=api_key @@ -122,7 +122,7 @@ async def verify_key(api_key: str): ) ] ) - response = chat_service.generate_content(settings.TEST_MODEL,gemini_requset, api_key) + response = await chat_service.generate_content(settings.TEST_MODEL,gemini_requset, api_key) if response: return JSONResponse({"status": "valid"}) return JSONResponse({"status": "invalid"}) diff --git a/app/services/chat/api_client.py b/app/services/chat/api_client.py index df7f0cb..0a834d6 100644 --- a/app/services/chat/api_client.py +++ b/app/services/chat/api_client.py @@ -24,13 +24,13 @@ class GeminiApiClient(ApiClient): self.base_url = base_url self.timeout = timeout - def generate_content(self, payload: Dict[str, Any], model: str, api_key: str) -> Dict[str, Any]: + async def generate_content(self, payload: Dict[str, Any], model: str, api_key: str) -> Dict[str, Any]: timeout = httpx.Timeout(self.timeout, read=self.timeout) if model.endswith("-search"): model = model[:-7] - with httpx.Client(timeout=timeout) as client: + async with httpx.AsyncClient(timeout=timeout) as client: url = f"{self.base_url}/models/{model}:generateContent?key={api_key}" - response = client.post(url, json=payload) + response = await client.post(url, json=payload) if response.status_code != 200: error_content = response.text raise Exception(f"API call failed with status code {response.status_code}, {error_content}") diff --git a/app/services/gemini_chat_service.py b/app/services/gemini_chat_service.py index 48d4991..d281679 100644 --- a/app/services/gemini_chat_service.py +++ b/app/services/gemini_chat_service.py @@ -79,10 +79,10 @@ class GeminiChatService: self.key_manager = key_manager self.response_handler = GeminiResponseHandler() - def generate_content(self, model: str, request: GeminiRequest, api_key: str) -> Dict[str, Any]: + async def generate_content(self, model: str, request: GeminiRequest, api_key: str) -> Dict[str, Any]: """生成内容""" payload = _build_payload(model, request) - response = self.api_client.generate_content(payload, model, api_key) + response = await self.api_client.generate_content(payload, model, api_key) return self.response_handler.handle_response(response, model, stream=False) async def stream_generate_content(self, model: str, request: GeminiRequest, api_key: str) -> AsyncGenerator[str, None]: From cdbca7ec6236854098ca9da339e35cce1dc19ace Mon Sep 17 00:00:00 2001 From: Yuzhong Zhang <141388234+BetterAndBetterII@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:55:09 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BC=98=E5=8C=96dockerfile=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0docker-compose=EF=BC=8Casync=20openai?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 4 +++- app/services/openai_chat_service.py | 6 +++--- docker-compose.yml | 9 +++++++++ 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile index 7f7b119..a1c6213 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,16 +3,18 @@ FROM python:3.10-slim WORKDIR /app # 复制所需文件到容器中 -COPY ./app /app/app COPY ./requirements.txt /app RUN pip install --no-cache-dir -r requirements.txt +COPY ./app /app/app ENV API_KEYS='["your_api_key_1"]' ENV ALLOWED_TOKENS='["your_token_1"]' ENV BASE_URL=https://generativelanguage.googleapis.com/v1beta ENV TOOLS_CODE_EXECUTION_ENABLED=true ENV MODEL_SEARCH='["gemini-2.0-flash-exp"]' +COPY ./api_keys.txt /app + # Expose port EXPOSE 8000 diff --git a/app/services/openai_chat_service.py b/app/services/openai_chat_service.py index 8294756..eefc1b5 100644 --- a/app/services/openai_chat_service.py +++ b/app/services/openai_chat_service.py @@ -137,13 +137,13 @@ class OpenAIChatService: if request.stream: return self._handle_stream_completion(request.model, payload, api_key) - return self._handle_normal_completion(request.model, payload, api_key) + return await self._handle_normal_completion(request.model, payload, api_key) - def _handle_normal_completion( + async def _handle_normal_completion( self, model: str, payload: Dict[str, Any], api_key: str ) -> Dict[str, Any]: """处理普通聊天完成""" - response = self.api_client.generate_content(payload, model, api_key) + response = await self.api_client.generate_content(payload, model, api_key) return self.response_handler.handle_response( response, model, stream=False, finish_reason="stop" ) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..965b3fa --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,9 @@ +version: '3' + +services: + gemini-balance: + build: . + ports: + - "8000:8000" + env_file: + - .env From 68ed4da789080bd5a751005393b18fb245d319ba Mon Sep 17 00:00:00 2001 From: Yuzhong Zhang <141388234+BetterAndBetterII@users.noreply.github.com> Date: Mon, 3 Mar 2025 14:09:45 +0800 Subject: [PATCH 3/3] Update Dockerfile --- Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index a1c6213..9c365e7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,8 +13,6 @@ ENV BASE_URL=https://generativelanguage.googleapis.com/v1beta ENV TOOLS_CODE_EXECUTION_ENABLED=true ENV MODEL_SEARCH='["gemini-2.0-flash-exp"]' -COPY ./api_keys.txt /app - # Expose port EXPOSE 8000