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

XFEstudio/gpt4free

Update providers

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

代码差异

3 个文件 +12 -135
Modified g4f/Provider/hf_space/DeepseekAI_JanusPro7b.py +3 -2
@@ -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"
Deleted g4f/Provider/hf_space/G4F.py +0 -125
@@ -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")
Modified g4f/Provider/template/OpenaiTemplate.py +9 -8
@@ -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