From 2ea9d6efa4a26bca844015e98108f1f9c56bab8d Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 5 Sep 2024 16:41:06 +0000 Subject: [PATCH 1/2] Update repository --- __init__.py | 3 ++ nodes/http_serving.py | 97 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 nodes/http_serving.py diff --git a/__init__.py b/__init__.py index 261c1c1..6729544 100644 --- a/__init__.py +++ b/__init__.py @@ -1,4 +1,7 @@ import __main__ +from .nodes.http_serving import HTTPServing +NODE_CLASS_MAPPINGS["HTTPServing"] = HTTPServing +NODE_DISPLAY_NAME_MAPPINGS["HTTPServing"] = "HTTP Serving" from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS diff --git a/nodes/http_serving.py b/nodes/http_serving.py new file mode 100644 index 0000000..b07feec --- /dev/null +++ b/nodes/http_serving.py @@ -0,0 +1,97 @@ +import threading +from http.server import HTTPServer, BaseHTTPRequestHandler +from collections import deque +import json +import base64 +from io import BytesIO + +class HTTPServing: + def __init__(self): + self.data_ready = threading.Event() + self.data = deque() + self.http_running = False + self.port = None + self.server = None + + def http_handler(self): + class RequestHandler(BaseHTTPRequestHandler): + def do_POST(self2): + content_length = int(self2.headers['Content-Length']) + post_data = self2.rfile.read(content_length) + data = json.loads(post_data.decode('utf-8')) + self.data.append(data) + self.data_ready.set() + + self2.send_response(200) + self2.send_header('Content-type', 'application/json') + self2.end_headers() + self2.wfile.write(json.dumps({"status": "received"}).encode('utf-8')) + + def do_GET(self2): + if self2.path == '/': + self2.send_response(200) + self2.send_header('Content-type', 'text/html') + self2.end_headers() + self2.wfile.write(b"HTTP Serving is running") + + self.server = HTTPServer(('', self.port), RequestHandler) + print(f"HTTP Server running on port {self.port}") + self.server.serve_forever() + + def get_data(self): + if not self.data: + self.data_ready.wait() + data = self.data.popleft() + self.data_ready.clear() + return data + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "port": ("INT", {"default": 8000, "min": 1, "max": 65535}), + } + } + + RETURN_TYPES = ("SERVING_CONFIG",) + RETURN_NAMES = ("Serving config",) + FUNCTION = "serve" + CATEGORY = "Serving-Toolkit" + + def serve(self, port): + if not self.http_running: + self.port = port + threading.Thread(target=self.http_handler, daemon=True).start() + print(f"HTTP Server running on port {port}") + self.http_running = True + + data = self.get_data() + + def serve_multi_image_function(images): + base64_images = [] + for img in images: + img_np = (img.cpu().numpy() * 255).astype('uint8') + img_bytes = BytesIO() + Image.fromarray(img_np.squeeze()).save(img_bytes, format='PNG') + base64_img = base64.b64encode(img_bytes.getvalue()).decode('utf-8') + base64_images.append(base64_img) + response = { + "base64_images": base64_images, + "_requestId": data["_requestId"] + } + return json.dumps(response) + + def serve_image_function(image, frame_duration): + image_file = tensorToImageConversion(image, frame_duration) + base64_img = base64.b64encode(image_file.read()).decode('utf-8') + response = { + "base64_img": base64_img, + "_requestId": data["_requestId"] + } + return json.dumps(response) + + data["serve_image_function"] = serve_image_function + data["serve_multi_image_function"] = serve_multi_image_function + data["serve_text_function"] = lambda text: json.dumps({"text": text, "_requestId": data["_requestId"]}) + + return (data,) \ No newline at end of file From 9ea43ee6be2f8adb7104283a0e62f07cd70ec5dc Mon Sep 17 00:00:00 2001 From: matan Date: Thu, 5 Sep 2024 20:09:26 +0300 Subject: [PATCH 2/2] fixed ai --- __init__.py | 7 ++--- nodes.py => nodes/all_nodes.py | 0 discord_client.py => nodes/discord_client.py | 0 nodes/http_serving.py | 32 +++++++++++++++----- utils.py => nodes/utils.py | 0 5 files changed, 28 insertions(+), 11 deletions(-) rename nodes.py => nodes/all_nodes.py (100%) rename discord_client.py => nodes/discord_client.py (100%) rename utils.py => nodes/utils.py (100%) diff --git a/__init__.py b/__init__.py index 6729544..b8f8d30 100644 --- a/__init__.py +++ b/__init__.py @@ -1,9 +1,8 @@ -import __main__ from .nodes.http_serving import HTTPServing +from .nodes.all_nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS + + NODE_CLASS_MAPPINGS["HTTPServing"] = HTTPServing NODE_DISPLAY_NAME_MAPPINGS["HTTPServing"] = "HTTP Serving" -from .nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS - - __all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS'] diff --git a/nodes.py b/nodes/all_nodes.py similarity index 100% rename from nodes.py rename to nodes/all_nodes.py diff --git a/discord_client.py b/nodes/discord_client.py similarity index 100% rename from discord_client.py rename to nodes/discord_client.py diff --git a/nodes/http_serving.py b/nodes/http_serving.py index b07feec..7abf98b 100644 --- a/nodes/http_serving.py +++ b/nodes/http_serving.py @@ -4,6 +4,9 @@ from collections import deque import json import base64 from io import BytesIO +from .utils import tensorToImageConversion +from PIL import Image + class HTTPServing: def __init__(self): @@ -12,6 +15,8 @@ class HTTPServing: self.http_running = False self.port = None self.server = None + self.output_ready = threading.Event() + self.output = None def http_handler(self): class RequestHandler(BaseHTTPRequestHandler): @@ -22,17 +27,22 @@ class HTTPServing: self.data.append(data) self.data_ready.set() + self.output_ready.wait() + response = self.output self2.send_response(200) self2.send_header('Content-type', 'application/json') self2.end_headers() - self2.wfile.write(json.dumps({"status": "received"}).encode('utf-8')) + self2.wfile.write(json.dumps(response).encode('utf-8')) + + + def do_GET(self2): if self2.path == '/': self2.send_response(200) self2.send_header('Content-type', 'text/html') self2.end_headers() - self2.wfile.write(b"HTTP Serving is running") + self2.wfile.write(b"HTTP Serving is running, to send data make a POST request to this endpoint.") self.server = HTTPServer(('', self.port), RequestHandler) print(f"HTTP Server running on port {self.port}") @@ -77,21 +87,29 @@ class HTTPServing: base64_images.append(base64_img) response = { "base64_images": base64_images, - "_requestId": data["_requestId"] } - return json.dumps(response) + self.output = response + self.output_ready.set() + def serve_image_function(image, frame_duration): image_file = tensorToImageConversion(image, frame_duration) base64_img = base64.b64encode(image_file.read()).decode('utf-8') response = { "base64_img": base64_img, - "_requestId": data["_requestId"] } - return json.dumps(response) + self.output = response + self.output_ready.set() + + def serve_text_function(text): + response = { + "text": text, + } + self.output = response + self.output_ready.set() data["serve_image_function"] = serve_image_function data["serve_multi_image_function"] = serve_multi_image_function - data["serve_text_function"] = lambda text: json.dumps({"text": text, "_requestId": data["_requestId"]}) + data["serve_text_function"] = serve_text_function return (data,) \ No newline at end of file diff --git a/utils.py b/nodes/utils.py similarity index 100% rename from utils.py rename to nodes/utils.py