返回提交历史
Modified
g4f/Provider/CopilotSession.py
+11
-6
Modified
g4f/Provider/DeepInfra.py
+6
-78
Modified
g4f/Provider/template/OpenaiTemplate.py
+1
-1
Modified
g4f/image/copy_images.py
+1
-1
Modified
g4f/requests/__init__.py
+15
-14
XFEstudio/gpt4free
Refactor CopilotSession and DeepInfra providers to improve error handling and remove unused code; update OpenaiTemplate for image response formatting
c4506268
代码差异
5 个文件
+34
-100
@@ -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)
@@ -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
@@ -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:
@@ -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 = ""
@@ -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: