返回提交历史
Added
g4f/Provider/Prodia.py
+150
-0
Modified
g4f/Provider/__init__.py
+1
-0
XFEstudio/gpt4free
Added a new provider for generating images: g4f/Provider/Prodia.py
2aa514bf
代码差异
2 个文件
+151
-0
@@ -0,0 +1,150 @@
1
from __future__ import annotations
2
3
from aiohttp import ClientSession
4
import time
5
import asyncio
6
7
from ..typing import AsyncResult, Messages
8
from .base_provider import AsyncGeneratorProvider, ProviderModelMixin
9
from ..image import ImageResponse
10
11
class Prodia(AsyncGeneratorProvider, ProviderModelMixin):
12
url = "https://app.prodia.com"
13
api_endpoint = "https://api.prodia.com/generate"
14
working = True
15
16
default_model = 'absolutereality_v181.safetensors [3d9d4d2b]'
17
models = [
18
'3Guofeng3_v34.safetensors [50f420de]',
19
'absolutereality_V16.safetensors [37db0fc3]',
20
default_model,
21
'amIReal_V41.safetensors [0a8a2e61]',
22
'analog-diffusion-1.0.ckpt [9ca13f02]',
23
'aniverse_v30.safetensors [579e6f85]',
24
'anythingv3_0-pruned.ckpt [2700c435]',
25
'anything-v4.5-pruned.ckpt [65745d25]',
26
'anythingV5_PrtRE.safetensors [893e49b9]',
27
'AOM3A3_orangemixs.safetensors [9600da17]',
28
'AOM3A3_orangemixs.safetensors [9600da17]',
29
'blazing_drive_v10g.safetensors [ca1c1eab]',
30
'breakdomain_I2428.safetensors [43cc7d2f]',
31
'breakdomain_M2150.safetensors [15f7afca]',
32
'cetusMix_Version35.safetensors [de2f2560]',
33
'childrensStories_v13D.safetensors [9dfaabcb]',
34
'childrensStories_v1SemiReal.safetensors [a1c56dbb]',
35
'childrensStories_v1ToonAnime.safetensors [2ec7b88b]',
36
'Counterfeit_v30.safetensors [9e2a8f19]',
37
'cuteyukimixAdorable_midchapter3.safetensors [04bdffe6]',
38
'cyberrealistic_v33.safetensors [82b0d085]',
39
'dalcefo_v4.safetensors [425952fe]',
40
'deliberate_v2.safetensors [10ec4b29]',
41
'deliberate_v3.safetensors [afd9d2d4]',
42
'dreamlike-anime-1.0.safetensors [4520e090]',
43
'dreamlike-diffusion-1.0.safetensors [5c9fd6e0]',
44
'dreamlike-photoreal-2.0.safetensors [fdcf65e7]',
45
'dreamshaper_6BakedVae.safetensors [114c8abb]',
46
'dreamshaper_7.safetensors [5cf5ae06]',
47
'dreamshaper_8.safetensors [9d40847d]',
48
'edgeOfRealism_eorV20.safetensors [3ed5de15]',
49
'EimisAnimeDiffusion_V1.ckpt [4f828a15]',
50
'elldreths-vivid-mix.safetensors [342d9d26]',
51
'epicphotogasm_xPlusPlus.safetensors [1a8f6d35]',
52
'epicrealism_naturalSinRC1VAE.safetensors [90a4c676]',
53
'epicrealism_pureEvolutionV3.safetensors [42c8440c]',
54
'ICantBelieveItsNotPhotography_seco.safetensors [4e7a3dfd]',
55
'indigoFurryMix_v75Hybrid.safetensors [91208cbb]',
56
'juggernaut_aftermath.safetensors [5e20c455]',
57
'lofi_v4.safetensors [ccc204d6]',
58
'lyriel_v16.safetensors [68fceea2]',
59
'majicmixRealistic_v4.safetensors [29d0de58]',
60
'mechamix_v10.safetensors [ee685731]',
61
'meinamix_meinaV9.safetensors [2ec66ab0]',
62
'meinamix_meinaV11.safetensors [b56ce717]',
63
'neverendingDream_v122.safetensors [f964ceeb]',
64
'openjourney_V4.ckpt [ca2f377f]',
65
'pastelMixStylizedAnime_pruned_fp16.safetensors [793a26e8]',
66
'portraitplus_V1.0.safetensors [1400e684]',
67
'protogenx34.safetensors [5896f8d5]',
68
'Realistic_Vision_V1.4-pruned-fp16.safetensors [8d21810b]',
69
'Realistic_Vision_V2.0.safetensors [79587710]',
70
'Realistic_Vision_V4.0.safetensors [29a7afaa]',
71
'Realistic_Vision_V5.0.safetensors [614d1063]',
72
'Realistic_Vision_V5.1.safetensors [a0f13c83]',
73
'redshift_diffusion-V10.safetensors [1400e684]',
74
'revAnimated_v122.safetensors [3f4fefd9]',
75
'rundiffusionFX25D_v10.safetensors [cd12b0ee]',
76
'rundiffusionFX_v10.safetensors [cd4e694d]',
77
'sdv1_4.ckpt [7460a6fa]',
78
'v1-5-pruned-emaonly.safetensors [d7049739]',
79
'v1-5-inpainting.safetensors [21c7ab71]',
80
'shoninsBeautiful_v10.safetensors [25d8c546]',
81
'theallys-mix-ii-churned.safetensors [5d9225a4]',
82
'timeless-1.0.ckpt [7c4971d4]',
83
'toonyou_beta6.safetensors [980f6b15]',
84
]
85
86
@classmethod
87
def get_model(cls, model: str) -> str:
88
if model in cls.models:
89
return model
90
elif model in cls.model_aliases:
91
return cls.model_aliases[model]
92
else:
93
return cls.default_model
94
95
@classmethod
96
async def create_async_generator(
97
cls,
98
model: str,
99
messages: Messages,
100
proxy: str = None,
101
**kwargs
102
) -> AsyncResult:
103
model = cls.get_model(model)
104
105
headers = {
106
"accept": "*/*",
107
"accept-language": "en-US,en;q=0.9",
108
"origin": cls.url,
109
"referer": f"{cls.url}/",
110
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"
111
}
112
113
async with ClientSession(headers=headers) as session:
114
prompt = messages[-1]['content'] if messages else ""
115
116
params = {
117
"new": "true",
118
"prompt": prompt,
119
"model": model,
120
"negative_prompt": kwargs.get("negative_prompt", ""),
121
"steps": kwargs.get("steps", 20),
122
"cfg": kwargs.get("cfg", 7),
123
"seed": kwargs.get("seed", int(time.time())),
124
"sampler": kwargs.get("sampler", "DPM++ 2M Karras"),
125
"aspect_ratio": kwargs.get("aspect_ratio", "square")
126
}
127
128
async with session.get(cls.api_endpoint, params=params, proxy=proxy) as response:
129
response.raise_for_status()
130
job_data = await response.json()
131
job_id = job_data["job"]
132
133
image_url = await cls._poll_job(session, job_id, proxy)
134
yield ImageResponse(image_url, alt=prompt)
135
136
@classmethod
137
async def _poll_job(cls, session: ClientSession, job_id: str, proxy: str, max_attempts: int = 30, delay: int = 2) -> str:
138
for _ in range(max_attempts):
139
async with session.get(f"https://api.prodia.com/job/{job_id}", proxy=proxy) as response:
140
response.raise_for_status()
141
job_status = await response.json()
142
143
if job_status["status"] == "succeeded":
144
return f"https://images.prodia.xyz/{job_id}.png"
145
elif job_status["status"] == "failed":
146
raise Exception("Image generation failed")
147
148
await asyncio.sleep(delay)
149
150
raise Exception("Timeout waiting for image generation")
@@ -50,6 +50,7 @@ from .Ollama import Ollama
50
50
from .PerplexityLabs import PerplexityLabs
51
51
from .Pi import Pi
52
52
from .Pizzagpt import Pizzagpt
53
from .Prodia import Prodia
53
54
from .Reka import Reka
54
55
from .Snova import Snova
55
56
from .Replicate import Replicate