re-organization of the nodes

This commit is contained in:
Jason Schleifer
2024-07-16 10:48:59 +12:00
parent 4d516e5479
commit 4c1a10faec
85 changed files with 1317 additions and 1354 deletions
+51 -118
View File
@@ -5,97 +5,75 @@
@description: This extension offers various nodes that allow you to work with LLMs using the Griptape Python Framework (https://griptape.ai)
"""
import json
import os
from dotenv import load_dotenv
from .nodes.agent.convert_agent_to_tool import gtUIConvertAgentToTool
# Load the griptape_config.json data
from .nodes.agent.create_agent import CreateAgent
from .nodes.agent.expand_agent import ExpandAgent
from .nodes.agent.run_agent import RunAgent
from .nodes.agent.set_default_agent import gtUISetDefaultAgent
from .nodes.audio_drivers import gtUIOpenAiAudioTranscriptionDriver
from .nodes.audio_nodes import gtUILoadAudio
from .nodes.combine_nodes import MergeTexts, RulesList, ToolList, gtUIMergeInputs
from .nodes.config.amazon_bedrock_config import gtUIAmazonBedrockStructureConfig
from .nodes.config.anthropic_config import gtUIAnthropicStructureConfig
from .nodes.config.azure_openai_config import gtUIAzureOpenAiStructureConfig
from .nodes.config.google_config import gtUIGoogleStructureConfig
from .nodes.config.huggingface_config import gtUIHuggingFaceStructureConfig
from .nodes.config.lmstudio_config import gtUILMStudioStructureConfig
from .nodes.config.ollama_config import gtUIOllamaStructureConfig
from .nodes.config.openai_compatable_config import gtUIOpenAiCompatableConfig
from .nodes.config.openai_config import gtUIOpenAiStructureConfig
from .nodes.display_nodes import (
# gtUIOutputArtifactNode,
gtUIOutputDataNode,
gtUIOutputImageNode,
gtUIOutputStringNode,
)
from .nodes.image_drivers import (
from .nodes.combine.MergeInputs import gtUIMergeInputs
from .nodes.combine.MergeTexts import MergeTexts
from .nodes.combine.RulesList import RulesList
from .nodes.combine.ToolList import ToolList
from .nodes.config.AmazonBedrockStructureConfig import gtUIAmazonBedrockStructureConfig
from .nodes.config.AnthropicStructureConfig import gtUIAnthropicStructureConfig
from .nodes.config.AzureOpenAiStructureConfig import gtUIAzureOpenAiStructureConfig
from .nodes.config.GoogleStructureConfig import gtUIGoogleStructureConfig
from .nodes.config.HuggingFaceStructureConfig import gtUIHuggingFaceStructureConfig
from .nodes.config.LmStudioStructureConfig import gtUILMStudioStructureConfig
from .nodes.config.OllamaStructureConfig import gtUIOllamaStructureConfig
from .nodes.config.OpenAiCompatableConfig import gtUIOpenAiCompatableConfig
from .nodes.config.OpenAiConfig import gtUIOpenAiStructureConfig
from .nodes.convert.TextToClipEncode import gtUITextToClipEncode
from .nodes.convert.TextToCombo import gtUITextToCombo
from .nodes.display.OutputArtifactNode import gtUIOutputArtifactNode
from .nodes.display.OutputDataNode import gtUIOutputDataNode
from .nodes.display.OutputImageNode import gtUIOutputImageNode
from .nodes.display.OutputStringNode import gtUIOutputStringNode
from .nodes.drivers.AmazonBedrockStableDiffusionImageGenerationDriver import (
gtUIAmazonBedrockStableDiffusionImageGenerationDriver,
)
from .nodes.drivers.AmazonBedrockTitanImageGenerationDriver import (
gtUIAmazonBedrockTitanImageGenerationDriver,
)
from .nodes.drivers.DuckDuckGoWebSearchDriver import gtUIDuckDuckGoWebSearchDriver
from .nodes.drivers.GoogleWebSearchDriver import gtUIGoogleWebSearchDriver
from .nodes.drivers.LonardoImageGenerationDriver import (
gtUILeonardoImageGenerationDriver,
gtUIOpenAiImageGenerationDriver,
)
from .nodes.image_nodes import (
gtUIFetchImage,
from .nodes.drivers.OpenAiAudioTranscriptionDriver import (
gtUIOpenAiAudioTranscriptionDriver,
)
from .nodes.rules import gtUIRule
# from .nodes.structure_nodes import (
# gtUICreatePipeline,
# gtUIPipelineAddTask,
# gtUIPipelineInsertTask,
# gtUIRunStructure,
# )
from .nodes.tasks.audio_transcription_task import gtUIAudioTranscriptionTask
from .nodes.drivers.OpenAiImageGenerationDriver import gtUIOpenAiImageGenerationDriver
from .nodes.loaders.FetchImage import gtUIFetchImage
from .nodes.loaders.LoadAudio import gtUILoadAudio
from .nodes.rules.Rule import gtUIRule
from .nodes.tasks.AudioTranscriptionTask import gtUIAudioTranscriptionTask
# from .nodes.tasks.csv_extraction_task import gtUICSVExtractionTask
from .nodes.tasks.image_query_task import gtUIImageQueryTask
from .nodes.tasks.ImageQueryTask import gtUIImageQueryTask
# from .nodes.tasks.json_extraction_task import gtUIJSONExtractionTask
from .nodes.tasks.parallel_image_query_task import gtUIParallelImageQueryTask
from .nodes.tasks.prompt_image_generation_task import gtUIPromptImageGenerationTask
from .nodes.tasks.prompt_image_variation_task import gtUIPromptImageVariationTask
from .nodes.tasks.prompt_task import gtUIPromptTask
from .nodes.tasks.text_summary_task import gtUITextSummaryTask
from .nodes.tasks.tool_task import gtUIToolTask
from .nodes.tasks.toolkit_task import gtUIToolkitTask
# from .nodes.tasks import (
# gtUIAudioTranscriptionTask,
# gtUIImageQueryTask,
# gtUIParallelImageQueryTask,
# gtUIPromptImageGenerationTask,
# gtUIPromptImageVariationTask,
# # gtUIPromptTask,
# gtUITextSummaryTask,
# gtUIToolkitTask,
# gtUIToolTask,
# )
from .nodes.text_nodes import (
gtUICLIPTextEncode,
gtUIInputStringNode,
gtUITextToClipEncode,
gtUITextToCombo,
)
from .nodes.tools import (
gtUIAudioTranscriptionClient,
gtUICalculator,
gtUIDateTime,
gtUIFileManager,
gtUIKnowledgeBaseTool,
gtUIWebScraper,
gtUIWebSearch,
)
from .nodes.websearch_drivers import (
gtUIDuckDuckGoWebSearchDriver,
gtUIGoogleWebSearchDriver,
)
from .nodes.tasks.ParallelImageQueryTask import gtUIParallelImageQueryTask
from .nodes.tasks.PromptImageGenerationTask import gtUIPromptImageGenerationTask
from .nodes.tasks.PromptImageVariationTask import gtUIPromptImageVariationTask
from .nodes.tasks.PromptTask import gtUIPromptTask
from .nodes.tasks.TextSummaryTask import gtUITextSummaryTask
from .nodes.tasks.ToolkitTask import gtUIToolkitTask
from .nodes.tasks.ToolTask import gtUIToolTask
from .nodes.text.CLIPTextEncode import gtUICLIPTextEncode
from .nodes.text.InputStringNode import gtUIInputStringNode
from .nodes.tools.AudioTranscriptionClient import gtUIAudioTranscriptionClient
from .nodes.tools.Calculator import gtUICalculator
from .nodes.tools.ConvertAgentToTool import gtUIConvertAgentToTool
from .nodes.tools.DateTime import gtUIDateTime
from .nodes.tools.FileManager import gtUIFileManager
from .nodes.tools.KnowledgeBaseTool import gtUIKnowledgeBaseTool
from .nodes.tools.WebScraper import gtUIWebScraper
from .nodes.tools.WebSearch import gtUIWebSearch
from .py.griptape_config import (
load_and_prepare_config,
set_environment_variables_from_config,
@@ -198,51 +176,6 @@ NODE_CLASS_MAPPINGS = {
# "Griptape Config: Environment Variables": gtUIEnv,
}
# NODE_DISPLAY_NAME_MAPPINGS = {
# "gtUIInputNode": "Griptape Create: Text",
# "gtUICLIPTextEncode": "Griptape Create: CLIP Text Encode",
# "gtUITextToClipEncode": "Griptape Convert: Text to CLIP Encode",
# "gtUIFetchImage": "Griptape Load: Image From URL",
# "CreateAgent": "Griptape Create: Agent",
# "RunAgent": "Griptape Run: Agent",
# "PromptImageGenerationTask": "Griptape Create: Image from Text",
# "PromptImageVariationTask": "Griptape Create: Image Variation",
# "Rule": "Griptape Create: Rules",
# "RulesList": "Griptape Create: Rules List",
# "gtUIOpenAiAudioTranscriptionDriver": "Griptape Driver: OpenAI",
# "gtUIAmazonBedrockStableDiffusionImageGenerationDriver": "Griptape Driver: Amazon Bedrock Stable Diffusion",
# "gtUIAmazonBedrockTitanImageGenerationDriver": "Griptape Driver: Amazon Bedrock Titan",
# "gtUILeonardoImageGenerationDriver": "Griptape Driver: Leonardo.AI",
# "gtUIOutputStringNode": "Griptape Display: Text",
# "gtUIOutputImageNode": "Griptape Display: Image",
# "gtUIOutputArtifactNode": "Griptape Display: Artifact",
# "ImageQueryTask": "Griptape Run: Image Description",
# "ParallelImageQueryTask": "Griptape Run: Parallel Image Description",
# "PromptTask": "Griptape Run: Prompt Task",
# "ToolTask": "Griptape Run: Tool Task",
# "ToolkitTask": "Griptape Run: Toolkit Task",
# "TextSummaryTask": "Griptape Run: Text Summary",
# "AudioTranscriptionTask": "Griptape Run: Audio Transcription",
# "ExpandAgent": "Griptape Expand: Agent Nodes",
# "gtUIOpenAiStructureConfig": "Griptape Agent Config: OpenAI",
# "gtUIAmazonBedrockStructureConfig": "Griptape Agent Config: Amazon Bedrock",
# "gtUIGoogleStructureConfig": "Griptape Agent Config: Google",
# "gtUIAnthropicStructureConfig": "Griptape Agent Config: Anthropic",
# "gtUIOllamaStructureConfig": "Griptape Agent Config: Ollama",
# "gtUILMStudioStructureConfig": "Griptape Agent Config: LM Studio",
# "Calculator": "Griptape Tool: Calculator",
# "DateTime": "Griptape Tool: DateTime",
# "WebScraper": "Griptape Tool: WebScraper",
# "gtUIFileManager": "Griptape Tool: FileManager",
# "gtAudioTranscriptionClient": "Griptape Tool: Audio Transcription",
# "gtUIKnowledgeBaseTool": "Griptape Tool: Griptape Cloud KnowledgeBase",
# "gtUIWebSearch": "Griptape Tool: WebSearch",
# "ToolList": "Griptape Combine: Tool List",
# "MergeTexts": "Griptape Combine: Merge Texts",
# "EnvironmentConfig": "Griptape Config: Environment Variables",
# "gtUIOpenAiImageGenerationDriver": "Griptape Audio Driver: OpenAI",
# "gtUILoadAudio": "Griptape Load: Audio",
# }
__all__ = ["NODE_CLASS_MAPPINGS", "WEB_DIRECTORY"]
print(" \033[34m- \033[92mDone!\033[0m\n")
-4
View File
@@ -490,7 +490,6 @@ app.registerExtension({
gtUIAddUploadWidget(nodeType, nodeData, "audio", "audio")
}
// Display Artifact Node
if (nodeData.name === "Griptape Display: Artifact") {
const onNodeCreated = nodeType.prototype.onNodeCreated;
@@ -664,9 +663,6 @@ app.registerExtension({
if(!link_info)
return;
if(type==1) {
console.log("link_info", link_info);
console.log("connected", connected);
console.log("index", index);
const node = app.graph.getNodeById(link_info.origin_id);
let origin_type = node.outputs[link_info.origin_slot].type;
+34
View File
@@ -0,0 +1,34 @@
class gtUIMergeInputs:
"""
Takes any inputs and merges them.. like strings, but just any inputs instead.
"""
DESCRIPTION = "Merge multiple inputs into one."
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {
"input_1": ("*",),
},
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "create"
CATEGORY = "Griptape/Text"
def create(
self,
**kwargs,
):
concatenated_value = ""
inputs = [value for value in kwargs.values()]
for input in inputs:
concatenated_value += "\n\n" + str(input)
return (concatenated_value,)
+42
View File
@@ -0,0 +1,42 @@
class MergeTexts:
"""
Merge Texts
"""
DESCRIPTION = "Merge multiple strings into one."
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {
"merge_string": ("STRING", {"default": "\\n\\n"}),
"input_1": (
"STRING",
{"multiline": False, "default": "", "forceInput": True},
),
},
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "create"
CATEGORY = "Griptape/Text"
def create(
self,
**kwargs,
):
merged_text = ""
sep = kwargs["merge_string"].replace("\\n", "\n")
del kwargs["merge_string"]
inputs = [value for value in kwargs.values()]
merged_text = sep.join(inputs)
return (merged_text.strip(),)
+34
View File
@@ -0,0 +1,34 @@
class RulesList:
"""
Griptape Lists of Rules
"""
DESCRIPTION = "Combine rules to give an agent a more complex set of rules."
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {
"optional": {
"rules_1": ("RULESET",),
}
}
RETURN_TYPES = ("RULESET",)
RETURN_NAMES = ("RULESET",)
FUNCTION = "create"
CATEGORY = "Griptape/Agent Rules"
def create(self, **kwargs):
# Clear the rule_list
rule_list = []
rules = [value for value in kwargs.values()]
if len(rules) > 0:
for rule in rules:
rule_list.append(rule[0])
# rule_list = [rule[0] for rule in [kwargs.values()] if rule is not None]
return (rule_list,)
+32
View File
@@ -0,0 +1,32 @@
class ToolList:
"""
Griptape Tool List
"""
DESCRIPTION = "Combine tools to give an agent a more complex set of tools."
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {
"optional": {
"tool_1": ("TOOL_LIST",),
}
}
RETURN_TYPES = ("TOOL_LIST",)
RETURN_NAMES = ("TOOL_LIST",)
FUNCTION = "create"
CATEGORY = "Griptape/Agent Tools"
def create(self, **kwargs):
tool_list = []
tools = [value for value in kwargs.values()]
if len(tools) > 0:
for tool in tools:
tool_list.append(tool[0])
return (tool_list,)
View File
-148
View File
@@ -1,148 +0,0 @@
class MergeTexts:
"""
Merge Texts
"""
DESCRIPTION = "Merge multiple strings into one."
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {
"merge_string": ("STRING", {"default": "\\n\\n"}),
"input_1": (
"STRING",
{"multiline": False, "default": "", "forceInput": True},
),
},
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "create"
CATEGORY = "Griptape/Text"
def create(
self,
**kwargs,
):
merged_text = ""
sep = kwargs["merge_string"].replace("\\n", "\n")
del kwargs["merge_string"]
inputs = [value for value in kwargs.values()]
merged_text = sep.join(inputs)
return (merged_text.strip(),)
class gtUIMergeInputs:
"""
Takes any inputs and merges them.. like strings, but just any inputs instead.
"""
DESCRIPTION = "Merge multiple inputs into one."
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {
"input_1": ("*",),
},
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "create"
CATEGORY = "Griptape/Text"
def create(
self,
**kwargs,
):
concatenated_value = ""
inputs = [value for value in kwargs.values()]
for input in inputs:
concatenated_value += "\n\n" + str(input)
return (concatenated_value,)
class RulesList:
"""
Griptape Lists of Rules
"""
DESCRIPTION = "Combine rules to give an agent a more complex set of rules."
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {
"optional": {
"rules_1": ("RULESET",),
}
}
RETURN_TYPES = ("RULESET",)
RETURN_NAMES = ("RULESET",)
FUNCTION = "create"
CATEGORY = "Griptape/Agent Rules"
def create(self, **kwargs):
# Clear the rule_list
rule_list = []
rules = [value for value in kwargs.values()]
if len(rules) > 0:
for rule in rules:
rule_list.append(rule[0])
# rule_list = [rule[0] for rule in [kwargs.values()] if rule is not None]
return (rule_list,)
class ToolList:
"""
Griptape Tool List
"""
DESCRIPTION = "Combine tools to give an agent a more complex set of tools."
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {
"optional": {
"tool_1": ("TOOL_LIST",),
}
}
RETURN_TYPES = ("TOOL_LIST",)
RETURN_NAMES = ("TOOL_LIST",)
FUNCTION = "create"
CATEGORY = "Griptape/Agent Tools"
def create(self, **kwargs):
tool_list = []
tools = [value for value in kwargs.values()]
if len(tools) > 0:
for tool in tools:
tool_list.append(tool[0])
return (tool_list,)
@@ -9,7 +9,7 @@ from griptape.drivers import (
BedrockClaudeImageQueryModelDriver,
)
from .base_config import gtUIBaseConfig
from .BaseConfig import gtUIBaseConfig
amazonBedrockPromptModels = [
"anthropic.claude-3-5-sonnet-20240620-v1:0",
@@ -54,11 +54,6 @@ class gtUIAmazonBedrockStructureConfig(gtUIBaseConfig):
def create(
self,
prompt_model,
image_query_model,
temperature,
seed,
image_generation_driver=None,
**kwargs,
):
prompt_model = kwargs.get("prompt_model", amazonBedrockPromptModels[0])
@@ -66,7 +61,6 @@ class gtUIAmazonBedrockStructureConfig(gtUIBaseConfig):
"image_query_model", amazonBedrockImageQueryModels[0]
)
temperature = kwargs.get("temperature", 0.7)
seed = kwargs.get("seed", 12341)
image_generation_driver = kwargs.get("image_generation_driver", None)
max_attempts = kwargs.get("max_attempts_on_fail", 10)
@@ -9,7 +9,7 @@ from griptape.drivers import (
DummyImageGenerationDriver,
)
from .base_config import gtUIBaseConfig
from .BaseConfig import gtUIBaseConfig
anthropicPromptModels = [
"claude-3-5-sonnet-20240620",
@@ -56,11 +56,6 @@ class gtUIAnthropicStructureConfig(gtUIBaseConfig):
def create(
self,
prompt_model,
image_query_model,
temperature,
seed,
image_generation_driver=DummyImageGenerationDriver(),
**kwargs,
):
prompt_model = kwargs.get("prompt_model", anthropicPromptModels[0])
@@ -68,7 +63,6 @@ class gtUIAnthropicStructureConfig(gtUIBaseConfig):
"image_query_model", anthropicImageQueryModels[0]
)
temperature = kwargs.get("temperature", 0.7)
seed = kwargs.get("seed", 12341)
image_generation_driver = kwargs.get(
"image_generation_driver", DummyImageGenerationDriver()
)
@@ -9,7 +9,7 @@ from griptape.drivers import (
)
from ...py.griptape_config import get_config
from .base_config import gtUIBaseConfig
from .BaseConfig import gtUIBaseConfig
class gtUIAzureOpenAiStructureConfig(gtUIBaseConfig):
@@ -8,7 +8,7 @@ from griptape.drivers import (
GooglePromptDriver,
)
from .base_config import gtUIBaseConfig
from .BaseConfig import gtUIBaseConfig
google_models = [
"gemini-1.5-pro",
@@ -45,7 +45,6 @@ class gtUIGoogleStructureConfig(gtUIBaseConfig):
**kwargs,
):
temperature = kwargs.get("temperature", 0.7)
seed = kwargs.get("seed", 12341)
prompt_model = kwargs.get("prompt_model", google_models[0])
image_generation_driver = kwargs.get(
"image_generation_driver", DummyImageGenerationDriver()
@@ -10,7 +10,7 @@ from griptape.drivers import (
HuggingFaceHubPromptDriver,
)
from .base_config import gtUIBaseConfig
from .BaseConfig import gtUIBaseConfig
load_dotenv()
@@ -9,7 +9,7 @@ from griptape.drivers import (
)
from ..utilities import get_lmstudio_models
from .base_config import gtUIBaseConfig
from .BaseConfig import gtUIBaseConfig
lmstudio_models = get_lmstudio_models(port="1234")
lmstudio_models.append("")
@@ -50,7 +50,6 @@ class gtUILMStudioStructureConfig(gtUIBaseConfig):
base_url = kwargs.get("base_url", lmstudio_base_url)
port = kwargs.get("port", lmstudio_port)
temperature = kwargs.get("temperature", 0.7)
seed = kwargs.get("seed", 12341)
image_generation_driver = kwargs.get(
"image_generation_driver", DummyImageGenerationDriver()
)
@@ -9,7 +9,7 @@ from griptape.drivers import (
)
from ..utilities import get_ollama_models
from .base_config import gtUIBaseConfig
from .BaseConfig import gtUIBaseConfig
ollama_models = get_ollama_models()
ollama_models.append("")
@@ -44,7 +44,6 @@ class gtUIOllamaStructureConfig(gtUIBaseConfig):
temperature = kwargs.get("temperature", 0.7)
base_url = kwargs.get("base_url", ollama_base_url)
port = kwargs.get("port", ollama_port)
seed = kwargs.get("seed", 12341)
image_generation_driver = kwargs.get(
"image_generation_driver", DummyImageGenerationDriver()
@@ -13,7 +13,7 @@ from griptape.drivers import (
OpenAiTextToSpeechDriver,
)
from .base_config import gtUIBaseConfig
from .BaseConfig import gtUIBaseConfig
load_dotenv()
@@ -11,7 +11,7 @@ from griptape.drivers import (
)
from ...py.griptape_config import get_config
from .base_config import gtUIBaseConfig
from .BaseConfig import gtUIBaseConfig
default_prompt_model = "gpt-4o"
default_image_query_model = "gpt-4o"
+35
View File
@@ -0,0 +1,35 @@
from ..tasks.BaseTask import gtUIBaseTask
class AnyType(str):
def __ne__(self, __value: object) -> bool:
return False
any = AnyType("*")
class gtUITextToClipEncode(gtUIBaseTask):
DESCRIPTION = "Convert text to a CLIP conditioning"
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"STRING": ("STRING", {"forceInput": True}),
"clip": ("CLIP",),
},
}
RETURN_TYPES = ("CONDITIONING",)
FUNCTION = "run"
OUTPUT_NODE = True
CATEGORY = "Griptape/Text"
FUNCTION = "encode"
def encode(self, STRING, clip):
tokens = clip.tokenize(STRING)
cond, pooled = clip.encode_from_tokens(tokens, return_pooled=True)
return ([[cond, {"pooled_output": pooled}]],)
+30
View File
@@ -0,0 +1,30 @@
class AnyType(str):
def __ne__(self, __value: object) -> bool:
return False
any = AnyType("*")
class gtUITextToCombo:
DESCRIPTION = "Convert text to a Combo conditioning"
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"STRING": ("STRING", {"forceInput": True}),
},
}
RETURN_TYPES = (any,)
RETURN_NAMES = ("combo",)
FUNCTION = "run"
OUTPUT_NODE = True
CATEGORY = "Griptape/Text"
FUNCTION = "convert"
def convert(self, STRING):
return (STRING,)
View File
+34
View File
@@ -0,0 +1,34 @@
from griptape.artifacts import TextArtifact
class gtUIOutputArtifactNode:
CATEGORY = "Griptape/Display"
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {"INPUT": ("ARTIFACT", {"forceInput": True})},
}
RETURN_TYPES = ("ARTIFACT",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "func"
OUTPUT_NODE = True
def func(self, INPUT=None):
if INPUT:
input_type = type(INPUT)
if isinstance(INPUT, TextArtifact):
to_display = f"{repr(INPUT)}"
else:
to_display = f"{input_type=}"
return {
"ui": {"INPUT": str(to_display)}, # UI message for the frontend
"result": (INPUT,),
}
else:
return {
"ui": {"INPUT": ""},
"result": ("",),
}
+25
View File
@@ -0,0 +1,25 @@
class gtUIOutputDataNode:
NAME = "Griptape Display: Data"
DESCRIPTION = "Display output data."
CATEGORY = "Griptape/Display"
@classmethod
def INPUT_TYPES(s):
return {"required": {}, "optional": {"INPUT": ("*", {"forceInput": True})}}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "func"
OUTPUT_NODE = True
def func(self, INPUT=None):
if INPUT:
return {
"ui": {"INPUT": str(INPUT)}, # UI message for the frontend
"result": (str(INPUT),),
}
else:
return {
"ui": {"INPUT": ""},
"result": ("",),
}
+32
View File
@@ -0,0 +1,32 @@
import random
import folder_paths
from .SaveImageNode import gtUISaveImageNode
# From PreviewImage
class gtUIOutputImageNode(gtUISaveImageNode):
DESCRIPTION = "Display image output."
def __init__(self):
self.output_dir = folder_paths.get_temp_directory()
self.type = "temp"
self.prefix_append = "_temp_" + "".join(
random.choice("abcdefghijklmnopqrstupvxyz") for x in range(5)
)
self.compress_level = 1
CATEGORY = "Griptape/Display"
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {"images": ("IMAGE", {"forceInput": True})},
"hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"},
}
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("OUTPUT",)
OUTPUT_NODE = True
+34
View File
@@ -0,0 +1,34 @@
class gtUIOutputStringNode:
NAME = "Griptape Display: Text"
DESCRIPTION = "Display string output."
CATEGORY = "Griptape/Display"
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {
"INPUT": ("STRING", {"forceInput": True}),
"STRING": ("STRING", {"multiline": True}),
},
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "func"
OUTPUT_NODE = True
def func(self, INPUT=None, STRING=None):
if INPUT is not None:
# Input is connected, use it's value
return {
"ui": {"INPUT": str(INPUT)}, # UI message for the frontend
"result": (str(INPUT),),
}
else:
return {
"ui": {
"STRING": str(STRING) if STRING is not None else "",
},
"result": (str(STRING) if STRING is not None else "",),
}
+49
View File
@@ -0,0 +1,49 @@
import json
import os
import folder_paths
import numpy as np
from comfy.cli_args import args
from PIL import Image
from PIL.PngImagePlugin import PngInfo
from nodes import SaveImage
# From SaveImage
class gtUISaveImageNode(SaveImage):
def save_images(
self, images, filename_prefix="ComfyUI", prompt=None, extra_pnginfo=None
):
filename_prefix += self.prefix_append
full_output_folder, filename, counter, subfolder, filename_prefix = (
folder_paths.get_save_image_path(
filename_prefix, self.output_dir, images[0].shape[1], images[0].shape[0]
)
)
results = list()
for batch_number, image in enumerate(images):
i = 255.0 * image.cpu().numpy()
img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8))
metadata = None
if not args.disable_metadata:
metadata = PngInfo()
if prompt is not None:
metadata.add_text("prompt", json.dumps(prompt))
if extra_pnginfo is not None:
for x in extra_pnginfo:
metadata.add_text(x, json.dumps(extra_pnginfo[x]))
filename_with_batch_num = filename.replace("%batch_num%", str(batch_number))
file = f"{filename_with_batch_num}_{counter:05}_.png"
img.save(
os.path.join(full_output_folder, file),
pnginfo=metadata,
compress_level=self.compress_level,
)
results.append(
{"filename": file, "subfolder": subfolder, "type": self.type}
)
counter += 1
return {"ui": {"images": results}, "result": (images,)}
View File
-174
View File
@@ -1,174 +0,0 @@
import json
import os
import random
import folder_paths
import numpy as np
from comfy.cli_args import args
from griptape.artifacts import TextArtifact
from PIL import Image
from PIL.PngImagePlugin import PngInfo
from nodes import SaveImage
class gtUIOutputArtifactNode:
CATEGORY = "Griptape/Display"
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {"INPUT": ("ARTIFACT", {"forceInput": True})},
}
RETURN_TYPES = ("ARTIFACT",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "func"
OUTPUT_NODE = True
def func(self, INPUT=None):
if INPUT:
input_type = type(INPUT)
if isinstance(INPUT, TextArtifact):
to_display = f"{repr(INPUT)}"
else:
to_display = f"{input_type=}"
return {
"ui": {"INPUT": str(to_display)}, # UI message for the frontend
"result": (INPUT,),
}
else:
return {
"ui": {"INPUT": ""},
"result": ("",),
}
class gtUIOutputStringNode:
NAME = "Griptape Display: Text"
DESCRIPTION = "Display string output."
CATEGORY = "Griptape/Display"
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {
"INPUT": ("STRING", {"forceInput": True}),
"STRING": ("STRING", {"multiline": True}),
},
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "func"
OUTPUT_NODE = True
def func(self, INPUT=None, STRING=None):
if INPUT is not None:
# Input is connected, use it's value
return {
"ui": {"INPUT": str(INPUT)}, # UI message for the frontend
"result": (str(INPUT),),
}
else:
return {
"ui": {
"STRING": str(STRING) if STRING is not None else "",
},
"result": (str(STRING) if STRING is not None else "",),
}
class gtUIOutputDataNode:
NAME = "Griptape Display: Data"
DESCRIPTION = "Display output data."
CATEGORY = "Griptape/Display"
@classmethod
def INPUT_TYPES(s):
return {"required": {}, "optional": {"INPUT": ("*", {"forceInput": True})}}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "func"
OUTPUT_NODE = True
def func(self, INPUT=None):
if INPUT:
return {
"ui": {"INPUT": str(INPUT)}, # UI message for the frontend
"result": (str(INPUT),),
}
else:
return {
"ui": {"INPUT": ""},
"result": ("",),
}
# From SaveImage
class gtUISaveImageNode(SaveImage):
def save_images(
self, images, filename_prefix="ComfyUI", prompt=None, extra_pnginfo=None
):
filename_prefix += self.prefix_append
full_output_folder, filename, counter, subfolder, filename_prefix = (
folder_paths.get_save_image_path(
filename_prefix, self.output_dir, images[0].shape[1], images[0].shape[0]
)
)
results = list()
for batch_number, image in enumerate(images):
i = 255.0 * image.cpu().numpy()
img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8))
metadata = None
if not args.disable_metadata:
metadata = PngInfo()
if prompt is not None:
metadata.add_text("prompt", json.dumps(prompt))
if extra_pnginfo is not None:
for x in extra_pnginfo:
metadata.add_text(x, json.dumps(extra_pnginfo[x]))
filename_with_batch_num = filename.replace("%batch_num%", str(batch_number))
file = f"{filename_with_batch_num}_{counter:05}_.png"
img.save(
os.path.join(full_output_folder, file),
pnginfo=metadata,
compress_level=self.compress_level,
)
results.append(
{"filename": file, "subfolder": subfolder, "type": self.type}
)
counter += 1
return {"ui": {"images": results}, "result": (images,)}
# From PreviewImage
class gtUIOutputImageNode(gtUISaveImageNode):
DESCRIPTION = "Display image output."
def __init__(self):
self.output_dir = folder_paths.get_temp_directory()
self.type = "temp"
self.prefix_append = "_temp_" + "".join(
random.choice("abcdefghijklmnopqrstupvxyz") for x in range(5)
)
self.compress_level = 1
CATEGORY = "Griptape/Display"
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {"images": ("IMAGE", {"forceInput": True})},
"hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"},
}
RETURN_TYPES = ("IMAGE",)
RETURN_NAMES = ("OUTPUT",)
OUTPUT_NODE = True
@@ -0,0 +1,66 @@
from griptape.drivers import (
AmazonBedrockImageGenerationDriver,
BedrockStableDiffusionImageGenerationModelDriver,
)
from .BaseImageDriver import gtUIBaseImageGenerationDriver
class gtUIAmazonBedrockStableDiffusionImageGenerationDriver(
gtUIBaseImageGenerationDriver
):
DESCRIPTION = "Amazon Bedrock Stable Diffusion Image Generation Driver"
@classmethod
def INPUT_TYPES(s):
style_presets = [
"<None>",
"3d-model",
"analog-film",
"anime",
"cinematic",
"comic-book",
"digital-art",
"enhance",
"fantasy-art",
"isometric",
"line-art",
"low-poly",
"modeling-compound",
"neon-punk",
"origami",
"photographic",
"pixel-art",
"tile-texture",
]
inputs = super().INPUT_TYPES()
inputs["optional"].update(
{
"style_preset": (style_presets, {"default": style_presets[4]}),
"width": (
"INT",
{"default": 512, "min": 64, "max": 2048, "step": 64},
),
"height": (
"INT",
{"default": 512, "min": 64, "max": 2048, "step": 64},
),
"seed": ("INT", {"default": 12345}),
}
)
return inputs
def create(self, style_preset, width, height, seed, prompt):
if style_preset == "<None>":
style_preset = None
model_driver = BedrockStableDiffusionImageGenerationModelDriver(
style_preset=style_preset,
)
driver = AmazonBedrockImageGenerationDriver(
image_generation_model_driver=model_driver,
model="stability.stable-diffusion-xl-v1",
image_width=width,
image_height=height,
seed=seed,
)
return (driver,)
@@ -0,0 +1,34 @@
from griptape.drivers import (
AmazonBedrockImageGenerationDriver,
BedrockTitanImageGenerationModelDriver,
)
from .BaseImageDriver import gtUIBaseImageGenerationDriver
class gtUIAmazonBedrockTitanImageGenerationDriver(gtUIBaseImageGenerationDriver):
DESCRIPTION = "Amazon Bedrock Titan Image Generation Driver"
@classmethod
def INPUT_TYPES(s):
sizes = ["512x512", "1024x1024"]
inputs = super().INPUT_TYPES()
inputs["required"].update(
{
"size": (sizes, {"default": sizes[0]}),
"seed": ("INT", {"default": 10342349342}),
}
)
return inputs
def create(self, size, seed, prompt):
width, height = size.split("x")
model_driver = BedrockTitanImageGenerationModelDriver()
driver = AmazonBedrockImageGenerationDriver(
image_generation_model_driver=model_driver,
model="amazon.titan-image-generator-v1",
image_width=int(width),
image_height=int(height),
seed=seed,
)
return (driver,)
@@ -0,0 +1,23 @@
from griptape.drivers import OpenAiAudioTranscriptionDriver
class gtUIBaseAudioTranscriptionDriver:
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {},
}
RETURN_TYPES = ("DRIVER",)
RETURN_NAMES = ("DRIVER",)
FUNCTION = "create"
CATEGORY = "Griptape/Audio Drivers"
def create(
self,
):
driver = OpenAiAudioTranscriptionDriver(model="whisper-1")
return (driver,)
@@ -1,26 +1,4 @@
from griptape.drivers import OpenAiAudioTranscriptionDriver, OpenAiImageGenerationDriver
class gtUIBaseAudioTranscriptionDriver:
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {},
}
RETURN_TYPES = ("DRIVER",)
RETURN_NAMES = ("DRIVER",)
FUNCTION = "create"
CATEGORY = "Griptape/Audio Drivers"
def create(
self,
):
driver = OpenAiAudioTranscriptionDriver(model="whisper-1")
return (driver,)
from griptape.drivers import OpenAiImageGenerationDriver
class gtUIBaseImageGenerationDriver:
@@ -0,0 +1,13 @@
from griptape.drivers import DuckDuckGoWebSearchDriver
from .BaseWebSearchDriver import gtUIBaseWebSearchDriver
class gtUIDuckDuckGoWebSearchDriver(gtUIBaseWebSearchDriver):
DESCRIPTION = "DuckDuckGo Web Search Driver"
def create(
self,
):
driver = DuckDuckGoWebSearchDriver()
return (driver,)
@@ -1,17 +1,7 @@
from griptape.drivers import DuckDuckGoWebSearchDriver, GoogleWebSearchDriver
from griptape.drivers import GoogleWebSearchDriver
from ..py.griptape_config import get_config
from .base_websearch_driver import gtUIBaseWebSearchDriver
class gtUIDuckDuckGoWebSearchDriver(gtUIBaseWebSearchDriver):
DESCRIPTION = "DuckDuckGo Web Search Driver"
def create(
self,
):
driver = DuckDuckGoWebSearchDriver()
return (driver,)
from ...py.griptape_config import get_config
from .BaseWebSearchDriver import gtUIBaseWebSearchDriver
class gtUIGoogleWebSearchDriver(gtUIBaseWebSearchDriver):
+34
View File
@@ -0,0 +1,34 @@
from griptape.drivers import LocalStructureRunDriver
class gtUILocalStructureRunDriver:
def __init__(self):
pass
DESCRIPTION = "Local Structure Run Driver"
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {"agent": ("AGENT", {"forceInput": True, "default": None})},
}
RETURN_TYPES = ("ARTIFACT",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "run"
OUTPUT_NODE = True
CATEGORY = "Griptape/Agent Structures"
def run(
self,
agent=None,
):
if agent:
# Create a local structure function
driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent)
return (driver,)
else:
return None
@@ -0,0 +1,102 @@
from griptape.drivers import (
LeonardoImageGenerationDriver,
)
from ...py.griptape_config import get_config
from .BaseImageDriver import gtUIBaseImageGenerationDriver
leonardo_models = [
{
"name": "default",
"model": "1e60896f-3c26-4296-8ecc-53e2afecc132",
"url": "https://app.leonardo.ai/models/1e60896f-3c26-4296-8ecc-53e2afecc132",
},
{
"name": "Leonardo Anime XL",
"model": "e71a1c2f-4f80-4800-934f-2c68979d8cc8",
"url": "https://app.leonardo.ai/models/e71a1c2f-4f80-4800-934f-2c68979d8cc8",
},
{
"name": "Leonardo Lightning XL",
"model": "b24e16ff-06e3-43eb-8d33-4416c2d75876",
"url": "https://app.leonardo.ai/models/b24e16ff-06e3-43eb-8d33-4416c2d75876",
},
{
"name": "Leonardo Kino XL",
"model": "aa77f04e-3eec-4034-9c07-d0f619684628",
"url": "https://app.leonardo.ai/models/aa77f04e-3eec-4034-9c07-d0f619684628",
},
{
"name": "SDXL 1.0",
"model": "16e7060a-803e-4df3-97ee-edcfa5dc9cc8",
"url": "https://app.leonardo.ai/models/16e7060a-803e-4df3-97ee-edcfa5dc9cc8",
},
{
"name": "Leonardo Vision XL",
"model": "5c232a9e-9061-4777-980a-ddc8e65647c6",
"url": "https://app.leonardo.ai/models/5c232a9e-9061-4777-980a-ddc8e65647c6",
},
{
"name": "AlbedoBase XL",
"model": "2067ae52-33fd-4a82-bb92-c2c55e7d2786",
},
{
"name": "Retro illustrations",
"model": "133a8391-de9e-49e1-aee6-12d375cdef14",
"url": "https://app.leonardo.ai/models133a8391-de9e-49e1-aee6-12d375cdef14",
},
{
"name": "mon prefere artiste",
"model": "bb18b23f-d86e-4280-9a0c-8e7c051e3daf",
"url": "https://app.leonardo.ai/models/bb18b23f-d86e-4280-9a0c-8e7c051e3daf",
},
{
"name": "Watercolor sketch",
"model": "966002a0-9d71-42ca-922d-233a5781dd8c",
"url": "https://app.leonardo.ai/models/966002a0-9d71-42ca-922d-233a5781dd8c",
},
{
"name": "ArchDwg",
"model": "cce5a67f-9f7c-48a7-baf7-bd32c55745f5",
"url": "https://app.leonardo.ai/models/cce5a67f-9f7c-48a7-baf7-bd32c55745f5",
},
]
class gtUILeonardoImageGenerationDriver(gtUIBaseImageGenerationDriver):
DESCRIPTION = (
"Leonardo.AI Image Generation Driver. Learn more at http://leonardo.ai"
)
@classmethod
def INPUT_TYPES(s):
models = []
for model in leonardo_models:
models.append(model["name"])
inputs = super().INPUT_TYPES()
inputs["required"].update(
{
"model": (models, {"default": models[0]}),
"use_custom_model": ("BOOLEAN", {"default": False}),
"custom_model": ("STRING", {"default": ""}),
}
)
return inputs
def get_model_by_name(self, name):
for model in leonardo_models:
if model["name"] == name:
return model["model"]
return None
def create(self, model, prompt, use_custom_model=False, custom_model=""):
if use_custom_model and custom_model != "":
m = custom_model
else:
m = self.get_model_by_name(model)
driver = LeonardoImageGenerationDriver(
api_key=get_config(key="env.LEONARDO_API_KEY", default=None),
model=m,
)
return (driver,)
@@ -1,6 +1,6 @@
from griptape.drivers import OpenAiAudioTranscriptionDriver
from .base_driver import gtUIBaseAudioTranscriptionDriver
from .BaseAudioTranscriptionDriver import gtUIBaseAudioTranscriptionDriver
openAiAudioTranscriptionModels = ["whisper-1"]
@@ -0,0 +1,38 @@
from griptape.drivers import (
OpenAiImageGenerationDriver,
)
from .BaseImageDriver import gtUIBaseImageGenerationDriver
class gtUIOpenAiImageGenerationDriver(gtUIBaseImageGenerationDriver):
DESCRIPTION = "OpenAI Image Generation Driver"
@classmethod
def INPUT_TYPES(s):
models = ["dall-e-3", "dall-e-2"]
sizes = ["256x256", "512x512", "1024x1024", "1024x1792", "1792x1024"]
inputs = super().INPUT_TYPES()
inputs["required"].update(
{
"model": (models, {"default": models[0]}),
"size": (sizes, {"default": sizes[2]}),
}
)
return inputs
def adjust_size_based_on_model(self, model, size):
# pick the approprite size based on the model
if model == "dall-e-2":
if size in ["1024x1792", "1792x1024"]:
size = "1024x1024"
if model == "dall-e-3":
if size in ["256x256", "512x512"]:
size = "1024x1024"
return size
def create(self, model, size, prompt):
size = self.adjust_size_based_on_model(model, size)
driver = OpenAiImageGenerationDriver(model=model, image_size=size)
return (driver,)
View File
-227
View File
@@ -1,227 +0,0 @@
from griptape.drivers import (
AmazonBedrockImageGenerationDriver,
BedrockStableDiffusionImageGenerationModelDriver,
BedrockTitanImageGenerationModelDriver,
LeonardoImageGenerationDriver,
OpenAiImageGenerationDriver,
)
from ..py.griptape_config import get_config
from .base_driver import gtUIBaseImageGenerationDriver
leonardo_models = [
{
"name": "default",
"model": "1e60896f-3c26-4296-8ecc-53e2afecc132",
"url": "https://app.leonardo.ai/models/1e60896f-3c26-4296-8ecc-53e2afecc132",
},
{
"name": "Leonardo Anime XL",
"model": "e71a1c2f-4f80-4800-934f-2c68979d8cc8",
"url": "https://app.leonardo.ai/models/e71a1c2f-4f80-4800-934f-2c68979d8cc8",
},
{
"name": "Leonardo Lightning XL",
"model": "b24e16ff-06e3-43eb-8d33-4416c2d75876",
"url": "https://app.leonardo.ai/models/b24e16ff-06e3-43eb-8d33-4416c2d75876",
},
{
"name": "Leonardo Kino XL",
"model": "aa77f04e-3eec-4034-9c07-d0f619684628",
"url": "https://app.leonardo.ai/models/aa77f04e-3eec-4034-9c07-d0f619684628",
},
{
"name": "SDXL 1.0",
"model": "16e7060a-803e-4df3-97ee-edcfa5dc9cc8",
"url": "https://app.leonardo.ai/models/16e7060a-803e-4df3-97ee-edcfa5dc9cc8",
},
{
"name": "Leonardo Vision XL",
"model": "5c232a9e-9061-4777-980a-ddc8e65647c6",
"url": "https://app.leonardo.ai/models/5c232a9e-9061-4777-980a-ddc8e65647c6",
},
{
"name": "AlbedoBase XL",
"model": "2067ae52-33fd-4a82-bb92-c2c55e7d2786",
},
{
"name": "Retro illustrations",
"model": "133a8391-de9e-49e1-aee6-12d375cdef14",
"url": "https://app.leonardo.ai/models133a8391-de9e-49e1-aee6-12d375cdef14",
},
{
"name": "mon prefere artiste",
"model": "bb18b23f-d86e-4280-9a0c-8e7c051e3daf",
"url": "https://app.leonardo.ai/models/bb18b23f-d86e-4280-9a0c-8e7c051e3daf",
},
{
"name": "Watercolor sketch",
"model": "966002a0-9d71-42ca-922d-233a5781dd8c",
"url": "https://app.leonardo.ai/models/966002a0-9d71-42ca-922d-233a5781dd8c",
},
{
"name": "ArchDwg",
"model": "cce5a67f-9f7c-48a7-baf7-bd32c55745f5",
"url": "https://app.leonardo.ai/models/cce5a67f-9f7c-48a7-baf7-bd32c55745f5",
},
]
class gtUIOpenAiImageGenerationDriver(gtUIBaseImageGenerationDriver):
DESCRIPTION = "OpenAI Image Generation Driver"
@classmethod
def INPUT_TYPES(s):
models = ["dall-e-3", "dall-e-2"]
sizes = ["256x256", "512x512", "1024x1024", "1024x1792", "1792x1024"]
inputs = super().INPUT_TYPES()
inputs["required"].update(
{
"model": (models, {"default": models[0]}),
"size": (sizes, {"default": sizes[2]}),
}
)
return inputs
def adjust_size_based_on_model(self, model, size):
# pick the approprite size based on the model
if model == "dall-e-2":
if size in ["1024x1792", "1792x1024"]:
size = "1024x1024"
if model == "dall-e-3":
if size in ["256x256", "512x512"]:
size = "1024x1024"
return size
def create(self, model, size, prompt):
size = self.adjust_size_based_on_model(model, size)
driver = OpenAiImageGenerationDriver(model=model, image_size=size)
return (driver,)
class gtUILeonardoImageGenerationDriver(gtUIBaseImageGenerationDriver):
DESCRIPTION = (
"Leonardo.AI Image Generation Driver. Learn more at http://leonardo.ai"
)
@classmethod
def INPUT_TYPES(s):
models = []
for model in leonardo_models:
models.append(model["name"])
inputs = super().INPUT_TYPES()
inputs["required"].update(
{
"model": (models, {"default": models[0]}),
"use_custom_model": ("BOOLEAN", {"default": False}),
"custom_model": ("STRING", {"default": ""}),
}
)
return inputs
def get_model_by_name(self, name):
for model in leonardo_models:
if model["name"] == name:
return model["model"]
return None
def create(self, model, prompt, use_custom_model=False, custom_model=""):
if use_custom_model and custom_model != "":
m = custom_model
else:
m = self.get_model_by_name(model)
driver = LeonardoImageGenerationDriver(
api_key=get_config(key="env.LEONARDO_API_KEY", default=None),
model=m,
)
return (driver,)
class gtUIAmazonBedrockStableDiffusionImageGenerationDriver(
gtUIBaseImageGenerationDriver
):
DESCRIPTION = "Amazon Bedrock Stable Diffusion Image Generation Driver"
@classmethod
def INPUT_TYPES(s):
style_presets = [
"<None>",
"3d-model",
"analog-film",
"anime",
"cinematic",
"comic-book",
"digital-art",
"enhance",
"fantasy-art",
"isometric",
"line-art",
"low-poly",
"modeling-compound",
"neon-punk",
"origami",
"photographic",
"pixel-art",
"tile-texture",
]
inputs = super().INPUT_TYPES()
inputs["optional"].update(
{
"style_preset": (style_presets, {"default": style_presets[4]}),
"width": (
"INT",
{"default": 512, "min": 64, "max": 2048, "step": 64},
),
"height": (
"INT",
{"default": 512, "min": 64, "max": 2048, "step": 64},
),
"seed": ("INT", {"default": 12345}),
}
)
return inputs
def create(self, style_preset, width, height, seed, prompt):
if style_preset == "<None>":
style_preset = None
model_driver = BedrockStableDiffusionImageGenerationModelDriver(
style_preset=style_preset,
)
driver = AmazonBedrockImageGenerationDriver(
image_generation_model_driver=model_driver,
model="stability.stable-diffusion-xl-v1",
image_width=width,
image_height=height,
seed=seed,
)
return (driver,)
class gtUIAmazonBedrockTitanImageGenerationDriver(gtUIBaseImageGenerationDriver):
DESCRIPTION = "Amazon Bedrock Titan Image Generation Driver"
@classmethod
def INPUT_TYPES(s):
sizes = ["512x512", "1024x1024"]
inputs = super().INPUT_TYPES()
inputs["required"].update(
{
"size": (sizes, {"default": sizes[0]}),
"seed": ("INT", {"default": 10342349342}),
}
)
return inputs
def create(self, size, seed, prompt):
width, height = size.split("x")
model_driver = BedrockTitanImageGenerationModelDriver()
driver = AmazonBedrockImageGenerationDriver(
image_generation_model_driver=model_driver,
model="amazon.titan-image-generator-v1",
image_width=int(width),
image_height=int(height),
seed=seed,
)
return (driver,)
View File
View File
-229
View File
@@ -1,229 +0,0 @@
from random import randint
from griptape.artifacts import AudioArtifact, ImageArtifact, TextArtifact
from griptape.structures import Pipeline
from griptape.tasks import PromptTask
from .base_structure import gtUIBaseStructure
from .utilities import image_to_comfyui
class AnyType(str):
def __ne__(self, __value: object) -> bool:
return False
any = AnyType("*")
class gtUICreatePipeline(gtUIBaseStructure):
def __init__(self):
pass
DESCRIPTION = "Create a Pipeline."
@classmethod
def INPUT_TYPES(s):
inputs = super().INPUT_TYPES()
inputs["optional"].update({"task_1": ("TASK",)})
del inputs["required"]["STRING"]
del inputs["optional"]["input_string"]
return inputs
RETURN_TYPES = ("STRUCTURE",)
RETURN_NAMES = ("STRUCTURE",)
FUNCTION = "run"
OUTPUT_NODE = False
@classmethod
def IS_CHANGED(s, int_field):
return randint(0, 1000)
def run(
self,
**kwargs,
):
tasks = []
for i, (key, value) in enumerate(kwargs.items()):
if value is not None:
if i == 0:
# append " {{ args[0] }}" to the first task if it's not there.
tasks.append(value)
structure = Pipeline(tasks=tasks)
return (structure,)
class gtUIPipelineAddTask(gtUIBaseStructure):
DESCRIPTION = "Add a task to the end of a pipeline."
@classmethod
def INPUT_TYPES(s):
inputs = super().INPUT_TYPES()
inputs["required"].update({"structure": ("STRUCTURE",)})
inputs["optional"].update(
{
"task": ("TASK", {}),
"append_parent_output": ("BOOLEAN", {"default": True}),
}
)
return inputs
@classmethod
def IS_CHANGED(s, int_field):
return randint(0, 1000)
RETURN_TYPES = ("STRUCTURE",)
RETURN_NAMES = ("STRUCTURE",)
FUNCTION = "run"
# OUTPUT_NODE = Tru
def run(self, **kwargs):
structure = kwargs.get("structure")
append_parent_output = kwargs.get("append_parent_output", True)
task = kwargs.get("task")
if task:
if isinstance(task, PromptTask):
if append_parent_output:
prev_value = task.input.value
task = PromptTask(
"{{ prev_value}}\n\n{{ parent_output }}",
context={"prev_value": prev_value},
)
# print(task.input.value)
# print(type(task.input.value))
# task.prompt = task.prompt.value + "\n\n" + task.input.value
structure.add_task(task)
return (structure,)
class gtUIPipelineInsertTask(gtUIBaseStructure):
DESCRIPTION = "Insert a task into a pipeline."
@classmethod
def INPUT_TYPES(s):
inputs = super().INPUT_TYPES()
inputs["required"].update({"structure": ("STRUCTURE",)})
inputs["optional"].update(
{
"parent_task": ("TASK", {}),
"task": ("TASK", {}),
"append_parent_output": ("BOOLEAN", {"default": True}),
},
)
return inputs
@classmethod
def IS_CHANGED(s, int_field):
return randint(0, 1000)
RETURN_TYPES = ("STRUCTURE",)
RETURN_NAMES = ("STRUCTURE",)
FUNCTION = "run"
# OUTPUT_NODE = True
def run(
self,
**kwargs,
):
structure = kwargs.get("structure")
parent_task = kwargs.get("parent_task")
task = kwargs.get("task")
append_parent_output = kwargs.get("append_parent_output", True)
if task and parent_task:
if isinstance(task, PromptTask):
if append_parent_output:
prev_value = task.input.value
task = PromptTask(
"{{ prev_value}}\n\n{{ parent_output }}",
context={"prev_value": prev_value},
)
# print(task.input.value)
# print(type(task.input.value))
# task.prompt = task.prompt.value + "\n\n" + task.input.value
structure.insert_task(parent_task, task)
return (structure,)
class gtUIRunStructure(gtUIBaseStructure):
def __init__(self):
pass
DESCRIPTION = "Run a Structure."
@classmethod
def INPUT_TYPES(s):
inputs = super().INPUT_TYPES()
inputs["required"].update({"structure": ("STRUCTURE",)})
inputs["optional"].update(
{
"STRING": ("STRING", {"default": "", "multiline": True}),
}
)
return inputs
RETURN_TYPES = (
any,
"STRING",
"STRUCTURE",
)
RETURN_NAMES = (
"OUTPUT",
"TASK_OUTPUTS",
"STRUCTURE",
)
FUNCTION = "run"
OUTPUT_NODE = True
def append_prompt_text(self, structure, prompt_text):
if prompt_text.strip() != "":
# Check and see if the first task has an input
if structure.tasks:
first_task = structure.tasks[0]
if isinstance(first_task.input, TextArtifact):
new_artifact = TextArtifact(
first_task.input.value + "\n\n {{ args[0] }}"
)
first_task.input = new_artifact
structure.tasks[0] = first_task
return structure
def run(self, **kwargs):
STRING = kwargs.get("STRING", "")
structure = kwargs.get("structure")
input_string = kwargs.get("input_string", "")
prompt_text = self.get_prompt_text(STRING, input_string)
# If prompt_text isn't empty, we'll need to add it to the first task if we can.
structure = self.append_prompt_text(structure, prompt_text)
# Run the structure
result = structure.run(prompt_text)
# Handle the results
task_outputs = repr(
[
{"input": task.input.value, "output": task.output.value}
for task in structure.tasks
]
)
# Depending on the type of output, we'll need to adjust it
if isinstance(result.output_task.output, str):
output = result.output_task.output
elif isinstance(result.output_task.output, TextArtifact):
output = result.output_task.output.value
elif isinstance(result.output_task.output, ImageArtifact):
output, output_mask = image_to_comfyui(result.output_task.output.value)
elif isinstance(result.output_task.output, AudioArtifact):
output = type(result.output_task.output)
return (output, task_outputs, structure)
+52
View File
@@ -0,0 +1,52 @@
from random import randint
from griptape.structures import Pipeline
from .BaseStructure import gtUIBaseStructure
class AnyType(str):
def __ne__(self, __value: object) -> bool:
return False
any = AnyType("*")
class gtUICreatePipeline(gtUIBaseStructure):
def __init__(self):
pass
DESCRIPTION = "Create a Pipeline."
@classmethod
def INPUT_TYPES(s):
inputs = super().INPUT_TYPES()
inputs["optional"].update({"task_1": ("TASK",)})
del inputs["required"]["STRING"]
del inputs["optional"]["input_string"]
return inputs
RETURN_TYPES = ("STRUCTURE",)
RETURN_NAMES = ("STRUCTURE",)
FUNCTION = "run"
OUTPUT_NODE = False
@classmethod
def IS_CHANGED(s, int_field):
return randint(0, 1000)
def run(
self,
**kwargs,
):
tasks = []
for i, (key, value) in enumerate(kwargs.items()):
if value is not None:
if i == 0:
# append " {{ args[0] }}" to the first task if it's not there.
tasks.append(value)
structure = Pipeline(tasks=tasks)
return (structure,)
+59
View File
@@ -0,0 +1,59 @@
from random import randint
from griptape.tasks import PromptTask
from .BaseStructure import gtUIBaseStructure
class AnyType(str):
def __ne__(self, __value: object) -> bool:
return False
any = AnyType("*")
class gtUIPipelineAddTask(gtUIBaseStructure):
DESCRIPTION = "Add a task to the end of a pipeline."
@classmethod
def INPUT_TYPES(s):
inputs = super().INPUT_TYPES()
inputs["required"].update({"structure": ("STRUCTURE",)})
inputs["optional"].update(
{
"task": ("TASK", {}),
"append_parent_output": ("BOOLEAN", {"default": True}),
}
)
return inputs
@classmethod
def IS_CHANGED(s, int_field):
return randint(0, 1000)
RETURN_TYPES = ("STRUCTURE",)
RETURN_NAMES = ("STRUCTURE",)
FUNCTION = "run"
# OUTPUT_NODE = Tru
def run(self, **kwargs):
structure = kwargs.get("structure")
append_parent_output = kwargs.get("append_parent_output", True)
task = kwargs.get("task")
if task:
if isinstance(task, PromptTask):
if append_parent_output:
prev_value = task.input.value
task = PromptTask(
"{{ prev_value}}\n\n{{ parent_output }}",
context={"prev_value": prev_value},
)
# print(task.input.value)
# print(type(task.input.value))
# task.prompt = task.prompt.value + "\n\n" + task.input.value
structure.add_task(task)
return (structure,)
+64
View File
@@ -0,0 +1,64 @@
from random import randint
from griptape.tasks import PromptTask
from .BaseStructure import gtUIBaseStructure
class AnyType(str):
def __ne__(self, __value: object) -> bool:
return False
any = AnyType("*")
class gtUIPipelineInsertTask(gtUIBaseStructure):
DESCRIPTION = "Insert a task into a pipeline."
@classmethod
def INPUT_TYPES(s):
inputs = super().INPUT_TYPES()
inputs["required"].update({"structure": ("STRUCTURE",)})
inputs["optional"].update(
{
"parent_task": ("TASK", {}),
"task": ("TASK", {}),
"append_parent_output": ("BOOLEAN", {"default": True}),
},
)
return inputs
@classmethod
def IS_CHANGED(s, int_field):
return randint(0, 1000)
RETURN_TYPES = ("STRUCTURE",)
RETURN_NAMES = ("STRUCTURE",)
FUNCTION = "run"
# OUTPUT_NODE = True
def run(
self,
**kwargs,
):
structure = kwargs.get("structure")
parent_task = kwargs.get("parent_task")
task = kwargs.get("task")
append_parent_output = kwargs.get("append_parent_output", True)
if task and parent_task:
if isinstance(task, PromptTask):
if append_parent_output:
prev_value = task.input.value
task = PromptTask(
"{{ prev_value}}\n\n{{ parent_output }}",
context={"prev_value": prev_value},
)
# print(task.input.value)
# print(type(task.input.value))
# task.prompt = task.prompt.value + "\n\n" + task.input.value
structure.insert_task(parent_task, task)
return (structure,)
+89
View File
@@ -0,0 +1,89 @@
from griptape.artifacts import AudioArtifact, ImageArtifact, TextArtifact
from ..utilities import image_to_comfyui
from .BaseStructure import gtUIBaseStructure
class AnyType(str):
def __ne__(self, __value: object) -> bool:
return False
any = AnyType("*")
class gtUIRunStructure(gtUIBaseStructure):
def __init__(self):
pass
DESCRIPTION = "Run a Structure."
@classmethod
def INPUT_TYPES(s):
inputs = super().INPUT_TYPES()
inputs["required"].update({"structure": ("STRUCTURE",)})
inputs["optional"].update(
{
"STRING": ("STRING", {"default": "", "multiline": True}),
}
)
return inputs
RETURN_TYPES = (
any,
"STRING",
"STRUCTURE",
)
RETURN_NAMES = (
"OUTPUT",
"TASK_OUTPUTS",
"STRUCTURE",
)
FUNCTION = "run"
OUTPUT_NODE = True
def append_prompt_text(self, structure, prompt_text):
if prompt_text.strip() != "":
# Check and see if the first task has an input
if structure.tasks:
first_task = structure.tasks[0]
if isinstance(first_task.input, TextArtifact):
new_artifact = TextArtifact(
first_task.input.value + "\n\n {{ args[0] }}"
)
first_task.input = new_artifact
structure.tasks[0] = first_task
return structure
def run(self, **kwargs):
STRING = kwargs.get("STRING", "")
structure = kwargs.get("structure")
input_string = kwargs.get("input_string", "")
prompt_text = self.get_prompt_text(STRING, input_string)
# If prompt_text isn't empty, we'll need to add it to the first task if we can.
structure = self.append_prompt_text(structure, prompt_text)
# Run the structure
result = structure.run(prompt_text)
# Handle the results
task_outputs = repr(
[
{"input": task.input.value, "output": task.output.value}
for task in structure.tasks
]
)
# Depending on the type of output, we'll need to adjust it
if isinstance(result.output_task.output, str):
output = result.output_task.output
elif isinstance(result.output_task.output, TextArtifact):
output = result.output_task.output.value
elif isinstance(result.output_task.output, ImageArtifact):
output, output_mask = image_to_comfyui(result.output_task.output.value)
elif isinstance(result.output_task.output, AudioArtifact):
output = type(result.output_task.output)
return (output, task_outputs, structure)
View File
@@ -15,7 +15,7 @@ from griptape.tasks import (
from griptape.utils import load_file
from ...py.griptape_config import get_config
from ..base_audio_task import gtUIBaseAudioTask
from .BaseAudioTask import gtUIBaseAudioTask
default_prompt = "{{ input_string }}"
OPENAI_API_KEY = get_config("env.OPENAI_API_KEY")
@@ -4,7 +4,7 @@ import tempfile
import torchaudio
from griptape.drivers import OpenAiAudioTranscriptionDriver
from .tasks.base_task import gtUIBaseTask
from .BaseTask import gtUIBaseTask
class gtUIBaseAudioTask(gtUIBaseTask):
@@ -56,8 +56,6 @@ class gtUIBaseAudioTask(gtUIBaseTask):
return temp_files
def run(self, **kwargs):
audio = kwargs.get("audio", None)
audio_filepath = kwargs.get("audio_filepath", None)
driver = kwargs.get("driver", None)
if not driver:
@@ -1,4 +1,4 @@
from .tasks.base_task import gtUIBaseTask
from .BaseTask import gtUIBaseTask
class gtUIBaseImageTask(gtUIBaseTask):
@@ -4,7 +4,7 @@ from griptape.tasks import (
from ...py.griptape_config import get_config
from ..agent.agent import gtComfyAgent as Agent
from .base_task import gtUIBaseTask
from .BaseTask import gtUIBaseTask
OPENAI_API_KEY = get_config("env.OPENAI_API_KEY")
@@ -8,10 +8,10 @@ from griptape.loaders import ImageLoader
from ...py.griptape_config import get_config
from ..agent.agent import gtComfyAgent as Agent
from ..base_image_task import gtUIBaseImageTask
from ..utilities import (
convert_tensor_to_base_64,
)
from .BaseImageTask import gtUIBaseImageTask
default_prompt = "{{ input_string }}"
OPENAI_API_KEY = get_config("env.OPENAI_API_KEY")
@@ -5,7 +5,7 @@ from schema import Schema
from ...py.griptape_config import get_config
from ..agent.agent import gtComfyAgent as Agent
from .base_task import gtUIBaseTask
from .BaseTask import gtUIBaseTask
OPENAI_API_KEY = get_config("env.OPENAI_API_KEY")
@@ -20,10 +20,10 @@ from griptape.tasks import (
from ...py.griptape_config import get_config
from ..agent.agent import gtComfyAgent as Agent
from ..base_image_task import gtUIBaseImageTask
from ..utilities import (
convert_tensor_to_base_64,
)
from .BaseImageTask import gtUIBaseImageTask
default_prompt = "{{ input_string }}"
OPENAI_API_KEY = get_config("env.OPENAI_API_KEY")
@@ -17,7 +17,7 @@ from ..agent.agent import gtComfyAgent as Agent
from ..utilities import (
image_path_to_output,
)
from .base_task import gtUIBaseTask
from .BaseTask import gtUIBaseTask
default_prompt = "{{ input_string }}"
OPENAI_API_KEY = get_config("env.OPENAI_API_KEY")
@@ -15,11 +15,11 @@ from griptape.tasks import (
from ...py.griptape_config import get_config
from ..agent.agent import gtComfyAgent as Agent
from ..base_image_task import gtUIBaseImageTask
from ..utilities import (
convert_tensor_to_base_64,
image_path_to_output,
)
from .BaseImageTask import gtUIBaseImageTask
default_prompt = "{{ input_string }}"
OPENAI_API_KEY = get_config("env.OPENAI_API_KEY")
@@ -1,5 +1,5 @@
from ...py.griptape_config import get_config
from .base_task import gtUIBaseTask
from .BaseTask import gtUIBaseTask
default_prompt = "{{ input_string }}"
OPENAI_API_KEY = get_config("env.OPENAI_API_KEY")
@@ -4,7 +4,7 @@ from griptape.tasks import (
from ...py.griptape_config import get_config
from ..agent.agent import gtComfyAgent as Agent
from .base_task import gtUIBaseTask
from .BaseTask import gtUIBaseTask
default_prompt = "{{ input_string }}"
OPENAI_API_KEY = get_config("env.OPENAI_API_KEY")
@@ -5,7 +5,7 @@ from griptape.tasks import (
from ...py.griptape_config import get_config
from ..agent.agent import gtComfyAgent as Agent
from .base_task import gtUIBaseTask
from .BaseTask import gtUIBaseTask
default_prompt = "{{ input_string }}"
OPENAI_API_KEY = get_config("env.OPENAI_API_KEY")
@@ -4,7 +4,7 @@ from griptape.tasks import (
from ...py.griptape_config import get_config
from ..agent.agent import gtComfyAgent as Agent
from .base_task import gtUIBaseTask
from .BaseTask import gtUIBaseTask
default_prompt = "{{ input_string }}"
OPENAI_API_KEY = get_config("env.OPENAI_API_KEY")
+31
View File
@@ -0,0 +1,31 @@
from ..tasks.BaseTask import gtUIBaseTask
class AnyType(str):
def __ne__(self, __value: object) -> bool:
return False
any = AnyType("*")
class gtUICLIPTextEncode(gtUIBaseTask):
DESCRIPTION = "Create a text string and convert it to a CLIP conditioning."
@classmethod
def INPUT_TYPES(s):
inputs = super().INPUT_TYPES()
inputs["optional"].update({"clip": ("CLIP",)})
del inputs["optional"]["agent"]
return inputs
RETURN_TYPES = ("CONDITIONING",)
FUNCTION = "encode"
CATEGORY = "Griptape/Text"
def encode(self, STRING, clip, input_string=None):
prompt_text = self.get_prompt_text(STRING, input_string)
tokens = clip.tokenize(prompt_text)
cond, pooled = clip.encode_from_tokens(tokens, return_pooled=True)
return ([[cond, {"pooled_output": pooled}]],)
+34
View File
@@ -0,0 +1,34 @@
class AnyType(str):
def __ne__(self, __value: object) -> bool:
return False
any = AnyType("*")
class gtUIInputStringNode:
NAME = "Griptape Create: Text"
DESCRIPTION = "Create a text string"
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {
"STRING": ("STRING", {"multiline": True, "dynamicPrompts": True})
},
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "run"
OUTPUT_NODE = True
CATEGORY = "Griptape/Text"
def run(self, STRING):
return (STRING,)
View File
-109
View File
@@ -1,109 +0,0 @@
from .tasks.base_task import gtUIBaseTask
class AnyType(str):
def __ne__(self, __value: object) -> bool:
return False
any = AnyType("*")
class gtUIInputStringNode:
NAME = "Griptape Create: Text"
DESCRIPTION = "Create a text string"
def __init__(self):
pass
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {
"STRING": ("STRING", {"multiline": True, "dynamicPrompts": True})
},
}
RETURN_TYPES = ("STRING",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "run"
OUTPUT_NODE = True
CATEGORY = "Griptape/Text"
def run(self, STRING):
return (STRING,)
class gtUITextToCombo:
DESCRIPTION = "Convert text to a Combo conditioning"
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"STRING": ("STRING", {"forceInput": True}),
},
}
RETURN_TYPES = (any,)
RETURN_NAMES = ("combo",)
FUNCTION = "run"
OUTPUT_NODE = True
CATEGORY = "Griptape/Text"
FUNCTION = "convert"
def convert(self, STRING):
return (STRING,)
class gtUITextToClipEncode(gtUIBaseTask):
DESCRIPTION = "Convert text to a CLIP conditioning"
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"STRING": ("STRING", {"forceInput": True}),
"clip": ("CLIP",),
},
}
RETURN_TYPES = ("CONDITIONING",)
FUNCTION = "run"
OUTPUT_NODE = True
CATEGORY = "Griptape/Text"
FUNCTION = "encode"
def encode(self, STRING, clip):
tokens = clip.tokenize(STRING)
cond, pooled = clip.encode_from_tokens(tokens, return_pooled=True)
return ([[cond, {"pooled_output": pooled}]],)
class gtUICLIPTextEncode(gtUIBaseTask):
DESCRIPTION = "Create a text string and convert it to a CLIP conditioning."
@classmethod
def INPUT_TYPES(s):
inputs = super().INPUT_TYPES()
inputs["optional"].update({"clip": ("CLIP",)})
del inputs["optional"]["agent"]
return inputs
RETURN_TYPES = ("CONDITIONING",)
FUNCTION = "encode"
CATEGORY = "Griptape/Text"
def encode(self, STRING, clip, input_string=None):
prompt_text = self.get_prompt_text(STRING, input_string)
tokens = clip.tokenize(prompt_text)
cond, pooled = clip.encode_from_tokens(tokens, return_pooled=True)
return ([[cond, {"pooled_output": pooled}]],)
-205
View File
@@ -1,205 +0,0 @@
import requests
from griptape.drivers import DuckDuckGoWebSearchDriver, OpenAiAudioTranscriptionDriver
from griptape.engines import AudioTranscriptionEngine
from griptape.tools import (
Calculator,
DateTime,
FileManager,
GriptapeCloudKnowledgeBaseClient,
WebScraper,
WebSearch,
)
from griptape.tools.audio_transcription_client.tool import AudioTranscriptionClient
from ..py.griptape_config import get_config
from .base_tool import gtUIBaseTool
class gtUIAudioTranscriptionClient(gtUIBaseTool):
"""
Griptape AudioTranscriptionClient Tool
"""
DESCRIPTION = "Transcribe audio to text"
@classmethod
def INPUT_TYPES(s):
# inputs = super().INPUT_TYPES()
# inputs["optional"].update({"driver": ("DRIVER",)})
# return inputs
return {
"required": {"off_prompt": ("BOOLEAN", {"default": True})},
"optional": {"driver": ("DRIVER", {"default": None})},
}
def create(self, off_prompt, driver=None):
if not driver:
driver = OpenAiAudioTranscriptionDriver(model="whisper-1")
tool = AudioTranscriptionClient(
off_prompt=off_prompt,
engine=AudioTranscriptionEngine(
audio_transcription_driver=driver,
),
)
return ([tool],)
class gtUIFileManager(gtUIBaseTool):
"""
The Griptape File Manager Tool
"""
DESCRIPTION = "Access files on disk."
@classmethod
def INPUT_TYPES(s):
return {
"required": {"off_prompt": ("BOOLEAN", {"default": True})},
}
def create(self, off_prompt, workdir=""):
tool = FileManager(off_prompt=off_prompt)
return ([tool],)
class gtUICalculator(gtUIBaseTool):
"""
The Griptape Calculator Tool
"""
DESCRIPTION = "Perform calculations."
def create(self, off_prompt):
tool = Calculator(off_prompt=off_prompt)
return ([tool],)
class gtUIWebSearch(gtUIBaseTool):
"""
The Griptape Web Search Tool
"""
DESCRIPTION = "Search the web."
@classmethod
def INPUT_TYPES(s):
inputs = super().INPUT_TYPES()
inputs["optional"].update(
{
"driver": ("DRIVER", {"default": None}),
}
)
return inputs
def create(self, off_prompt, driver=None):
if not driver:
driver = DuckDuckGoWebSearchDriver()
tool = WebSearch(
web_search_driver=driver,
off_prompt=off_prompt,
)
return ([tool],)
# class gtUIImageQueryClient(gtUIBaseTool):
# """
# The Griptape Image Query Tool
# """
# def create(self, off_prompt):
# tool = ImageQueryClient(off_prompt=off_prompt)
# return ([tool],)
class gtUIWebScraper(gtUIBaseTool):
"""
The Griptape WebScraper Tool
"""
DESCRIPTION = "Scrape the web for information."
def create(self, off_prompt):
tool = WebScraper(
off_prompt=off_prompt,
)
return ([tool],)
class gtUIDateTime(gtUIBaseTool):
"""
The Griptape DateTime Tool
"""
DESCRIPTION = "Get the current date and time."
def create(self, off_prompt):
tool = DateTime(off_prompt=off_prompt)
return ([tool],)
class gtUIKnowledgeBaseTool(gtUIBaseTool):
"""
The Griptape Knowledge Base Tool
"""
DESCRIPTION = "Access a Griptape Cloud Knowledge Base. Learn more at https://cloud.griptape.ai"
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"off_prompt": ("BOOLEAN", {"default": False}),
"api_key_environment_variable": (
"STRING",
{"default": "GRIPTAPE_API_KEY"},
),
"base_url": ("STRING", {"default": "https://cloud.griptape.ai"}),
"knowledge_base_id": ("STRING", {"default": ""}),
},
}
def getKnowledgeBaseInfo(self, api_key, base_url, knowledge_base_id):
headers = {
"Authorization": f"Bearer {api_key}",
}
try:
response = requests.get(
f"{base_url}/api/knowledge-bases/{knowledge_base_id}", headers=headers
)
except requests.exceptions.RequestException as e:
print(e)
return
# Check if the request was successful
if response.status_code == 200:
# Parse the JSON response
data = response.json()
return data
else:
print(f"Failed to get knowledge base info: {response.status_code}")
def create(
self,
off_prompt,
api_key_environment_variable,
base_url,
knowledge_base_id,
):
api_key = get_config(f"env.{api_key_environment_variable}")
# Use the Griptape API to grab the name and description of the knowledge base
data = self.getKnowledgeBaseInfo(api_key, base_url, knowledge_base_id)
name = data.get("name", "Griptape Knowledge Base")
description = data.get("description", "Contains helpful information")
tool = GriptapeCloudKnowledgeBaseClient(
name=name,
description=description,
off_prompt=off_prompt,
api_key=api_key,
base_url=base_url,
knowledge_base_id=knowledge_base_id,
)
return ([tool],)
+37
View File
@@ -0,0 +1,37 @@
from griptape.drivers import OpenAiAudioTranscriptionDriver
from griptape.engines import AudioTranscriptionEngine
from griptape.tools.audio_transcription_client.tool import AudioTranscriptionClient
from .BaseTool import gtUIBaseTool
class gtUIAudioTranscriptionClient(gtUIBaseTool):
"""
Griptape AudioTranscriptionClient Tool
"""
DESCRIPTION = "Transcribe audio to text"
@classmethod
def INPUT_TYPES(s):
# inputs = super().INPUT_TYPES()
# inputs["optional"].update({"driver": ("DRIVER",)})
# return inputs
return {
"required": {"off_prompt": ("BOOLEAN", {"default": True})},
"optional": {"driver": ("DRIVER", {"default": None})},
}
def create(self, off_prompt, driver=None):
if not driver:
driver = OpenAiAudioTranscriptionDriver(model="whisper-1")
tool = AudioTranscriptionClient(
off_prompt=off_prompt,
engine=AudioTranscriptionEngine(
audio_transcription_driver=driver,
),
)
return ([tool],)
+17
View File
@@ -0,0 +1,17 @@
from griptape.tools import (
Calculator,
)
from .BaseTool import gtUIBaseTool
class gtUICalculator(gtUIBaseTool):
"""
The Griptape Calculator Tool
"""
DESCRIPTION = "Perform calculations."
def create(self, off_prompt):
tool = Calculator(off_prompt=off_prompt)
return ([tool],)
@@ -1,40 +1,7 @@
from griptape.drivers import LocalStructureRunDriver
from griptape.tools import StructureRunClient
from ..base_tool import gtUIBaseTool
class gtUILocalStructureRunDriver:
def __init__(self):
pass
DESCRIPTION = "Local Structure Run Driver"
@classmethod
def INPUT_TYPES(s):
return {
"required": {},
"optional": {"agent": ("AGENT", {"forceInput": True, "default": None})},
}
RETURN_TYPES = ("ARTIFACT",)
RETURN_NAMES = ("OUTPUT",)
FUNCTION = "run"
OUTPUT_NODE = True
CATEGORY = "Griptape/Agent Structures"
def run(
self,
agent=None,
):
if agent:
# Create a local structure function
driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent)
return (driver,)
else:
return None
from .BaseTool import gtUIBaseTool
class gtUIConvertAgentToTool(gtUIBaseTool):
+17
View File
@@ -0,0 +1,17 @@
from griptape.tools import (
DateTime,
)
from .BaseTool import gtUIBaseTool
class gtUIDateTime(gtUIBaseTool):
"""
The Griptape DateTime Tool
"""
DESCRIPTION = "Get the current date and time."
def create(self, off_prompt):
tool = DateTime(off_prompt=off_prompt)
return ([tool],)
+23
View File
@@ -0,0 +1,23 @@
from griptape.tools import (
FileManager,
)
from .BaseTool import gtUIBaseTool
class gtUIFileManager(gtUIBaseTool):
"""
The Griptape File Manager Tool
"""
DESCRIPTION = "Access files on disk."
@classmethod
def INPUT_TYPES(s):
return {
"required": {"off_prompt": ("BOOLEAN", {"default": True})},
}
def create(self, off_prompt, workdir=""):
tool = FileManager(off_prompt=off_prompt)
return ([tool],)
+72
View File
@@ -0,0 +1,72 @@
import requests
from griptape.tools import (
GriptapeCloudKnowledgeBaseClient,
)
from ...py.griptape_config import get_config
from .BaseTool import gtUIBaseTool
class gtUIKnowledgeBaseTool(gtUIBaseTool):
"""
The Griptape Knowledge Base Tool
"""
DESCRIPTION = "Access a Griptape Cloud Knowledge Base. Learn more at https://cloud.griptape.ai"
@classmethod
def INPUT_TYPES(s):
return {
"required": {
"off_prompt": ("BOOLEAN", {"default": False}),
"api_key_environment_variable": (
"STRING",
{"default": "GRIPTAPE_API_KEY"},
),
"base_url": ("STRING", {"default": "https://cloud.griptape.ai"}),
"knowledge_base_id": ("STRING", {"default": ""}),
},
}
def getKnowledgeBaseInfo(self, api_key, base_url, knowledge_base_id):
headers = {
"Authorization": f"Bearer {api_key}",
}
try:
response = requests.get(
f"{base_url}/api/knowledge-bases/{knowledge_base_id}", headers=headers
)
except requests.exceptions.RequestException as e:
print(e)
return
# Check if the request was successful
if response.status_code == 200:
# Parse the JSON response
data = response.json()
return data
else:
print(f"Failed to get knowledge base info: {response.status_code}")
def create(
self,
off_prompt,
api_key_environment_variable,
base_url,
knowledge_base_id,
):
api_key = get_config(f"env.{api_key_environment_variable}")
# Use the Griptape API to grab the name and description of the knowledge base
data = self.getKnowledgeBaseInfo(api_key, base_url, knowledge_base_id)
name = data.get("name", "Griptape Knowledge Base")
description = data.get("description", "Contains helpful information")
tool = GriptapeCloudKnowledgeBaseClient(
name=name,
description=description,
off_prompt=off_prompt,
api_key=api_key,
base_url=base_url,
knowledge_base_id=knowledge_base_id,
)
return ([tool],)
+19
View File
@@ -0,0 +1,19 @@
from griptape.tools import (
WebScraper,
)
from .BaseTool import gtUIBaseTool
class gtUIWebScraper(gtUIBaseTool):
"""
The Griptape WebScraper Tool
"""
DESCRIPTION = "Scrape the web for information."
def create(self, off_prompt):
tool = WebScraper(
off_prompt=off_prompt,
)
return ([tool],)
+33
View File
@@ -0,0 +1,33 @@
from griptape.drivers import DuckDuckGoWebSearchDriver
from griptape.tools import (
WebSearch,
)
from .BaseTool import gtUIBaseTool
class gtUIWebSearch(gtUIBaseTool):
"""
The Griptape Web Search Tool
"""
DESCRIPTION = "Search the web."
@classmethod
def INPUT_TYPES(s):
inputs = super().INPUT_TYPES()
inputs["optional"].update(
{
"driver": ("DRIVER", {"default": None}),
}
)
return inputs
def create(self, off_prompt, driver=None):
if not driver:
driver = DuckDuckGoWebSearchDriver()
tool = WebSearch(
web_search_driver=driver,
off_prompt=off_prompt,
)
return ([tool],)
View File
-30
View File
@@ -129,36 +129,6 @@ def convert_tensor_batch_to_base_64(image_batch):
return None
# def convert_tensor_to_base_64(image):
# if isinstance(image, torch.Tensor):
# # Convert to base64
# print("Converting to base64")
# # Ensure it's on CPU and remove batch dimension if there's one
# if image.dim() == 4 and image.shape[0] == 1:
# image = image.squeeze(0) # Removes batch dimension if it's 1
# # Permute the dimensions if necessary (from C, H, W to H, W, C)
# if image.shape[0] < image.shape[2]: # Assuming channel-first ordering
# image = image.permute(1, 2, 0) # Change to (Height, Width, Channels)
# # Scale to 0-255 and convert to uint8
# image = (255.0 * image).clamp(0, 255).numpy().astype(np.uint8)
# # Create PIL Image from array
# img = Image.fromarray(image)
# # Save the image to a buffer
# buffer = BytesIO()
# img.save(buffer, format="PNG")
# # Encode to base64
# final_image = base64.b64encode(buffer.getvalue()).decode("utf-8")
# print("Base64 Conversion Successful")
# return final_image
# else:
# return None
def convert_tensor_to_base_64(image):
if not isinstance(image, torch.Tensor):
raise TypeError("Input must be a PyTorch tensor")