Merge pull request #229 from griptape-ai:update/griptape1.1.3

Update/griptape1.1.3
This commit is contained in:
Jason Schleifer
2025-01-15 14:27:17 +13:00
committed by GitHub
15 changed files with 642 additions and 16 deletions
+18 -3
View File
@@ -7,16 +7,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
<!-- ## [Unreleased]
### Added
### Changed
### Deprecated
### Removed
### Fixed
### Security -->
## [2.1.11] - 2025-15-01
### Added
- `Griptape Agent Config: Groq Drivers` - A Config node for using Groq (https://groq.groqcloud/). Currently contains both the PromptDriver and Audio Transcription Driver. Note: Groq doesn't currently have an embedding driver, which means in order to use it with off_prompt tools, you must use a separate embedding driver. It's on their list, but haven't heard back as to when it'll be available.
- `Griptape Prompt Driver: Groq` - a default prompt driver for working with Groq (https://groq.com/groqcloud/). You will need a `GROQ_API_KEY` to use this node, but you can get one FREE at: https://console.groq.com/keys
- `Griptape Audio Transcription Driver: Groq` - a node to use Groq to perform Audio Transcriptions. You will need a `GROQ_API_KEY` to use this node, but you can get one FREE at: https://console.groq.com/keys
### Changed
- Griptape Framework updated to `1.1.3`
- `Griptape Embedding Driver: OpenAI Compatible` now has a string for the `embedding_model`.
### Deprecated
## [2.1.10] - 2025-15-01
### Added
- `GeminiQueryTool` - a patch for the QueryTool: https://github.com/griptape-ai/griptape/issues/1572
### Changed
- `gtComfyAgent` checks to see if the `prompt_driver` is `GooglePromptDriver`. if so, it uses the `GeminiQueryTool` isntead of `QueryTool`.
- `QueryTool` now checks to see if the `prompt_driver` is `GooglePromptDriver`. If so, it uses the `GeminiQueryTool` instead of `QueryTool`.
### Deprecated
### Removed
### Fixed
- `GooglePromptDriver` can now handle tools that are `off_prompt`.
### Security -->
## [2.1.09] - 2025-10-01
### Added
+10
View File
@@ -52,6 +52,7 @@ from .nodes.config.gtUIAzureOpenAiDriversConfig import gtUIAzureOpenAiDriversCon
from .nodes.config.gtUICohereDriversConfig import gtUICohereDriversConfig
from .nodes.config.gtUIEnvConfig import gtUIEnvConfig
from .nodes.config.gtUIGoogleDriversConfig import gtUIGoogleDriversConfig
from .nodes.config.gtUIGroqDriversConfig import gtUIGroqDriversConfig
from .nodes.config.gtUIHuggingFaceDriversConfig import gtUIHuggingFaceDriversConfig
from .nodes.config.gtUILMStudioDriversConfig import gtUILMStudioDriversConfig
from .nodes.config.gtUIOllamaDriversConfig import gtUIOllamaDriversConfig
@@ -145,6 +146,12 @@ from .nodes.drivers.gtUIGoogleWebSearchDriver import gtUIGoogleWebSearchDriver
from .nodes.drivers.gtUIGriptapeCloudVectorStoreDriver import (
gtUIGriptapeCloudVectorStoreDriver,
)
from .nodes.drivers.gtUIGroqAudioTranscriptionDriver import (
gtUIGroqAudioTranscriptionDriver,
)
# - Groq
from .nodes.drivers.gtUIGroqChatPromptDriver import gtUIGroqChatPromptDriver
# - HuggingFace
from .nodes.drivers.gtUIHuggingFaceHubEmbeddingDriver import (
@@ -329,6 +336,7 @@ NODE_CLASS_MAPPINGS = {
"Griptape Agent Config: Azure OpenAI Drivers": gtUIAzureOpenAiDriversConfig,
"Griptape Agent Config: Cohere Drivers": gtUICohereDriversConfig,
"Griptape Agent Config: Google Drivers": gtUIGoogleDriversConfig,
"Griptape Agent Config: Groq Drivers": gtUIGroqDriversConfig,
"Griptape Agent Config: HuggingFace Drivers": gtUIHuggingFaceDriversConfig,
"Griptape Agent Config: LM Studio Drivers": gtUILMStudioDriversConfig,
"Griptape Agent Config: Ollama Drivers": gtUIOllamaDriversConfig,
@@ -350,6 +358,7 @@ NODE_CLASS_MAPPINGS = {
"Griptape Prompt Driver: Anthropic": gtUIAnthropicPromptDriver,
"Griptape Prompt Driver: Azure OpenAI": gtUIAzureOpenAiChatPromptDriver,
"Griptape Prompt Driver: Cohere": gtUICoherePromptDriver,
"Griptape Prompt Driver: Groq": gtUIGroqChatPromptDriver,
"Griptape Prompt Driver: Google": gtUIGooglePromptDriver,
"Griptape Prompt Driver: HuggingFace": gtUIHuggingFaceHubPromptDriver,
"Griptape Prompt Driver: LM Studio": gtUILMStudioChatPromptDriver,
@@ -393,6 +402,7 @@ NODE_CLASS_MAPPINGS = {
"Griptape Text To Speech Driver: ElevenLabs": gtUIElevenLabsTextToSpeechDriver,
"Griptape Text To Speech Driver: OpenAI": gtUIOpenAiTextToSpeechDriver,
# AUDIO DRIVERS
"Griptape Audio Transcription Driver: Groq": gtUIGroqAudioTranscriptionDriver,
"Griptape Audio Transcription Driver: OpenAI": gtUIOpenAiAudioTranscriptionDriver,
# WEBSEARCH DRIVERS
"Griptape WebSearch Driver: DuckDuckGo": gtUIDuckDuckGoWebSearchDriver,

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

+1 -1
View File
@@ -65,7 +65,7 @@ Download: [retrieval_augmented_generation.json](retrieval_augmented_generation.j
## Sorting a CSV - by using generic Python!
With the `Griptape Code: Run Python` node, you can use generic Python code to work with data. This node requires turning on the `Enable Griptape Code: Run Python Nodes` setting to be enabled.
![alt text](run_python_nodes.png)
![alt text](../docs/images/run_python_nodes.png)
![Run Python](sort_list_with_python_code.png)
Download: [sort_list_with_python_code.png](sort_list_with_python_code.png)
+336
View File
@@ -0,0 +1,336 @@
{
"last_node_id": 8,
"last_link_id": 8,
"nodes": [
{
"id": 1,
"type": "Griptape Code: Run Python",
"pos": [
-175,
100
],
"size": [
950,
550
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "agent",
"type": "AGENT",
"link": null,
"shape": 7
},
{
"name": "input",
"type": "STRING",
"link": 3,
"widget": {
"name": "input"
}
}
],
"outputs": [
{
"name": "OUTPUT",
"type": "STRING",
"links": [
8
],
"slot_index": 0
},
{
"name": "AGENT",
"type": "AGENT",
"links": [],
"slot_index": 1
}
],
"properties": {
"Node name for S&R": "Griptape Code: Run Python"
},
"widgets_values": [
"This text will be passed as `input` to the code.",
"Sort rows based on column from CSV",
"# Sort rows based on Name\n\nimport csv\nfrom io import StringIO\n\ndef sort_by_column(csv_data, column_name):\n reader = csv.DictReader(StringIO(csv_data))\n sorted_rows = sorted(reader, key=lambda row: row[column_name])\n return \"\\n\".join([\",\".join(sorted_rows[0].keys())] + [\",\".join(row.values()) for row in sorted_rows])\n\n# Example: Sort rows by \"Name\"\noutput = sort_by_column(input, \"Name\")"
]
},
{
"id": 3,
"type": "Griptape Create: Agent",
"pos": [
-1500,
225
],
"size": [
525,
225
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"name": "agent",
"type": "AGENT",
"link": null,
"shape": 7
},
{
"name": "config",
"type": "CONFIG",
"link": null,
"shape": 7
},
{
"name": "tools",
"type": "TOOL_LIST",
"link": null,
"shape": 7
},
{
"name": "rulesets",
"type": "RULESET",
"link": 5,
"shape": 7
},
{
"name": "input_string",
"type": "STRING",
"link": null,
"widget": {
"name": "input_string"
},
"shape": 7
}
],
"outputs": [
{
"name": "OUTPUT",
"type": "STRING",
"links": [
2
],
"slot_index": 0
},
{
"name": "AGENT",
"type": "AGENT",
"links": null
}
],
"properties": {
"Node name for S&R": "Griptape Create: Agent"
},
"widgets_values": [
"",
"Create a csv of 20 people. Include Name, Age, Country, and Interest."
],
"color": "#323",
"bgcolor": "#535"
},
{
"id": 4,
"type": "Griptape Display: Text",
"pos": [
-925,
-25
],
"size": [
500,
850
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"name": "INPUT",
"type": "STRING",
"link": 2,
"widget": {
"name": "INPUT"
},
"shape": 7
}
],
"outputs": [
{
"name": "OUTPUT",
"type": "STRING",
"links": [
3
],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "Griptape Display: Text"
},
"widgets_values": [
"",
"Name,Age,Country,Interest\nAlice Smith,28,USA,Photography\nBob Johnson,34,Canada,Cycling\nCharlie Brown,22,UK,Reading\nDiana Prince,30,Australia,Traveling\nEthan Hunt,26,USA,Movies\nFiona Green,29,New Zealand,Gardening\nGeorge White,31,UK,Music\nHannah Lee,24,South Korea,Dancing\nIan Wright,35,Canada,Technology\nJulia Roberts,27,USA,Cooking\nKevin Bacon,33,Australia,Sports\nLaura Croft,25,UK,Art\nMichael Jordan,40,USA,Basketball\nNina Simone,32,France,Singing\nOscar Wilde,29,Ireland,Writing\nPaula Abdul,36,USA,Dance\nQuincy Jones,38,USA,Music Production\nRachel Green,30,USA,Fashion\nSteve Jobs,45,USA,Entrepreneurship\nTina Turner,81,USA,Performing\nUma Thurman,53,USA,Acting"
],
"color": "#222",
"bgcolor": "#000"
},
{
"id": 5,
"type": "Griptape Display: Text",
"pos": [
850,
0
],
"size": [
575,
625
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "INPUT",
"type": "STRING",
"link": 8,
"widget": {
"name": "INPUT"
},
"shape": 7
}
],
"outputs": [
{
"name": "OUTPUT",
"type": "STRING",
"links": [],
"slot_index": 0
}
],
"properties": {
"Node name for S&R": "Griptape Display: Text"
},
"widgets_values": [
"",
"Name,Age,Country,Interest\nAlice Smith,28,USA,Photography\nBob Johnson,34,Canada,Cycling\nCharlie Brown,22,UK,Reading\nDiana Prince,30,Australia,Traveling\nEthan Hunt,26,USA,Movies\nFiona Green,29,New Zealand,Gardening\nGeorge White,31,UK,Music\nHannah Lee,24,South Korea,Dancing\nIan Wright,35,Canada,Technology\nJulia Roberts,27,USA,Cooking\nKevin Bacon,33,Australia,Sports\nLaura Croft,25,UK,Art\nMichael Jordan,40,USA,Basketball\nNina Simone,32,France,Singing\nOscar Wilde,29,Ireland,Writing\nPaula Abdul,36,USA,Dance\nQuincy Jones,38,USA,Music Production\nRachel Green,30,USA,Fashion\nSteve Jobs,45,USA,Entrepreneurship\nTina Turner,81,USA,Performing\nUma Thurman,53,USA,Acting"
],
"color": "#222",
"bgcolor": "#000"
},
{
"id": 6,
"type": "Griptape Create: Rules",
"pos": [
-1500,
-25
],
"size": [
525,
200
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "RULES",
"type": "RULESET",
"links": [
5
]
},
{
"name": "NAME",
"type": "STRING",
"links": null
}
],
"properties": {
"Node name for S&R": "Griptape Create: Rules"
},
"widgets_values": [
"My rules",
"Only output the requested information.\nNever wrap in markdown."
],
"color": "#233",
"bgcolor": "#355"
}
],
"links": [
[
2,
3,
0,
4,
0,
"STRING"
],
[
3,
4,
0,
1,
1,
"STRING"
],
[
5,
6,
0,
3,
3,
"RULESET"
],
[
8,
1,
0,
5,
0,
"STRING"
]
],
"groups": [
{
"id": 1,
"title": "Create Agent",
"bounding": [
-1550,
-175,
1150,
1150
],
"color": "#3f789e",
"font_size": 22,
"flags": {}
},
{
"id": 2,
"title": "Sort List",
"bounding": [
-225,
-150,
1725,
1000
],
"color": "#8A8",
"font_size": 22,
"flags": {}
}
],
"config": {},
"extra": {
"ds": {
"scale": 0.6209213230591554,
"offset": [
1601.6863942999978,
537.0984377999998
]
},
"ue_links": []
},
"version": 0.4
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 KiB

After

Width:  |  Height:  |  Size: 431 KiB

+2 -3
View File
@@ -153,9 +153,6 @@ class BaseAgent:
tools = kwargs.get("tools", [])
rulesets = kwargs.get("rulesets", [])
input_string = kwargs.get("input_string", None)
# print(f"STRING: {STRING=}")
# print(f"input_string: {input_string=}")
# Defaults.drivers_config = DriversConfig()
create_dict = {}
# Configuration
if config:
@@ -183,6 +180,8 @@ class BaseAgent:
create_dict["task_memory"] = agent.task_memory
try:
if create_dict["rulesets"] == [None]:
create_dict["rulesets"] = []
# Now create the agent
self.agent = gtComfyAgent(**create_dict)
+77
View File
@@ -0,0 +1,77 @@
# pyright: reportMissingImports=false
import logging
from comfy_execution.graph import ExecutionBlocker
from griptape.configs import Defaults
from griptape.configs.drivers import (
DriversConfig,
)
# StructureGlobalDriversConfig,
from griptape.drivers import OpenAiAudioTranscriptionDriver, OpenAiChatPromptDriver
from ..drivers.gtUIGroqAudioTranscriptionDriver import gtUIGroqAudioTranscriptionDriver
from ..drivers.gtUIGroqChatPromptDriver import gtUIGroqChatPromptDriver
from .gtUIBaseDriversConfig import (
add_optional_inputs,
add_required_inputs,
gtUIBaseDriversConfig,
)
drivers = [
("prompt", gtUIGroqChatPromptDriver),
("audio_transcription", gtUIGroqAudioTranscriptionDriver),
]
class gtUIGroqDriversConfig(gtUIBaseDriversConfig):
"""
The Griptape LM Studio Structure Config
"""
DESCRIPTION = "Groq Driver Configs. Groq requires a GROQ_API_KEY available at https://console.groq.com"
@classmethod
def INPUT_TYPES(cls):
inputs = super().INPUT_TYPES()
inputs["optional"] = {}
inputs = add_required_inputs(inputs, drivers)
inputs = add_optional_inputs(inputs, drivers)
return inputs
def create(self, **kwargs):
drivers_config_params = {}
try:
# Create instances of the driver classes
prompt_driver_builder = gtUIGroqChatPromptDriver()
audio_transcription_driver_builder = gtUIGroqAudioTranscriptionDriver()
# Build parameters for drivers
prompt_driver_params = prompt_driver_builder.build_params(**kwargs)
audio_transcription_driver_params = (
audio_transcription_driver_builder.build_params(**kwargs)
)
if "model" not in prompt_driver_params:
custom_config = ExecutionBlocker(
"Please provide a model for the prompt driver."
)
return (custom_config,)
# Create Driver Configs
drivers_config_params["prompt_driver"] = OpenAiChatPromptDriver(
**prompt_driver_params
)
drivers_config_params["vector_store_driver"] = (
OpenAiAudioTranscriptionDriver(**audio_transcription_driver_params)
)
Defaults.drivers_config = DriversConfig(**drivers_config_params)
custom_config = Defaults.drivers_config
except Exception as e:
custom_config = ExecutionBlocker(f"{e}")
logging.error(e)
return (custom_config,)
@@ -0,0 +1,58 @@
from griptape.drivers import OpenAiAudioTranscriptionDriver
from .gtUIBaseAudioTranscriptionDriver import gtUIBaseAudioTranscriptionDriver
models = ["whisper-large-v3-turbo", "distil-whisper-large-v3-en", "whisper-large-v3"]
base_url = "https://api.groq.com/openai/v1/"
DEFAULT_MODEL = ""
if len(models) > 0:
DEFAULT_MODEL = models[0]
DEFAULT_API_KEY = "GROQ_API_KEY"
class gtUIGroqAudioTranscriptionDriver(gtUIBaseAudioTranscriptionDriver):
DESCRIPTION = "Groq Audio Transcription Driver"
@classmethod
def INPUT_TYPES(cls):
inputs = super().INPUT_TYPES()
inputs["optional"].update(
{
"audio_transcription_model": (
models,
{
"default": DEFAULT_MODEL,
"tooltip": "Select the audio transcription model to use.",
},
),
"api_key_env_var": (
"STRING",
{
"default": DEFAULT_API_KEY,
"tooltip": "Enter the name of the environment variable that contains the API key, not the API key itself.",
},
),
},
)
return inputs
def build_params(self, **kwargs):
model = kwargs.get("audio_transcription_model", DEFAULT_MODEL)
api_key = self.getenv(kwargs.get("api_key_env_var", DEFAULT_API_KEY))
params = {}
if model:
params["model"] = model
if api_key:
params["api_key"] = api_key
params["base_url"] = base_url
return params
def create(self, **kwargs):
params = self.build_params(**kwargs)
driver = OpenAiAudioTranscriptionDriver(**params)
return (driver,)
+86
View File
@@ -0,0 +1,86 @@
# pyright: reportMissingImports=false
from comfy_execution.graph import ExecutionBlocker
from griptape.drivers import OpenAiChatPromptDriver
from .gtUIOpenAiCompatibleChatPromptDriver import gtUIOpenAiCompatibleChatPromptDriver
default_base_url = "https://api.groq.com/openai/v1"
DEFAULT_API_KEY_ENV = "GROQ_API_KEY"
class gtUIGroqChatPromptDriver(gtUIOpenAiCompatibleChatPromptDriver):
@classmethod
def INPUT_TYPES(cls):
inputs = super().INPUT_TYPES()
del inputs["optional"]["base_url"]
inputs["optional"].update(
{
"model": (
"STRING",
{
"default": "llama-3.3-70b-versatile",
"tooltip": "The model to use for the chat prompt.",
},
),
"use_native_tools": (
"BOOLEAN",
{
"default": True,
"tooltip": "Whether to use native tools.",
"label_on": "True (LLM-native tool calling)",
"label_off": "False (Griptape tool calling)",
},
),
"api_key_env_var": (
"STRING",
{
"default": DEFAULT_API_KEY_ENV,
"tooltip": "API key variable for authentication.",
},
),
}
)
return inputs
FUNCTION = "create"
def build_params(self, **kwargs):
model = kwargs.get("model", None)
response_format = kwargs.get("response_format", None)
api_key = self.getenv(kwargs.get("api_key_env_var", DEFAULT_API_KEY_ENV))
temperature = kwargs.get("temperature", None)
max_attempts = kwargs.get("max_attempts_on_fail", None)
use_native_tools = kwargs.get("use_native_tools", False)
max_tokens = kwargs.get("max_tokens", None)
params = {
"model": model,
"base_url": default_base_url,
"api_key": api_key,
"temperature": temperature,
"use_native_tools": use_native_tools,
"max_attempts": max_attempts,
}
if response_format == "json_object":
params["response_format"] = {"type": response_format}
if max_tokens > 0:
params["max_tokens"] = max_tokens
return params
def create(self, **kwargs):
params = self.build_params(**kwargs)
print(params)
if not params.get("model"):
driver = ExecutionBlocker("Model is required.")
return (driver,)
try:
driver = OpenAiChatPromptDriver(**params)
return (driver,)
except Exception as e:
driver = ExecutionBlocker(f"Error creating driver: {e}")
return (driver,)
@@ -19,7 +19,7 @@ class gtUIOpenAiCompatibleEmbeddingDriver(gtUIBaseEmbeddingDriver):
inputs["optional"].update(
{
"embedding_model": (
models,
"STRING",
{
"default": models[0],
"tooltip": "Select the embedding model to use.",
+32 -3
View File
@@ -17,6 +17,12 @@ default_prompt = "{{ input_string }}"
class gtUIImageQueryTask(gtUIBaseImageTask):
DESCRIPTION = "Query an image for a detailed description."
def _is_grog(self, prompt_driver):
if hasattr(prompt_driver, "base_url") and prompt_driver.base_url:
if "groq" in prompt_driver.base_url:
return True
return False
def run(self, **kwargs):
STRING = kwargs.get("STRING")
image = kwargs.get("image")
@@ -38,6 +44,23 @@ class gtUIImageQueryTask(gtUIBaseImageTask):
):
prompt_text = "Describe this image"
# If the driver is Groq, rulesets _must_ be empty
rulesets = []
tmp_agent_rulesets = []
tmp_task_rulesets = []
if self._is_grog(prompt_driver):
if len(agent.rulesets) > 0:
print(
"[Griptape Run: Image Description] Warning: Rulesets are not supported with Groq. Removing temporarily while getting Image Description."
)
tmp_agent_rulesets = agent.rulesets
tmp_task_rulesets = agent.tasks[0].rulesets
agent._rulesets = []
agent.tasks[0]._rulesets = []
else:
rulesets = agent.rulesets
# Load each of the images
image_artifacts = []
for base64Image in images:
try:
@@ -46,15 +69,16 @@ class gtUIImageQueryTask(gtUIBaseImageTask):
)
except Exception as 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 = []
# Depending on the model, we might need to use a workflow instead of a simple prompt
if len(image_artifacts) > 2:
task_args = {}
if agent.drivers_config.prompt_driver:
task_args["prompt_driver"] = prompt_driver
if len(rulesets) > 0:
task_args["rulesets"] = rulesets
if "groq" not in prompt_driver.base_url:
task_args["rulesets"] = rulesets
end_task = PromptTask(
"Concatenate just the output values of the tasks, separated by two newlines: {{ parent_outputs }}",
id="END",
@@ -68,6 +92,11 @@ class gtUIImageQueryTask(gtUIBaseImageTask):
result = workflow.run()
else:
result = agent.run([prompt_text, *image_artifacts])
# Reset the rulesets
if self._is_grog(prompt_driver):
agent._rulesets = tmp_agent_rulesets
agent.tasks[0]._rulesets = tmp_task_rulesets
output = result.output_task.output.value
else:
output = "No image provided"
+16
View File
@@ -2,11 +2,14 @@
# pyright: reportOptionalMemberAccess=false
import base64
import os
import re
import uuid
from io import BytesIO
from typing import Optional
from urllib.parse import urlparse, urlunparse
import folder_paths
import numpy as np
import requests
import torch
@@ -155,6 +158,19 @@ def load_audio_from_artifact(audio_artifact):
return audio_output
def save_images_to_disk(images):
image_paths = []
output_dir = folder_paths.get_temp_directory()
for batch_number, image in enumerate(images):
i = 255.0 * image.cpu().numpy()
img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8))
filepath = os.path.join(output_dir, uuid.uuid4().hex + ".png")
img.save(filepath)
image_paths.append(filepath)
return image_paths
# return base64_images
def convert_tensor_to_base_64(image):
if not isinstance(image, torch.Tensor):
+4 -4
View File
@@ -1,6 +1,6 @@
[tool.poetry]
name = "comfyui-griptape"
version = "2.1.10"
version = "2.1.11"
description = "Griptape LLM(Large Language Model) Nodes for ComfyUI."
authors = ["Jason Schleifer <jason.schleifer@gmail.com>"]
readme = "README.md"
@@ -9,9 +9,9 @@ readme = "README.md"
[project]
name = "comfyui-griptape"
description = "Griptape LLM(Large Language Model) Nodes for ComfyUI."
version = "2.1.10"
version = "2.1.11"
license = {file = "LICENSE"}
dependencies = ["attrs>=24.3.0,<25.0.0", "openai>=1.58.1,<2.0.0", "griptape[all]>=1.1.0", "python-dotenv", "poetry==1.8.5", "griptape-black-forest @ git+https://github.com/griptape-ai/griptape-black-forest.git"]
dependencies = ["attrs>=24.3.0,<25.0.0", "openai>=1.58.1,<2.0.0", "griptape[all]>=1.1.3", "python-dotenv", "poetry==1.8.5", "griptape-black-forest @ git+https://github.com/griptape-ai/griptape-black-forest.git"]
[project.urls]
Repository = "https://github.com/griptape-ai/ComfyUI-Griptape"
@@ -21,7 +21,7 @@ Repository = "https://github.com/griptape-ai/ComfyUI-Griptape"
python = "^3.11"
python-dotenv = "^1.0.1"
attrs = "^24.3.0"
griptape = { version = "^1.1.0", extras = ["all"]}
griptape = { version = "^1.1.3", extras = ["all"]}
griptape-black-forest = {git = "https://github.com/griptape-ai/griptape-black-forest.git"}
[tool.poetry.group.dev]
+1 -1
View File
@@ -1,6 +1,6 @@
attrs>=24.3.0
openai>=1.58.1
griptape[all]==1.1.0
griptape[all]==1.1.3
python-dotenv
poetry==1.8.5
git+https://github.com/griptape-ai/griptape-black-forest.git