Spaces:
Running
Running
File size: 3,908 Bytes
a411e12 2af6387 39661d4 f5f05d8 a411e12 76a000e a411e12 2af6387 a411e12 2af6387 a411e12 2af6387 a411e12 2af6387 a411e12 f5f05d8 eef13e5 a411e12 eef13e5 a411e12 f5f05d8 a411e12 f5f05d8 a411e12 eef13e5 a411e12 fb9bf22 a411e12 f5f05d8 eef13e5 f5f05d8 5aba480 0d3d342 d46ff0f eef13e5 a411e12 e0d733d a411e12 39661d4 a411e12 39661d4 a411e12 f5f05d8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
import random
import io
import zipfile
import requests
import json
import base64
from PIL import Image
jwt_token = ''
url = "https://api.novelai.net/ai/generate-image"
headers = {}
def set_token(token):
global jwt_token, headers
if jwt_token == token:
return
jwt_token = token
headers = {
"Authorization": f"Bearer {jwt_token}",
"Content-Type": "application/json",
"Origin": "https://novelai.net",
"Referer": "https://novelai.net/"
}
def generate_novelai_image(
input_text="",
negative_prompt="",
seed=-1,
scale=5.0,
width=1024,
height=1024,
steps=28,
sampler="k_euler",
schedule='native',
smea=False,
dyn=False,
dyn_threshold=False,
cfg_rescale=0,
ref_image=None,
info_extract=1,
ref_str=0.6,
i2i_image=None,
i2i_str=0.7,
i2i_noise=0
):
# Assign a random seed if seed is -1
if seed == -1:
seed = random.randint(0, 2**32 - 1)
# Define the payload
payload = {
"action": "generate",
"input": input_text,
"model": "nai-diffusion-3",
"parameters": {
"width": width,
"height": height,
"scale": scale,
"sampler": sampler,
"steps": steps,
"n_samples": 1,
"ucPreset": 0,
"add_original_image": True,
"cfg_rescale": cfg_rescale,
"controlnet_strength": 1,
"dynamic_thresholding": dyn_threshold,
"params_version": 1,
"legacy": False,
"legacy_v3_extend": False,
"negative_prompt": negative_prompt,
"noise": i2i_noise,
"noise_schedule": schedule,
"qualityToggle": True,
"reference_information_extracted": info_extract,
"reference_strength": ref_str,
"seed": seed,
"sm": smea,
"sm_dyn": dyn,
"uncond_scale": 1,
}
}
if ref_image is not None:
payload['parameters']['reference_image'] = image2base64(ref_image)
'''
if use_inp:
payload['action'] = "infill"
payload['model'] = 'nai-diffusion-3-inpainting'
payload['parameters']['mask'] = image2base64(inp_img['layers'][0])
payload['parameters']['image'] = image2base64(inp_img['background'])
payload['parameters']['extra_noise_seed'] = seed
payload['parameters']['strength'] = inp_str
'''
if i2i_image is not None:
payload['action'] = "img2img"
payload['parameters']['image'] = image2base64(i2i_image)
payload['parameters']['strength'] = i2i_str
payload['parameters']['extra_noise_seed'] = seed
# Send the POST request
try {
response = requests.post(url, json=payload, headers=headers, timeout=20)
}
except {
return None, {'message': 'NAI response timeout'}
}
# Process the response
if response.headers.get('Content-Type') == 'application/x-zip-compressed':
zipfile_in_memory = io.BytesIO(response.content)
with zipfile.ZipFile(zipfile_in_memory, 'r') as zip_ref:
file_names = zip_ref.namelist()
if file_names:
with zip_ref.open(file_names[0]) as file:
return file.read(), payload
else:
return "NAI doesn't return any images", json.loads(response.content)
else:
return "Generation failed", json.loads(response.content)
def image_from_bytes(data):
img_file = io.BytesIO(data)
img_file.seek(0)
return Image.open(img_file)
def image2base64(img):
output_buffer = io.BytesIO()
img.save(output_buffer, format='PNG' if img.mode=='RGBA' else 'JPEG')
byte_data = output_buffer.getvalue()
base64_str = base64.b64encode(byte_data).decode()
return base64_str |