From 9aed91e202eafc4288bacac6786c5dd32ff5cae3 Mon Sep 17 00:00:00 2001 From: daxcay Date: Wed, 16 Oct 2024 23:02:26 +0530 Subject: [PATCH] GroqCloud Added --- __init__.py | 9 +++ classes/DataSet_GroqChat.py | 78 +++++++++++++++++++++++++ classes/DataSet_GroqChatImage.py | 98 ++++++++++++++++++++++++++++++++ requirements.txt | 3 +- 4 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 classes/DataSet_GroqChat.py create mode 100644 classes/DataSet_GroqChatImage.py diff --git a/__init__.py b/__init__.py index f631965..bb9f6cf 100644 --- a/__init__.py +++ b/__init__.py @@ -28,9 +28,12 @@ from .classes.DataSet_FindAndReplace import N_CLASS_MAPPINGS as FindAndReplaceMa from .classes.DataSet_PathSelector import N_CLASS_MAPPINGS as PathSelectorMappings, N_DISPLAY_NAME_MAPPINGS as PathSelectorNameMappings from .classes.DataSet_LoadImage import N_CLASS_MAPPINGS as LoadImageMappings, N_DISPLAY_NAME_MAPPINGS as LoadImageNameMappings from .classes.DataSet_SaveImage import N_CLASS_MAPPINGS as SaveImageMappings, N_DISPLAY_NAME_MAPPINGS as SaveImageNameMappings +from .classes.DataSet_SaveImagePro import N_CLASS_MAPPINGS as SaveImageProMappings, N_DISPLAY_NAME_MAPPINGS as SaveImageProNameMappings from .classes.DataSet_OpenAIChat import N_CLASS_MAPPINGS as OpenAIChatMappings, N_DISPLAY_NAME_MAPPINGS as OpenAIChatNameMappings from .classes.DataSet_OpenAIChatImage import N_CLASS_MAPPINGS as OpenAIChatImageMappings, N_DISPLAY_NAME_MAPPINGS as OpenAIChatImageNameMappings from .classes.DataSet_OpenAIChatImageBatch import N_CLASS_MAPPINGS as OpenAIChatImageBatchMappings, N_DISPLAY_NAME_MAPPINGS as OpenAIChatImageBatchNameMappings +from .classes.DataSet_GroqChat import N_CLASS_MAPPINGS as GroqChatMappings, N_DISPLAY_NAME_MAPPINGS as GroqChatNameMappings +from .classes.DataSet_GroqChatImage import N_CLASS_MAPPINGS as GroqChatImageMappings, N_DISPLAY_NAME_MAPPINGS as GroqChatImageNameMappings NODE_CLASS_MAPPINGS = {} NODE_CLASS_MAPPINGS.update(VisualizerMappings) @@ -44,9 +47,12 @@ NODE_CLASS_MAPPINGS.update(PathSelectorMappings) NODE_CLASS_MAPPINGS.update(ConceptManagerMappings) NODE_CLASS_MAPPINGS.update(LoadImageMappings) NODE_CLASS_MAPPINGS.update(SaveImageMappings) +NODE_CLASS_MAPPINGS.update(SaveImageProMappings) NODE_CLASS_MAPPINGS.update(OpenAIChatMappings) NODE_CLASS_MAPPINGS.update(OpenAIChatImageMappings) NODE_CLASS_MAPPINGS.update(OpenAIChatImageBatchMappings) +NODE_CLASS_MAPPINGS.update(GroqChatMappings) +NODE_CLASS_MAPPINGS.update(GroqChatImageMappings) NODE_DISPLAY_NAME_MAPPINGS = {} NODE_DISPLAY_NAME_MAPPINGS.update(VisualizerNameMappings) @@ -60,8 +66,11 @@ NODE_DISPLAY_NAME_MAPPINGS.update(PathSelectorNameMappings) NODE_DISPLAY_NAME_MAPPINGS.update(ConceptManagerNameMappings) NODE_DISPLAY_NAME_MAPPINGS.update(LoadImageNameMappings) NODE_DISPLAY_NAME_MAPPINGS.update(SaveImageNameMappings) +NODE_DISPLAY_NAME_MAPPINGS.update(SaveImageProNameMappings) NODE_DISPLAY_NAME_MAPPINGS.update(OpenAIChatNameMappings) NODE_DISPLAY_NAME_MAPPINGS.update(OpenAIChatImageNameMappings) NODE_DISPLAY_NAME_MAPPINGS.update(OpenAIChatImageBatchNameMappings) +NODE_DISPLAY_NAME_MAPPINGS.update(GroqChatNameMappings) +NODE_DISPLAY_NAME_MAPPINGS.update(GroqChatImageNameMappings) WEB_DIRECTORY = "./web" \ No newline at end of file diff --git a/classes/DataSet_GroqChat.py b/classes/DataSet_GroqChat.py new file mode 100644 index 0000000..32ed644 --- /dev/null +++ b/classes/DataSet_GroqChat.py @@ -0,0 +1,78 @@ +from groq import Groq +import requests +import os + +def getGroqModels(key): + + url = "https://api.groq.com/openai/v1/models" + headers = { + "Authorization": f"Bearer {key}", + "Content-Type": "application/json" + } + response = requests.get(url, headers=headers) + response = response.json() + + return [item['id'] for item in response['data'] if 'id' in item] + + +api_key = os.environ.get("GROQ_API_KEY") +api_models = getGroqModels(api_key) + + +class DataSet_GroqChat: + + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "model": (api_models, {"default": api_models[0]}), + "system_prompt": ("STRING", {"multiline": True, "default": ""}), + "user_prompt": ("STRING", {"multiline": True, "default": ""}), + "max_tokens": ("INT", {"default": 1024}) + } + } + + FUNCTION = "generate" + RETURN_TYPES = ("STRING",) + + def generate(self, model, system_prompt, user_prompt, max_tokens): + try: + + api_client = Groq( + api_key=api_key, + ) + + chat_completion = api_client.chat.completions.create( + messages=[ + { + "role": "system", + "content": system_prompt + }, + { + "role": "user", + "content": user_prompt, + } + ], + model=model, + temperature=0.5, + max_tokens=max_tokens, + top_p=1, + stop=None, + stream=False, + ) + + return (chat_completion.choices[0].message.content,) + + except Exception as e: + return (f"Error: {str(e)}",) + +N_CLASS_MAPPINGS = { + "DataSet_GroqChat": DataSet_GroqChat, +} + +N_DISPLAY_NAME_MAPPINGS = { + "DataSet_GroqChat": "DataSet_GroqChat", +} diff --git a/classes/DataSet_GroqChatImage.py b/classes/DataSet_GroqChatImage.py new file mode 100644 index 0000000..f1dcacc --- /dev/null +++ b/classes/DataSet_GroqChatImage.py @@ -0,0 +1,98 @@ +from groq import Groq +import requests +import os +import base64 +import io +from PIL import Image +import numpy as np + + +def getGroqModels(key): + + url = "https://api.groq.com/openai/v1/models" + headers = { + "Authorization": f"Bearer {key}", + "Content-Type": "application/json" + } + response = requests.get(url, headers=headers) + response = response.json() + + return [item['id'] for item in response['data'] if 'id' in item] + + +api_key = os.environ.get("GROQ_API_KEY") +api_models = getGroqModels(api_key) + + +class DataSet_GroqChatImage: + + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "image": ("IMAGE",), + "model": (api_models, {"default": api_models[0]}), + "user_prompt": ("STRING", {"multiline": True, "default": ""}), + "max_tokens": ("INT", {"default": 1024}) + } + } + + FUNCTION = "generate" + RETURN_TYPES = ("STRING",) + + def to_base64(self, image): + image = image[0] + i = 255. * image.cpu().numpy() + img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8)) + buffered = io.BytesIO() + img.save(buffered, format="PNG") + return base64.b64encode(buffered.getvalue()).decode("utf-8") + + def generate(self, image, model, user_prompt, max_tokens): + try: + + base64img = self.to_base64(image) + + api_client = Groq( + api_key=api_key, + ) + + chat_completion = api_client.chat.completions.create( + messages=[ + { + "role": "user", + "content": [ + {"type": "text", "text": user_prompt}, + { + "type": "image_url", + "image_url": { + "url": f"data:image/png;base64,{base64img}", + }, + }, + ], + } + ], + model=model, + temperature=0.5, + max_tokens=max_tokens, + top_p=1, + stop=None, + stream=False, + ) + + return (chat_completion.choices[0].message.content,) + + except Exception as e: + return (f"Error: {str(e)}",) + + +N_CLASS_MAPPINGS = { + "DataSet_GroqChatImage": DataSet_GroqChatImage, +} + +N_DISPLAY_NAME_MAPPINGS = { + "DataSet_GroqChatImage": "DataSet_GroqChatImage", +} diff --git a/requirements.txt b/requirements.txt index 65b8f61..af49464 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ matplotlib wordcloud networkx pandas -openai \ No newline at end of file +openai +groq \ No newline at end of file