added files
This commit is contained in:
parent
1049ba4f07
commit
f99a88d570
|
@ -0,0 +1,5 @@
|
||||||
|
websocket-client
|
||||||
|
requests
|
||||||
|
pydantic
|
||||||
|
gradio
|
||||||
|
ollama
|
Binary file not shown.
After Width: | Height: | Size: 816 KiB |
|
@ -0,0 +1,34 @@
|
||||||
|
from text2image import GenerateImage, Nodes, ComfyUIGenerateImageForm, load_workflow
|
||||||
|
import random
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
base_url = "http://172.22.0.29:8188"
|
||||||
|
client_id = "test_client"
|
||||||
|
image_file_name = "test.png"
|
||||||
|
image_file_folder = "CodeNight/text2image/images"
|
||||||
|
workflow_json = load_workflow("CodeNight/text2image/malerisch.json")
|
||||||
|
nodes = Nodes(
|
||||||
|
prompt=6,
|
||||||
|
negative_prompt=7,
|
||||||
|
width=5,
|
||||||
|
height=5,
|
||||||
|
seed=3,
|
||||||
|
steps=3
|
||||||
|
)
|
||||||
|
payload = ComfyUIGenerateImageForm(
|
||||||
|
workflow=workflow_json,
|
||||||
|
nodes=nodes,
|
||||||
|
# prompt="fashion photography of 23 y.o blonde woman, beautiful makeup, wearing dot dress, 35mm",
|
||||||
|
# prompt="b/w fashion photography of 23 y.o black man, instgram, 35mm",
|
||||||
|
# prompt="Cyberpunk android with glowing eyes, beautiful face, urban background, neon accents, high-tech, realistic style.",
|
||||||
|
# prompt="Cyberpunk rooftop scene, overlooking city, neon lights, futuristic skyline, atmospheric style.",
|
||||||
|
prompt="A goat with sun glasses on a skateboard. realistic. skatepark, sunny day. 35mm",
|
||||||
|
width=768,
|
||||||
|
height=768,
|
||||||
|
negative_prompt=" (octane render, render, drawing, anime, bad photo, bad photography:1.3), (worst quality, low quality, blurry:1.2), (bad teeth, deformed teeth, deformed lips), (bad anatomy, bad proportions:1.1), (deformed iris, deformed pupils), (deformed eyes, bad eyes), (deformed face, ugly face, bad face), (deformed hands, bad hands, fused fingers), morbid, mutilated, mutation, disfigured",
|
||||||
|
seed=random.randint(0, 1125899906842624),
|
||||||
|
steps=30
|
||||||
|
)
|
||||||
|
|
||||||
|
GenerateImage(payload, client_id, base_url, image_file_folder, image_file_name)
|
|
@ -0,0 +1,53 @@
|
||||||
|
from text2image import GenerateImage, Nodes, ComfyUIGenerateImageForm, load_workflow
|
||||||
|
import random, os, gradio
|
||||||
|
|
||||||
|
def generate(prompt: str):
|
||||||
|
base_url = "http://172.22.0.29:8188"
|
||||||
|
client_id = "test_client"
|
||||||
|
image_file_name = "test.png"
|
||||||
|
image_file_folder = "CodeNight/text2image/images"
|
||||||
|
workflow_json = load_workflow("CodeNight/text2image/malerisch.json")
|
||||||
|
nodes = Nodes(
|
||||||
|
prompt=6,
|
||||||
|
negative_prompt=7,
|
||||||
|
width=5,
|
||||||
|
height=5,
|
||||||
|
seed=3,
|
||||||
|
steps=3
|
||||||
|
)
|
||||||
|
payload = ComfyUIGenerateImageForm(
|
||||||
|
workflow=workflow_json,
|
||||||
|
nodes=nodes,
|
||||||
|
# prompt="fashion photography of 23 y.o blonde woman, beautiful makeup, wearing dot dress, 35mm",
|
||||||
|
# prompt="b/w fashion photography of 23 y.o black man, instgram, 35mm",
|
||||||
|
# prompt="Cyberpunk android with glowing eyes, beautiful face, urban background, neon accents, high-tech, realistic style.",
|
||||||
|
# prompt="Cyberpunk rooftop scene, overlooking city, neon lights, futuristic skyline, atmospheric style.",
|
||||||
|
# prompt="A goat with sun glasses on a skateboard. realistic. skatepark, sunny day. 35mm",
|
||||||
|
prompt=prompt,
|
||||||
|
width=768,
|
||||||
|
height=768,
|
||||||
|
negative_prompt=" (octane render, render, drawing, anime, bad photo, bad photography:1.3), (worst quality, low quality, blurry:1.2), (bad teeth, deformed teeth, deformed lips), (bad anatomy, bad proportions:1.1), (deformed iris, deformed pupils), (deformed eyes, bad eyes), (deformed face, ugly face, bad face), (deformed hands, bad hands, fused fingers), morbid, mutilated, mutation, disfigured",
|
||||||
|
seed=random.randint(0, 1125899906842624),
|
||||||
|
steps=30
|
||||||
|
)
|
||||||
|
|
||||||
|
GenerateImage(payload, client_id, base_url, image_file_folder, image_file_name)
|
||||||
|
return os.path.join(image_file_folder, image_file_name)
|
||||||
|
|
||||||
|
with gradio.Blocks() as demo:
|
||||||
|
gradio.Markdown("# Meine erste Webanwendung")
|
||||||
|
with gradio.Row(equal_height=True):
|
||||||
|
textbox = gradio.Textbox(lines=1, show_label=False, placeholder="Gib hier deinen Prompt ein")
|
||||||
|
button = gradio.Button("Generate", variant="primary")
|
||||||
|
image = gradio.Image(height=768)
|
||||||
|
|
||||||
|
button.click(
|
||||||
|
generate,
|
||||||
|
inputs=textbox,
|
||||||
|
outputs=image
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
demo.launch(share=True)
|
|
@ -0,0 +1,107 @@
|
||||||
|
{
|
||||||
|
"3": {
|
||||||
|
"inputs": {
|
||||||
|
"seed": 766408214160696,
|
||||||
|
"steps": 30,
|
||||||
|
"cfg": 2,
|
||||||
|
"sampler_name": "dpmpp_2m_sde_gpu",
|
||||||
|
"scheduler": "karras",
|
||||||
|
"denoise": 1,
|
||||||
|
"model": [
|
||||||
|
"4",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"positive": [
|
||||||
|
"6",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"negative": [
|
||||||
|
"7",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"latent_image": [
|
||||||
|
"5",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "KSampler",
|
||||||
|
"_meta": {
|
||||||
|
"title": "KSampler"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"4": {
|
||||||
|
"inputs": {
|
||||||
|
"ckpt_name": "dreamshaper/realvis5xl.safetensors"
|
||||||
|
},
|
||||||
|
"class_type": "CheckpointLoaderSimple",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Load Checkpoint"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"5": {
|
||||||
|
"inputs": {
|
||||||
|
"width": 512,
|
||||||
|
"height": 512,
|
||||||
|
"batch_size": 1
|
||||||
|
},
|
||||||
|
"class_type": "EmptyLatentImage",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Empty Latent Image"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"6": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "In the vast, untouched wilderness of Kanadensische Alpen, der Sonnenaufgang über einen Schneelandschaft mit Bergrücken und tiefen Schluchten warf einen goldenen Lichtschein, während die unberührte Natur in Stille und Frieden schlug.",
|
||||||
|
"clip": [
|
||||||
|
"4",
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Text Encode (Prompt)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"7": {
|
||||||
|
"inputs": {
|
||||||
|
"text": "text, watermarks, pornography",
|
||||||
|
"clip": [
|
||||||
|
"4",
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "CLIPTextEncode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "CLIP Text Encode (Prompt)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"8": {
|
||||||
|
"inputs": {
|
||||||
|
"samples": [
|
||||||
|
"3",
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"vae": [
|
||||||
|
"4",
|
||||||
|
2
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "VAEDecode",
|
||||||
|
"_meta": {
|
||||||
|
"title": "VAE Decode"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"9": {
|
||||||
|
"inputs": {
|
||||||
|
"filename_prefix": "ComfyUI",
|
||||||
|
"images": [
|
||||||
|
"8",
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"class_type": "SaveImage",
|
||||||
|
"_meta": {
|
||||||
|
"title": "Save Image"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,134 @@
|
||||||
|
import asyncio
|
||||||
|
import json
|
||||||
|
import random
|
||||||
|
import requests
|
||||||
|
import websocket
|
||||||
|
import os
|
||||||
|
from pydantic import BaseModel
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
class Nodes(BaseModel):
|
||||||
|
prompt: int
|
||||||
|
width: int
|
||||||
|
height: int
|
||||||
|
negative_prompt: Optional[int] = None
|
||||||
|
seed: Optional[int] = None
|
||||||
|
steps: Optional[int] = None
|
||||||
|
|
||||||
|
class ComfyUIGenerateImageForm(BaseModel):
|
||||||
|
workflow: str
|
||||||
|
prompt: str
|
||||||
|
nodes: Nodes
|
||||||
|
negative_prompt: Optional[str] = None
|
||||||
|
width: int
|
||||||
|
height: int
|
||||||
|
steps: Optional[int] = None
|
||||||
|
seed: Optional[int] = None
|
||||||
|
|
||||||
|
class GenerateImage:
|
||||||
|
def __init__(self, payload, client_id, base_url, image_file_folder, image_file_name):
|
||||||
|
self.payload = payload
|
||||||
|
self.client_id = client_id
|
||||||
|
self.base_url = base_url
|
||||||
|
self.image_file_folder = image_file_folder
|
||||||
|
self.image_file_name = image_file_name
|
||||||
|
asyncio.run(self.__generate())
|
||||||
|
|
||||||
|
def save_image(self, image_url):
|
||||||
|
"""Lädt ein Bild von einer URL herunter und speichert es im angegebenen Ordner mit dem gewünschten Dateinamen."""
|
||||||
|
response = requests.get(image_url, stream=True)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
os.makedirs(self.image_file_folder, exist_ok=True) # Erstelle den Ordner, falls er nicht existiert
|
||||||
|
file_path = os.path.join(self.image_file_folder, self.image_file_name)
|
||||||
|
|
||||||
|
with open(file_path, "wb") as file:
|
||||||
|
for chunk in response.iter_content(1024):
|
||||||
|
file.write(chunk)
|
||||||
|
|
||||||
|
print(f"Bild gespeichert unter: {file_path}")
|
||||||
|
else:
|
||||||
|
print(f"Fehler beim Download des Bildes: {response.status_code}")
|
||||||
|
|
||||||
|
def get_image_url(self, filename, subfolder, img_type):
|
||||||
|
return f"{self.base_url}/view?filename={filename}&subfolder={subfolder}&type={img_type}"
|
||||||
|
|
||||||
|
def queue_prompt(self):
|
||||||
|
response = requests.post(
|
||||||
|
f"{self.base_url}/prompt",
|
||||||
|
json={"prompt": self.workflow, "client_id": self.client_id},
|
||||||
|
headers={"Authorization": f"Bearer "},
|
||||||
|
)
|
||||||
|
return response.json()
|
||||||
|
|
||||||
|
def get_history(self, prompt_id):
|
||||||
|
response = requests.get(
|
||||||
|
f"{self.base_url}/history/{prompt_id}",
|
||||||
|
headers={"Authorization": f"Bearer "},
|
||||||
|
)
|
||||||
|
return response.json()
|
||||||
|
|
||||||
|
def get_images(self, ws):
|
||||||
|
prompt_id = self.queue_prompt()["prompt_id"]
|
||||||
|
output_images = []
|
||||||
|
while True:
|
||||||
|
out = ws.recv()
|
||||||
|
if isinstance(out, str):
|
||||||
|
message = json.loads(out)
|
||||||
|
if message["type"] == "executing":
|
||||||
|
data = message["data"]
|
||||||
|
if data["node"] is None and data["prompt_id"] == prompt_id:
|
||||||
|
break # Execution is done
|
||||||
|
else:
|
||||||
|
continue # previews are binary data
|
||||||
|
|
||||||
|
history = self.get_history(prompt_id)[prompt_id]
|
||||||
|
for node_id, node_output in history["outputs"].items():
|
||||||
|
if "images" in node_output:
|
||||||
|
for image in node_output["images"]:
|
||||||
|
url = self.get_image_url(
|
||||||
|
image["filename"], image["subfolder"], image["type"]
|
||||||
|
)
|
||||||
|
output_images.append({"url": url})
|
||||||
|
return {"data": output_images}
|
||||||
|
|
||||||
|
|
||||||
|
async def comfyui_generate_image(self):
|
||||||
|
ws_url = self.base_url.replace("http://", "ws://").replace("https://", "wss://")
|
||||||
|
self.workflow = json.loads(self.payload.workflow)
|
||||||
|
self.workflow[f"{self.payload.nodes.prompt}"]["inputs"]["text"] = self.payload.prompt
|
||||||
|
self.workflow[f"{self.payload.nodes.width}"]["inputs"]["width"] = self.payload.width
|
||||||
|
self.workflow[f"{self.payload.nodes.height}"]["inputs"]["height"] = self.payload.height
|
||||||
|
if self.payload.seed and self.payload.nodes.seed:
|
||||||
|
self.workflow[f"{self.payload.nodes.seed}"]["inputs"]["seed"] = self.payload.seed
|
||||||
|
if self.payload.steps and self.payload.nodes.steps:
|
||||||
|
self.workflow[f"{self.payload.nodes.steps}"]["inputs"]["steps"] = self.payload.steps
|
||||||
|
if self.payload.negative_prompt and self.payload.nodes.negative_prompt:
|
||||||
|
self.workflow[f"{self.payload.nodes.negative_prompt}"]["inputs"]["text"] = self.payload.negative_prompt
|
||||||
|
|
||||||
|
try:
|
||||||
|
ws = websocket.WebSocket()
|
||||||
|
headers = {"Authorization": f"Bearer "}
|
||||||
|
ws.connect(f"{ws_url}/ws?clientId={self.client_id}", header=headers)
|
||||||
|
except Exception as e:
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
images = await asyncio.to_thread(self.get_images, ws)
|
||||||
|
except Exception as e:
|
||||||
|
images = None
|
||||||
|
finally:
|
||||||
|
ws.close()
|
||||||
|
return images
|
||||||
|
|
||||||
|
async def __generate(self):
|
||||||
|
images = await self.comfyui_generate_image()
|
||||||
|
if images and "data" in images and images["data"]:
|
||||||
|
image_url = images["data"][0]["url"]
|
||||||
|
self.save_image(image_url)
|
||||||
|
|
||||||
|
def load_workflow(file_path):
|
||||||
|
with open(file_path, "r", encoding="utf-8") as file:
|
||||||
|
return file.read()
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
|
||||||
|
from ollama import Client
|
||||||
|
|
||||||
|
model = 'llama3.2'
|
||||||
|
prompt = "Wieso ist der Himmel blau?"
|
||||||
|
top_k = 40
|
||||||
|
top_p = 0.9
|
||||||
|
temp=0.8
|
||||||
|
client = Client(host='http://172.22.0.29:11434')
|
||||||
|
|
||||||
|
response = client.generate(
|
||||||
|
model=model,
|
||||||
|
prompt= prompt,
|
||||||
|
stream= False,
|
||||||
|
options= {
|
||||||
|
'top_k': top_k,
|
||||||
|
'temperature':top_p,
|
||||||
|
'top_p': temp
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
print(response.response)
|
|
@ -0,0 +1,54 @@
|
||||||
|
|
||||||
|
from ollama import Client
|
||||||
|
import json
|
||||||
|
import gradio as gr
|
||||||
|
|
||||||
|
model = 'llama3.2'
|
||||||
|
context = []
|
||||||
|
|
||||||
|
client = Client(
|
||||||
|
host='http://172.22.0.29:11434',
|
||||||
|
)
|
||||||
|
|
||||||
|
def generate(prompt, context, top_k, top_p, temp):
|
||||||
|
global client
|
||||||
|
response = client.generate(
|
||||||
|
model=model,
|
||||||
|
prompt= prompt,
|
||||||
|
context= context,
|
||||||
|
stream= False,
|
||||||
|
options= {
|
||||||
|
'top_k': top_k,
|
||||||
|
'temperature':top_p,
|
||||||
|
'top_p': temp
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return response.response, response.context
|
||||||
|
|
||||||
|
|
||||||
|
def chat(input, chat_history, top_k, top_p, temp):
|
||||||
|
chat_history = chat_history or []
|
||||||
|
global context
|
||||||
|
output, context = generate(input, context, top_k, top_p, temp)
|
||||||
|
chat_history.append((input, output))
|
||||||
|
|
||||||
|
return chat_history, chat_history
|
||||||
|
|
||||||
|
|
||||||
|
#########################Gradio Code##########################
|
||||||
|
block = gr.Blocks()
|
||||||
|
|
||||||
|
with block:
|
||||||
|
gr.Markdown("""<h1><center> Mein Assistent </center></h1>""")
|
||||||
|
chatbot = gr.Chatbot()
|
||||||
|
message = gr.Textbox(placeholder="Type here")
|
||||||
|
state = gr.State()
|
||||||
|
with gr.Row():
|
||||||
|
top_k = gr.Slider(0.0,100.0, label="top_k", value=40, info="Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)")
|
||||||
|
top_p = gr.Slider(0.0,1.0, label="top_p", value=0.9, info=" Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)")
|
||||||
|
temp = gr.Slider(0.0,2.0, label="temperature", value=0.8, info="The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)")
|
||||||
|
|
||||||
|
submit = gr.Button("Send")
|
||||||
|
submit.click(chat, inputs=[message, state, top_k, top_p, temp], outputs=[chatbot, state])
|
||||||
|
|
||||||
|
block.launch(debug=True)
|
Loading…
Reference in New Issue