返回提交历史
Modified
g4f/Provider/hf_space/DeepseekAI_JanusPro7b.py
+3
-2
Deleted
g4f/Provider/hf_space/G4F.py
+0
-125
Modified
g4f/Provider/template/OpenaiTemplate.py
+9
-8
XFEstudio/gpt4free
Update providers
2c3fa23f
代码差异
3 个文件
+12
-135
@@ -16,7 +16,7 @@ from ...requests.raise_for_status import raise_for_status
16
16
from ...tools.media import merge_media
17
17
from ...image import to_bytes, is_accepted_format
18
18
from ...cookies import get_cookies
19
from ...errors import ResponseError
19
from ...errors import ResponseError, ModelNotFoundError
20
20
from ... import debug
21
21
from .raise_for_status import raise_for_status
22
22
@@ -38,7 +38,6 @@ class DeepseekAI_JanusPro7b(AsyncGeneratorProvider, ProviderModelMixin):
38
38
image_models = [default_image_model]
39
39
vision_models = [default_vision_model]
40
40
models = vision_models + image_models
41
model_aliases = {}
42
41
43
42
@classmethod
44
43
def run(cls, method: str, session: StreamSession, prompt: str, conversation: JsonConversation, image: dict = None, seed: int = 0):
@@ -82,6 +81,8 @@ class DeepseekAI_JanusPro7b(AsyncGeneratorProvider, ProviderModelMixin):
82
81
seed: int = None,
83
82
**kwargs
84
83
) -> AsyncResult:
84
if model and "janus" not in model:
85
raise ModelNotFoundError(f"Model '{model}' not found. Available models: {', '.join(cls.models)}")
85
86
method = "post"
86
87
if model == cls.default_image_model or prompt is not None:
87
88
method = "image"
@@ -1,125 +0,0 @@
1
from __future__ import annotations
2
3
from aiohttp import ClientSession
4
import time
5
import random
6
import asyncio
7
8
from ...typing import AsyncResult, Messages
9
from ...providers.response import ImageResponse, Reasoning, JsonConversation
10
from ..helper import format_media_prompt, get_random_string
11
from .DeepseekAI_JanusPro7b import DeepseekAI_JanusPro7b, get_zerogpu_token
12
from .BlackForestLabs_Flux1Dev import BlackForestLabs_Flux1Dev
13
from .raise_for_status import raise_for_status
14
15
class FluxDev(BlackForestLabs_Flux1Dev):
16
url = "https://roxky-flux-1-dev.hf.space"
17
space = "roxky/FLUX.1-dev"
18
referer = f"{url}/?__theme=light"
19
20
class G4F(DeepseekAI_JanusPro7b):
21
label = "G4F framework"
22
space = "roxky/Janus-Pro-7B"
23
url = f"https://huggingface.co/spaces/roxky/g4f-space"
24
api_url = "https://roxky-janus-pro-7b.hf.space"
25
url_flux = "https://roxky-g4f-flux.hf.space/run/predict"
26
referer = f"{api_url}?__theme=light"
27
28
default_model = "flux"
29
model_aliases = {"flux-schnell": default_model}
30
image_models = [DeepseekAI_JanusPro7b.default_image_model, default_model, "flux-dev", *model_aliases.keys()]
31
models = [DeepseekAI_JanusPro7b.default_model, *image_models]
32
33
@classmethod
34
async def create_async_generator(
35
cls,
36
model: str,
37
messages: Messages,
38
proxy: str = None,
39
prompt: str = None,
40
aspect_ratio: str = "1:1",
41
width: int = None,
42
height: int = None,
43
seed: int = None,
44
cookies: dict = None,
45
api_key: str = None,
46
zerogpu_uuid: str = "[object Object]",
47
**kwargs
48
) -> AsyncResult:
49
if model in ("flux", "flux-dev"):
50
async for chunk in FluxDev.create_async_generator(
51
model, messages,
52
proxy=proxy,
53
prompt=prompt,
54
aspect_ratio=aspect_ratio,
55
width=width,
56
height=height,
57
seed=seed,
58
cookies=cookies,
59
api_key=api_key,
60
zerogpu_uuid=zerogpu_uuid,
61
**kwargs
62
):
63
yield chunk
64
return
65
if cls.default_model not in model:
66
async for chunk in super().create_async_generator(
67
model, messages,
68
proxy=proxy,
69
prompt=prompt,
70
seed=seed,
71
cookies=cookies,
72
api_key=api_key,
73
zerogpu_uuid=zerogpu_uuid,
74
**kwargs
75
):
76
yield chunk
77
return
78
79
model = cls.get_model(model)
80
width = max(32, width - (width % 8))
81
height = max(32, height - (height % 8))
82
if prompt is None:
83
prompt = format_media_prompt(messages)
84
if seed is None:
85
seed = random.randint(9999, 2**32 - 1)
86
87
payload = {
88
"data": [
89
prompt,
90
seed,
91
width,
92
height,
93
True,
94
1
95
],
96
"event_data": None,
97
"fn_index": 3,
98
"session_hash": get_random_string(),
99
"trigger_id": 10
100
}
101
async with ClientSession() as session:
102
if api_key is None:
103
yield Reasoning(status="Acquiring GPU Token")
104
zerogpu_uuid, api_key = await get_zerogpu_token(cls.space, session, JsonConversation(), cookies)
105
headers = {
106
"x-zerogpu-token": api_key,
107
"x-zerogpu-uuid": zerogpu_uuid,
108
}
109
headers = {k: v for k, v in headers.items() if v is not None}
110
async def generate():
111
async with session.post(cls.url_flux, json=payload, proxy=proxy, headers=headers) as response:
112
await raise_for_status(response)
113
response_data = await response.json()
114
image_url = response_data["data"][0]['url']
115
return ImageResponse(image_url, alt=prompt)
116
background_tasks = set()
117
started = time.time()
118
task = asyncio.create_task(generate())
119
background_tasks.add(task)
120
task.add_done_callback(background_tasks.discard)
121
while background_tasks:
122
yield Reasoning(status=f"Generating {time.time() - started:.2f}s")
123
await asyncio.sleep(0.2)
124
yield await task
125
yield Reasoning(status=f"Finished {time.time() - started:.2f}s")
@@ -129,16 +129,17 @@ class OpenaiTemplate(AsyncGeneratorProvider, ProviderModelMixin, RaiseErrorMixin
129
129
model = data.get("model")
130
130
if model:
131
131
yield ProviderInfo(**cls.get_dict(), model=model)
132
choice = data["choices"][0]
133
if "content" in choice["message"] and choice["message"]["content"]:
134
yield choice["message"]["content"].strip()
135
if "tool_calls" in choice["message"]:
136
yield ToolCalls(choice["message"]["tool_calls"])
137
132
if "usage" in data:
138
133
yield Usage(**data["usage"])
139
if "finish_reason" in choice and choice["finish_reason"] is not None:
140
yield FinishReason(choice["finish_reason"])
141
return
134
if "choices" in choice:
135
choice = data["choices"][0]
136
if "content" in choice["message"] and choice["message"]["content"]:
137
yield choice["message"]["content"].strip()
138
if "tool_calls" in choice["message"]:
139
yield ToolCalls(choice["message"]["tool_calls"])
140
if "finish_reason" in choice and choice["finish_reason"] is not None:
141
yield FinishReason(choice["finish_reason"])
142
return
142
143
elif content_type.startswith("text/event-stream"):
143
144
await raise_for_status(response)
144
145
first = True