Spaces:
Paused
Paused
File size: 3,556 Bytes
a411e12 2af6387 39661d4 f5f05d8 a411e12 76a000e a411e12 2af6387 a411e12 2af6387 a411e12 2af6387 a411e12 2af6387 a411e12 f5f05d8 d46ff0f a411e12 f5f05d8 a411e12 f5f05d8 a411e12 f5f05d8 a411e12 f5f05d8 a411e12 fb9bf22 a411e12 f5f05d8 5aba480 f5f05d8 d46ff0f a411e12 2af6387 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 |
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,
inp_img=None,
overlay=False,
use_inp=False,
inp_str=0.7
):
# 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": overlay,
"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": 0,
"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
# Send the POST request
response = requests.post(url, json=payload, headers=headers)
# 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 |