diff --git a/app/services/SDE/short_drama_explanation.py b/app/services/SDE/short_drama_explanation.py index 1d17ae1..3044983 100644 --- a/app/services/SDE/short_drama_explanation.py +++ b/app/services/SDE/short_drama_explanation.py @@ -152,13 +152,13 @@ class SubtitleAnalyzer: } # 构建请求URL - url = f"{self.base_url}/models/{self.model}:generateContent?key={self.api_key}" + url = f"{self.base_url}/models/{self.model}:generateContent" # 发送请求 response = requests.post( url, json=payload, - headers={"Content-Type": "application/json", "User-Agent": "NarratoAI/1.0"}, + headers={"Content-Type": "application/json", "x-goog-api-key": self.api_key}, timeout=120 ) @@ -440,13 +440,13 @@ class SubtitleAnalyzer: } # 构建请求URL - url = f"{self.base_url}/models/{self.model}:generateContent?key={self.api_key}" + url = f"{self.base_url}/models/{self.model}:generateContent" # 发送请求 response = requests.post( url, json=payload, - headers={"Content-Type": "application/json", "User-Agent": "NarratoAI/1.0"}, + headers={"Content-Type": "application/json", "x-goog-api-key": self.api_key}, timeout=120 ) diff --git a/app/services/llm/providers/gemini_provider.py b/app/services/llm/providers/gemini_provider.py index 949df21..e9225c3 100644 --- a/app/services/llm/providers/gemini_provider.py +++ b/app/services/llm/providers/gemini_provider.py @@ -140,7 +140,7 @@ class GeminiVisionProvider(VisionModelProvider): """执行原生Gemini API调用,包含重试机制""" from app.config import config - url = f"{self.base_url}/models/{self.model_name}:generateContent?key={self.api_key}" + url = f"{self.base_url}/models/{self.model_name}:generateContent" max_retries = config.app.get('llm_max_retries', 3) base_timeout = config.app.get('llm_vision_timeout', 120) @@ -157,7 +157,7 @@ class GeminiVisionProvider(VisionModelProvider): json=payload, headers={ "Content-Type": "application/json", - "User-Agent": "NarratoAI/1.0" + "x-goog-api-key": self.api_key }, timeout=timeout ) @@ -330,7 +330,7 @@ class GeminiTextProvider(TextModelProvider): """执行原生Gemini API调用,包含重试机制""" from app.config import config - url = f"{self.base_url}/models/{self.model_name}:generateContent?key={self.api_key}" + url = f"{self.base_url}/models/{self.model_name}:generateContent" max_retries = config.app.get('llm_max_retries', 3) base_timeout = config.app.get('llm_text_timeout', 180) # 文本生成任务使用更长的基础超时时间 @@ -347,7 +347,7 @@ class GeminiTextProvider(TextModelProvider): json=payload, headers={ "Content-Type": "application/json", - "User-Agent": "NarratoAI/1.0" + "x-goog-api-key": self.api_key }, timeout=timeout ) diff --git a/app/utils/gemini_analyzer.py b/app/utils/gemini_analyzer.py index c3685ab..2de4086 100644 --- a/app/utils/gemini_analyzer.py +++ b/app/utils/gemini_analyzer.py @@ -107,7 +107,7 @@ class VisionAnalyzer: } # 构建请求URL - url = f"{self.base_url}/models/{self.model_name}:generateContent?key={self.api_key}" + url = f"{self.base_url}/models/{self.model_name}:generateContent" # 发送请求 response = await asyncio.to_thread( @@ -116,7 +116,7 @@ class VisionAnalyzer: json=request_data, headers={ "Content-Type": "application/json", - "User-Agent": "NarratoAI/1.0" + "x-goog-api-key": self.api_key }, timeout=120 # 增加超时时间 ) diff --git a/app/utils/script_generator.py b/app/utils/script_generator.py index e6d7cea..18cc618 100644 --- a/app/utils/script_generator.py +++ b/app/utils/script_generator.py @@ -230,7 +230,7 @@ class GeminiOpenAIGenerator(BaseGenerator): } # 构建请求URL - url = f"{self.base_url}/models/{self.model_name}:generateContent?key={self.api_key}" + url = f"{self.base_url}/models/{self.model_name}:generateContent" # 发送请求 response = requests.post( @@ -238,7 +238,7 @@ class GeminiOpenAIGenerator(BaseGenerator): json=request_data, headers={ "Content-Type": "application/json", - "User-Agent": "NarratoAI/1.0" + "x-goog-api-key": self.api_key }, timeout=120 ) diff --git a/webui/components/basic_settings.py b/webui/components/basic_settings.py index a887246..a4aca65 100644 --- a/webui/components/basic_settings.py +++ b/webui/components/basic_settings.py @@ -138,6 +138,7 @@ def test_vision_model_connection(api_key, base_url, model_name, provider, tr): str: 测试结果消息 """ import requests + logger.debug(f"大模型连通性测试: {base_url} 模型: {model_name} apikey: {api_key}") if provider.lower() == 'gemini': # 原生Gemini API测试 try: @@ -145,43 +146,21 @@ def test_vision_model_connection(api_key, base_url, model_name, provider, tr): request_data = { "contents": [{ "parts": [{"text": "直接回复我文本'当前网络可用'"}] - }], - "generationConfig": { - "temperature": 1.0, - "topK": 40, - "topP": 0.95, - "maxOutputTokens": 100, - }, - "safetySettings": [ - { - "category": "HARM_CATEGORY_HARASSMENT", - "threshold": "BLOCK_NONE" - }, - { - "category": "HARM_CATEGORY_HATE_SPEECH", - "threshold": "BLOCK_NONE" - }, - { - "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", - "threshold": "BLOCK_NONE" - }, - { - "category": "HARM_CATEGORY_DANGEROUS_CONTENT", - "threshold": "BLOCK_NONE" - } - ] + }] } # 构建请求URL - api_base_url = base_url or "https://generativelanguage.googleapis.com/v1beta" - url = f"{api_base_url}/models/{model_name}:generateContent?key={api_key}" - + api_base_url = base_url + url = f"{api_base_url}/models/{model_name}:generateContent" # 发送请求 response = requests.post( url, json=request_data, - headers={"Content-Type": "application/json"}, - timeout=30 + headers={ + "x-goog-api-key": api_key, + "Content-Type": "application/json" + }, + timeout=10 ) if response.status_code == 200: @@ -190,7 +169,6 @@ def test_vision_model_connection(api_key, base_url, model_name, provider, tr): return False, f"{tr('原生Gemini模型连接失败')}: HTTP {response.status_code}" except Exception as e: return False, f"{tr('原生Gemini模型连接失败')}: {str(e)}" - elif provider.lower() == 'gemini(openai)': # OpenAI兼容的Gemini代理测试 try: @@ -215,23 +193,6 @@ def test_vision_model_connection(api_key, base_url, model_name, provider, tr): return False, f"{tr('OpenAI兼容Gemini代理连接失败')}: HTTP {response.status_code}" except Exception as e: return False, f"{tr('OpenAI兼容Gemini代理连接失败')}: {str(e)}" - elif provider.lower() == 'narratoapi': - try: - # 构建测试请求 - headers = { - "Authorization": f"Bearer {api_key}" - } - - test_url = f"{base_url.rstrip('/')}/health" - response = requests.get(test_url, headers=headers, timeout=10) - - if response.status_code == 200: - return True, tr("NarratoAPI is available") - else: - return False, f"{tr('NarratoAPI is not available')}: HTTP {response.status_code}" - except Exception as e: - return False, f"{tr('NarratoAPI is not available')}: {str(e)}" - else: from openai import OpenAI try: @@ -441,7 +402,8 @@ def test_text_model_connection(api_key, base_url, model_name, provider, tr): str: 测试结果消息 """ import requests - + logger.debug(f"大模型连通性测试: {base_url} 模型: {model_name} apikey: {api_key}") + try: # 构建统一的测试请求(遵循OpenAI格式) headers = { @@ -457,43 +419,22 @@ def test_text_model_connection(api_key, base_url, model_name, provider, tr): request_data = { "contents": [{ "parts": [{"text": "直接回复我文本'当前网络可用'"}] - }], - "generationConfig": { - "temperature": 1.0, - "topK": 40, - "topP": 0.95, - "maxOutputTokens": 100, - }, - "safetySettings": [ - { - "category": "HARM_CATEGORY_HARASSMENT", - "threshold": "BLOCK_NONE" - }, - { - "category": "HARM_CATEGORY_HATE_SPEECH", - "threshold": "BLOCK_NONE" - }, - { - "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", - "threshold": "BLOCK_NONE" - }, - { - "category": "HARM_CATEGORY_DANGEROUS_CONTENT", - "threshold": "BLOCK_NONE" - } - ] + }] } # 构建请求URL - api_base_url = base_url or "https://generativelanguage.googleapis.com/v1beta" - url = f"{api_base_url}/models/{model_name}:generateContent?key={api_key}" + api_base_url = base_url + url = f"{api_base_url}/models/{model_name}:generateContent" # 发送请求 response = requests.post( url, json=request_data, - headers={"Content-Type": "application/json"}, - timeout=30 + headers={ + "x-goog-api-key": api_key, + "Content-Type": "application/json" + }, + timeout=10 ) if response.status_code == 200: