diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..e2af6bb --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,52 @@ +name: Create Release with Changelog + +on: + push: + branches: + - main + +jobs: + create-release: + name: Create Release + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install poetry + + - name: Read version from pyproject.toml + id: get_version + run: | + VERSION=$(poetry version -s) + echo "version=$VERSION" >> $GITHUB_ENV + + - name: Install Changelog Generator + run: | + sudo apt-get install ruby-full + gem install github_changelog_generator + + - name: Generate Changelog + run: | + github_changelog_generator --user --project --token ${{ secrets.GITHUB_TOKEN }} + + - name: Create GitHub Release + uses: actions/create-release@v1 + with: + tag_name: "v${{ env.version }}" + release_name: "v${{ env.version }}" + body: | + $(cat CHANGELOG.md) + draft: false + prerelease: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2b54128 --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +.PHONY: check +check: check/format check/lint check/types check/spell ## Run all checks. + +.PHONY: check/format +check/format: + @poetry run ruff format --check + +.PHONY: check/lint +check/lint: + @poetry run ruff check + +.PHONY: check/types +check/types: + @poetry run pyright + +.PHONY: check/spell +check/spell: + @poetry run typos \ No newline at end of file diff --git a/README.md b/README.md index c1f5ffc..867ec57 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,9 @@ You can previous and download more examples [here](examples/README.md). ### Dec 31, 2024 * Removed manual version tracking in versions.js and now pulling the information from the `pyproject.toml`. To see what version you're running, choose RMB -> Griptape and look at the `Version` information. - + * Removed `griptape_config.py` as it's no longer being used + * Added testing to catch spelling, type, and other errors. _Note_: This was a massive effort - hopefully it didn't introduce any errors. + ### Dec 27, 2024 * Fixed missing classmethod for OllamaPromptDriver @@ -182,7 +184,7 @@ You can previous and download more examples [here](examples/README.md). * Upgrade to Griptape Framework v0.34.1 * Fix to `WebScraperTool` provides better results when using `off_prompt`. * Fixed bug where urls were dropping any text after the `:`. Example: "What is https://griptape.ai" was being converted to "What is https:". This is due to the `dynamicprompt` functionality of ComfyUI, so I've disabled that. -* Added context string to all BOOLEAN parameters to give the user a better idea as to what the particular boolean option does. For example, intead of just `True` or `False`, the tools now explain `off_prompt`. +* Added context string to all BOOLEAN parameters to give the user a better idea as to what the particular boolean option does. For example, instead of just `True` or `False`, the tools now explain `off_prompt`. ![WebsScraper tool with off_prompt](docs/images/off_prompt_parameter.png) @@ -248,7 +250,7 @@ You can previous and download more examples [here](examples/README.md). ![alt text](docs/images/release_030_2_config_nodes.png) -* Old `Griptape Agent Config` nodes still exist, but have been deprecated. They will be removed in a future release. Old workflows should automatically display the older nodes as deprecated. It's **highly recommended** to replace these old nodes with the new ones. I have tried to minimize breaking nodes, but if some may exist. I appologize for this if it happens. +* Old `Griptape Agent Config` nodes still exist, but have been deprecated. They will be removed in a future release. Old workflows should automatically display the older nodes as deprecated. It's **highly recommended** to replace these old nodes with the new ones. I have tried to minimize breaking nodes, but if some may exist. I apologize for this if it happens. ![alt text](docs/images/config_deprecated.png) @@ -347,11 +349,11 @@ You can previous and download more examples [here](examples/README.md). * **Drivers** * **Prompt Drivers** - Unique chat prompt drivers for `AmazonBedrock`, `Cohere`, `HuggingFace`, `Google`, `Ollama`, `LMStudio`, `Azure OpenAi`, `OpenAi`, `OpenAiCompatible` * **Image Generation Drivers** - These all existed before, but adding here for visibility: `Amazon Bedrock Stable Diffusion`, `Amazon Bedrock Titan`, `Leonardo AI`, `Azure OpenAi`, `OpenAi` - * **Embedding Drivers** - Agents can use these for generating embeddings, allowing them to extract relevant chunks of data from text. `Azure OpenAi`, `Voyage Ai`, `Cohere`, `Google`, `OpenAi`, `OpenAi compatable` + * **Embedding Drivers** - Agents can use these for generating embeddings, allowing them to extract relevant chunks of data from text. `Azure OpenAi`, `Voyage Ai`, `Cohere`, `Google`, `OpenAi`, `OpenAi compatible` * **Vector Store Drivers** - Allows agents to access Vector Stores to query data: ``Azure MongoDB`, `PGVector`, `Pinecone`, `Amazon OpenSearch`, `Qdrant`, `MongoDB Atlas`, `Redis`, `Local Vector Store` * **Text To Speech Drivers** - Gives agents the ability to convert text to speech. `OpenAi`, `ElevenLabs` * **Audio Transcription Driver** - Gives agents the ability to transcribe audio. `OpenAi` - * re-fixed spelling of Compatable to Compatible, because it's a common mistake. :) + * re-fixed spelling of `Compatible`, because it's a common mistake. :) * **Vector Store** - New Vector Store nodes - `Vector Store Add Text`, `Vector Store Query`, and `Griptape Tool: VectorStore` to allow you to work with various Vector Stores @@ -377,7 +379,7 @@ You can previous and download more examples [here](examples/README.md). ### July 12, 2024 * Updated to Griptape v0.28.2 -* **New Node** Griptape Config: OpenAI Compatible node. Allows you to connect to services like https://www.ohmygpt.com/ which are compatable with OpenAi's api. +* **New Node** Griptape Config: OpenAI Compatible node. Allows you to connect to services like https://www.ohmygpt.com/ which are compatible with OpenAi's api. * **New Node** HuggingFace Prompt Driver Config * Reorganized a few files * Removed unused DuckDuckGoTool now that Griptape supports drivers. diff --git a/__init__.py b/__init__.py index 50ff1b5..45b3a18 100644 --- a/__init__.py +++ b/__init__.py @@ -5,8 +5,6 @@ @description: This extension offers various nodes that allow you to work with LLMs using the Griptape Python Framework (https://griptape.ai) """ -import os - from dotenv import load_dotenv # AGENT @@ -25,31 +23,30 @@ from .nodes.combine.RulesList import RulesList from .nodes.combine.ToolList import ToolList # CONFIG -from .nodes.config.depricated.gtUIAmazonBedrockStructureConfig import ( +from .nodes.config.deprecated.gtUIAmazonBedrockStructureConfig import ( gtUIAmazonBedrockStructureConfig, ) -# CONFIG - DEPRICATED -from .nodes.config.depricated.gtUIAnthropicStructureConfig import ( +# CONFIG - DEPRECATED +from .nodes.config.deprecated.gtUIAnthropicStructureConfig import ( gtUIAnthropicStructureConfig, ) -from .nodes.config.depricated.gtUIAzureOpenAiStructureConfig import ( +from .nodes.config.deprecated.gtUIAzureOpenAiStructureConfig import ( gtUIAzureOpenAiStructureConfig, ) -from .nodes.config.depricated.gtUIGoogleStructureConfig import gtUIGoogleStructureConfig -from .nodes.config.depricated.gtUIHuggingFaceStructureConfig import ( +from .nodes.config.deprecated.gtUIGoogleStructureConfig import gtUIGoogleStructureConfig +from .nodes.config.deprecated.gtUIHuggingFaceStructureConfig import ( gtUIHuggingFaceStructureConfig, ) -from .nodes.config.depricated.gtUILMStudioStructureConfig import ( +from .nodes.config.deprecated.gtUILMStudioStructureConfig import ( gtUILMStudioStructureConfig, ) -from .nodes.config.depricated.gtUIOllamaStructureConfig import gtUIOllamaStructureConfig -from .nodes.config.depricated.gtUIOpenAiCompatibleConfig import ( +from .nodes.config.deprecated.gtUIOllamaStructureConfig import gtUIOllamaStructureConfig +from .nodes.config.deprecated.gtUIOpenAiCompatibleConfig import ( gtUIOpenAiCompatibleConfig, ) -from .nodes.config.depricated.gtUIOpenAiStructureConfig import gtUIOpenAiStructureConfig +from .nodes.config.deprecated.gtUIOpenAiStructureConfig import gtUIOpenAiStructureConfig from .nodes.config.gtUIAmazonBedrockDriversConfig import gtUIAmazonBedrockDriversConfig -from .nodes.config.gtUIAmazonBedrockSession import gtUIAmazonBedrockSession from .nodes.config.gtUIAnthropicDriversConfig import gtUIAnthropicDriversConfig from .nodes.config.gtUIAzureOpenAiDriversConfig import gtUIAzureOpenAiDriversConfig from .nodes.config.gtUICohereDriversConfig import gtUICohereDriversConfig @@ -253,7 +250,6 @@ from .nodes.tasks.gtUIInpaintingImageGenerationTask import ( from .nodes.tasks.gtUIParallelImageQueryTask import gtUIParallelImageQueryTask from .nodes.tasks.gtUIPromptImageGenerationTask import gtUIPromptImageGenerationTask from .nodes.tasks.gtUIPromptImageVariationTask import gtUIPromptImageVariationTask -from .nodes.tasks.gtUIPromptTask import gtUIPromptTask # TASKS # - Agent @@ -263,10 +259,6 @@ from .nodes.tasks.gtUITask import gtUITask from .nodes.tasks.gtUITextSummaryTask import gtUITextSummaryTask from .nodes.tasks.gtUITextToSpeechTask import gtUITextToSpeechTask -# - Tool -from .nodes.tasks.gtUIToolkitTask import gtUIToolkitTask -from .nodes.tasks.gtUIToolTask import gtUIToolTask - # - Vector Store from .nodes.tasks.gtUIVectorStoreQueryTask import gtUIVectorStoreQueryTask from .nodes.tasks.gtUIVectorStoreUpsertTextTask import gtUIVectorStoreUpsertTextTask @@ -296,7 +288,6 @@ from .nodes.tools.gtUIWebSearch import gtUIWebSearch from .nodes.utils.gtUICreateAgentModelfile import gtUICreateAgentModelfile from .nodes.utils.gtUICreateModelFromModelfile import gtUICreateModelFromModelfile from .nodes.utils.gtUIRemoveOllamaModel import gtUIRemoveOllamaModel -from .py.griptape_settings import GriptapeSettings # Load existing environment variables load_dotenv() @@ -319,7 +310,6 @@ NODE_CLASS_MAPPINGS = { # "Griptape Run: Prompt Task": gtUIPromptTask, # "Griptape Run: Tool Task": gtUIToolTask, # "Griptape Run: Toolkit Task": gtUIToolkitTask, - # "Gt Run Agent": gtUIRunAgent, "Griptape Expand: Agent Nodes": ExpandAgent, "Griptape Set: Default Agent": gtUISetDefaultAgent, # AGENT CONFIG @@ -336,16 +326,16 @@ NODE_CLASS_MAPPINGS = { "Griptape Agent Config: Ollama Drivers": gtUIOllamaDriversConfig, "Griptape Agent Config: OpenAI Drivers": gtUIOpenAiDriversConfig, "Griptape Agent Config: OpenAI Compatible Drivers": gtUIOpenAiCompatibleDriversConfig, - # DEPRICATED - "Griptape Agent Config: Amazon Bedrock [DEPRICATED]": gtUIAmazonBedrockStructureConfig, - "Griptape Agent Config: Anthropic [DEPRICATED]": gtUIAnthropicStructureConfig, - "Griptape Agent Config: Azure OpenAI [DEPRICATED]": gtUIAzureOpenAiStructureConfig, - "Griptape Agent Config: Google [DEPRICATED]": gtUIGoogleStructureConfig, - "Griptape Agent Config: HuggingFace [DEPRICATED]": gtUIHuggingFaceStructureConfig, - "Griptape Agent Config: LM Studio [DEPRICATED]": gtUILMStudioStructureConfig, - "Griptape Agent Config: Ollama [DEPRICATED]": gtUIOllamaStructureConfig, - "Griptape Agent Config: OpenAI [DEPRICATED]": gtUIOpenAiStructureConfig, - "Griptape Agent Config: OpenAI Compatible [DEPRICATED]": gtUIOpenAiCompatibleConfig, + # DEPRECATED + "Griptape Agent Config: Amazon Bedrock [DEPRECATED]": gtUIAmazonBedrockStructureConfig, + "Griptape Agent Config: Anthropic [DEPRECATED]": gtUIAnthropicStructureConfig, + "Griptape Agent Config: Azure OpenAI [DEPRECATED]": gtUIAzureOpenAiStructureConfig, + "Griptape Agent Config: Google [DEPRECATED]": gtUIGoogleStructureConfig, + "Griptape Agent Config: HuggingFace [DEPRECATED]": gtUIHuggingFaceStructureConfig, + "Griptape Agent Config: LM Studio [DEPRECATED]": gtUILMStudioStructureConfig, + "Griptape Agent Config: Ollama [DEPRECATED]": gtUIOllamaStructureConfig, + "Griptape Agent Config: OpenAI [DEPRECATED]": gtUIOpenAiStructureConfig, + "Griptape Agent Config: OpenAI Compatible [DEPRECATED]": gtUIOpenAiCompatibleConfig, # PROMPT DRIVER "Griptape Prompt Driver: Amazon Bedrock": gtUIAmazonBedrockPromptDriver, "Griptape Prompt Driver: Amazon SageMaker Jumpstart": gtUIAmazonSageMakerJumpstartPromptDriver, @@ -405,12 +395,6 @@ NODE_CLASS_MAPPINGS = { "Griptape Create: Rules": gtUIRule, "Griptape Combine: Rules List": RulesList, "Griptape Replace: Rulesets on Agent": gtUIReplaceRulesetsOnAgent, - # TASKS - # # STRUCTURES - # "Griptape Create: Pipeline": gtUICreatePipeline, - # "Griptape Run: Structure": gtUIRunStructure, - # "Griptape Pipeline: Add Task": gtUIPipelineAddTask, - # "Griptape Pipeline: Insert Task": gtUIPipelineInsertTask, # AGENT TOOLS "Griptape Convert: Agent to Tool": gtUIConvertAgentToTool, "Griptape Combine: Tool List": ToolList, diff --git a/examples/README.md b/examples/README.md index a929eb8..26ffc16 100644 --- a/examples/README.md +++ b/examples/README.md @@ -57,7 +57,7 @@ This example demonstrates how to use a local model (`llama3.1` in this case) to Download: [OffPrompt.json](OffPromopt.json) ## RAG (Retrieval Augmented Generation) -Use Retrieval Augmented Generation to have more control over the data your agents can query. Check out this example which demonstrates multiple data sources, reranking results, and controling the responses. +Use Retrieval Augmented Generation to have more control over the data your agents can query. Check out this example which demonstrates multiple data sources, reranking results, and controlling the responses. ![RAG](retrieval_augmented_generation.png) Download: [retrieval_augmented_generation.json](retrieval_augmented_generation.json) \ No newline at end of file diff --git a/js/ColorNodes.js b/js/ColorNodes.js index d687b72..bdebeff 100644 --- a/js/ColorNodes.js +++ b/js/ColorNodes.js @@ -63,7 +63,7 @@ export function setupNodeColors(nodeType, nodeData) { applyColor(this, nodeColors.red); } - if (nodeData.name.includes("[DEPRICATED]")){ + if (nodeData.name.includes("[DEPRECATED]")){ applyColor(this, nodeColors.yellow) } diff --git a/js/gtUIUtils.js b/js/gtUIUtils.js index 314584d..87ddcdc 100644 --- a/js/gtUIUtils.js +++ b/js/gtUIUtils.js @@ -67,7 +67,7 @@ export function formatPythonLikeObject(text) { export function chainCallback(object, property, callback) { if (object == undefined) { - console.error("Tried to add callback to non-existant object") + console.error("Tried to add callback to non-existent object") return; } if (property in object) { diff --git a/js/nodeFixes.js b/js/nodeFixes.js index c4c0294..ce81844 100644 --- a/js/nodeFixes.js +++ b/js/nodeFixes.js @@ -62,24 +62,42 @@ export const nodeFixes = { "Griptape Driver: Qdrant Vector Store": "Griptape Vector Store Driver: Qdrant", "Griptape Driver: DuckDuckGo WebSearch": "Griptape WebSearch Driver: DuckDuckGo", "Griptape Driver: Google WebSearch": "Griptape WebSearch Driver: Google", - "Griptape Agent Config: Amazon Bedrock [DEPRECIATED]": "Griptape Agent Config: Amazon Bedrock [DEPRICATED]", - "Griptape Agent Config: Anthropic [DEPRECIATED]": "Griptape Agent Config: Anthropic [DEPRICATED]", - "Griptape Agent Config: Azure OpenAI [DEPRECIATED]": "Griptape Agent Config: Azure OpenAI [DEPRICATED]", - "Griptape Agent Config: Google [DEPRECIATED]": "Griptape Agent Config: Google [DEPRICATED]", - "Griptape Agent Config: HuggingFace [DEPRECIATED]": "Griptape Agent Config: HuggingFace [DEPRICATED]", - "Griptape Agent Config: LM Studio [DEPRECIATED]": "Griptape Agent Config: LM Studio [DEPRICATED]", - "Griptape Agent Config: Ollama [DEPRECIATED]": "Griptape Agent Config: Ollama [DEPRICATED]", - "Griptape Agent Config: OpenAI Compatible [DEPRECIATED]": "Griptape Agent Config: OpenAI Compatible [DEPRICATED]", - "Griptape Agent Config: OpenAI [DEPRECIATED]": "Griptape Agent Config: OpenAI [DEPRICATED]", - "Griptape Agent Config: Amazon Bedrock": "Griptape Agent Config: Amazon Bedrock [DEPRICATED]", - "Griptape Agent Config: Anthropic": "Griptape Agent Config: Anthropic [DEPRICATED]", - "Griptape Agent Config: Azure OpenAI": "Griptape Agent Config: Azure OpenAI [DEPRICATED]", - "Griptape Agent Config: Google": "Griptape Agent Config: Google [DEPRICATED]", - "Griptape Agent Config: HuggingFace": "Griptape Agent Config: HuggingFace [DEPRICATED]", - "Griptape Agent Config: LM Studio": "Griptape Agent Config: LM Studio [DEPRICATED]", - "Griptape Agent Config: Ollama": "Griptape Agent Config: Ollama [DEPRICATED]", - "Griptape Agent Config: OpenAI Compatible": "Griptape Agent Config: OpenAI Compatible [DEPRICATED]", - "Griptape Agent Config: OpenAI": "Griptape Agent Config: OpenAI [DEPRICATED]", + "Griptape Agent Config: Amazon Bedrock [DEPRECIATED]": "Griptape Agent Config: Amazon Bedrock [DEPRECATED]", + "Griptape Agent Config: Anthropic [DEPRECIATED]": "Griptape Agent Config: Anthropic [DEPRECATED]", + "Griptape Agent Config: Azure OpenAI [DEPRECIATED]": "Griptape Agent Config: Azure OpenAI [DEPRECATED]", + "Griptape Agent Config: Google [DEPRECIATED]": "Griptape Agent Config: Google [DEPRECATED]", + "Griptape Agent Config: HuggingFace [DEPRECIATED]": "Griptape Agent Config: HuggingFace [DEPRECATED]", + "Griptape Agent Config: LM Studio [DEPRECIATED]": "Griptape Agent Config: LM Studio [DEPRECATED]", + "Griptape Agent Config: Ollama [DEPRECIATED]": "Griptape Agent Config: Ollama [DEPRECATED]", + "Griptape Agent Config: OpenAI Compatible [DEPRECIATED]": "Griptape Agent Config: OpenAI Compatible [DEPRECATED]", + "Griptape Agent Config: OpenAI [DEPRECIATED]": "Griptape Agent Config: OpenAI [DEPRECATED]", + "Griptape Agent Config: Amazon Bedrock": "Griptape Agent Config: Amazon Bedrock [DEPRECATED]", + "Griptape Agent Config: Anthropic": "Griptape Agent Config: Anthropic [DEPRECATED]", + "Griptape Agent Config: Azure OpenAI": "Griptape Agent Config: Azure OpenAI [DEPRECATED]", + "Griptape Agent Config: Google": "Griptape Agent Config: Google [DEPRECATED]", + "Griptape Agent Config: HuggingFace": "Griptape Agent Config: HuggingFace [DEPRECATED]", + "Griptape Agent Config: LM Studio": "Griptape Agent Config: LM Studio [DEPRECATED]", + "Griptape Agent Config: Ollama": "Griptape Agent Config: Ollama [DEPRECATED]", + "Griptape Agent Config: OpenAI Compatible": "Griptape Agent Config: OpenAI Compatible [DEPRECATED]", + "Griptape Agent Config: OpenAI": "Griptape Agent Config: OpenAI [DEPRECATED]", + "Griptape Agent Config: Amazon Bedrock [DEPRICATED]": "Griptape Agent Config: Amazon Bedrock [DEPRECATED]", + "Griptape Agent Config: Anthropic [DEPRICATED]": "Griptape Agent Config: Anthropic [DEPRECATED]", + "Griptape Agent Config: Azure OpenAI [DEPRICATED]": "Griptape Agent Config: Azure OpenAI [DEPRECATED]", + "Griptape Agent Config: Google [DEPRICATED]": "Griptape Agent Config: Google [DEPRECATED]", + "Griptape Agent Config: HuggingFace [DEPRICATED]": "Griptape Agent Config: HuggingFace [DEPRECATED]", + "Griptape Agent Config: LM Studio [DEPRICATED]": "Griptape Agent Config: LM Studio [DEPRECATED]", + "Griptape Agent Config: Ollama [DEPRICATED]": "Griptape Agent Config: Ollama [DEPRECATED]", + "Griptape Agent Config: OpenAI Compatible [DEPRICATED]": "Griptape Agent Config: OpenAI Compatible [DEPRECATED]", + "Griptape Agent Config: OpenAI [DEPRICATED]": "Griptape Agent Config: OpenAI [DEPRECATED]", + "Griptape Agent Config: Amazon Bedrock [DEPRICATED]": "Griptape Agent Config: Amazon Bedrock [DEPRECATED]", + "Griptape Agent Config: Anthropic [DEPRICATED]" : "Griptape Agent Config: Anthropic [DEPRECATED]", + "Griptape Agent Config: Azure OpenAI [DEPRICATED]" : "Griptape Agent Config: Azure OpenAI [DEPRECATED]", + "Griptape Agent Config: Google [DEPRICATED]" : "Griptape Agent Config: Google [DEPRECATED]", + "Griptape Agent Config: HuggingFace [DEPRICATED]" : "Griptape Agent Config: HuggingFace [DEPRECATED]", + "Griptape Agent Config: LM Studio [DEPRICATED]" : "Griptape Agent Config: LM Studio [DEPRECATED]", + "Griptape Agent Config: Ollama [DEPRICATED]" : "Griptape Agent Config: Ollama [DEPRECATED]", + "Griptape Agent Config: OpenAI Compatible [DEPRICATED]" : "Griptape Agent Config: OpenAI Compatible [DEPRECATED]", + "Griptape Agent Config: OpenAI [DEPRICATED]" : "Griptape Agent Config: OpenAI [DEPRECATED]", "Griptape Vector Store Driver: Griptape Cloud KnowledgeBase": "Griptape Vector Store Driver: Griptape Cloud" } } \ No newline at end of file diff --git a/nodes/Separator.py b/nodes/Separator.py index e5c9bdd..d84efe3 100644 --- a/nodes/Separator.py +++ b/nodes/Separator.py @@ -1,6 +1,6 @@ class Separator: @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return {"required": {}} RETURN_TYPES = () diff --git a/nodes/agent/BaseAgent.py b/nodes/agent/BaseAgent.py index 46dd6ba..4ce74a0 100644 --- a/nodes/agent/BaseAgent.py +++ b/nodes/agent/BaseAgent.py @@ -1,3 +1,5 @@ +# pyright: reportMissingImports=false + import logging from comfy_execution.graph import ExecutionBlocker @@ -29,7 +31,7 @@ class BaseAgent: self.agent = None @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": { @@ -106,8 +108,9 @@ class BaseAgent: # See if there's an additional attribute on the RagTool if hasattr(tool, "use_rules"): # if it's true, get the ruleset - if tool.use_rules: - return tool.ruleset + if getattr(tool, "use_rules", False): + ruleset = getattr(tool, "ruleset", None) + return ruleset return None def tool_check(self, config, tools): diff --git a/nodes/agent/RunAgent.py b/nodes/agent/RunAgent.py index b837fee..b016e72 100644 --- a/nodes/agent/RunAgent.py +++ b/nodes/agent/RunAgent.py @@ -6,7 +6,7 @@ class RunAgent(BaseAgent): DESCRIPTION = "Run a simple Griptape Agent" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() del inputs["optional"]["config"] del inputs["optional"]["tools"] @@ -34,7 +34,6 @@ class RunAgent(BaseAgent): prompt_text = STRING else: prompt_text = STRING + "\n\n" + input_string - tools = self.agent.tools # if len(tools) > 0: # self.agent.add_task(ToolkitTask(prompt_text, tools=tools)) # else: diff --git a/nodes/agent/gtUICreateAgentFromConfig.py b/nodes/agent/gtUICreateAgentFromConfig.py index ec9d4fb..754e41d 100644 --- a/nodes/agent/gtUICreateAgentFromConfig.py +++ b/nodes/agent/gtUICreateAgentFromConfig.py @@ -11,7 +11,7 @@ class gtUICreateAgentFromConfig(BaseAgent): self.agent = None @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() del inputs["optional"]["tools"] del inputs["optional"]["rulesets"] diff --git a/nodes/agent/gtUIReplaceRulesetsOnAgent.py b/nodes/agent/gtUIReplaceRulesetsOnAgent.py index 9b122e4..032baa1 100644 --- a/nodes/agent/gtUIReplaceRulesetsOnAgent.py +++ b/nodes/agent/gtUIReplaceRulesetsOnAgent.py @@ -19,7 +19,7 @@ class gtUIReplaceRulesetsOnAgent(BaseAgent): self.agent = None @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": { diff --git a/nodes/agent/gtUIReplaceToolsOnAgent.py b/nodes/agent/gtUIReplaceToolsOnAgent.py index 15c3b56..e792444 100644 --- a/nodes/agent/gtUIReplaceToolsOnAgent.py +++ b/nodes/agent/gtUIReplaceToolsOnAgent.py @@ -19,7 +19,7 @@ class gtUIReplaceToolsOnAgent(BaseAgent): self.agent = None @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": { diff --git a/nodes/agent/gtUIRunAgent.py b/nodes/agent/gtUIRunAgent.py deleted file mode 100644 index fcf29cd..0000000 --- a/nodes/agent/gtUIRunAgent.py +++ /dev/null @@ -1,142 +0,0 @@ -from griptape.tasks import PromptTask, TextSummaryTask, ToolkitTask, ToolTask -from openai import OpenAIError - -# from server import PromptServer -from .gtComfyAgent import gtComfyAgent - -default_prompt = "{{ input_string }}" -max_attempts_default = 10 - - -class AnyType(str): - def __ne__(self, __value: object) -> bool: - return False - - -any = AnyType("*") - - -run_types = ["Default", "Prompt", "Tool(s)", "Summarize"] - - -class gtUIRunAgent: - """ - Run a Griptape Agent - """ - - def __init__(self): - self.default_prompt = default_prompt - self.agent = None - - @classmethod - def INPUT_TYPES(s): - return { - "required": {}, - "optional": { - "agent": ( - "AGENT", - { - "forceInput": True, - "tooltip": "An existing agent to use.\nIf not provided, a new agent will be created.", - }, - ), - "run_type": (run_types, {"default": run_types[0]}), - "tools": ("TOOL_LIST", {"forceInput": True, "INPUT_IS_LIST": True}), - "inputs": ("*",), - "text": ( - "STRING", - {"multiline": True, "dynamicPrompts": False}, - ), - }, - } - - @classmethod - def VALIDATE_INPUTS(s, input_types): - return True - - RETURN_TYPES = ( - any, - "AGENT", - ) - RETURN_NAMES = ( - "OUTPUT", - "AGENT", - ) - FUNCTION = "run" - - OUTPUT_NODE = True - - CATEGORY = "Griptape/Agent" - - def run(self, **kwargs): - run_type = kwargs.get("run_type", run_types[0]) - inputs = kwargs.get("inputs", []) - agent = kwargs.get("agent", None) - tools = kwargs.get("tools", []) - text = kwargs.get("text", None) - - create_dict = {} - - # Configuration - if agent: - config = agent.drivers_config - create_dict["config"] = agent.drivers_config.prompt_driver - - # Tools - create_dict["tools"] = self.tool_check(config, tools) - - if agent: - create_dict["rulesets"] = agent.rulesets - - # Memory - if agent: - create_dict["conversation_memory"] = agent.conversation_memory - create_dict["meta_memory"] = agent.meta_memory - create_dict["task_memory"] = agent.task_memory - - prompt = [] - try: - # Now create the agent - self.agent = gtComfyAgent(**create_dict) - - # Check for inputs. If none, then just create the agent - if len(inputs) == 0 and text.strip() == "": - output = "Agent created." - else: - # Get the prompt text - if len(inputs) == 0: - prompt = [text] - else: - prompt = [text] + inputs - - if run_type == "Default": - result = self.agent.run(prompt) - else: - if run_type == "Prompt" or ( - run_type == "Tool(s)" and len(tools) == 0 - ): - self.agent.add_task(PromptTask(prompt)) - elif run_type == "Tool(s)": - if len(tools) == 1: - self.agent.add_task(ToolTask(prompt, tool=tools[0])) - else: - self.agent.add_task(ToolkitTask(prompt, tools=tools)) - elif run_type == "Summarize": - self.agent.add_task(TextSummaryTask(prompt)) - result = self.agent.run() - output = result.output_task.output - return ( - output, - self.agent, - ) - - except OpenAIError as e: - if "api_key" in str(e).lower(): - return ( - "Error: OpenAI API key is missing. Please provide a valid API key.", - None, - ) - else: - return (f"OpenAI Error: {str(e)}", None) - except Exception as e: - return (f"Error creating agent: {str(e)}", None) diff --git a/nodes/agent/gtUISetDefaultAgent.py b/nodes/agent/gtUISetDefaultAgent.py index afc040b..5ccaef4 100644 --- a/nodes/agent/gtUISetDefaultAgent.py +++ b/nodes/agent/gtUISetDefaultAgent.py @@ -6,7 +6,7 @@ class gtUISetDefaultAgent(BaseAgent): DESCRIPTION = "Set the default agent." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() del inputs["optional"]["tools"] del inputs["optional"]["rulesets"] @@ -18,8 +18,9 @@ class gtUISetDefaultAgent(BaseAgent): RETURN_TYPES = ("CONFIG",) OUTPUT_NODE = True - def run(self, config=None): + def run(self, **kwargs): settings = GriptapeSettings() + config = kwargs.get("config", None) if config: config_dict = config.to_dict() settings.overwrite_settings_key("Griptape.default_config", config_dict) diff --git a/nodes/combine/MergeTexts.py b/nodes/combine/MergeTexts.py index f681962..21bdfd2 100644 --- a/nodes/combine/MergeTexts.py +++ b/nodes/combine/MergeTexts.py @@ -9,7 +9,7 @@ class MergeTexts: pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": { diff --git a/nodes/combine/RulesList.py b/nodes/combine/RulesList.py index dd1e987..7e4c421 100644 --- a/nodes/combine/RulesList.py +++ b/nodes/combine/RulesList.py @@ -9,7 +9,7 @@ class RulesList: pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "optional": { "rules_1": ( diff --git a/nodes/combine/ToolList.py b/nodes/combine/ToolList.py index b0604ec..4d7b432 100644 --- a/nodes/combine/ToolList.py +++ b/nodes/combine/ToolList.py @@ -9,7 +9,7 @@ class ToolList: pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "optional": { "tool_1": ( diff --git a/nodes/combine/gtUIMergeInputs.py b/nodes/combine/gtUIMergeInputs.py index 5547031..a206043 100644 --- a/nodes/combine/gtUIMergeInputs.py +++ b/nodes/combine/gtUIMergeInputs.py @@ -9,7 +9,7 @@ class gtUIMergeInputs: pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": { diff --git a/nodes/combine/gtUIModuleList.py b/nodes/combine/gtUIModuleList.py index 54253cd..fa17d41 100644 --- a/nodes/combine/gtUIModuleList.py +++ b/nodes/combine/gtUIModuleList.py @@ -9,7 +9,7 @@ class gtUIModuleList: pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "optional": { "module_1": ( diff --git a/nodes/config/depricated/__init__.py b/nodes/config/deprecated/__init__.py similarity index 100% rename from nodes/config/depricated/__init__.py rename to nodes/config/deprecated/__init__.py diff --git a/nodes/config/depricated/gtUIAmazonBedrockStructureConfig.py b/nodes/config/deprecated/gtUIAmazonBedrockStructureConfig.py similarity index 95% rename from nodes/config/depricated/gtUIAmazonBedrockStructureConfig.py rename to nodes/config/deprecated/gtUIAmazonBedrockStructureConfig.py index f2a0e5f..47e80d9 100644 --- a/nodes/config/depricated/gtUIAmazonBedrockStructureConfig.py +++ b/nodes/config/deprecated/gtUIAmazonBedrockStructureConfig.py @@ -1,3 +1,5 @@ +from typing import Optional, Tuple + from griptape.configs.drivers import ( AmazonBedrockDriversConfig, ) @@ -33,7 +35,7 @@ class gtUIAmazonBedrockStructureConfig(gtUIBaseConfig): DESCRIPTION = "Amazon Bedrock Prompt Driver." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( { @@ -64,7 +66,7 @@ class gtUIAmazonBedrockStructureConfig(gtUIBaseConfig): def create( self, **kwargs, - ): + ) -> Tuple[Optional[AmazonBedrockDriversConfig]]: params = {} prompt_model = kwargs.get("prompt_model", amazonBedrockPromptModels[0]) diff --git a/nodes/config/depricated/gtUIAnthropicStructureConfig.py b/nodes/config/deprecated/gtUIAnthropicStructureConfig.py similarity index 98% rename from nodes/config/depricated/gtUIAnthropicStructureConfig.py rename to nodes/config/deprecated/gtUIAnthropicStructureConfig.py index 5037555..2f74b2e 100644 --- a/nodes/config/depricated/gtUIAnthropicStructureConfig.py +++ b/nodes/config/deprecated/gtUIAnthropicStructureConfig.py @@ -29,7 +29,7 @@ class gtUIAnthropicStructureConfig(gtUIBaseConfig): ) @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( { diff --git a/nodes/config/depricated/gtUIAzureOpenAiStructureConfig.py b/nodes/config/deprecated/gtUIAzureOpenAiStructureConfig.py similarity index 78% rename from nodes/config/depricated/gtUIAzureOpenAiStructureConfig.py rename to nodes/config/deprecated/gtUIAzureOpenAiStructureConfig.py index 9e36093..36cba90 100644 --- a/nodes/config/depricated/gtUIAzureOpenAiStructureConfig.py +++ b/nodes/config/deprecated/gtUIAzureOpenAiStructureConfig.py @@ -21,7 +21,7 @@ class gtUIAzureOpenAiStructureConfig(gtUIBaseConfig): DESCRIPTION = "Azure OpenAI Structure Config. Requires AZURE_OPENAI_ENDPOINT_3 and AZURE_OPENAI_API_KEY_3" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( { @@ -75,13 +75,26 @@ class gtUIAzureOpenAiStructureConfig(gtUIBaseConfig): kwargs.get("azure_endpoint_env_var", DEFAULT_AZURE_OPENAI_ENDPOINT) ) - params["api_key"] = self.getenv("AZURE_OPENAI_API_KEY") - params["azure_endpoint"] = self.getenv("AZURE_OPENAI_ENDPOINT") + prompt_api_key = self.getenv(AZURE_OPENAI_API_KEY) + prompt_azure_endpoint = self.getenv(AZURE_OPENAI_ENDPOINT) + if not prompt_api_key: + raise ValueError("Azure OpenAI API Key is not set") + if not prompt_azure_endpoint: + raise ValueError("Azure OpenAI Endpoint is not set") + params["api_key"] = prompt_api_key + params["azure_endpoint"] = prompt_azure_endpoint prompt_driver = AzureOpenAiChatPromptDriver(**params) + + embedding_api_key = self.getenv(AZURE_OPENAI_API_KEY) + embedding_azure_endpoint = self.getenv(AZURE_OPENAI_ENDPOINT) + if not embedding_api_key: + raise ValueError("Azure OpenAI API Key is not set") + if not embedding_azure_endpoint: + raise ValueError("Azure OpenAI Endpoint is not set") embedding_driver = AzureOpenAiEmbeddingDriver( - api_key=self.getenv(AZURE_OPENAI_API_KEY), - azure_endpoint=self.getenv(AZURE_OPENAI_ENDPOINT), + api_key=embedding_api_key, + azure_endpoint=embedding_azure_endpoint, ) if not image_generation_driver: diff --git a/nodes/config/depricated/gtUIGoogleStructureConfig.py b/nodes/config/deprecated/gtUIGoogleStructureConfig.py similarity index 98% rename from nodes/config/depricated/gtUIGoogleStructureConfig.py rename to nodes/config/deprecated/gtUIGoogleStructureConfig.py index 42401dd..e08778c 100644 --- a/nodes/config/depricated/gtUIGoogleStructureConfig.py +++ b/nodes/config/deprecated/gtUIGoogleStructureConfig.py @@ -24,7 +24,7 @@ class gtUIGoogleStructureConfig(gtUIBaseConfig): """ @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( diff --git a/nodes/config/depricated/gtUIHuggingFaceStructureConfig.py b/nodes/config/deprecated/gtUIHuggingFaceStructureConfig.py similarity index 98% rename from nodes/config/depricated/gtUIHuggingFaceStructureConfig.py rename to nodes/config/deprecated/gtUIHuggingFaceStructureConfig.py index 752d7a6..7e7007b 100644 --- a/nodes/config/depricated/gtUIHuggingFaceStructureConfig.py +++ b/nodes/config/deprecated/gtUIHuggingFaceStructureConfig.py @@ -23,7 +23,7 @@ class gtUIHuggingFaceStructureConfig(gtUIBaseConfig): DESCRIPTION = "HuggingFace Structure Config." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( { diff --git a/nodes/config/depricated/gtUILMStudioStructureConfig.py b/nodes/config/deprecated/gtUILMStudioStructureConfig.py similarity index 98% rename from nodes/config/depricated/gtUILMStudioStructureConfig.py rename to nodes/config/deprecated/gtUILMStudioStructureConfig.py index 50d8344..38fc85c 100644 --- a/nodes/config/depricated/gtUILMStudioStructureConfig.py +++ b/nodes/config/deprecated/gtUILMStudioStructureConfig.py @@ -23,7 +23,7 @@ class gtUILMStudioStructureConfig(gtUIBaseConfig): ) @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( { diff --git a/nodes/config/depricated/gtUIOllamaStructureConfig.py b/nodes/config/deprecated/gtUIOllamaStructureConfig.py similarity index 98% rename from nodes/config/depricated/gtUIOllamaStructureConfig.py rename to nodes/config/deprecated/gtUIOllamaStructureConfig.py index 26de82a..543b5e5 100644 --- a/nodes/config/depricated/gtUIOllamaStructureConfig.py +++ b/nodes/config/deprecated/gtUIOllamaStructureConfig.py @@ -21,7 +21,7 @@ class gtUIOllamaStructureConfig(gtUIBaseConfig): DESCRIPTION = "Ollama Prompt Driver. Use local models with Ollama. Available at https://ollama.com" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( { diff --git a/nodes/config/depricated/gtUIOpenAiCompatibleConfig.py b/nodes/config/deprecated/gtUIOpenAiCompatibleConfig.py similarity index 99% rename from nodes/config/depricated/gtUIOpenAiCompatibleConfig.py rename to nodes/config/deprecated/gtUIOpenAiCompatibleConfig.py index eb954b4..585b9e8 100644 --- a/nodes/config/depricated/gtUIOpenAiCompatibleConfig.py +++ b/nodes/config/deprecated/gtUIOpenAiCompatibleConfig.py @@ -25,7 +25,7 @@ class gtUIOpenAiCompatibleConfig(gtUIBaseConfig): DESCRIPTION = "OpenAI Compatible Structure Config." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( { diff --git a/nodes/config/depricated/gtUIOpenAiStructureConfig.py b/nodes/config/deprecated/gtUIOpenAiStructureConfig.py similarity index 98% rename from nodes/config/depricated/gtUIOpenAiStructureConfig.py rename to nodes/config/deprecated/gtUIOpenAiStructureConfig.py index ca622e5..697b07a 100644 --- a/nodes/config/depricated/gtUIOpenAiStructureConfig.py +++ b/nodes/config/deprecated/gtUIOpenAiStructureConfig.py @@ -23,7 +23,7 @@ class gtUIOpenAiStructureConfig(gtUIBaseConfig): DESCRIPTION = "OpenAI Structure Config. Use OpenAI's models for prompt, embedding, image generation, and image query." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( { diff --git a/nodes/config/gtUIAmazonBedrockDriversConfig.py b/nodes/config/gtUIAmazonBedrockDriversConfig.py index 468ee37..812fcb8 100644 --- a/nodes/config/gtUIAmazonBedrockDriversConfig.py +++ b/nodes/config/gtUIAmazonBedrockDriversConfig.py @@ -1,3 +1,5 @@ +from typing import Tuple + from griptape.configs import Defaults from griptape.configs.drivers import ( AmazonBedrockDriversConfig, @@ -56,7 +58,7 @@ class gtUIAmazonBedrockDriversConfig(gtUIBaseDriversConfig): DESCRIPTION = "Amazon Bedrock Prompt Driver." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = {} @@ -68,7 +70,7 @@ class gtUIAmazonBedrockDriversConfig(gtUIBaseDriversConfig): def create( self, **kwargs, - ): + ) -> Tuple[AmazonBedrockDriversConfig]: self.run_envs(kwargs) drivers_config_params = {} diff --git a/nodes/config/gtUIAmazonBedrockSession.py b/nodes/config/gtUIAmazonBedrockSession.py index 547e189..043e9a0 100644 --- a/nodes/config/gtUIAmazonBedrockSession.py +++ b/nodes/config/gtUIAmazonBedrockSession.py @@ -1,7 +1,6 @@ import boto3 from ...py.griptape_settings import GriptapeSettings -from ..drivers.gtUIBaseDriver import gtUIBaseDriver DEFAULT_AWS_ACCESS_KEY_ID = "AWS_ACCESS_KEY_ID" DEFAULT_AWS_SECRET_ACCESS_KEY = "AWS_SECRET_ACCESS_KEY" @@ -32,58 +31,59 @@ def start_session(aws_access_key_id=None, aws_secret_access_key=None, region_nam return None -class gtUIAmazonBedrockSession(gtUIBaseDriver): - DESCRIPTION = "Starts a session with Amazon" +# +# class gtUIAmazonBedrockSession(gtUIBaseDriver): +# DESCRIPTION = "Starts a session with Amazon" - @classmethod - def INPUT_TYPES(s): - return { - "optional": { - "aws_access_key_id_env_var": ( - "STRING", - {"default": DEFAULT_AWS_ACCESS_KEY_ID}, - ), - "aws_secret_access_key_env_var": ( - "STRING", - {"default": DEFAULT_AWS_SECRET_ACCESS_KEY}, - ), - "aws_default_region_env_var": ( - "STRING", - {"default": DEFAULT_AWS_DEFAULT_REGION}, - ), - } - } +# @classmethod +# def INPUT_TYPES(cls): +# return { +# "optional": { +# "aws_access_key_id_env_var": ( +# "STRING", +# {"default": DEFAULT_AWS_ACCESS_KEY_ID}, +# ), +# "aws_secret_access_key_env_var": ( +# "STRING", +# {"default": DEFAULT_AWS_SECRET_ACCESS_KEY}, +# ), +# "aws_default_region_env_var": ( +# "STRING", +# {"default": DEFAULT_AWS_DEFAULT_REGION}, +# ), +# } +# } - RETURN_TYPES = ("SESSION",) - RETURN_NAMES = ("SESSION",) +# RETURN_TYPES = ("SESSION",) +# RETURN_NAMES = ("SESSION",) - FUNCTION = "create" +# FUNCTION = "create" - CATEGORY = "Griptape/Agent Configs" +# CATEGORY = "Griptape/Agent Configs" - def build_params(self, **kwargs): - params = {} - aws_access_key_id = self.getenv( - kwargs.get("aws_access_key_id_env_var", DEFAULT_AWS_ACCESS_KEY_ID) - ) - aws_secret_access_key = self.getenv( - kwargs.get("aws_secret_access_key_env_var", DEFAULT_AWS_SECRET_ACCESS_KEY) - ) - region_name = self.getenv( - kwargs.get("aws_default_region_env_var", DEFAULT_AWS_DEFAULT_REGION) - ) +# def build_params(self, **kwargs): +# params = {} +# aws_access_key_id = self.getenv( +# kwargs.get("aws_access_key_id_env_var", DEFAULT_AWS_ACCESS_KEY_ID) +# ) +# aws_secret_access_key = self.getenv( +# kwargs.get("aws_secret_access_key_env_var", DEFAULT_AWS_SECRET_ACCESS_KEY) +# ) +# region_name = self.getenv( +# kwargs.get("aws_default_region_env_var", DEFAULT_AWS_DEFAULT_REGION) +# ) - params["aws_access_key_id"] = aws_access_key_id - params["aws_secret_access_key"] = aws_secret_access_key - params["region_name"] = region_name +# params["aws_access_key_id"] = aws_access_key_id +# params["aws_secret_access_key"] = aws_secret_access_key +# params["region_name"] = region_name - return params +# return params - def create(self, **kwargs): - params = self.build_params(**kwargs) - session = start_session( - aws_access_key_id=params.get("aws_access_key_id"), - aws_secret_access_key=params.get("aws_secret_access_key"), - region_name=params.get("region_name"), - ) - return (session,) +# def create(self, **kwargs): +# params = self.build_params(**kwargs) +# session = start_session( +# aws_access_key_id=params.get("aws_access_key_id"), +# aws_secret_access_key=params.get("aws_secret_access_key"), +# region_name=params.get("region_name"), +# ) +# return (session,) diff --git a/nodes/config/gtUIAnthropicDriversConfig.py b/nodes/config/gtUIAnthropicDriversConfig.py index 12970dc..2f55a9d 100644 --- a/nodes/config/gtUIAnthropicDriversConfig.py +++ b/nodes/config/gtUIAnthropicDriversConfig.py @@ -40,7 +40,7 @@ class gtUIAnthropicDriversConfig(gtUIBaseDriversConfig): ) @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = {} diff --git a/nodes/config/gtUIAzureOpenAiDriversConfig.py b/nodes/config/gtUIAzureOpenAiDriversConfig.py index ef54057..c7e227f 100644 --- a/nodes/config/gtUIAzureOpenAiDriversConfig.py +++ b/nodes/config/gtUIAzureOpenAiDriversConfig.py @@ -38,7 +38,7 @@ class gtUIAzureOpenAiDriversConfig(gtUIBaseDriversConfig): DESCRIPTION = "Azure OpenAI Structure Config. Requires AZURE_OPENAI_ENDPOINT_3 and AZURE_OPENAI_API_KEY_3" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = {} diff --git a/nodes/config/gtUIBaseConfig.py b/nodes/config/gtUIBaseConfig.py index 066c4b6..08f2287 100644 --- a/nodes/config/gtUIBaseConfig.py +++ b/nodes/config/gtUIBaseConfig.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.configs import Defaults from griptape.configs.drivers import OpenAiDriversConfig @@ -34,7 +36,7 @@ class gtUIBaseConfig: pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": { @@ -73,13 +75,13 @@ class gtUIBaseConfig: # OUTPUT_NODE = False - CATEGORY = "Griptape/Agent Configs [DEPRICATED]" + CATEGORY = "Griptape/Agent Configs [DEPRECATED]" def getenv(self, env): settings = GriptapeSettings() api_key = settings.get_settings_key_or_use_env(env) return api_key - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: Defaults.drivers_config = OpenAiDriversConfig() return (OpenAiDriversConfig(),) diff --git a/nodes/config/gtUIBaseDriversConfig.py b/nodes/config/gtUIBaseDriversConfig.py index c82afb1..4cd644f 100644 --- a/nodes/config/gtUIBaseDriversConfig.py +++ b/nodes/config/gtUIBaseDriversConfig.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.configs import Defaults from griptape.configs.drivers import OpenAiDriversConfig @@ -35,7 +37,7 @@ class gtUIBaseDriversConfig(gtUIBase): pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() return inputs @@ -53,6 +55,6 @@ class gtUIBaseDriversConfig(gtUIBase): api_key = settings.get_settings_key_or_use_env(env) return api_key - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: Defaults.drivers_config = OpenAiDriversConfig() return (OpenAiDriversConfig(),) diff --git a/nodes/config/gtUICohereDriversConfig.py b/nodes/config/gtUICohereDriversConfig.py index 92e3bd5..bd4d3a8 100644 --- a/nodes/config/gtUICohereDriversConfig.py +++ b/nodes/config/gtUICohereDriversConfig.py @@ -33,7 +33,7 @@ class gtUICohereDriversConfig(gtUIBaseDriversConfig): DESCRIPTION = "OpenAI Structure Config. Use OpenAI's models for prompt, embedding, image generation, and image query." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = {} diff --git a/nodes/config/gtUIEnvConfig.py b/nodes/config/gtUIEnvConfig.py index 6750156..6190a07 100644 --- a/nodes/config/gtUIEnvConfig.py +++ b/nodes/config/gtUIEnvConfig.py @@ -12,7 +12,7 @@ class gtUIEnvConfig: """ @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": { diff --git a/nodes/config/gtUIGoogleDriversConfig.py b/nodes/config/gtUIGoogleDriversConfig.py index 71f33d8..0741d06 100644 --- a/nodes/config/gtUIGoogleDriversConfig.py +++ b/nodes/config/gtUIGoogleDriversConfig.py @@ -1,3 +1,5 @@ +from typing import Optional, Tuple + from griptape.configs import Defaults from griptape.configs.drivers import ( GoogleDriversConfig, @@ -38,7 +40,7 @@ class gtUIGoogleDriversConfig(gtUIBaseDriversConfig): """ @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = {} @@ -52,9 +54,11 @@ class gtUIGoogleDriversConfig(gtUIBaseDriversConfig): "Google Structure Config. Use Google's models for prompt and image query." ) - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Optional[GoogleDriversConfig]]: self.run_envs(kwargs) + custom_config = None + drivers_config_params = {} # Create instances of the driver classes prompt_driver_builder = gtUIGooglePromptDriver() @@ -77,6 +81,8 @@ class gtUIGoogleDriversConfig(gtUIBaseDriversConfig): try: Defaults.drivers_config = GoogleDriversConfig(**drivers_config_params) custom_config = Defaults.drivers_config + if custom_config is None: + raise Exception("Failed to create GoogleDriversConfig") except Exception as e: print(e) diff --git a/nodes/config/gtUIHuggingFaceDriversConfig.py b/nodes/config/gtUIHuggingFaceDriversConfig.py index b623f22..30c6d8b 100644 --- a/nodes/config/gtUIHuggingFaceDriversConfig.py +++ b/nodes/config/gtUIHuggingFaceDriversConfig.py @@ -40,7 +40,7 @@ class gtUIHuggingFaceDriversConfig(gtUIBaseDriversConfig): DESCRIPTION = "HuggingFace Structure Config." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = {} @@ -50,6 +50,7 @@ class gtUIHuggingFaceDriversConfig(gtUIBaseDriversConfig): def create(self, **kwargs): self.run_envs(kwargs) + custom_config = None drivers_config_params = {} diff --git a/nodes/config/gtUILMStudioDriversConfig.py b/nodes/config/gtUILMStudioDriversConfig.py index 3b1a09d..4329fe5 100644 --- a/nodes/config/gtUILMStudioDriversConfig.py +++ b/nodes/config/gtUILMStudioDriversConfig.py @@ -1,3 +1,4 @@ +# pyright: reportMissingImports=false import logging from comfy_execution.graph import ExecutionBlocker @@ -38,7 +39,7 @@ class gtUILMStudioDriversConfig(gtUIBaseDriversConfig): ) @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = {} diff --git a/nodes/config/gtUIOllamaDriversConfig.py b/nodes/config/gtUIOllamaDriversConfig.py index 453a867..a5af988 100644 --- a/nodes/config/gtUIOllamaDriversConfig.py +++ b/nodes/config/gtUIOllamaDriversConfig.py @@ -33,7 +33,7 @@ class gtUIOllamaDriversConfig(gtUIBaseDriversConfig): DESCRIPTION = "Ollama Prompt Driver. Use local models with Ollama. Available at https://ollama.com" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = {} @@ -45,6 +45,7 @@ class gtUIOllamaDriversConfig(gtUIBaseDriversConfig): def create(self, **kwargs): self.run_envs(kwargs) + custom_config = None drivers_config_params = {} diff --git a/nodes/config/gtUIOpenAiCompatibleDriversConfig.py b/nodes/config/gtUIOpenAiCompatibleDriversConfig.py index 595fe8e..52462b4 100644 --- a/nodes/config/gtUIOpenAiCompatibleDriversConfig.py +++ b/nodes/config/gtUIOpenAiCompatibleDriversConfig.py @@ -56,7 +56,7 @@ class gtUIOpenAiCompatibleDriversConfig(gtUIBaseDriversConfig): DESCRIPTION = "OpenAI Compatible Structure Config." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = {} diff --git a/nodes/config/gtUIOpenAiDriversConfig.py b/nodes/config/gtUIOpenAiDriversConfig.py index 6018a01..8417bf3 100644 --- a/nodes/config/gtUIOpenAiDriversConfig.py +++ b/nodes/config/gtUIOpenAiDriversConfig.py @@ -49,7 +49,7 @@ class gtUIOpenAiDriversConfig(gtUIBaseDriversConfig): DESCRIPTION = "OpenAI Drivers Config. Use OpenAI's models for prompt, embedding, image generation, and image query." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = {} diff --git a/nodes/config/gtUIStructureConfig.py b/nodes/config/gtUIStructureConfig.py index 2fd670b..a1edf5d 100644 --- a/nodes/config/gtUIStructureConfig.py +++ b/nodes/config/gtUIStructureConfig.py @@ -25,7 +25,7 @@ class gtUIStructureConfig(gtUIBase): self.default_audio_transcription_driver = DummyAudioTranscriptionDriver() @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( { diff --git a/nodes/convert/gtUITextToClipEncode.py b/nodes/convert/gtUITextToClipEncode.py index c0611ad..5b5265f 100644 --- a/nodes/convert/gtUITextToClipEncode.py +++ b/nodes/convert/gtUITextToClipEncode.py @@ -13,7 +13,7 @@ class gtUITextToClipEncode(gtUIBaseTask): DESCRIPTION = "Convert text to a CLIP conditioning" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": { "STRING": ("STRING", {"forceInput": True}), diff --git a/nodes/convert/gtUITextToCombo.py b/nodes/convert/gtUITextToCombo.py index 8f87e7c..ecccfaf 100644 --- a/nodes/convert/gtUITextToCombo.py +++ b/nodes/convert/gtUITextToCombo.py @@ -10,7 +10,7 @@ class gtUITextToCombo: DESCRIPTION = "Convert text to a Combo conditioning" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": { "STRING": ("STRING", {"forceInput": True}), diff --git a/nodes/custom_routes.py b/nodes/custom_routes.py index 47dcfc7..1afcc37 100644 --- a/nodes/custom_routes.py +++ b/nodes/custom_routes.py @@ -1,3 +1,4 @@ +# pyright: reportMissingImports=false from aiohttp import web from server import PromptServer diff --git a/nodes/display/gtUIOutputArtifactNode.py b/nodes/display/gtUIOutputArtifactNode.py index 6f06b16..17df690 100644 --- a/nodes/display/gtUIOutputArtifactNode.py +++ b/nodes/display/gtUIOutputArtifactNode.py @@ -5,7 +5,7 @@ class gtUIOutputArtifactNode: CATEGORY = "Griptape/Display" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": {"INPUT": ("ARTIFACT", {"forceInput": True})}, diff --git a/nodes/display/gtUIOutputDataNode.py b/nodes/display/gtUIOutputDataNode.py index 659d15b..597473b 100644 --- a/nodes/display/gtUIOutputDataNode.py +++ b/nodes/display/gtUIOutputDataNode.py @@ -4,11 +4,11 @@ class gtUIOutputDataNode: CATEGORY = "Griptape/Display" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return {"required": {}, "optional": {"INPUT": ("*", {"forceInput": True})}} @classmethod - def VALIDATE_INPUTS(s, input_types): + def VALIDATE_INPUTS(cls, input_types): return True RETURN_TYPES = ("STRING",) diff --git a/nodes/display/gtUIOutputImageNode.py b/nodes/display/gtUIOutputImageNode.py index fa691b0..c6bfe3d 100644 --- a/nodes/display/gtUIOutputImageNode.py +++ b/nodes/display/gtUIOutputImageNode.py @@ -1,3 +1,4 @@ +# pyright: reportMissingImports=false import random import folder_paths @@ -20,7 +21,7 @@ class gtUIOutputImageNode(gtUISaveImageNode): CATEGORY = "Griptape/Display" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": {"images": ("IMAGE", {"forceInput": True})}, diff --git a/nodes/display/gtUIOutputStringNode.py b/nodes/display/gtUIOutputStringNode.py index 7154d89..dc155fb 100644 --- a/nodes/display/gtUIOutputStringNode.py +++ b/nodes/display/gtUIOutputStringNode.py @@ -4,7 +4,7 @@ class gtUIOutputStringNode: CATEGORY = "Griptape/Display" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": { diff --git a/nodes/display/gtUISaveImageNode.py b/nodes/display/gtUISaveImageNode.py index 61bd4ad..6494287 100644 --- a/nodes/display/gtUISaveImageNode.py +++ b/nodes/display/gtUISaveImageNode.py @@ -1,3 +1,4 @@ +# pyright: reportMissingImports=false import json import os @@ -7,7 +8,7 @@ from comfy.cli_args import args from PIL import Image from PIL.PngImagePlugin import PngInfo -from nodes import SaveImage +from nodes import SaveImage # type: ignore[reportAttributeAccessIssue] # From SaveImage diff --git a/nodes/drivers/gtUIAmazonBedrockPromptDriver.py b/nodes/drivers/gtUIAmazonBedrockPromptDriver.py index 6e4381b..25f4bab 100644 --- a/nodes/drivers/gtUIAmazonBedrockPromptDriver.py +++ b/nodes/drivers/gtUIAmazonBedrockPromptDriver.py @@ -20,7 +20,7 @@ DEFAULT_AWS_DEFAULT_REGION = "AWS_DEFAULT_REGION" class gtUIAmazonBedrockPromptDriver(gtUIBasePromptDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() # Get the base required and optional inputs diff --git a/nodes/drivers/gtUIAmazonBedrockStableDiffusionImageGenerationDriver.py b/nodes/drivers/gtUIAmazonBedrockStableDiffusionImageGenerationDriver.py index 8064c76..4c51752 100644 --- a/nodes/drivers/gtUIAmazonBedrockStableDiffusionImageGenerationDriver.py +++ b/nodes/drivers/gtUIAmazonBedrockStableDiffusionImageGenerationDriver.py @@ -17,7 +17,7 @@ class gtUIAmazonBedrockStableDiffusionImageGenerationDriver( DESCRIPTION = "Amazon Bedrock Stable Diffusion Image Generation Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): style_presets = [ "", "3d-model", diff --git a/nodes/drivers/gtUIAmazonBedrockTitanEmbeddingDriver.py b/nodes/drivers/gtUIAmazonBedrockTitanEmbeddingDriver.py index dc32da3..767b011 100644 --- a/nodes/drivers/gtUIAmazonBedrockTitanEmbeddingDriver.py +++ b/nodes/drivers/gtUIAmazonBedrockTitanEmbeddingDriver.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.drivers import AmazonBedrockTitanEmbeddingDriver from ..config.gtUIAmazonBedrockSession import start_session @@ -18,7 +20,7 @@ class gtUIAmazonBedrockTitanEmbeddingDriver(gtUIBaseEmbeddingDriver): DESCRIPTION = "Amazon Bedrock Titan Embedding Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() # Get the base required and optional inputs @@ -39,6 +41,14 @@ class gtUIAmazonBedrockTitanEmbeddingDriver(gtUIBaseEmbeddingDriver): "tooltip": "Select the embedding model to use.", }, ), + "min_retry_delay": ( + "FLOAT", + {"default": 2, "tooltip": "Minimum retry delay"}, + ), + "max_retry_delay": ( + "FLOAT", + {"default": 10, "tooltip": "Minimum retry delay"}, + ), "aws_access_key_id_env_var": ( "STRING", { @@ -67,6 +77,8 @@ class gtUIAmazonBedrockTitanEmbeddingDriver(gtUIBaseEmbeddingDriver): def build_params(self, **kwargs): model = kwargs.get("embedding_model", None) + min_retry_delay = kwargs.get("min_retry_delay", 2) + max_retry_delay = kwargs.get("max_retry_delay", 10) api_key = self.getenv( kwargs.get("aws_access_key_id_env_var", DEFAULT_AWS_ACCESS_KEY_ID) ) @@ -81,13 +93,15 @@ class gtUIAmazonBedrockTitanEmbeddingDriver(gtUIBaseEmbeddingDriver): "aws_access_key_id": api_key, "aws_secret_access_key": secret_access_key, "region_name": region_name, + "min_retry_delay": min_retry_delay, + "max_retry_delay": max_retry_delay, } if model: params["model"] = model return params - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: params = self.build_params(**kwargs) start_session( aws_access_key_id=params.get("aws_access_key_id", None), diff --git a/nodes/drivers/gtUIAmazonBedrockTitanImageGenerationDriver.py b/nodes/drivers/gtUIAmazonBedrockTitanImageGenerationDriver.py index 288be5b..4e24007 100644 --- a/nodes/drivers/gtUIAmazonBedrockTitanImageGenerationDriver.py +++ b/nodes/drivers/gtUIAmazonBedrockTitanImageGenerationDriver.py @@ -17,7 +17,7 @@ class gtUIAmazonBedrockTitanImageGenerationDriver(gtUIBaseImageGenerationDriver) DESCRIPTION = "Amazon Bedrock Titan Image Generation Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): sizes = ["512x512", "1024x1024"] inputs = super().INPUT_TYPES() diff --git a/nodes/drivers/gtUIAmazonOpenSearchVectorStoreDriver.py b/nodes/drivers/gtUIAmazonOpenSearchVectorStoreDriver.py index aeb13dd..25589da 100644 --- a/nodes/drivers/gtUIAmazonOpenSearchVectorStoreDriver.py +++ b/nodes/drivers/gtUIAmazonOpenSearchVectorStoreDriver.py @@ -16,7 +16,7 @@ class gtUIAmazonOpenSearchVectorStoreDriver(gtUIBaseVectorStoreDriver): DESCRIPTION = "Griptape Open Search Vector Store Driver: https://aws.amazon.com/opensearch-service/" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() # Get the base required and optional inputs @@ -107,5 +107,5 @@ class gtUIAmazonOpenSearchVectorStoreDriver(gtUIBaseVectorStoreDriver): params.pop("aws_access_key_id") params.pop("aws_secret_access_key") params.pop("region_name") - driver = AmazonOpenSearchVectorStoreDriver(**params) + driver = AmazonOpenSearchVectorStoreDriver(**params) # type: ignore[reportArgumentType] return (driver,) diff --git a/nodes/drivers/gtUIAmazonSageMakerJumpstartEmbeddingDriver.py b/nodes/drivers/gtUIAmazonSageMakerJumpstartEmbeddingDriver.py index 813fd66..28b4ad4 100644 --- a/nodes/drivers/gtUIAmazonSageMakerJumpstartEmbeddingDriver.py +++ b/nodes/drivers/gtUIAmazonSageMakerJumpstartEmbeddingDriver.py @@ -14,7 +14,7 @@ class gtUIAmazonSageMakerJumpstartEmbeddingDriver(gtUIBaseEmbeddingDriver): DESCRIPTION = "OpenAI Compatible Embedding Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() # Get the base required and optional inputs base_required_inputs = inputs["required"] diff --git a/nodes/drivers/gtUIAmazonSageMakerJumpstartPromptDriver.py b/nodes/drivers/gtUIAmazonSageMakerJumpstartPromptDriver.py index f973cc4..a68294d 100644 --- a/nodes/drivers/gtUIAmazonSageMakerJumpstartPromptDriver.py +++ b/nodes/drivers/gtUIAmazonSageMakerJumpstartPromptDriver.py @@ -12,7 +12,7 @@ DEFAULT_AWS_DEFAULT_REGION = "AWS_DEFAULT_REGION" class gtUIAmazonSageMakerJumpstartPromptDriver(gtUIBasePromptDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() diff --git a/nodes/drivers/gtUIAnthropicPromptDriver.py b/nodes/drivers/gtUIAnthropicPromptDriver.py index 4d1080e..e940070 100644 --- a/nodes/drivers/gtUIAnthropicPromptDriver.py +++ b/nodes/drivers/gtUIAnthropicPromptDriver.py @@ -11,7 +11,7 @@ DEFAULT_API_KEY = "ANTHROPIC_API_KEY" class gtUIAnthropicPromptDriver(gtUIBasePromptDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() # Get the base required and optional inputs @@ -58,7 +58,7 @@ class gtUIAnthropicPromptDriver(gtUIBasePromptDriver): "min": 0, "max": 500, "step": 1, - "tooltip": "Limits the number of tokens considered for each step of the generation. Pevents the model from focusing too narrowly on the top choices.", + "tooltip": "Limits the number of tokens considered for each step of the generation. Prevents the model from focusing too narrowly on the top choices.", }, ), } diff --git a/nodes/drivers/gtUIAzureMongoDbVectorStoreDriver.py b/nodes/drivers/gtUIAzureMongoDbVectorStoreDriver.py index 84bf6de..007a9dd 100644 --- a/nodes/drivers/gtUIAzureMongoDbVectorStoreDriver.py +++ b/nodes/drivers/gtUIAzureMongoDbVectorStoreDriver.py @@ -17,7 +17,7 @@ class gtUIAzureMongoDbVectorStoreDriver(gtUIBaseVectorStoreDriver): DESCRIPTION = "Griptape Azure Mongodb Atlas Vector Store Driver: https://www.mongodb.com/products/platform/atlas-database" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( diff --git a/nodes/drivers/gtUIAzureOpenAiChatPromptDriver.py b/nodes/drivers/gtUIAzureOpenAiChatPromptDriver.py index c500604..ebcdde4 100644 --- a/nodes/drivers/gtUIAzureOpenAiChatPromptDriver.py +++ b/nodes/drivers/gtUIAzureOpenAiChatPromptDriver.py @@ -10,7 +10,7 @@ DEFAULT_API_KEY_ENV_VAR = "AZURE_OPENAI_API_KEY" class gtUIAzureOpenAiChatPromptDriver(gtUIBasePromptDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() # Get the base required and optional inputs base_required_inputs = inputs["required"] diff --git a/nodes/drivers/gtUIAzureOpenAiEmbeddingDriver.py b/nodes/drivers/gtUIAzureOpenAiEmbeddingDriver.py index ea23a41..69b0d1b 100644 --- a/nodes/drivers/gtUIAzureOpenAiEmbeddingDriver.py +++ b/nodes/drivers/gtUIAzureOpenAiEmbeddingDriver.py @@ -11,7 +11,7 @@ class gtUIAzureOpenAiEmbeddingDriver(gtUIBaseEmbeddingDriver): DESCRIPTION = "Azure OpenAI Embedding Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() diff --git a/nodes/drivers/gtUIAzureOpenAiImageGenerationDriver.py b/nodes/drivers/gtUIAzureOpenAiImageGenerationDriver.py index 38f81d2..4447a20 100644 --- a/nodes/drivers/gtUIAzureOpenAiImageGenerationDriver.py +++ b/nodes/drivers/gtUIAzureOpenAiImageGenerationDriver.py @@ -14,7 +14,7 @@ class gtUIAzureOpenAiImageGenerationDriver(gtUIBaseImageGenerationDriver): DESCRIPTION = "Azire OpenAI Image Generation Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( { @@ -58,7 +58,7 @@ class gtUIAzureOpenAiImageGenerationDriver(gtUIBaseImageGenerationDriver): return inputs def adjust_size_based_on_model(self, model, size): - # pick the approprite size based on the model + # pick the appropriate size based on the model if model == "dall-e-2": if size in ["1024x1792", "1792x1024"]: size = "1024x1024" diff --git a/nodes/drivers/gtUIBaseAudioTranscriptionDriver.py b/nodes/drivers/gtUIBaseAudioTranscriptionDriver.py index 29edb81..7d1d4d4 100644 --- a/nodes/drivers/gtUIBaseAudioTranscriptionDriver.py +++ b/nodes/drivers/gtUIBaseAudioTranscriptionDriver.py @@ -8,7 +8,7 @@ DEFAULT_MODEL = "whisper-1" class gtUIBaseAudioTranscriptionDriver(gtUIBaseDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": {}, @@ -21,9 +21,7 @@ class gtUIBaseAudioTranscriptionDriver(gtUIBaseDriver): CATEGORY = "Griptape/Agent Drivers/Audio Transcription" - def create( - self, - ): + def create(self, **kwargs): api_key = self.getenv(DEFAULT_API_KEY) params = {} diff --git a/nodes/drivers/gtUIBaseDriver.py b/nodes/drivers/gtUIBaseDriver.py index f152294..a71e83e 100644 --- a/nodes/drivers/gtUIBaseDriver.py +++ b/nodes/drivers/gtUIBaseDriver.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.drivers import DummyPromptDriver from ...py.griptape_settings import GriptapeSettings @@ -7,7 +9,7 @@ class gtUIBaseDriver: DESCRIPTION = "Griptape Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": {}, @@ -25,6 +27,6 @@ class gtUIBaseDriver: api_key = settings.get_settings_key_or_use_env(env) return api_key - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: driver = DummyPromptDriver() return (driver,) diff --git a/nodes/drivers/gtUIBaseEmbeddingDriver.py b/nodes/drivers/gtUIBaseEmbeddingDriver.py index 14ba98e..4bf55fd 100644 --- a/nodes/drivers/gtUIBaseEmbeddingDriver.py +++ b/nodes/drivers/gtUIBaseEmbeddingDriver.py @@ -1,4 +1,6 @@ -from griptape.drivers import BaseEmbeddingDriver +from typing import Any, Tuple + +from griptape.drivers import DummyEmbeddingDriver from .gtUIBaseDriver import gtUIBaseDriver @@ -7,7 +9,7 @@ class gtUIBaseEmbeddingDriver(gtUIBaseDriver): DESCRIPTION = "Griptape Embedding Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update() @@ -18,6 +20,6 @@ class gtUIBaseEmbeddingDriver(gtUIBaseDriver): RETURN_TYPES = ("EMBEDDING_DRIVER",) - def create(self, **kwargs): - driver = BaseEmbeddingDriver() + def create(self, **kwargs) -> Tuple[Any, ...]: + driver = DummyEmbeddingDriver() return (driver,) diff --git a/nodes/drivers/gtUIBaseImageDriver.py b/nodes/drivers/gtUIBaseImageDriver.py index d255cdc..1f796f7 100644 --- a/nodes/drivers/gtUIBaseImageDriver.py +++ b/nodes/drivers/gtUIBaseImageDriver.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.drivers import OpenAiImageGenerationDriver from .gtUIBaseDriver import gtUIBaseDriver @@ -14,7 +16,7 @@ class gtUIBaseImageGenerationDriver(gtUIBaseDriver): """ @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": {}, @@ -28,7 +30,7 @@ class gtUIBaseImageGenerationDriver(gtUIBaseDriver): CATEGORY = "Griptape/Agent Drivers/Image Generation" - def create(self, prompt): + def create(self, **kwargs) -> Tuple[Any, ...]: api_key = self.getenv(DEFAULT_API_KEY) params = {} if api_key: diff --git a/nodes/drivers/gtUIBasePromptDriver.py b/nodes/drivers/gtUIBasePromptDriver.py index 86a566e..ef4c6a6 100644 --- a/nodes/drivers/gtUIBasePromptDriver.py +++ b/nodes/drivers/gtUIBasePromptDriver.py @@ -1,11 +1,13 @@ -from griptape.drivers import BasePromptDriver +from typing import Any, Tuple + +from griptape.drivers import DummyPromptDriver from .gtUIBaseDriver import gtUIBaseDriver class gtUIBasePromptDriver(gtUIBaseDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( @@ -64,6 +66,6 @@ class gtUIBasePromptDriver(gtUIBaseDriver): CATEGORY = "Griptape/Agent Drivers/Prompt" - def create(self, **kwargs): - driver = BasePromptDriver() + def create(self, **kwargs) -> Tuple[Any, ...]: + driver = DummyPromptDriver() return (driver,) diff --git a/nodes/drivers/gtUIBaseRerankDriver.py b/nodes/drivers/gtUIBaseRerankDriver.py index a2d0bf2..bb4a9f2 100644 --- a/nodes/drivers/gtUIBaseRerankDriver.py +++ b/nodes/drivers/gtUIBaseRerankDriver.py @@ -1,4 +1,6 @@ -from griptape.drivers import BaseRerankDriver +from typing import Any, Tuple + +from griptape.drivers import DummyPromptDriver from .gtUIBaseDriver import gtUIBaseDriver @@ -7,7 +9,7 @@ class gtUIBaseRerankDriver(gtUIBaseDriver): DESCRIPTION = "Griptape Rerank Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update() @@ -18,6 +20,6 @@ class gtUIBaseRerankDriver(gtUIBaseDriver): RETURN_TYPES = ("RERANK_DRIVER",) - def create(self, **kwargs): - driver = BaseRerankDriver() + def create(self, **kwargs) -> Tuple[Any, ...]: + driver = DummyPromptDriver() return (driver,) diff --git a/nodes/drivers/gtUIBaseTextToSpeechDriver.py b/nodes/drivers/gtUIBaseTextToSpeechDriver.py index 6ef9e3b..6bc835e 100644 --- a/nodes/drivers/gtUIBaseTextToSpeechDriver.py +++ b/nodes/drivers/gtUIBaseTextToSpeechDriver.py @@ -1,4 +1,6 @@ -from griptape.drivers import BaseTextToSpeechDriver +from typing import Any, Tuple + +from griptape.drivers import DummyTextToSpeechDriver from .gtUIBaseDriver import gtUIBaseDriver @@ -7,7 +9,7 @@ class gtUIBaseTextToSpeechDriver(gtUIBaseDriver): DESCRIPTION = "Griptape Text to Speech Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": { @@ -35,8 +37,6 @@ class gtUIBaseTextToSpeechDriver(gtUIBaseDriver): CATEGORY = "Griptape/Agent Drivers/Text to Speech" - def create(self, **kwargs): - model = kwargs.get("text_to_speech_model", "eleven_multilingual_v2") - voice = kwargs.get("voice", "Matilda") - driver = BaseTextToSpeechDriver(model=model, voice=voice) + def create(self, **kwargs) -> Tuple[Any, ...]: + driver = DummyTextToSpeechDriver() return (driver,) diff --git a/nodes/drivers/gtUIBaseVectorStoreDriver.py b/nodes/drivers/gtUIBaseVectorStoreDriver.py index 46c4eb8..b75127b 100644 --- a/nodes/drivers/gtUIBaseVectorStoreDriver.py +++ b/nodes/drivers/gtUIBaseVectorStoreDriver.py @@ -1,6 +1,8 @@ +from typing import Any, Tuple + from griptape.drivers import ( - BaseVectorStoreDriver, DummyEmbeddingDriver, + DummyVectorStoreDriver, OpenAiEmbeddingDriver, ) @@ -14,7 +16,7 @@ class gtUIBaseVectorStoreDriver(gtUIBaseDriver): DESCRIPTION = "Griptape Embedding Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( @@ -41,7 +43,7 @@ class gtUIBaseVectorStoreDriver(gtUIBaseDriver): else: return DummyEmbeddingDriver() - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: embedding_driver = kwargs.get("embedding_driver", None) params = {} @@ -50,5 +52,5 @@ class gtUIBaseVectorStoreDriver(gtUIBaseDriver): else: params["embedding_driver"] = self.get_default_embedding_driver() - driver = BaseVectorStoreDriver(**params) + driver = DummyVectorStoreDriver() return (driver,) diff --git a/nodes/drivers/gtUIBaseWebSearchDriver.py b/nodes/drivers/gtUIBaseWebSearchDriver.py index 576809f..2b7b986 100644 --- a/nodes/drivers/gtUIBaseWebSearchDriver.py +++ b/nodes/drivers/gtUIBaseWebSearchDriver.py @@ -1,11 +1,11 @@ -from griptape.drivers import BaseWebSearchDriver +from typing import Any, Tuple from .gtUIBaseDriver import gtUIBaseDriver class gtUIBaseWebSearchDriver(gtUIBaseDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": {}, @@ -18,8 +18,6 @@ class gtUIBaseWebSearchDriver(gtUIBaseDriver): CATEGORY = "Griptape/Agent Drivers/Web Search" - def create( - self, - ): - driver = BaseWebSearchDriver() + def create(self, **kwargs) -> Tuple[Any, ...]: + driver = None return (driver,) diff --git a/nodes/drivers/gtUIBlackForestImageGenerationDriver.py b/nodes/drivers/gtUIBlackForestImageGenerationDriver.py index 9ccba1a..91e22fe 100644 --- a/nodes/drivers/gtUIBlackForestImageGenerationDriver.py +++ b/nodes/drivers/gtUIBlackForestImageGenerationDriver.py @@ -28,7 +28,7 @@ class gtUIBlackForestImageGenerationDriver(gtUIBaseImageGenerationDriver): DESCRIPTION = "Black Forest Image Generation Driver to use Flux models." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( { @@ -183,7 +183,7 @@ class gtUIBlackForestImageGenerationDriver(gtUIBaseImageGenerationDriver): if model == "flux-pro-1.0-fill": if guidance is not None and guidance > 0: if guidance < 1.5: - guidance == 1.5 + guidance = 1.5 if guidance > 100: raise ValueError( f"When using {model}, guidance must be between 1.5 and 100." @@ -193,14 +193,14 @@ class gtUIBlackForestImageGenerationDriver(gtUIBaseImageGenerationDriver): if model in ["flux-pro-1.0-canny", "flux-pro-1.0-depth"]: if guidance is not None and guidance > 0: if guidance < 1: - guidance == 1 + guidance = 1 params["guidance"] = float(guidance) # Dev/Pro specific settings if model in ["flux-dev", "flux-pro"]: if guidance is not None and guidance > 0: if guidance < 1.5: - guidance == 1.5 + guidance = 1.5 if guidance > 5: raise ValueError( f"When using {model}, guidance must be between 1.5 and 5." @@ -237,8 +237,9 @@ class gtUIBlackForestImageGenerationDriver(gtUIBaseImageGenerationDriver): def create(self, **kwargs): params = self.build_params(**kwargs) params["max_attempts"] = 1 + driver = None try: - driver = BlackForestImageGenerationDriver(**params) + driver = BlackForestImageGenerationDriver(**params) # type: ignore[reportPossiblyUnboundVariable] except Exception as e: print(f"Error creating BlackForestImageGenerationDriver: {e}") return (None,) diff --git a/nodes/drivers/gtUICohereEmbeddingDriver.py b/nodes/drivers/gtUICohereEmbeddingDriver.py index b9afb08..4d87085 100644 --- a/nodes/drivers/gtUICohereEmbeddingDriver.py +++ b/nodes/drivers/gtUICohereEmbeddingDriver.py @@ -11,7 +11,7 @@ class gtUICohereEmbeddingDriver(gtUIBaseEmbeddingDriver): DESCRIPTION = "Cohere Embedding Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() diff --git a/nodes/drivers/gtUICoherePromptDriver.py b/nodes/drivers/gtUICoherePromptDriver.py index f39b03d..bd5e595 100644 --- a/nodes/drivers/gtUICoherePromptDriver.py +++ b/nodes/drivers/gtUICoherePromptDriver.py @@ -16,7 +16,7 @@ DEFAULT_API_KEY_ENV_VAR = "COHERE_API_KEY" class gtUICoherePromptDriver(gtUIBasePromptDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( diff --git a/nodes/drivers/gtUICohereRerankDriver.py b/nodes/drivers/gtUICohereRerankDriver.py index 0056462..1521cad 100644 --- a/nodes/drivers/gtUICohereRerankDriver.py +++ b/nodes/drivers/gtUICohereRerankDriver.py @@ -10,7 +10,7 @@ class gtUICohereRerankDriver(gtUIBaseRerankDriver): DESCRIPTION = "Cohere Rerank Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( diff --git a/nodes/drivers/gtUIDuckDuckGoWebSearchDriver.py b/nodes/drivers/gtUIDuckDuckGoWebSearchDriver.py index eee62cf..9678ff6 100644 --- a/nodes/drivers/gtUIDuckDuckGoWebSearchDriver.py +++ b/nodes/drivers/gtUIDuckDuckGoWebSearchDriver.py @@ -6,8 +6,6 @@ from .gtUIBaseWebSearchDriver import gtUIBaseWebSearchDriver class gtUIDuckDuckGoWebSearchDriver(gtUIBaseWebSearchDriver): DESCRIPTION = "DuckDuckGo Web Search Driver" - def create( - self, - ): + def create(self, **kwargs): driver = DuckDuckGoWebSearchDriver() return (driver,) diff --git a/nodes/drivers/gtUIElevenLabsTextToSpeechDriver.py b/nodes/drivers/gtUIElevenLabsTextToSpeechDriver.py index f654a41..4a9cdae 100644 --- a/nodes/drivers/gtUIElevenLabsTextToSpeechDriver.py +++ b/nodes/drivers/gtUIElevenLabsTextToSpeechDriver.py @@ -11,7 +11,7 @@ class gtUIElevenLabsTextToSpeechDriver(gtUIBaseTextToSpeechDriver): DESCRIPTION = "Griptape ElevenLabs to Speech Driver: https://elevenlabs.io/apps/" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( diff --git a/nodes/drivers/gtUIExaWebSearchDriver.py b/nodes/drivers/gtUIExaWebSearchDriver.py index 3c71445..c4f186d 100644 --- a/nodes/drivers/gtUIExaWebSearchDriver.py +++ b/nodes/drivers/gtUIExaWebSearchDriver.py @@ -11,7 +11,7 @@ class gtUIExaWebSearchDriver(gtUIBaseWebSearchDriver): DESCRIPTION = "Exa Web Search Driver. Requires environment variables EXA_API_KEY." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( { diff --git a/nodes/drivers/gtUIGoogleEmbeddingDriver.py b/nodes/drivers/gtUIGoogleEmbeddingDriver.py index db3ad1d..4ff42b9 100644 --- a/nodes/drivers/gtUIGoogleEmbeddingDriver.py +++ b/nodes/drivers/gtUIGoogleEmbeddingDriver.py @@ -19,7 +19,7 @@ class gtUIGoogleEmbeddingDriver(gtUIBaseEmbeddingDriver): DESCRIPTION = "Google Embedding Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( diff --git a/nodes/drivers/gtUIGooglePromptDriver.py b/nodes/drivers/gtUIGooglePromptDriver.py index 3991982..dcc16ae 100644 --- a/nodes/drivers/gtUIGooglePromptDriver.py +++ b/nodes/drivers/gtUIGooglePromptDriver.py @@ -9,7 +9,7 @@ DEFAULT_API_KEY_ENV_VAR = "GOOGLE_API_KEY" class gtUIGooglePromptDriver(gtUIBasePromptDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( diff --git a/nodes/drivers/gtUIGoogleWebSearchDriver.py b/nodes/drivers/gtUIGoogleWebSearchDriver.py index b8bff65..816b8e7 100644 --- a/nodes/drivers/gtUIGoogleWebSearchDriver.py +++ b/nodes/drivers/gtUIGoogleWebSearchDriver.py @@ -10,7 +10,7 @@ class gtUIGoogleWebSearchDriver(gtUIBaseWebSearchDriver): DESCRIPTION = "Google Web Search Driver. Requires environment variables GOOGLE_API_KEY and GOOGLE_API_SEARCH_ID." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( { diff --git a/nodes/drivers/gtUIGriptapeCloudVectorStoreDriver.py b/nodes/drivers/gtUIGriptapeCloudVectorStoreDriver.py index 3010a27..d9892c6 100644 --- a/nodes/drivers/gtUIGriptapeCloudVectorStoreDriver.py +++ b/nodes/drivers/gtUIGriptapeCloudVectorStoreDriver.py @@ -12,7 +12,7 @@ class gtUIGriptapeCloudVectorStoreDriver(gtUIBaseVectorStoreDriver): DESCRIPTION = "Griptape Cloud Vector Store Driver: https://cloud.griptape.ai" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() del inputs["optional"]["embedding_driver"] inputs["required"].update() @@ -48,7 +48,7 @@ class gtUIGriptapeCloudVectorStoreDriver(gtUIBaseVectorStoreDriver): api_key_env_var = kwargs.get("api_key_env_var", API_KEY_ENV) base_url = kwargs.get("base_url", BASE_URL) knowledge_base_id = kwargs.get("knowledge_base_id", "12345-abcde-1434") - + api_key = None if api_key_env_var: api_key = self.getenv(api_key_env_var) diff --git a/nodes/drivers/gtUIHuggingFaceHubEmbeddingDriver.py b/nodes/drivers/gtUIHuggingFaceHubEmbeddingDriver.py index ee8e0ea..e93ce82 100644 --- a/nodes/drivers/gtUIHuggingFaceHubEmbeddingDriver.py +++ b/nodes/drivers/gtUIHuggingFaceHubEmbeddingDriver.py @@ -12,7 +12,7 @@ class gtUIHuggingFaceHubEmbeddingDriver(gtUIBaseEmbeddingDriver): DESCRIPTION = "Hugging Face Hub Embedding Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( @@ -68,6 +68,7 @@ class gtUIHuggingFaceHubEmbeddingDriver(gtUIBaseEmbeddingDriver): def create(self, **kwargs): params = self.build_params(**kwargs) + driver = None try: driver = HuggingFaceHubEmbeddingDriver(**params) except Exception as e: diff --git a/nodes/drivers/gtUIHuggingFaceHubPromptDriver.py b/nodes/drivers/gtUIHuggingFaceHubPromptDriver.py index ac62684..7f94b71 100644 --- a/nodes/drivers/gtUIHuggingFaceHubPromptDriver.py +++ b/nodes/drivers/gtUIHuggingFaceHubPromptDriver.py @@ -11,7 +11,7 @@ class gtUIHuggingFaceHubPromptDriver(gtUIBasePromptDriver): DESCRIPTION = "Hugging Face Hub Prompt Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update({}) diff --git a/nodes/drivers/gtUILMStudioChatPromptDriver.py b/nodes/drivers/gtUILMStudioChatPromptDriver.py index b229b39..859468c 100644 --- a/nodes/drivers/gtUILMStudioChatPromptDriver.py +++ b/nodes/drivers/gtUILMStudioChatPromptDriver.py @@ -1,3 +1,4 @@ +# pyright: reportMissingImports=false from comfy_execution.graph import ExecutionBlocker from griptape.drivers import OpenAiChatPromptDriver @@ -10,7 +11,7 @@ DEFAULT_API_KEY = "lm_studio" class gtUILMStudioChatPromptDriver(gtUIOpenAiCompatibleChatPromptDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() del inputs["optional"]["api_key_env_var"] diff --git a/nodes/drivers/gtUILMStudioEmbeddingDriver.py b/nodes/drivers/gtUILMStudioEmbeddingDriver.py index 3f41204..8e29c0d 100644 --- a/nodes/drivers/gtUILMStudioEmbeddingDriver.py +++ b/nodes/drivers/gtUILMStudioEmbeddingDriver.py @@ -9,7 +9,7 @@ DEFAULT_API_KEY = "lm_studio" class gtUILMStudioEmbeddingDriver(gtUIOpenAiCompatibleEmbeddingDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() del inputs["optional"]["api_key_env_var"] diff --git a/nodes/drivers/gtUILeonardoImageGenerationDriver.py b/nodes/drivers/gtUILeonardoImageGenerationDriver.py index 663176e..32fd06d 100644 --- a/nodes/drivers/gtUILeonardoImageGenerationDriver.py +++ b/nodes/drivers/gtUILeonardoImageGenerationDriver.py @@ -70,7 +70,7 @@ class gtUILeonardoImageGenerationDriver(gtUIBaseImageGenerationDriver): ) @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): models = [] for model in leonardo_models: models.append(model["name"]) diff --git a/nodes/drivers/gtUILocalStructureRunDriver.py b/nodes/drivers/gtUILocalStructureRunDriver.py index 2d2a8f2..d785b3c 100644 --- a/nodes/drivers/gtUILocalStructureRunDriver.py +++ b/nodes/drivers/gtUILocalStructureRunDriver.py @@ -8,7 +8,7 @@ class gtUILocalStructureRunDriver: DESCRIPTION = "Local Structure Run Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": {"agent": ("AGENT", {"forceInput": True, "default": None})}, @@ -28,7 +28,7 @@ class gtUILocalStructureRunDriver: ): if agent: # Create a local structure function - driver = LocalStructureRunDriver(structure_factory_fn=lambda: agent) + driver = LocalStructureRunDriver(create_structure=lambda: agent) return (driver,) else: return None diff --git a/nodes/drivers/gtUILocalVectorStoreDriver.py b/nodes/drivers/gtUILocalVectorStoreDriver.py index bd1cbdb..79e1bc8 100644 --- a/nodes/drivers/gtUILocalVectorStoreDriver.py +++ b/nodes/drivers/gtUILocalVectorStoreDriver.py @@ -11,7 +11,7 @@ class gtUILocalVectorStoreDriver(gtUIBaseVectorStoreDriver): DESCRIPTION = "Griptape Local Vector Store Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( diff --git a/nodes/drivers/gtUIMarqoVectorStoreDriver.py b/nodes/drivers/gtUIMarqoVectorStoreDriver.py index 9929751..7cc12b8 100644 --- a/nodes/drivers/gtUIMarqoVectorStoreDriver.py +++ b/nodes/drivers/gtUIMarqoVectorStoreDriver.py @@ -13,7 +13,7 @@ class gtUIMarqoVectorStoreDriver(gtUIBaseVectorStoreDriver): DESCRIPTION = "Griptape Marqo Vector Store Driver: https://www.marqo.ai/" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( @@ -65,5 +65,5 @@ class gtUIMarqoVectorStoreDriver(gtUIBaseVectorStoreDriver): def create(self, **kwargs): params = self.build_params(**kwargs) - driver = MarqoVectorStoreDriver(**params) + driver = MarqoVectorStoreDriver(**params) # type: ignore[reportArgumentType] return (driver,) diff --git a/nodes/drivers/gtUIMongoDbAtlasVectorStoreDriver.py b/nodes/drivers/gtUIMongoDbAtlasVectorStoreDriver.py index e3c612a..fe9d1e4 100644 --- a/nodes/drivers/gtUIMongoDbAtlasVectorStoreDriver.py +++ b/nodes/drivers/gtUIMongoDbAtlasVectorStoreDriver.py @@ -17,7 +17,7 @@ class gtUIMongoDbAtlasVectorStoreDriver(gtUIBaseVectorStoreDriver): DESCRIPTION = "Griptape Mongodb Atlas Vector Store Driver: https://www.mongodb.com/products/platform/atlas-database" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( @@ -112,5 +112,5 @@ class gtUIMongoDbAtlasVectorStoreDriver(gtUIBaseVectorStoreDriver): def create(self, **kwargs): params = self.build_params(**kwargs) - driver = MongoDbAtlasVectorStoreDriver(**params) + driver = MongoDbAtlasVectorStoreDriver(**params) # type: ignore[reportArgumentType] return (driver,) diff --git a/nodes/drivers/gtUIOllamaEmbeddingDriver.py b/nodes/drivers/gtUIOllamaEmbeddingDriver.py index cd6741a..86c4941 100644 --- a/nodes/drivers/gtUIOllamaEmbeddingDriver.py +++ b/nodes/drivers/gtUIOllamaEmbeddingDriver.py @@ -15,7 +15,7 @@ default_base_url = "http://127.0.0.1" class gtUIOllamaEmbeddingDriver(gtUIBaseEmbeddingDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( @@ -48,7 +48,7 @@ class gtUIOllamaEmbeddingDriver(gtUIBaseEmbeddingDriver): return inputs @classmethod - def VALIDATE_INPUTS(s, embedding_model): + def VALIDATE_INPUTS(cls, embedding_model): if not embedding_model: return """ diff --git a/nodes/drivers/gtUIOllamaPromptDriver.py b/nodes/drivers/gtUIOllamaPromptDriver.py index 1082fcb..c894e01 100644 --- a/nodes/drivers/gtUIOllamaPromptDriver.py +++ b/nodes/drivers/gtUIOllamaPromptDriver.py @@ -13,7 +13,7 @@ default_base_url = "http://127.0.0.1" class gtUIOllamaPromptDriver(gtUIBasePromptDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() # Get the base required and optional inputs base_required_inputs = inputs["required"] diff --git a/nodes/drivers/gtUIOpenAiAudioTranscriptionDriver.py b/nodes/drivers/gtUIOpenAiAudioTranscriptionDriver.py index 4dd0d4b..0235414 100644 --- a/nodes/drivers/gtUIOpenAiAudioTranscriptionDriver.py +++ b/nodes/drivers/gtUIOpenAiAudioTranscriptionDriver.py @@ -15,7 +15,7 @@ class gtUIOpenAiAudioTranscriptionDriver(gtUIBaseAudioTranscriptionDriver): DESCRIPTION = "OpenAI Audio Transcription Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( diff --git a/nodes/drivers/gtUIOpenAiChatPromptDriver.py b/nodes/drivers/gtUIOpenAiChatPromptDriver.py index c3d05ec..5b26da4 100644 --- a/nodes/drivers/gtUIOpenAiChatPromptDriver.py +++ b/nodes/drivers/gtUIOpenAiChatPromptDriver.py @@ -11,7 +11,7 @@ DEFAULT_API_KEY = "OPENAI_API_KEY" class gtUIOpenAiChatPromptDriver(gtUIBasePromptDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() # Get the base required and optional inputs diff --git a/nodes/drivers/gtUIOpenAiCompatibleChatPromptDriver.py b/nodes/drivers/gtUIOpenAiCompatibleChatPromptDriver.py index a5c532c..a648d79 100644 --- a/nodes/drivers/gtUIOpenAiCompatibleChatPromptDriver.py +++ b/nodes/drivers/gtUIOpenAiCompatibleChatPromptDriver.py @@ -9,7 +9,7 @@ DEFAULT_API_KEY_ENV = "OPENAI_API_KEY" class gtUIOpenAiCompatibleChatPromptDriver(gtUIOpenAiChatPromptDriver): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( diff --git a/nodes/drivers/gtUIOpenAiCompatibleEmbeddingDriver.py b/nodes/drivers/gtUIOpenAiCompatibleEmbeddingDriver.py index 8c722eb..fcca18d 100644 --- a/nodes/drivers/gtUIOpenAiCompatibleEmbeddingDriver.py +++ b/nodes/drivers/gtUIOpenAiCompatibleEmbeddingDriver.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.drivers import OpenAiEmbeddingDriver from .gtUIBaseEmbeddingDriver import gtUIBaseEmbeddingDriver @@ -11,7 +13,7 @@ class gtUIOpenAiCompatibleEmbeddingDriver(gtUIBaseEmbeddingDriver): DESCRIPTION = "OpenAI Compatible Embedding Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( @@ -60,7 +62,7 @@ class gtUIOpenAiCompatibleEmbeddingDriver(gtUIBaseEmbeddingDriver): return params - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: params = self.build_params(**kwargs) driver = OpenAiEmbeddingDriver(**params) return (driver,) diff --git a/nodes/drivers/gtUIOpenAiCompatibleImageGenerationDriver.py b/nodes/drivers/gtUIOpenAiCompatibleImageGenerationDriver.py index 48de314..8651bc1 100644 --- a/nodes/drivers/gtUIOpenAiCompatibleImageGenerationDriver.py +++ b/nodes/drivers/gtUIOpenAiCompatibleImageGenerationDriver.py @@ -14,7 +14,7 @@ class gtUIOpenAiCompatibleImageGenerationDriver(gtUIOpenAiImageGenerationDriver) DESCRIPTION = "OpenAI Image Generation Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( { diff --git a/nodes/drivers/gtUIOpenAiEmbeddingDriver.py b/nodes/drivers/gtUIOpenAiEmbeddingDriver.py index 29b1611..c1ee744 100644 --- a/nodes/drivers/gtUIOpenAiEmbeddingDriver.py +++ b/nodes/drivers/gtUIOpenAiEmbeddingDriver.py @@ -16,7 +16,7 @@ class gtUIOpenAiEmbeddingDriver(gtUIBaseEmbeddingDriver): DESCRIPTION = "OpenAI Embedding Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() diff --git a/nodes/drivers/gtUIOpenAiImageGenerationDriver.py b/nodes/drivers/gtUIOpenAiImageGenerationDriver.py index c5cd563..8edaf41 100644 --- a/nodes/drivers/gtUIOpenAiImageGenerationDriver.py +++ b/nodes/drivers/gtUIOpenAiImageGenerationDriver.py @@ -15,7 +15,7 @@ class gtUIOpenAiImageGenerationDriver(gtUIBaseImageGenerationDriver): DESCRIPTION = "OpenAI Image Generation Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( { @@ -43,7 +43,7 @@ class gtUIOpenAiImageGenerationDriver(gtUIBaseImageGenerationDriver): return inputs def adjust_size_based_on_model(self, model, size): - # pick the approprite size based on the model + # pick the appropriate size based on the model if model == "dall-e-2": if size in ["1024x1792", "1792x1024"]: size = "1024x1024" diff --git a/nodes/drivers/gtUIOpenAiTextToSpeechDriver.py b/nodes/drivers/gtUIOpenAiTextToSpeechDriver.py index ae59747..4f07503 100644 --- a/nodes/drivers/gtUIOpenAiTextToSpeechDriver.py +++ b/nodes/drivers/gtUIOpenAiTextToSpeechDriver.py @@ -14,7 +14,7 @@ class gtUIOpenAiTextToSpeechDriver(gtUIBaseTextToSpeechDriver): DESCRIPTION = "Griptape OpenAi Text to Speech Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( diff --git a/nodes/drivers/gtUIPgVectorVectorStoreDriver.py b/nodes/drivers/gtUIPgVectorVectorStoreDriver.py index 971f8bc..935b0de 100644 --- a/nodes/drivers/gtUIPgVectorVectorStoreDriver.py +++ b/nodes/drivers/gtUIPgVectorVectorStoreDriver.py @@ -16,7 +16,7 @@ class gtUIPgVectorVectorStoreDriver(gtUIBaseVectorStoreDriver): ) @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( diff --git a/nodes/drivers/gtUIPineconeVectorStoreDriver.py b/nodes/drivers/gtUIPineconeVectorStoreDriver.py index 6901a0d..127ccab 100644 --- a/nodes/drivers/gtUIPineconeVectorStoreDriver.py +++ b/nodes/drivers/gtUIPineconeVectorStoreDriver.py @@ -11,7 +11,7 @@ class gtUIPineconeVectorStoreDriver(gtUIBaseVectorStoreDriver): DESCRIPTION = "Griptape Pinecone Vector Store Driver: https://www.pinecone.io/" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( @@ -66,5 +66,5 @@ class gtUIPineconeVectorStoreDriver(gtUIBaseVectorStoreDriver): def create(self, **kwargs): params = self.build_params(**kwargs) - driver = PineconeVectorStoreDriver(**params) + driver = PineconeVectorStoreDriver(**params) # type: ignore[reportArgumentType] return (driver,) diff --git a/nodes/drivers/gtUIQdrantVectorStoreDriver.py b/nodes/drivers/gtUIQdrantVectorStoreDriver.py index 6394dc4..aaf3927 100644 --- a/nodes/drivers/gtUIQdrantVectorStoreDriver.py +++ b/nodes/drivers/gtUIQdrantVectorStoreDriver.py @@ -12,7 +12,7 @@ class gtUIQdrantVectorStoreDriver(gtUIBaseVectorStoreDriver): DESCRIPTION = "Griptape Qdrant Vector Store Driver: https://qdrant.tech/" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( @@ -57,6 +57,9 @@ class gtUIQdrantVectorStoreDriver(gtUIBaseVectorStoreDriver): collection_name = kwargs.get("collection_name", DEFAULT_COLLECTION_NAME) content_payload_key = kwargs.get("content_payload_key", DEFAULT_PAYLOAD_KEY) + url = None + api_key = None + if url_env: url = self.getenv(url_env) if api_key_env: diff --git a/nodes/drivers/gtUIRedisVectorStoreDriver.py b/nodes/drivers/gtUIRedisVectorStoreDriver.py index dd3b49c..e320d3e 100644 --- a/nodes/drivers/gtUIRedisVectorStoreDriver.py +++ b/nodes/drivers/gtUIRedisVectorStoreDriver.py @@ -12,7 +12,7 @@ class gtUIRedisVectorStoreDriver(gtUIBaseVectorStoreDriver): DESCRIPTION = "Griptape Redis Atlas Vector Store Driver: https://redis.io/" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update() inputs["optional"].update( @@ -57,6 +57,11 @@ class gtUIRedisVectorStoreDriver(gtUIBaseVectorStoreDriver): password_env = kwargs.get("password_env", DEFAULT_PASSWORD_ENV) index_env_var = kwargs.get("index_name_env", DEFAULT_INDEX_ENV) + password = None + host = None + port = None + index = None + if password_env: password = self.getenv(password_env) if host_env: diff --git a/nodes/drivers/gtUITavilyWebSearchDriver.py b/nodes/drivers/gtUITavilyWebSearchDriver.py index 8ef31a8..fac291e 100644 --- a/nodes/drivers/gtUITavilyWebSearchDriver.py +++ b/nodes/drivers/gtUITavilyWebSearchDriver.py @@ -13,7 +13,7 @@ class gtUITavilyWebSearchDriver(gtUIBaseWebSearchDriver): ) @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( { diff --git a/nodes/drivers/gtUIVoyageAiEmbeddingDriver.py b/nodes/drivers/gtUIVoyageAiEmbeddingDriver.py index a2726fe..d8c1faa 100644 --- a/nodes/drivers/gtUIVoyageAiEmbeddingDriver.py +++ b/nodes/drivers/gtUIVoyageAiEmbeddingDriver.py @@ -9,7 +9,7 @@ class gtUIVoyageAiEmbeddingDriver(gtUIBaseEmbeddingDriver): DESCRIPTION = "Voyage AI Embedding Driver" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() # Get the base required and optional inputs diff --git a/nodes/expand/ExpandAgent.py b/nodes/expand/ExpandAgent.py index 899340d..d488dcd 100644 --- a/nodes/expand/ExpandAgent.py +++ b/nodes/expand/ExpandAgent.py @@ -5,7 +5,7 @@ class ExpandAgent: pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": { "agent": ( diff --git a/nodes/expand/gtUIExpandConfig.py b/nodes/expand/gtUIExpandConfig.py index 47576c3..a642495 100644 --- a/nodes/expand/gtUIExpandConfig.py +++ b/nodes/expand/gtUIExpandConfig.py @@ -7,7 +7,7 @@ class gtUIExpandConfig: pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": { "config": ( @@ -42,15 +42,17 @@ class gtUIExpandConfig: OUTPUT_NODE = True def expand(self, **kwargs): - config = kwargs.get("config") - - prompt_driver = config.prompt_driver - image_generation_driver = config.image_generation_driver - embedding_driver = config.embedding_driver - vector_store_driver = config.vector_store_driver - text_to_speech_driver = config.text_to_speech_driver - audio_transcription_driver = config.audio_transcription_driver + config = kwargs.get("config", None) + if config is not None: + prompt_driver = config.prompt_driver + image_generation_driver = config.image_generation_driver + embedding_driver = config.embedding_driver + vector_store_driver = config.vector_store_driver + text_to_speech_driver = config.text_to_speech_driver + audio_transcription_driver = config.audio_transcription_driver + else: + raise ValueError("No config provided") return ( prompt_driver, image_generation_driver, diff --git a/nodes/griptape_config.py b/nodes/griptape_config.py deleted file mode 100644 index 664f087..0000000 --- a/nodes/griptape_config.py +++ /dev/null @@ -1,76 +0,0 @@ -# This config code from rgthree-comfy - an incredibly helpful library! -# https://github.com/rgthree/rgthree-comfy -import os -import json -import re - -from .utils import get_dict_value, set_dict_value, dict_has_key - - -def get_config_value(key): - return get_dict_value(GRIPTAPE_CONFIG, key) - - -def extend_config(default_config, user_config): - """Returns a new config dict combining user_config into defined keys for default_config.""" - cfg = {} - for key, value in default_config.items(): - if key not in user_config: - cfg[key] = value - elif isinstance(value, dict): - cfg[key] = extend_config(value, user_config[key]) - else: - cfg[key] = user_config[key] if key in user_config else value - return cfg - - -def set_user_config(data: dict): - """Sets the user configuration.""" - count = 0 - for key, value in data.items(): - if dict_has_key(DEFAULT_CONFIG, key): - set_dict_value(USER_CONFIG, key, value) - set_dict_value(GRIPTAPE_CONFIG, key, value) - count += 1 - if count > 0: - write_user_config() - - -def get_griptape_default_config(): - """Gets the default configuration.""" - with open(DEFAULT_CONFIG_FILE, "r", encoding="UTF-8") as file: - config = re.sub(r"(?:^|\s)//.*", "", file.read(), flags=re.MULTILINE) - return json.loads(config) - - -def get_griptape_user_config(): - """Gets the user configuration.""" - if os.path.exists(USER_CONFIG_FILE): - with open(USER_CONFIG_FILE, "r", encoding="UTF-8") as file: - config = re.sub(r"(?:^|\s)//.*", "", file.read(), flags=re.MULTILINE) - return json.loads(config) - else: - return {} - - -def write_user_config(): - """Writes the user configuration.""" - with open(USER_CONFIG_FILE, "w+", encoding="UTF-8") as file: - json.dump(USER_CONFIG, file, sort_keys=True, indent=2, separators=(",", ": ")) - - -THIS_DIR = os.path.dirname(os.path.abspath(__file__)) -DEFAULT_CONFIG_FILE = os.path.join(THIS_DIR, "..", "griptape_config.json.default") -USER_CONFIG_FILE = os.path.join(THIS_DIR, "..", "griptape_config.json") -DEFAULT_CONFIG = get_griptape_default_config() - -USER_CONFIG = get_griptape_user_config() - -# Migrate old config options into "features" -needs_to_write_user_config = False - -if needs_to_write_user_config is True: - print("writing new user config.") - write_user_config() - -GRIPTAPE_CONFIG = extend_config(DEFAULT_CONFIG, USER_CONFIG) diff --git a/nodes/gtUIBase.py b/nodes/gtUIBase.py index 7c25f07..2892c9c 100644 --- a/nodes/gtUIBase.py +++ b/nodes/gtUIBase.py @@ -1,4 +1,5 @@ import os +from typing import Any, Tuple class gtUIBase: @@ -10,7 +11,7 @@ class gtUIBase: pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": {}, @@ -49,6 +50,6 @@ class gtUIBase: os.environ[key] = value print(f"Set environment variable: {key}") - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: self.run_envs(kwargs) - return () + return (None,) diff --git a/nodes/loaders/gtUIBaseLoader.py b/nodes/loaders/gtUIBaseLoader.py index 49d1ab6..93d6409 100644 --- a/nodes/loaders/gtUIBaseLoader.py +++ b/nodes/loaders/gtUIBaseLoader.py @@ -1,4 +1,4 @@ -from griptape.artifacts import BaseArtifact +from griptape.artifacts import TextArtifact class gtUIBaseLoader: @@ -8,7 +8,7 @@ class gtUIBaseLoader: DESCRIPTION = "Loader" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": {}, @@ -23,5 +23,5 @@ class gtUIBaseLoader: CATEGORY = "Griptape/Loaders" def run(self, **kwargs): - artifact = BaseArtifact() + artifact = TextArtifact(value="") return (artifact,) diff --git a/nodes/loaders/gtUIFetchImage.py b/nodes/loaders/gtUIFetchImage.py index 7e4cba7..ecc0e63 100644 --- a/nodes/loaders/gtUIFetchImage.py +++ b/nodes/loaders/gtUIFetchImage.py @@ -1,3 +1,4 @@ +# pyright: reportMissingImports=false from io import BytesIO import numpy as np diff --git a/nodes/loaders/gtUILoadAudio.py b/nodes/loaders/gtUILoadAudio.py index 6c4a932..ec8e119 100644 --- a/nodes/loaders/gtUILoadAudio.py +++ b/nodes/loaders/gtUILoadAudio.py @@ -1,9 +1,10 @@ +# pyright: reportMissingImports=false + import mimetypes import os -import torchaudio - import folder_paths +import torchaudio def is_audio_file(filepath): @@ -16,7 +17,7 @@ class gtUILoadAudio: SUPPORTED_FORMATS = (".wav", ".mp3", ".ogg", ".flac", ".aiff", ".aif") @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): input_dir = folder_paths.get_input_directory() files = [ f @@ -37,7 +38,6 @@ class gtUILoadAudio: def gt_load_audio(self, audio): audio_path = folder_paths.get_annotated_filepath(audio) waveform, sample_rate = torchaudio.load(audio_path) - multiplier = 1.0 audio = {"waveform": waveform.unsqueeze(0), "sample_rate": sample_rate} return ( audio_path, diff --git a/nodes/loaders/gtUILoadText.py b/nodes/loaders/gtUILoadText.py index f01a2fd..f05eded 100644 --- a/nodes/loaders/gtUILoadText.py +++ b/nodes/loaders/gtUILoadText.py @@ -1,3 +1,5 @@ +# pyright: reportMissingImports=false + import os import folder_paths @@ -23,7 +25,7 @@ class gtUILoadText: ) @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): input_dir = folder_paths.get_input_directory() files = [ f diff --git a/nodes/rag/gtUIBaseQueryRagModule.py b/nodes/rag/gtUIBaseQueryRagModule.py index 5789b51..3a9be50 100644 --- a/nodes/rag/gtUIBaseQueryRagModule.py +++ b/nodes/rag/gtUIBaseQueryRagModule.py @@ -1,5 +1,3 @@ -from griptape.engines.rag.modules import BaseQueryRagModule - from .gtUIBaseRagModule import gtUIBaseRagModule @@ -12,10 +10,10 @@ class gtUIBaseQueryRagModule(gtUIBaseRagModule): pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() return inputs - def create(self): - return ([BaseQueryRagModule()],) + def create(self, **kwargs): + return ([None],) diff --git a/nodes/rag/gtUIBaseRagModule.py b/nodes/rag/gtUIBaseRagModule.py index 75c0bcb..b40aa77 100644 --- a/nodes/rag/gtUIBaseRagModule.py +++ b/nodes/rag/gtUIBaseRagModule.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.engines.rag.modules import BaseRagModule @@ -10,7 +12,7 @@ class gtUIBaseRagModule: pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": {}, @@ -23,7 +25,7 @@ class gtUIBaseRagModule: CATEGORY = "Griptape/RAG" - def ensure_dict(params): + def ensure_dict(self, params): if isinstance(params, dict): return params elif isinstance(params, str): @@ -48,5 +50,5 @@ class gtUIBaseRagModule: except Exception: raise ValueError(f"Could not convert {type(params)} to dictionary") - def create(self): + def create(self) -> Tuple[Any, ...]: return ([BaseRagModule()],) diff --git a/nodes/rag/gtUIBaseRerankRagModule.py b/nodes/rag/gtUIBaseRerankRagModule.py index b5bc374..f01f6e9 100644 --- a/nodes/rag/gtUIBaseRerankRagModule.py +++ b/nodes/rag/gtUIBaseRerankRagModule.py @@ -1,5 +1,3 @@ -from griptape.engines.rag.modules import BaseRerankRagModule - from .gtUIBaseRagModule import gtUIBaseRagModule @@ -12,7 +10,7 @@ class gtUIBaseRerankRagModule(gtUIBaseRagModule): pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( @@ -26,4 +24,4 @@ class gtUIBaseRerankRagModule(gtUIBaseRagModule): RETURN_NAMES = ("MODULE",) def create(self, **kwargs): - return (BaseRerankRagModule(),) + return (None,) diff --git a/nodes/rag/gtUIBaseReponseRagModule.py b/nodes/rag/gtUIBaseResponseRagModule.py similarity index 63% rename from nodes/rag/gtUIBaseReponseRagModule.py rename to nodes/rag/gtUIBaseResponseRagModule.py index e12f722..eadc720 100644 --- a/nodes/rag/gtUIBaseReponseRagModule.py +++ b/nodes/rag/gtUIBaseResponseRagModule.py @@ -1,5 +1,3 @@ -from griptape.engines.rag.modules import BaseResponseRagModule - from .gtUIBaseRagModule import gtUIBaseRagModule @@ -9,4 +7,4 @@ class gtUIBaseResponseRagModule(gtUIBaseRagModule): """ def create(self, **kwargs): - return ([BaseResponseRagModule()],) + return ([None],) diff --git a/nodes/rag/gtUIBaseRetrievalRagModule.py b/nodes/rag/gtUIBaseRetrievalRagModule.py index 9de0b7a..7b715e8 100644 --- a/nodes/rag/gtUIBaseRetrievalRagModule.py +++ b/nodes/rag/gtUIBaseRetrievalRagModule.py @@ -1,5 +1,8 @@ -from griptape.drivers import DummyVectorStoreDriver, LocalVectorStoreDriver -from griptape.engines.rag.modules import BaseRetrievalRagModule +from griptape.drivers import ( + DummyEmbeddingDriver, + DummyVectorStoreDriver, + LocalVectorStoreDriver, +) from .gtUIBaseRagModule import gtUIBaseRagModule @@ -13,7 +16,7 @@ class gtUIBaseRetrievalRagModule(gtUIBaseRagModule): pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = { @@ -46,10 +49,10 @@ class gtUIBaseRetrievalRagModule(gtUIBaseRagModule): if not vector_store_driver or isinstance( vector_store_driver, DummyVectorStoreDriver ): - return LocalVectorStoreDriver() + return LocalVectorStoreDriver(embedding_driver=DummyEmbeddingDriver()) else: return vector_store_driver return None def create(self, **kwargs): - return ([BaseRetrievalRagModule()],) + return ([None],) diff --git a/nodes/rag/gtUIFootnotePromptResponseRagModule.py b/nodes/rag/gtUIFootnotePromptResponseRagModule.py index 919d0a2..c52f9f0 100644 --- a/nodes/rag/gtUIFootnotePromptResponseRagModule.py +++ b/nodes/rag/gtUIFootnotePromptResponseRagModule.py @@ -12,7 +12,7 @@ class gtUIFootnotePromptResponseRagModule(gtUIPromptResponseRagModule): pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() return inputs diff --git a/nodes/rag/gtUIPromptResponseRagModule.py b/nodes/rag/gtUIPromptResponseRagModule.py index bb542da..4c1e6ba 100644 --- a/nodes/rag/gtUIPromptResponseRagModule.py +++ b/nodes/rag/gtUIPromptResponseRagModule.py @@ -1,6 +1,8 @@ +from typing import Any, Tuple + from griptape.engines.rag.modules import PromptResponseRagModule -from .gtUIBaseReponseRagModule import gtUIBaseResponseRagModule +from .gtUIBaseResponseRagModule import gtUIBaseResponseRagModule class gtUIPromptResponseRagModule(gtUIBaseResponseRagModule): @@ -12,7 +14,7 @@ class gtUIPromptResponseRagModule(gtUIBaseResponseRagModule): pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = { @@ -30,7 +32,7 @@ class gtUIPromptResponseRagModule(gtUIBaseResponseRagModule): } return inputs - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: params = {} prompt_driver = kwargs.get("prompt_driver", None) rulesets = kwargs.get("rulesets", []) diff --git a/nodes/rag/gtUIRagEngine.py b/nodes/rag/gtUIRagEngine.py index a038660..0d07f2c 100644 --- a/nodes/rag/gtUIRagEngine.py +++ b/nodes/rag/gtUIRagEngine.py @@ -10,7 +10,7 @@ class gtUIRagEngine: DESCRIPTION = "Griptape Rag Tool" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": { diff --git a/nodes/rag/gtUITextChunksRerankRagModule.py b/nodes/rag/gtUITextChunksRerankRagModule.py index bae2851..6771b3f 100644 --- a/nodes/rag/gtUITextChunksRerankRagModule.py +++ b/nodes/rag/gtUITextChunksRerankRagModule.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.engines.rag.modules import TextChunksRerankRagModule from .gtUIBaseRerankRagModule import gtUIBaseRerankRagModule @@ -11,7 +13,7 @@ class gtUITextChunksRerankRagModule(gtUIBaseRerankRagModule): def __init__(self): pass - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: params = {} rerank_driver = kwargs.get("rerank_driver", None) if rerank_driver: diff --git a/nodes/rag/gtUITextChunksResponseRagModule.py b/nodes/rag/gtUITextChunksResponseRagModule.py index e50e980..5bbd20b 100644 --- a/nodes/rag/gtUITextChunksResponseRagModule.py +++ b/nodes/rag/gtUITextChunksResponseRagModule.py @@ -1,6 +1,8 @@ +from typing import Any, Tuple + from griptape.engines.rag.modules import TextChunksResponseRagModule -from .gtUIBaseReponseRagModule import gtUIBaseResponseRagModule +from .gtUIBaseResponseRagModule import gtUIBaseResponseRagModule class gtUITextChunksResponseRagModule(gtUIBaseResponseRagModule): @@ -11,6 +13,6 @@ class gtUITextChunksResponseRagModule(gtUIBaseResponseRagModule): def __init__(self): pass - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: module = TextChunksResponseRagModule() return ([module],) diff --git a/nodes/rag/gtUITextLoaderRetrievalRagModule.py b/nodes/rag/gtUITextLoaderRetrievalRagModule.py index 3d55e96..17d52db 100644 --- a/nodes/rag/gtUITextLoaderRetrievalRagModule.py +++ b/nodes/rag/gtUITextLoaderRetrievalRagModule.py @@ -1,5 +1,7 @@ +# pyright: reportMissingImports=false import os import tempfile +from typing import Any, Tuple import folder_paths from griptape.engines.rag.modules import TextLoaderRetrievalRagModule @@ -36,7 +38,7 @@ class gtUITextLoaderRetrievalRagModule(gtUIBaseRetrievalRagModule): pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): input_dir = folder_paths.get_input_directory() files = [ f @@ -93,7 +95,7 @@ class gtUITextLoaderRetrievalRagModule(gtUIBaseRetrievalRagModule): ) return inputs - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: vector_store_driver = self.get_vector_store_driver( kwargs.get("vector_store_driver", None) ) diff --git a/nodes/rag/gtUITranslateQueryRagModule.py b/nodes/rag/gtUITranslateQueryRagModule.py index 63f4acd..5f11414 100644 --- a/nodes/rag/gtUITranslateQueryRagModule.py +++ b/nodes/rag/gtUITranslateQueryRagModule.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.drivers import OpenAiChatPromptDriver from griptape.engines.rag.modules import TranslateQueryRagModule @@ -13,7 +15,7 @@ class gtUITranslateQueryRagModule(gtUIBaseQueryRagModule): pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"] = { @@ -31,7 +33,7 @@ class gtUITranslateQueryRagModule(gtUIBaseQueryRagModule): } return inputs - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: prompt_driver = kwargs.get("prompt_driver", None) if not prompt_driver: prompt_driver = OpenAiChatPromptDriver(model="gpt-4o") diff --git a/nodes/rag/gtUIVectorStoreRetrievalRagModule.py b/nodes/rag/gtUIVectorStoreRetrievalRagModule.py index f54281d..773c0f4 100644 --- a/nodes/rag/gtUIVectorStoreRetrievalRagModule.py +++ b/nodes/rag/gtUIVectorStoreRetrievalRagModule.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.engines.rag.modules import VectorStoreRetrievalRagModule from .gtUIBaseRetrievalRagModule import gtUIBaseRetrievalRagModule @@ -12,7 +14,7 @@ class gtUIVectorStoreRetrievalRagModule(gtUIBaseRetrievalRagModule): pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( @@ -34,7 +36,7 @@ class gtUIVectorStoreRetrievalRagModule(gtUIBaseRetrievalRagModule): ) return inputs - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: vector_store_driver = self.get_vector_store_driver( kwargs.get("vector_store_driver", None) ) diff --git a/nodes/rules/gtUIRule.py b/nodes/rules/gtUIRule.py index dac1335..0ccfe7e 100644 --- a/nodes/rules/gtUIRule.py +++ b/nodes/rules/gtUIRule.py @@ -8,7 +8,7 @@ class gtUIRule: DESCRIPTION = "Create a set of rules for an agent" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": { "name": ("STRING", {"default": "My rules"}), diff --git a/nodes/structures/BaseStructure.py b/nodes/structures/BaseStructure.py deleted file mode 100644 index e98e4ad..0000000 --- a/nodes/structures/BaseStructure.py +++ /dev/null @@ -1,28 +0,0 @@ -from griptape.structures import Structure - - -class gtUIBaseStructure: - def __init__(self): - pass - - DESCRIPTION = "Create a Structure." - - @classmethod - def INPUT_TYPES(s): - return { - "required": {}, - "optional": {}, - } - - RETURN_TYPES = ("STRUCTURE",) - RETURN_NAMES = ("STRUCTURE",) - - FUNCTION = "run" - # OUTPUT_NODE = True - - CATEGORY = "Griptape/Structure" - - def run( - self, - ): - return (Structure(),) diff --git a/nodes/structures/CreatePipeline.py b/nodes/structures/CreatePipeline.py deleted file mode 100644 index ae6b655..0000000 --- a/nodes/structures/CreatePipeline.py +++ /dev/null @@ -1,52 +0,0 @@ -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,) diff --git a/nodes/structures/PipelineAddTask.py b/nodes/structures/PipelineAddTask.py deleted file mode 100644 index 85f8c7d..0000000 --- a/nodes/structures/PipelineAddTask.py +++ /dev/null @@ -1,59 +0,0 @@ -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,) diff --git a/nodes/structures/PipelineInsertTask.py b/nodes/structures/PipelineInsertTask.py deleted file mode 100644 index 755a8be..0000000 --- a/nodes/structures/PipelineInsertTask.py +++ /dev/null @@ -1,64 +0,0 @@ -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,) diff --git a/nodes/structures/RunStructure.py b/nodes/structures/RunStructure.py deleted file mode 100644 index d5f5957..0000000 --- a/nodes/structures/RunStructure.py +++ /dev/null @@ -1,89 +0,0 @@ -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) diff --git a/nodes/tasks/gtUIAudioTranscriptionTask.py b/nodes/tasks/gtUIAudioTranscriptionTask.py index 541fd3c..6447541 100644 --- a/nodes/tasks/gtUIAudioTranscriptionTask.py +++ b/nodes/tasks/gtUIAudioTranscriptionTask.py @@ -43,6 +43,8 @@ class gtUIAudioTranscriptionTask(gtUIBaseAudioTask): audio_filepath = kwargs.get("audio_filepath", None) driver = kwargs.get("driver", None) agent = kwargs.get("agent", None) + + result = None if not agent: agent = Agent() @@ -100,7 +102,7 @@ class gtUIAudioTranscriptionTask(gtUIBaseAudioTask): result = pipeline.run() except Exception as e: print(e) - output = result.output_task.output.value + output = result.output_task.output.value # type: ignore[reportOptionalMemberAccess] else: output = "No audio provided" return (output,) diff --git a/nodes/tasks/gtUIBaseAudioTask.py b/nodes/tasks/gtUIBaseAudioTask.py index 0a78821..27dec52 100644 --- a/nodes/tasks/gtUIBaseAudioTask.py +++ b/nodes/tasks/gtUIBaseAudioTask.py @@ -1,5 +1,7 @@ +# pyright: reportMissingImports=false import io import tempfile +from typing import Any, Tuple import torchaudio from griptape.drivers import OpenAiAudioTranscriptionDriver @@ -55,7 +57,7 @@ class gtUIBaseAudioTask(gtUIBaseTask): return temp_files - def run(self, **kwargs): + def run(self, **kwargs) -> Tuple[Any, ...]: driver = kwargs.get("driver", None) if not driver: diff --git a/nodes/tasks/gtUIBaseImageTask.py b/nodes/tasks/gtUIBaseImageTask.py index cf054a1..aec29aa 100644 --- a/nodes/tasks/gtUIBaseImageTask.py +++ b/nodes/tasks/gtUIBaseImageTask.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from .gtUIBaseTask import gtUIBaseTask @@ -16,6 +18,7 @@ class gtUIBaseImageTask(gtUIBaseTask): CATEGORY = "Griptape/Image" - def run(self, STRING, image, input_string=None, agent=None): + def run(self, **kwargs) -> Tuple[Any, ...]: + agent = kwargs.get("agent", None) output = "Output" return (output, agent) diff --git a/nodes/tasks/gtUIBaseTask.py b/nodes/tasks/gtUIBaseTask.py index d729dbd..f7986d2 100644 --- a/nodes/tasks/gtUIBaseTask.py +++ b/nodes/tasks/gtUIBaseTask.py @@ -1,7 +1,5 @@ import re -from griptape.tasks import PromptTask - from ..agent.gtComfyAgent import gtComfyAgent as Agent @@ -12,7 +10,7 @@ class gtUIBaseTask: DESCRIPTION = "Run a PromptTask." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": { # "deferred_evaluation": ("BOOLEAN", {"default": False}), @@ -88,12 +86,11 @@ class gtUIBaseTask: input_string = kwargs.get("input_string") agent = kwargs.get("agent") deferred_evaluation = kwargs.get("deferred_evaluation", False) - + result = None if not agent: agent = Agent() prompt_text = self.get_prompt_text(STRING, input_string) - task = PromptTask(prompt_text) if deferred_evaluation: try: return ( @@ -110,7 +107,6 @@ class gtUIBaseTask: print(e) # result = agent.run() return ( - result.output_task.output.value, + result.output_task.output.value, # type: ignore[reportOptionalMemberAccess] agent, - # task ) diff --git a/nodes/tasks/gtUIBaseVectorStoreTask.py b/nodes/tasks/gtUIBaseVectorStoreTask.py index 7907d3d..fb36a4d 100644 --- a/nodes/tasks/gtUIBaseVectorStoreTask.py +++ b/nodes/tasks/gtUIBaseVectorStoreTask.py @@ -1,4 +1,4 @@ -from griptape.drivers import LocalVectorStoreDriver +from griptape.drivers import DummyEmbeddingDriver, LocalVectorStoreDriver from ..agent.gtComfyAgent import gtComfyAgent as Agent @@ -11,7 +11,7 @@ class gtUIBaseVectorStoreTask: DESCRIPTION = "Operate on a Vector Store." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): # inputs = super().INPUT_TYPES() inputs = { "required": {}, @@ -45,15 +45,12 @@ class gtUIBaseVectorStoreTask: elif not driver and agent: vector_store_driver = agent.drivers_config.vector_store_driver else: - vector_store_driver = LocalVectorStoreDriver() + vector_store_driver = LocalVectorStoreDriver( + embedding_driver=DummyEmbeddingDriver() + ) return vector_store_driver def run(self, **kwargs): agent = kwargs.get("agent", Agent()) - driver = kwargs.get("driver", None) - vector_store_driver = self.get_vector_store_driver(agent, driver) - return ( - agent, - # vector_store_driver, - ) + return (agent,) diff --git a/nodes/tasks/gtUIExtractionTask.py b/nodes/tasks/gtUIExtractionTask.py index 32deb07..1e05981 100644 --- a/nodes/tasks/gtUIExtractionTask.py +++ b/nodes/tasks/gtUIExtractionTask.py @@ -13,7 +13,7 @@ class gtUIExtractionTask(gtUIBaseTask): """ @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( { @@ -69,8 +69,8 @@ class gtUIExtractionTask(gtUIBaseTask): column_name.strip() for column_name in column_names_string.split(",") ] template_schema = kwargs.get("template_schema", "") - params = {} - + engine = None + output = None if not agent: agent = Agent() prompt_driver = agent.drivers_config.prompt_driver @@ -87,7 +87,7 @@ class gtUIExtractionTask(gtUIBaseTask): prompt_text = self.get_prompt_text(STRING, input_string) - task = ExtractionTask(extraction_engine=engine) + task = ExtractionTask(extraction_engine=engine) # type: ignore[reportArgumentType] try: agent.add_task(task) except Exception as e: diff --git a/nodes/tasks/gtUIImageQueryTask.py b/nodes/tasks/gtUIImageQueryTask.py index ee98ae9..5b12974 100644 --- a/nodes/tasks/gtUIImageQueryTask.py +++ b/nodes/tasks/gtUIImageQueryTask.py @@ -45,7 +45,7 @@ class gtUIImageQueryTask(gtUIBaseImageTask): ImageLoader().parse(base64.b64decode(base64Image)) ) except Exception as e: - raise (f"Couldn't load image {e}") + raise RuntimeError(f"Couldn't load image {e}") # Depending on the model, we might need to use a workflow instead of a simple prompt rulesets = agent.rulesets tasks = [] diff --git a/nodes/tasks/gtUIInpaintingImageGenerationTask.py b/nodes/tasks/gtUIInpaintingImageGenerationTask.py index e2e7338..210f6ec 100644 --- a/nodes/tasks/gtUIInpaintingImageGenerationTask.py +++ b/nodes/tasks/gtUIInpaintingImageGenerationTask.py @@ -1,3 +1,4 @@ +# pyright: reportMissingImports=false import base64 import os @@ -9,6 +10,8 @@ try: ) except ImportError: print("BlackForestImageGenerationDriver not found") + BlackForestImageGenerationDriver = None # Set it to None if import fails + from griptape.drivers import ( AmazonBedrockImageGenerationDriver, AzureOpenAiImageGenerationDriver, @@ -35,7 +38,7 @@ class gtUIInpaintingImageGenerationTask(gtUIBaseImageTask): ) @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( { @@ -102,7 +105,7 @@ class gtUIInpaintingImageGenerationTask(gtUIBaseImageTask): mask = kwargs.get("mask") driver = kwargs.get("driver", None) input_string = kwargs.get("input_string", None) - + result = None agent = Agent() final_image = convert_tensor_to_base_64(image) final_mask = convert_tensor_to_base_64(mask) @@ -126,7 +129,7 @@ class gtUIInpaintingImageGenerationTask(gtUIBaseImageTask): raise ValueError(msg) # Quick fix for flux-pro-1.0-fill - if "BlackForestImageGenerationDriver" in globals() and isinstance( + if BlackForestImageGenerationDriver and isinstance( driver, BlackForestImageGenerationDriver ): # check the model to make sure it's one that can handle Variation Image Generation @@ -150,7 +153,7 @@ class gtUIInpaintingImageGenerationTask(gtUIBaseImageTask): result = agent.run() except Exception as e: print(e) - filename = result.output_task.output.name + filename = result.output_task.output.name # type: ignore[reportOptionalMemberAccess] image_path = os.path.join(output_dir, filename) # Get the image in a format ComfyUI can read output_image, output_mask = image_path_to_output(image_path) diff --git a/nodes/tasks/gtUIPromptImageGenerationTask.py b/nodes/tasks/gtUIPromptImageGenerationTask.py index b23f4fa..fa7624d 100644 --- a/nodes/tasks/gtUIPromptImageGenerationTask.py +++ b/nodes/tasks/gtUIPromptImageGenerationTask.py @@ -1,4 +1,6 @@ +# pyright: reportMissingImports=false import os +from typing import Any, Tuple import folder_paths from griptape.drivers import ( @@ -24,7 +26,7 @@ class gtUIPromptImageGenerationTask(gtUIBaseTask): DESCRIPTION = "Generate an image from a text prompt." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update({"driver": ("DRIVER",)}) return inputs @@ -41,7 +43,7 @@ class gtUIPromptImageGenerationTask(gtUIBaseTask): ) CATEGORY = "Griptape/Image" - def run(self, **kwargs): + def run(self, **kwargs) -> Tuple[Any, ...]: STRING = kwargs.get("STRING") driver = kwargs.get("driver", None) input_string = kwargs.get("input_string", None) @@ -51,7 +53,7 @@ class gtUIPromptImageGenerationTask(gtUIBaseTask): agent = Agent() prompt_text = self.get_prompt_text(STRING, input_string) - + pipeline = None if not driver: # Check and see if the agent.config has an image_generation_driver if isinstance( @@ -84,11 +86,14 @@ class gtUIPromptImageGenerationTask(gtUIBaseTask): except Exception as e: print(e) - result = pipeline.run() - filename = result.output_task.output.name - image_path = os.path.join(output_dir, filename) + if pipeline is not None: + result = pipeline.run() + filename = result.output_task.output.name + image_path = os.path.join(output_dir, filename) - # Get the image in a format ComfyUI can read - output_image, output_mask = image_path_to_output(image_path) + # Get the image in a format ComfyUI can read + output_image, output_mask = image_path_to_output(image_path) - return (output_image, agent, image_path) + return (output_image, agent, image_path) + else: + return ("Error", agent, None) diff --git a/nodes/tasks/gtUIPromptImageVariationTask.py b/nodes/tasks/gtUIPromptImageVariationTask.py index 3b86762..37db76d 100644 --- a/nodes/tasks/gtUIPromptImageVariationTask.py +++ b/nodes/tasks/gtUIPromptImageVariationTask.py @@ -1,3 +1,5 @@ +# pyright: reportMissingImports=false + import base64 import os @@ -9,6 +11,8 @@ try: ) except ImportError: print("BlackForestImageGenerationDriver not found") + BlackForestImageGenerationDriver = None # Set it to None if import fails + from griptape.drivers import ( OpenAiImageGenerationDriver, ) @@ -32,7 +36,7 @@ class gtUIPromptImageVariationTask(gtUIBaseImageTask): DESCRIPTION = "Generate a variation of an image from a text prompt and an image." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update({"driver": ("DRIVER",)}) del inputs["optional"]["agent"] @@ -53,6 +57,7 @@ class gtUIPromptImageVariationTask(gtUIBaseImageTask): driver = kwargs.get("driver", None) input_string = kwargs.get("input_string", None) + result = None agent = Agent() final_image = convert_tensor_to_base_64(image) if not final_image: @@ -68,7 +73,7 @@ class gtUIPromptImageVariationTask(gtUIBaseImageTask): model="dall-e-2", ) # Check if driver is BlackForestImageGenerationDriver - if "BlackForestImageGenerationDriver" in globals() and isinstance( + if BlackForestImageGenerationDriver and isinstance( driver, BlackForestImageGenerationDriver ): # check the model to make sure it's one that can handle Variation Image Generation @@ -105,9 +110,13 @@ class gtUIPromptImageVariationTask(gtUIBaseImageTask): result = agent.run() except Exception as e: print(e) - filename = result.output_task.output.name - image_path = os.path.join(output_dir, filename) - # Get the image in a format ComfyUI can read - output_image, output_mask = image_path_to_output(image_path) + if result is not None: + filename = result.output_task.output.name - return (output_image, image_path) + image_path = os.path.join(output_dir, filename) + # Get the image in a format ComfyUI can read + output_image, output_mask = image_path_to_output(image_path) + + return (output_image, image_path) + else: + return ("Error", None) diff --git a/nodes/tasks/gtUITextSummaryTask.py b/nodes/tasks/gtUITextSummaryTask.py index 6351ffa..57af5d7 100644 --- a/nodes/tasks/gtUITextSummaryTask.py +++ b/nodes/tasks/gtUITextSummaryTask.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.tasks import ( TextSummaryTask, ) @@ -10,7 +12,7 @@ class gtUITextSummaryTask(gtUIBaseTask): DESCRIPTION = "Summarize a text prompt." CATEGORY = "Griptape/Text" - def run(self, **kwargs): + def run(self, **kwargs) -> Tuple[Any, ...]: STRING = kwargs.get("STRING") input_string = kwargs.get("input_string", None) agent = kwargs.get("agent", None) diff --git a/nodes/tasks/gtUITextToSpeechTask.py b/nodes/tasks/gtUITextToSpeechTask.py index 5e16dc8..1671e80 100644 --- a/nodes/tasks/gtUITextToSpeechTask.py +++ b/nodes/tasks/gtUITextToSpeechTask.py @@ -1,3 +1,6 @@ +# pyright: reportMissingImports=false +from typing import Any, Tuple + from comfy_execution.graph import ExecutionBlocker from griptape.artifacts import AudioArtifact, ErrorArtifact from griptape.drivers import DummyTextToSpeechDriver, ElevenLabsTextToSpeechDriver @@ -16,7 +19,7 @@ default_prompt = "{{ input_string }}" class gtUITextToSpeechTask(gtUIBaseTask): @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( @@ -30,7 +33,7 @@ class gtUITextToSpeechTask(gtUIBaseTask): RETURN_TYPES = ("AUDIO",) RETURN_NAMES = ("AUDIO",) - def run(self, **kwargs): + def run(self, **kwargs) -> Tuple[Any, ...]: # try: STRING = kwargs.get("STRING", "") input_string = kwargs.get("input_string", "") @@ -41,14 +44,15 @@ class gtUITextToSpeechTask(gtUIBaseTask): ELEVEN_LABS_API_KEY = settings.get_settings_key_or_use_env( "ELEVEN_LABS_API_KEY" ) - + if not ELEVEN_LABS_API_KEY: + ELEVEN_LABS_API_KEY = "" driver = agent.drivers_config.text_to_speech_driver if isinstance(driver, DummyTextToSpeechDriver): driver = ElevenLabsTextToSpeechDriver( api_key=ELEVEN_LABS_API_KEY, model="eleven_multilingual_v2", voice="Matilda", - ) + ) # type: ignore[reportArgumentType] prompt_text = self.get_prompt_text(STRING, input_string) task = TextToSpeechTask( diff --git a/nodes/tasks/gtUIToolTask.py b/nodes/tasks/gtUIToolTask.py index ae41b0f..4bccc05 100644 --- a/nodes/tasks/gtUIToolTask.py +++ b/nodes/tasks/gtUIToolTask.py @@ -11,7 +11,7 @@ class gtUIToolTask(gtUIBaseTask): CATEGORY = "Griptape/Agent" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() # Update optional inputs to include 'tool' and adjust others as necessary diff --git a/nodes/tasks/gtUIToolkitTask.py b/nodes/tasks/gtUIToolkitTask.py index c9a9be2..b8e7f99 100644 --- a/nodes/tasks/gtUIToolkitTask.py +++ b/nodes/tasks/gtUIToolkitTask.py @@ -1,6 +1,4 @@ -from griptape.tasks import ( - ToolkitTask, -) +from griptape.tasks import PromptTask, ToolkitTask from ..agent.gtComfyAgent import gtComfyAgent as Agent from .gtUIBaseTask import gtUIBaseTask @@ -29,9 +27,6 @@ class gtUIToolkitTask(gtUIBaseTask): agent = kwargs.get("agent", None) prompt_text = self.get_prompt_text(STRING, input_string) - if len(tools) == 0: - return super().run(STRING, input_string, agent) - if prompt_text.strip() == "": return ("No prompt provided", agent) # if the tool is provided, keep going @@ -43,10 +38,13 @@ class gtUIToolkitTask(gtUIBaseTask): response = agent.model_response(model) return (response, agent) - task = ToolkitTask( - prompt_text, - tools=tools, - ) + if len(tools) == 0: + task = PromptTask(prompt_text) + else: + task = ToolkitTask( + prompt_text, + tools=tools, + ) # if deferred_evaluation: # return ("Toolkit Task Created.", task) try: diff --git a/nodes/tasks/gtUIVectorStoreQueryTask.py b/nodes/tasks/gtUIVectorStoreQueryTask.py index 3614ae4..db08e15 100644 --- a/nodes/tasks/gtUIVectorStoreQueryTask.py +++ b/nodes/tasks/gtUIVectorStoreQueryTask.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from ..agent.gtComfyAgent import gtComfyAgent as Agent from .gtUIBaseVectorStoreTask import gtUIBaseVectorStoreTask @@ -8,7 +10,7 @@ class gtUIVectorStoreQueryTask(gtUIBaseVectorStoreTask): DESCRIPTION = "Query a Vector Store." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( @@ -47,7 +49,7 @@ class gtUIVectorStoreQueryTask(gtUIBaseVectorStoreTask): CATEGORY = "Griptape/Text" - def run(self, **kwargs): + def run(self, **kwargs) -> Tuple[Any, ...]: STRING = kwargs.get("STRING", "") input_string = kwargs.get("input_string", "") agent = kwargs.get("agent", Agent()) diff --git a/nodes/tasks/gtUIVectorStoreUpsertTextTask.py b/nodes/tasks/gtUIVectorStoreUpsertTextTask.py index bc5b542..1b7d2d1 100644 --- a/nodes/tasks/gtUIVectorStoreUpsertTextTask.py +++ b/nodes/tasks/gtUIVectorStoreUpsertTextTask.py @@ -18,7 +18,7 @@ class gtUIVectorStoreUpsertTextTask(gtUIBaseVectorStoreTask): DESCRIPTION = "Operate on a Vector Store." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( @@ -31,7 +31,7 @@ class gtUIVectorStoreUpsertTextTask(gtUIBaseVectorStoreTask): return inputs @classmethod - def VALIDATE_INPUTS(s, input_types): + def VALIDATE_INPUTS(cls, input_types): return True RETURN_TYPES = ( diff --git a/nodes/text/gtUIBaseSaveNode.py b/nodes/text/gtUIBaseSaveNode.py index 6ad4813..2309d99 100644 --- a/nodes/text/gtUIBaseSaveNode.py +++ b/nodes/text/gtUIBaseSaveNode.py @@ -1,4 +1,6 @@ +# pyright: reportMissingImports=false import os +from typing import Any, Tuple import folder_paths @@ -18,7 +20,7 @@ class gtUIBaseSaveNode: DESCRIPTION = "Save a file." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = { "required": { "text": ("STRING", {"default": "", "forceInput": True}), @@ -57,7 +59,8 @@ class gtUIBaseSaveNode: return full_output_path - def save(self, **kwargs): + def save(self, **kwargs) -> Tuple[Any, ...]: print(f": {kwargs['text']=}") print(f"Saving file: {kwargs['filename_prefix']}") - return {"ui": {"message": f"Saved file: {kwargs['filename_prefix']}"}} + filename_prefix = kwargs.get("filename_prefix", None) + return (filename_prefix,) diff --git a/nodes/text/gtUICLIPTextEncode.py b/nodes/text/gtUICLIPTextEncode.py index ba26102..44bcaec 100644 --- a/nodes/text/gtUICLIPTextEncode.py +++ b/nodes/text/gtUICLIPTextEncode.py @@ -13,7 +13,7 @@ class gtUICLIPTextEncode(gtUIBaseTask): DESCRIPTION = "Create a text string and convert it to a CLIP conditioning." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update({"clip": ("CLIP",)}) del inputs["optional"]["agent"] diff --git a/nodes/text/gtUIInputStringNode.py b/nodes/text/gtUIInputStringNode.py index e331358..d21858a 100644 --- a/nodes/text/gtUIInputStringNode.py +++ b/nodes/text/gtUIInputStringNode.py @@ -14,7 +14,7 @@ class gtUIInputStringNode: pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": {}, "optional": { diff --git a/nodes/text/gtUISaveText.py b/nodes/text/gtUISaveText.py index 86a39b3..d6a529f 100644 --- a/nodes/text/gtUISaveText.py +++ b/nodes/text/gtUISaveText.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from .gtUIBaseSaveNode import gtUIBaseSaveNode @@ -6,7 +8,7 @@ class gtUISaveText(gtUIBaseSaveNode): CATEGORY = "Griptape/Text" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( { @@ -15,7 +17,7 @@ class gtUISaveText(gtUIBaseSaveNode): ) return inputs - def save(self, **kwargs): + def save(self, **kwargs) -> Tuple[Any, ...]: text = kwargs.get("text", None) filename_prefix = kwargs.get("filename_prefix", None) diff --git a/nodes/tools/gtUIAudioTranscriptionClient.py b/nodes/tools/gtUIAudioTranscriptionClient.py index 37aca62..66bad94 100644 --- a/nodes/tools/gtUIAudioTranscriptionClient.py +++ b/nodes/tools/gtUIAudioTranscriptionClient.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.drivers import OpenAiAudioTranscriptionDriver from griptape.tools.audio_transcription.tool import AudioTranscriptionTool @@ -12,7 +14,7 @@ class gtUIAudioTranscriptionClient(gtUIBaseTool): DESCRIPTION = "Transcribe audio to text" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": { "off_prompt": ( @@ -27,7 +29,7 @@ class gtUIAudioTranscriptionClient(gtUIBaseTool): "optional": {"driver": ("DRIVER", {"default": None})}, } - def create(self, **kwargs): + def create(self, **kwargs) -> Tuple[Any, ...]: off_prompt = kwargs.get("off_prompt", True) driver = kwargs.get("driver", None) diff --git a/nodes/tools/gtUIBaseTool.py b/nodes/tools/gtUIBaseTool.py index db4224b..fcc5a80 100644 --- a/nodes/tools/gtUIBaseTool.py +++ b/nodes/tools/gtUIBaseTool.py @@ -1,3 +1,5 @@ +from typing import Any, Tuple + from griptape.tools import BaseTool @@ -10,7 +12,7 @@ class gtUIBaseTool: pass @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": { "off_prompt": ( @@ -32,5 +34,6 @@ class gtUIBaseTool: CATEGORY = "Griptape/Agent Tools" - def create(self, off_prompt): + def create(self, **kwargs) -> Tuple[Any, ...]: + off_prompt = kwargs.get("off_prompt", False) return ([BaseTool(off_prompt=off_prompt)],) diff --git a/nodes/tools/gtUICalculator.py b/nodes/tools/gtUICalculator.py index 25e21c1..fa9164e 100644 --- a/nodes/tools/gtUICalculator.py +++ b/nodes/tools/gtUICalculator.py @@ -10,6 +10,7 @@ class gtUICalculator(gtUIBaseTool): DESCRIPTION = "Perform calculations." - def create(self, off_prompt): + def create(self, **kwargs): + off_prompt = kwargs.get("off_prompt", False) tool = CalculatorTool(off_prompt=off_prompt) return ([tool],) diff --git a/nodes/tools/gtUIConvertAgentToTool.py b/nodes/tools/gtUIConvertAgentToTool.py index a2467b6..af0d1e9 100644 --- a/nodes/tools/gtUIConvertAgentToTool.py +++ b/nodes/tools/gtUIConvertAgentToTool.py @@ -12,7 +12,7 @@ class gtUIConvertAgentToTool(gtUIBaseTool): DESCRIPTION = "Convert Agent to Tool" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( { diff --git a/nodes/tools/gtUIDateTime.py b/nodes/tools/gtUIDateTime.py index 50fb491..5e65819 100644 --- a/nodes/tools/gtUIDateTime.py +++ b/nodes/tools/gtUIDateTime.py @@ -12,6 +12,7 @@ class gtUIDateTime(gtUIBaseTool): DESCRIPTION = "Get the current date and time." - def create(self, off_prompt): + def create(self, **kwargs): + off_prompt = kwargs.get("off_prompt", False) tool = DateTimeTool(off_prompt=off_prompt) return ([tool],) diff --git a/nodes/tools/gtUIExtractionTool.py b/nodes/tools/gtUIExtractionTool.py index 1a56fc7..942354e 100644 --- a/nodes/tools/gtUIExtractionTool.py +++ b/nodes/tools/gtUIExtractionTool.py @@ -14,7 +14,7 @@ class gtUIExtractionTool(gtUIBaseTool): """ @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( @@ -52,6 +52,7 @@ class gtUIExtractionTool(gtUIBaseTool): column_names_string = kwargs.get("column_names", "") column_names = [column_name.strip() for column_name in column_names_string] template_schema = kwargs.get("template_schema", "") + engine = None params = {} if not prompt_driver: diff --git a/nodes/tools/gtUIFileManager.py b/nodes/tools/gtUIFileManager.py index 3332292..33b1ea3 100644 --- a/nodes/tools/gtUIFileManager.py +++ b/nodes/tools/gtUIFileManager.py @@ -13,7 +13,7 @@ class gtUIFileManager(gtUIBaseTool): DESCRIPTION = "Access files on disk." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": { "off_prompt": ( @@ -27,6 +27,7 @@ class gtUIFileManager(gtUIBaseTool): }, } - def create(self, off_prompt, workdir=""): + def create(self, **kwargs): + off_prompt = kwargs.get("off_prompt", True) tool = FileManagerTool(off_prompt=off_prompt) return ([tool],) diff --git a/nodes/tools/gtUIKnowledgeBaseTool.py b/nodes/tools/gtUIKnowledgeBaseTool.py index 3b73ef8..d7b712c 100644 --- a/nodes/tools/gtUIKnowledgeBaseTool.py +++ b/nodes/tools/gtUIKnowledgeBaseTool.py @@ -1,7 +1,10 @@ +from typing import List, cast + import requests from griptape.drivers import GriptapeCloudVectorStoreDriver from griptape.engines.rag import RagEngine from griptape.engines.rag.modules import ( + BaseRetrievalRagModule, PromptResponseRagModule, VectorStoreRetrievalRagModule, ) @@ -24,7 +27,7 @@ class gtUIKnowledgeBaseTool(gtUIBaseTool): DESCRIPTION = "Access a Griptape Cloud Knowledge Base. Learn more at https://cloud.griptape.ai" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": { "off_prompt": ( @@ -63,35 +66,40 @@ class gtUIKnowledgeBaseTool(gtUIBaseTool): 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, - ): + def create(self, **kwargs): + off_prompt = kwargs.get("off_prompt", False) + api_key_environment_variable = kwargs.get( + "api_key_environment_variable", "GRIPTAPE_CLOUD_API_KEY" + ) + base_url = kwargs.get("base_url", "https://cloud.griptape.ai") + knowledge_base_id = kwargs.get("knowledge_base_id", "12345-abcde-1434") + settings = GriptapeSettings() api_key = settings.get_settings_key_or_use_env(api_key_environment_variable) - + if api_key is None: + api_key = "" # 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") + name = data.get("name", "Griptape Knowledge Base") # type: ignore[reportOptionalMemberAccess] + description = data.get("description", "Contains helpful information") # type: ignore[reportOptionalMemberAccess] name = to_pascal_case(name) - engine = RagEngine( - retrieval_stage=RetrievalRagStage( - retrieval_modules=[ - VectorStoreRetrievalRagModule( - driver=GriptapeCloudVectorStoreDriver( - api_key=api_key, - base_url=base_url, - knowledge_base_id=knowledge_base_id, - ) + retrieval_modules: List[BaseRetrievalRagModule] = cast( + List[BaseRetrievalRagModule], + [ + VectorStoreRetrievalRagModule( + vector_store_driver=GriptapeCloudVectorStoreDriver( + api_key=api_key, + base_url=base_url, + knowledge_base_id=knowledge_base_id, ) - ] - ), + ) + ], + ) + + engine = RagEngine( + retrieval_stage=RetrievalRagStage(retrieval_modules=retrieval_modules), response_stage=ResponseRagStage( response_modules=[ PromptResponseRagModule(), diff --git a/nodes/tools/gtUIPromptSummaryTool.py b/nodes/tools/gtUIPromptSummaryTool.py index 379071a..788b920 100644 --- a/nodes/tools/gtUIPromptSummaryTool.py +++ b/nodes/tools/gtUIPromptSummaryTool.py @@ -10,7 +10,7 @@ class gtUIPromptSummaryTool(gtUIBaseTool): """ @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( diff --git a/nodes/tools/gtUIQueryTool.py b/nodes/tools/gtUIQueryTool.py index 98875ad..aa5fd1a 100644 --- a/nodes/tools/gtUIQueryTool.py +++ b/nodes/tools/gtUIQueryTool.py @@ -9,7 +9,7 @@ class gtUIQueryTool(gtUIBaseTool): """ @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( diff --git a/nodes/tools/gtUIRagTool.py b/nodes/tools/gtUIRagTool.py index 9399e05..c504930 100644 --- a/nodes/tools/gtUIRagTool.py +++ b/nodes/tools/gtUIRagTool.py @@ -8,7 +8,7 @@ class gtUIRagTool(gtUIBaseTool): DESCRIPTION = "Griptape Rag Tool" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): return { "required": { "description": ( diff --git a/nodes/tools/gtUITextToSpeechClient.py b/nodes/tools/gtUITextToSpeechClient.py index 43525a0..8d13490 100644 --- a/nodes/tools/gtUITextToSpeechClient.py +++ b/nodes/tools/gtUITextToSpeechClient.py @@ -13,7 +13,7 @@ class gtUITextToSpeechClient(gtUIBaseTool): DESCRIPTION = "Transcribe audio to text" @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): # inputs = super().INPUT_TYPES() # inputs["optional"].update({"driver": ("DRIVER",)}) # return inputs @@ -32,11 +32,15 @@ class gtUITextToSpeechClient(gtUIBaseTool): "optional": {"driver": ("TEXT_TO_SPEECH_DRIVER", {"default": None})}, } - def create(self, off_prompt, driver=None): + def create(self, **kwargs): + off_prompt = kwargs.get("off_prompt", True) + driver = kwargs.get("driver", None) if not driver: settings = GriptapeSettings() api_key = settings.get_settings_key_or_use_env("ELEVEN_LABS_API_KEY") - + if not api_key: + print("Could not get Eleven Labs API key") + api_key = "" driver = ElevenLabsTextToSpeechDriver( api_key=api_key, model="eleven_multilingual_v2", voice="Matilda" ) diff --git a/nodes/tools/gtUIVectorStoreClient.py b/nodes/tools/gtUIVectorStoreClient.py index d44ef33..ce0c65c 100644 --- a/nodes/tools/gtUIVectorStoreClient.py +++ b/nodes/tools/gtUIVectorStoreClient.py @@ -13,7 +13,7 @@ class gtUIVectorStoreClient(gtUIBaseTool): """ @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["required"].update( { @@ -49,12 +49,11 @@ class gtUIVectorStoreClient(gtUIBaseTool): pass # Try key-value pair format - if ":" in s: - return dict( - map(str.strip, item.split(":", 1)) - for item in s.split("\n") - if ":" in item - ) + return dict( + (str.strip(item.split(":", 1)[0]), str.strip(item.split(":", 1)[1])) + for item in s.split("\n") + if ":" in item + ) # If all else fails, return an empty dict return {} diff --git a/nodes/tools/gtUIWebScraper.py b/nodes/tools/gtUIWebScraper.py index e2dedc0..e298407 100644 --- a/nodes/tools/gtUIWebScraper.py +++ b/nodes/tools/gtUIWebScraper.py @@ -12,7 +12,8 @@ class gtUIWebScraper(gtUIBaseTool): DESCRIPTION = "Scrape the web for information." - def create(self, off_prompt): + def create(self, **kwargs): + off_prompt = kwargs.get("off_prompt", False) tool = WebScraperTool( off_prompt=off_prompt, ) diff --git a/nodes/tools/gtUIWebSearch.py b/nodes/tools/gtUIWebSearch.py index b56ec9c..843d4cc 100644 --- a/nodes/tools/gtUIWebSearch.py +++ b/nodes/tools/gtUIWebSearch.py @@ -14,7 +14,7 @@ class gtUIWebSearch(gtUIBaseTool): DESCRIPTION = "Search the web." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = super().INPUT_TYPES() inputs["optional"].update( { @@ -23,7 +23,9 @@ class gtUIWebSearch(gtUIBaseTool): ) return inputs - def create(self, off_prompt, driver=None): + def create(self, **kwargs): + off_prompt = kwargs.get("off_prompt", False) + driver = kwargs.get("driver", None) if not driver: driver = DuckDuckGoWebSearchDriver() tool = WebSearchTool( diff --git a/nodes/utilities.py b/nodes/utilities.py index f150125..259ba48 100644 --- a/nodes/utilities.py +++ b/nodes/utilities.py @@ -1,6 +1,10 @@ +# pyright: reportMissingImports=false +# pyright: reportOptionalMemberAccess=false + import base64 import re from io import BytesIO +from typing import Optional from urllib.parse import urlparse, urlunparse import numpy as np @@ -71,7 +75,10 @@ def get_prompt_text(string_prompt, input_string): def image_path_to_output(image_path): - img = Image.open(image_path) + img: Optional[Image.Image] = Image.open(image_path) + if img is None: + raise ValueError(f"Failed to open image at path: {image_path}") + output_images = [] output_masks = [] for i in ImageSequence.Iterator(img): diff --git a/nodes/utils.py b/nodes/utils.py index 5e7cf93..1c90317 100644 --- a/nodes/utils.py +++ b/nodes/utils.py @@ -34,7 +34,7 @@ def set_dict_value(data: dict, dict_key: str, value, create_missing_objects=True keys = dict_key.split(".") key = keys.pop(0) if len(keys) > 0 else None if key not in data: - if create_missing_objects == False: + if not create_missing_objects: return data[key] = {} if len(keys) == 0: diff --git a/nodes/utils/gtUICreateAgentModelfile.py b/nodes/utils/gtUICreateAgentModelfile.py index b3330e7..62e162c 100644 --- a/nodes/utils/gtUICreateAgentModelfile.py +++ b/nodes/utils/gtUICreateAgentModelfile.py @@ -13,7 +13,7 @@ class gtUICreateAgentModelfile: DESCRIPTION = "Creates a Modelfile to build a new Model for Ollama." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = { "required": { "base_url": ( @@ -47,7 +47,7 @@ class gtUICreateAgentModelfile: return inputs @classmethod - def VALIDATE_INPUTS(s): + def VALIDATE_INPUTS(cls): if not check_ollama_installed(): return "You must have ollama installed on your machine to use this node." return True diff --git a/nodes/utils/gtUICreateModelFromModelfile.py b/nodes/utils/gtUICreateModelFromModelfile.py index a36ef7f..3895315 100644 --- a/nodes/utils/gtUICreateModelFromModelfile.py +++ b/nodes/utils/gtUICreateModelFromModelfile.py @@ -7,7 +7,7 @@ class gtUICreateModelFromModelfile: ) @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = { "required": { "modelfile": ( @@ -25,7 +25,7 @@ class gtUICreateModelFromModelfile: return inputs @classmethod - def VALIDATE_INPUTS(s): + def VALIDATE_INPUTS(cls): if not check_ollama_installed(): return "You must have ollama installed on your machine to use this node." return True @@ -57,7 +57,7 @@ class gtUICreateModelFromModelfile: modelfile = kwargs.get("modelfile", None) base_model = self.get_base_model(modelfile) if ":" in str(base_model): - base_model = base_model.split(":")[0] + base_model = str(base_model).split(":")[0] new_model_name = str(kwargs.get("new_model_name", "new_model")) # Save the contents of modelfile to a file named Modelfile. diff --git a/nodes/utils/gtUIRemoveOllamaModel.py b/nodes/utils/gtUIRemoveOllamaModel.py index 21022b6..2cb0eea 100644 --- a/nodes/utils/gtUIRemoveOllamaModel.py +++ b/nodes/utils/gtUIRemoveOllamaModel.py @@ -17,7 +17,7 @@ class gtUIRemoveOllamaModel: DESCRIPTION = "Ollama can sometimes be overrun with models. This node allows you to remove a model by name." @classmethod - def INPUT_TYPES(s): + def INPUT_TYPES(cls): inputs = { "required": { "base_url": ( @@ -43,7 +43,7 @@ class gtUIRemoveOllamaModel: return inputs @classmethod - def VALIDATE_INPUTS(s): + def VALIDATE_INPUTS(cls): if not check_ollama_installed(): return "You must have ollama installed on your machine to use this node." return True diff --git a/py/griptape_settings.py b/py/griptape_settings.py index 26286df..a1eaf71 100644 --- a/py/griptape_settings.py +++ b/py/griptape_settings.py @@ -1,3 +1,4 @@ +# pyright: reportMissingImports=false import json import os import re diff --git a/pyproject.toml b/pyproject.toml index 483c152..af2fef8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,18 +1,40 @@ [tool.poetry] name = "comfyui-griptape" -version = "2.0.10" +version = "2.0.11" description = "Griptape LLM(Large Language Model) Nodes for ComfyUI." authors = ["Jason Schleifer "] readme = "README.md" +# Used by Comfy Registry https://comfyregistry.org +[project] +name = "comfyui-griptape" +description = "Griptape LLM(Large Language Model) Nodes for ComfyUI." +version = "2.0.11" +license = {file = "LICENSE"} +dependencies = ["griptape[all]==^1.0.2", "python-dotenv", "poetry==1.8.4", "griptape-black-forest @ git+https://github.com/griptape-ai/griptape-black-forest.git"] + +[project.urls] +Repository = "https://github.com/griptape-ai/ComfyUI-Griptape" + + [tool.poetry.dependencies] python = "^3.11" python-dotenv = "^1.0.1" griptape = { version = "^1.0.2", extras = ["all"]} griptape-black-forest = {git = "https://github.com/griptape-ai/griptape-black-forest.git"} + +[tool.poetry.group.dev] +optional = true + + [tool.poetry.group.dev.dependencies] icecream = "^2.1.3" +ruff = "^0.8.0" +pyright = "^1.1.376" +pre-commit = "^4.0.0" +typos = "^1.22.9" + #torch = {version = "^2.3.1+cu121", source = "pytorch-gpu-src"} #torchvision = {version = "^0.18.1+cu121", source = "pytorch-gpu-src"} #torchaudio = {version = "^2.3.1+cu121", source = "pytorch-gpu-src"} @@ -23,16 +45,6 @@ name = "pytorch-gpu-src" url = "https://download.pytorch.org/whl/cu121" priority = "explicit" -# Used by Comfy Registry https://comfyregistry.org -[project] -name = "comfyui-griptape" -description = "Griptape LLM(Large Language Model) Nodes for ComfyUI." -version = "2.0.10" -license = {file = "LICENSE"} -dependencies = ["griptape[all]==^1.0.2", "python-dotenv", "poetry==1.8.4", "griptape-black-forest @ git+https://github.com/griptape-ai/griptape-black-forest.git"] - -[project.urls] -Repository = "https://github.com/griptape-ai/ComfyUI-Griptape" [tool.comfy] PublisherId = "shhlife" diff --git a/tests/audio/TranscriptionTest.mp3 b/tests/audio/TranscriptionTest.mp3 deleted file mode 100644 index d874e54..0000000 Binary files a/tests/audio/TranscriptionTest.mp3 and /dev/null differ diff --git a/tests/rag_workflow.py b/tests/rag_workflow.py deleted file mode 100644 index ba0c009..0000000 --- a/tests/rag_workflow.py +++ /dev/null @@ -1,58 +0,0 @@ -# use tempfile to create a temporary file - -from dotenv import load_dotenv -from griptape.chunkers import TextChunker -from griptape.drivers import LocalVectorStoreDriver, OpenAiEmbeddingDriver -from griptape.engines.rag import RagEngine -from griptape.engines.rag.modules import TextLoaderRetrievalRagModule -from griptape.engines.rag.stages import RetrievalRagStage -from griptape.loaders import TextLoader -from griptape.structures import Agent -from griptape.tools import QueryTool, RagTool - -load_dotenv() - -text = """ -Wonderbread.ai is a fictitional company that specializes in creating balloon animals for the future. -They are often confused with the bread company, Wonder Bread, but they are not the same. -Some of the services that Wonderbread.ai offers include: -- Balloon animal creation -- Balloon animal delivery -- Balloon animal training -- Balloon animal parties -- Balloon animal events -- Balloon animal consulting -- Balloon animal workshops -- Balloon animal classes -- Balloon animal seminars -- Balloon animal webinars -- Balloon animal conferences - -Wonderbread.ai is a leader in the balloon animal industry and has been in business for over 100 years. -They have a team of experts who are dedicated to creating the best balloon animals in the world. -If you are interested in learning more about Wonderbread.ai, please visit their website at www.wonderbread.ai/balloonanimals -""" - -chunker = TextChunker() -chunks = chunker.chunk(text) -module = TextLoaderRetrievalRagModule( - query_params={"namespace": "wonderbread"}, - vector_store_driver=LocalVectorStoreDriver( - embedding_driver=OpenAiEmbeddingDriver() - ), - loader=TextLoader().parse(text), -) - -retrieval_modules = [module] - -rag_engine = RagEngine( - retrieval_stage=RetrievalRagStage(retrieval_modules=retrieval_modules), -) - -tool = RagTool( - off_prompt=True, description="Contains info about a company", rag_engine=rag_engine -) - -agent = Agent(tools=[tool, QueryTool()]) - -agent.run("What does the company Wonderbread.ai do?") diff --git a/typos.toml b/typos.toml new file mode 100644 index 0000000..cb92d55 --- /dev/null +++ b/typos.toml @@ -0,0 +1,7 @@ +[files] +extend-exclude = [ + "*.svg", # Ignore all .svg files + "js/nodeFixes.js", # Ignore a specific file + "examples/retrieval_augmented_generation.json", # it's trying to fix "ue_links" which is fine + "nodes/drivers/gtUILeonardoImageGenerationDriver.py" # having trouble with french prefere +] diff --git a/workflow-tests/ConfigTests.json b/workflow-tests/ConfigTests.json index 5e3b26e..1830e0c 100644 --- a/workflow-tests/ConfigTests.json +++ b/workflow-tests/ConfigTests.json @@ -340,7 +340,7 @@ }, "widgets_values": [ "", - "What modle are you?" + "What model are you?" ] }, {