mirror of
https://github.com/xtekky/gpt4free.git
synced 2024-12-25 20:22:47 +03:00
152 lines
6.2 KiB
Python
152 lines
6.2 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
import requests
|
|
from ...typing import CreateResult, Messages
|
|
from ..base_provider import ProviderModelMixin, AbstractProvider
|
|
from ...image import ImageResponse
|
|
|
|
class NexraProdiaAI(AbstractProvider, ProviderModelMixin):
|
|
label = "Nexra Prodia AI"
|
|
url = "https://nexra.aryahcr.cc/documentation/prodia/en"
|
|
api_endpoint = "https://nexra.aryahcr.cc/api/image/complements"
|
|
working = True
|
|
|
|
default_model = 'absolutereality_v181.safetensors [3d9d4d2b]'
|
|
models = [
|
|
'3Guofeng3_v34.safetensors [50f420de]',
|
|
'absolutereality_V16.safetensors [37db0fc3]',
|
|
default_model,
|
|
'amIReal_V41.safetensors [0a8a2e61]',
|
|
'analog-diffusion-1.0.ckpt [9ca13f02]',
|
|
'aniverse_v30.safetensors [579e6f85]',
|
|
'anythingv3_0-pruned.ckpt [2700c435]',
|
|
'anything-v4.5-pruned.ckpt [65745d25]',
|
|
'anythingV5_PrtRE.safetensors [893e49b9]',
|
|
'AOM3A3_orangemixs.safetensors [9600da17]',
|
|
'blazing_drive_v10g.safetensors [ca1c1eab]',
|
|
'breakdomain_I2428.safetensors [43cc7d2f]',
|
|
'breakdomain_M2150.safetensors [15f7afca]',
|
|
'cetusMix_Version35.safetensors [de2f2560]',
|
|
'childrensStories_v13D.safetensors [9dfaabcb]',
|
|
'childrensStories_v1SemiReal.safetensors [a1c56dbb]',
|
|
'childrensStories_v1ToonAnime.safetensors [2ec7b88b]',
|
|
'Counterfeit_v30.safetensors [9e2a8f19]',
|
|
'cuteyukimixAdorable_midchapter3.safetensors [04bdffe6]',
|
|
'cyberrealistic_v33.safetensors [82b0d085]',
|
|
'dalcefo_v4.safetensors [425952fe]',
|
|
'deliberate_v2.safetensors [10ec4b29]',
|
|
'deliberate_v3.safetensors [afd9d2d4]',
|
|
'dreamlike-anime-1.0.safetensors [4520e090]',
|
|
'dreamlike-diffusion-1.0.safetensors [5c9fd6e0]',
|
|
'dreamlike-photoreal-2.0.safetensors [fdcf65e7]',
|
|
'dreamshaper_6BakedVae.safetensors [114c8abb]',
|
|
'dreamshaper_7.safetensors [5cf5ae06]',
|
|
'dreamshaper_8.safetensors [9d40847d]',
|
|
'edgeOfRealism_eorV20.safetensors [3ed5de15]',
|
|
'EimisAnimeDiffusion_V1.ckpt [4f828a15]',
|
|
'elldreths-vivid-mix.safetensors [342d9d26]',
|
|
'epicphotogasm_xPlusPlus.safetensors [1a8f6d35]',
|
|
'epicrealism_naturalSinRC1VAE.safetensors [90a4c676]',
|
|
'epicrealism_pureEvolutionV3.safetensors [42c8440c]',
|
|
'ICantBelieveItsNotPhotography_seco.safetensors [4e7a3dfd]',
|
|
'indigoFurryMix_v75Hybrid.safetensors [91208cbb]',
|
|
'juggernaut_aftermath.safetensors [5e20c455]',
|
|
'lofi_v4.safetensors [ccc204d6]',
|
|
'lyriel_v16.safetensors [68fceea2]',
|
|
'majicmixRealistic_v4.safetensors [29d0de58]',
|
|
'mechamix_v10.safetensors [ee685731]',
|
|
'meinamix_meinaV9.safetensors [2ec66ab0]',
|
|
'meinamix_meinaV11.safetensors [b56ce717]',
|
|
'neverendingDream_v122.safetensors [f964ceeb]',
|
|
'openjourney_V4.ckpt [ca2f377f]',
|
|
'pastelMixStylizedAnime_pruned_fp16.safetensors [793a26e8]',
|
|
'portraitplus_V1.0.safetensors [1400e684]',
|
|
'protogenx34.safetensors [5896f8d5]',
|
|
'Realistic_Vision_V1.4-pruned-fp16.safetensors [8d21810b]',
|
|
'Realistic_Vision_V2.0.safetensors [79587710]',
|
|
'Realistic_Vision_V4.0.safetensors [29a7afaa]',
|
|
'Realistic_Vision_V5.0.safetensors [614d1063]',
|
|
'Realistic_Vision_V5.1.safetensors [a0f13c83]',
|
|
'redshift_diffusion-V10.safetensors [1400e684]',
|
|
'revAnimated_v122.safetensors [3f4fefd9]',
|
|
'rundiffusionFX25D_v10.safetensors [cd12b0ee]',
|
|
'rundiffusionFX_v10.safetensors [cd4e694d]',
|
|
'sdv1_4.ckpt [7460a6fa]',
|
|
'v1-5-pruned-emaonly.safetensors [d7049739]',
|
|
'v1-5-inpainting.safetensors [21c7ab71]',
|
|
'shoninsBeautiful_v10.safetensors [25d8c546]',
|
|
'theallys-mix-ii-churned.safetensors [5d9225a4]',
|
|
'timeless-1.0.ckpt [7c4971d4]',
|
|
'toonyou_beta6.safetensors [980f6b15]',
|
|
]
|
|
|
|
model_aliases = {}
|
|
|
|
@classmethod
|
|
def get_model(cls, model: str) -> str:
|
|
if model in cls.models:
|
|
return model
|
|
elif model in cls.model_aliases:
|
|
return cls.model_aliases[model]
|
|
else:
|
|
return cls.default_model
|
|
|
|
@classmethod
|
|
def get_model(cls, model: str) -> str:
|
|
return cls.default_model
|
|
|
|
@classmethod
|
|
def create_completion(
|
|
cls,
|
|
model: str,
|
|
messages: Messages,
|
|
proxy: str = None,
|
|
response: str = "url", # base64 or url
|
|
steps: str = 25, # Min: 1, Max: 30
|
|
cfg_scale: str = 7, # Min: 0, Max: 20
|
|
sampler: str = "DPM++ 2M Karras", # Select from these: "Euler","Euler a","Heun","DPM++ 2M Karras","DPM++ SDE Karras","DDIM"
|
|
negative_prompt: str = "", # Indicates what the AI should not do
|
|
**kwargs
|
|
) -> CreateResult:
|
|
model = cls.get_model(model)
|
|
|
|
headers = {
|
|
'Content-Type': 'application/json'
|
|
}
|
|
|
|
data = {
|
|
"prompt": messages[-1]["content"],
|
|
"model": "prodia",
|
|
"response": response,
|
|
"data": {
|
|
"model": model,
|
|
"steps": steps,
|
|
"cfg_scale": cfg_scale,
|
|
"sampler": sampler,
|
|
"negative_prompt": negative_prompt
|
|
}
|
|
}
|
|
|
|
response = requests.post(cls.api_endpoint, headers=headers, json=data)
|
|
|
|
result = cls.process_response(response)
|
|
yield result
|
|
|
|
@classmethod
|
|
def process_response(cls, response):
|
|
if response.status_code == 200:
|
|
try:
|
|
content = response.text.strip()
|
|
content = content.lstrip('_') # Remove leading underscores
|
|
data = json.loads(content)
|
|
if data.get('status') and data.get('images'):
|
|
image_url = data['images'][0]
|
|
return ImageResponse(images=[image_url], alt="Generated Image")
|
|
else:
|
|
return "Error: No image URL found in the response"
|
|
except json.JSONDecodeError as e:
|
|
return f"Error: Unable to decode JSON response. Details: {str(e)}"
|
|
else:
|
|
return f"Error: {response.status_code}, Response: {response.text}"
|