XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet
公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/gpt4free

Refactor CopilotSession and DeepInfra providers to improve error handling and remove unused code; update OpenaiTemplate for image response formatting

c4506268
hlohaus <983577+hlohaus@users.noreply.github.com>
提交于

代码差异

5 个文件 +34 -100
Modified g4f/Provider/CopilotSession.py +11 -6
@@ -13,13 +13,13 @@ except ImportError:
13 13 has_nodriver = False
14 14
15 15 from .base_provider import AsyncAuthedProvider, ProviderModelMixin
16 from .openai.har_file import get_headers, get_har_files
17 16 from ..typing import AsyncResult, Messages, MediaListType
18 from ..errors import NoValidHarFileError, MissingAuthError
17 from ..errors import MissingAuthError
19 18 from ..providers.response import *
20 19 from ..requests import get_nodriver_session
21 from ..image import to_bytes, is_accepted_format
20 from ..image import is_accepted_format
22 21 from .helper import get_last_user_message
22 from .Copilot import click_trunstile
23 23 from .. import debug
24 24
25 25 class Conversation(JsonConversation):
@@ -70,7 +70,6 @@ class CopilotSession(AsyncAuthedProvider, ProviderModelMixin):
70 70 cls,
71 71 model: str,
72 72 messages: Messages,
73 auth_result: AuthResult,
74 73 proxy: str = None,
75 74 timeout: int = 30,
76 75 prompt: str = None,
@@ -97,10 +96,16 @@ class CopilotSession(AsyncAuthedProvider, ProviderModelMixin):
97 96 if textarea is not None:
98 97 await textarea.send_keys(prompt)
99 98 await asyncio.sleep(1)
100 button = await page.select("[data-testid=\"submit-button\"]")
99 try:
100 button = await page.select("[data-testid=\"submit-button\"]")
101 except TimeoutError:
102 button = None
101 103 if button:
102 104 await button.click()
103 turnstile = await page.select('#cf-turnstile')
105 try:
106 turnstile = await page.select('#cf-turnstile')
107 except TimeoutError:
108 turnstile = None
104 109 if turnstile:
105 110 debug.log("Found Element: 'cf-turnstile'")
106 111 await asyncio.sleep(3)
Modified g4f/Provider/DeepInfra.py +6 -78
@@ -1,7 +1,8 @@
1 1 from __future__ import annotations
2 2
3 3 import requests
4 from ..config import DEFAULT_MODEL
4
5 from ..typing import Messages, AsyncResult
5 6 from .template import OpenaiTemplate
6 7
7 8 class DeepInfra(OpenaiTemplate):
@@ -12,72 +13,7 @@ class DeepInfra(OpenaiTemplate):
12 13 working = True
13 14 active_by_default = True
14 15
15 default_model = DEFAULT_MODEL
16 default_vision_model = DEFAULT_MODEL
17 vision_models = [
18 default_vision_model,
19 'meta-llama/Llama-3.2-90B-Vision-Instruct',
20 ]
21
22 model_aliases = {
23 # cognitivecomputations
24 "dolphin-2.6": "cognitivecomputations/dolphin-2.6-mixtral-8x7b",
25 "dolphin-2.9": "cognitivecomputations/dolphin-2.9.1-llama-3-70b",
26
27 # deepinfra
28 "airoboros-70b": "deepinfra/airoboros-70b",
29
30 # deepseek-ai
31 "deepseek-prover-v2": "deepseek-ai/DeepSeek-Prover-V2-671B",
32 "deepseek-prover-v2-671b": "deepseek-ai/DeepSeek-Prover-V2-671B",
33 "deepseek-r1": ["deepseek-ai/DeepSeek-R1", "deepseek-ai/DeepSeek-R1-0528"],
34 "deepseek-r1-0528": "deepseek-ai/DeepSeek-R1-0528",
35 "deepseek-r1-0528-turbo": "deepseek-ai/DeepSeek-R1-0528-Turbo",
36 "deepseek-r1-distill-llama-70b": "deepseek-ai/DeepSeek-R1-Distill-Llama-70B",
37 "deepseek-r1-distill-qwen-32b": "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B",
38 "deepseek-r1-turbo": "deepseek-ai/DeepSeek-R1-Turbo",
39 "deepseek-v3": ["deepseek-ai/DeepSeek-V3", "deepseek-ai/DeepSeek-V3-0324"],
40 "deepseek-v3-0324": "deepseek-ai/DeepSeek-V3-0324",
41 "deepseek-v3-0324-turbo": "deepseek-ai/DeepSeek-V3-0324-Turbo",
42
43 # google
44 "codegemma-7b": "google/codegemma-7b-it",
45 "gemma-1.1-7b": "google/gemma-1.1-7b-it",
46 "gemma-2-27b": "google/gemma-2-27b-it",
47 "gemma-2-9b": "google/gemma-2-9b-it",
48 "gemma-3-4b": "google/gemma-3-4b-it",
49 "gemma-3-12b": "google/gemma-3-12b-it",
50 "gemma-3-27b": "google/gemma-3-27b-it",
51
52 # lizpreciatior
53 "lzlv-70b": "lizpreciatior/lzlv_70b_fp16_hf",
54
55 # meta-llama
56 "llama-3.1-8b": "meta-llama/Meta-Llama-3.1-8B-Instruct",
57 "llama-3.2-90b": "meta-llama/Llama-3.2-90B-Vision-Instruct",
58 "llama-3.3-70b": "meta-llama/Llama-3.3-70B-Instruct",
59 "llama-4-maverick": "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8",
60 "llama-4-scout": "meta-llama/Llama-4-Scout-17B-16E-Instruct",
61
62 # microsoft
63 "phi-4": "microsoft/phi-4",
64 "phi-4-multimodal": "microsoft/Phi-4-multimodal-instruct",
65 "phi-4-reasoning-plus": "microsoft/phi-4-reasoning-plus",
66 "wizardlm-2-7b": "microsoft/WizardLM-2-7B",
67 "wizardlm-2-8x22b": "microsoft/WizardLM-2-8x22B",
68
69 # mistralai
70 "mistral-small-3.1-24b": "mistralai/Mistral-Small-3.1-24B-Instruct-2503",
71
72 # Qwen
73 "qwen-3-14b": "Qwen/Qwen3-14B",
74 "qwen-3-30b": "Qwen/Qwen3-30B-A3B",
75 "qwen-3-32b": "Qwen/Qwen3-32B",
76 "qwen-3-235b": "Qwen/Qwen3-235B-A22B",
77 "qwq-32b": "Qwen/QwQ-32B",
78
79 "moonshotai/Kimi-K2-Instruct": "moonshotai/Kimi-K2-Instruct-0905",
80 }
16 default_model = "MiniMaxAI/MiniMax-M2.5"
81 17
82 18 @classmethod
83 19 def get_models(cls, **kwargs):
@@ -86,17 +22,9 @@ class DeepInfra(OpenaiTemplate):
86 22 response = requests.get(url)
87 23 models = response.json()
88 24
89 cls.models = []
90 cls.image_models = []
91
92 for model in models:
93 if model["type"] == "text-generation":
94 cls.models.append(model['model_name'])
95 elif model["reported_type"] == "text-to-image":
96 cls.image_models.append(model['model_name'])
97
98 cls.models.extend(cls.image_models)
99 if models:
25 cls.models = {model["model_name"]: {"id": model["model_name"], **model} for model in models if model.get("type") == "text-generation" or model.get("reported_type") == "text-to-image"}
26 cls.image_models = [model["model_name"] for model in models if model.get("reported_type") == "text-to-image"]
27 if cls.live == 0 and cls.models:
100 28 cls.live += 1
101 29
102 30 return cls.models
Modified g4f/Provider/template/OpenaiTemplate.py +1 -1
@@ -132,7 +132,7 @@ class OpenaiTemplate(AsyncGeneratorProvider, ProviderModelMixin, RaiseErrorMixin
132 132 if model:
133 133 yield ProviderInfo(**cls.get_dict(), model=model)
134 134 await raise_for_status(response)
135 yield ImageResponse([image["url"] for image in data["data"]], prompt)
135 yield ImageResponse([f"data:image/png;base64,{image['b64_json']}" if image.get("url") is None else image["url"] for image in data["data"]], prompt)
136 136 return
137 137
138 138 if stream or stream is None:
Modified g4f/image/copy_images.py +1 -1
@@ -151,7 +151,7 @@ async def copy_media(
151 151 async def copy_image(image: str, target: str = None) -> str:
152 152 """Process individual image and return its local URL"""
153 153 # Skip if image is already local
154 if image.startswith("/"):
154 if image is None or image.startswith("/"):
155 155 return image
156 156 target_path = target
157 157 media_extension = ""
Modified g4f/requests/__init__.py +15 -14
@@ -91,15 +91,15 @@ def get_cookie_params_from_dict(cookies: Cookies, url: str = None, domain: str =
91 91
92 92
93 93 async def get_args_from_nodriver(
94 url: str,
95 proxy: str = None,
96 timeout: int = 120,
97 wait_for: str = None,
98 callback: callable = None,
99 cookies: Cookies = None,
100 browser: Browser = None,
101 user_data_dir: str = "nodriver",
102 browser_args: list = None
94 url: str,
95 proxy: str = None,
96 timeout: int = 120,
97 wait_for: str = None,
98 callback: callable = None,
99 cookies: Cookies = None,
100 browser: Browser = None,
101 user_data_dir: str = "nodriver",
102 browser_args: list = None
103 103 ) -> dict:
104 104 if browser is None:
105 105 browser, stop_browser = await get_nodriver(proxy=proxy, timeout=timeout, user_data_dir=user_data_dir, browser_args=browser_args)
@@ -156,11 +156,11 @@ def set_browser_executable_path(browser_executable_path: str):
156 156
157 157
158 158 async def get_nodriver(
159 proxy: str = None,
160 user_data_dir="nodriver",
161 timeout: int = 300,
162 browser_executable_path: str = None,
163 **kwargs
159 proxy: str = None,
160 user_data_dir="nodriver",
161 timeout: int = 300,
162 browser_executable_path: str = None,
163 **kwargs
164 164 ) -> tuple[Browser, callable]:
165 165 if not has_nodriver:
166 166 raise MissingRequirementsError(
@@ -216,6 +216,7 @@ async def get_nodriver(
216 216 browser_executable_path=browser_executable_path,
217 217 port=BrowserConfig.port,
218 218 host=BrowserConfig.host,
219 browser_connection_timeout=1,
219 220 **kwargs
220 221 )
221 222 except FileNotFoundError as e: