From f60bd07e158135b7de40010d2c6e30d3fb1e6f78 Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Fri, 7 Mar 2025 16:55:00 +0700 Subject: [PATCH] fix(blocks): Fix Invalid input on SmartDecisionMakerBlock, add enchancement CountdownTimerBlock & --- .../backend/backend/blocks/basic.py | 4 ++++ .../backend/blocks/smart_decision_maker.py | 17 +++++++++++++++-- .../backend/backend/blocks/time_blocks.py | 9 +++++++-- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/autogpt_platform/backend/backend/blocks/basic.py b/autogpt_platform/backend/backend/blocks/basic.py index 9189ae40b6..f52a53a4eb 100644 --- a/autogpt_platform/backend/backend/blocks/basic.py +++ b/autogpt_platform/backend/backend/blocks/basic.py @@ -3,6 +3,7 @@ from typing import Any, List from backend.data.block import Block, BlockCategory, BlockOutput, BlockSchema, BlockType from backend.data.model import SchemaField +from backend.util import json from backend.util.file import MediaFile, store_media_file from backend.util.mock import MockObject from backend.util.text import TextFormatter @@ -153,6 +154,9 @@ class FindInDictionaryBlock(Block): obj = input_data.input key = input_data.key + if isinstance(obj, str): + obj = json.loads(obj) + if isinstance(obj, dict) and key in obj: yield "output", obj[key] elif isinstance(obj, list) and isinstance(key, int) and 0 <= key < len(obj): diff --git a/autogpt_platform/backend/backend/blocks/smart_decision_maker.py b/autogpt_platform/backend/backend/blocks/smart_decision_maker.py index b41f5506f4..db4c55d77e 100644 --- a/autogpt_platform/backend/backend/blocks/smart_decision_maker.py +++ b/autogpt_platform/backend/backend/blocks/smart_decision_maker.py @@ -186,7 +186,7 @@ class SmartDecisionMakerBlock(Block): @classmethod def get_missing_links(cls, data: BlockInput, links: list["Link"]) -> set[str]: # conversation_history & last_tool_output validation is handled differently - return super().get_missing_links( + missing_links = super().get_missing_links( data, [ link @@ -196,6 +196,19 @@ class SmartDecisionMakerBlock(Block): ], ) + # Avoid executing the block if the last_tool_output is connected to a static + # link, like StoreValueBlock or AgentInputBlock. + if any(link.sink_name == "conversation_history" for link in links) and any( + link.sink_name == "last_tool_output" and link.is_static + for link in links + ): + raise ValueError( + "Last Tool Output can't be connected to a static (dashed line) " + "link like the output of `StoreValue` or `AgentInput` block" + ) + + return missing_links + @classmethod def get_missing_input(cls, data: BlockInput) -> set[str]: if missing_input := super().get_missing_input(data): @@ -441,7 +454,7 @@ class SmartDecisionMakerBlock(Block): ) # Fallback on adding tool output in the conversation history as user prompt. - if len(tool_output) == 0: + if len(tool_output) == 0 and input_data.last_tool_output: logger.warning( f"[SmartDecisionMakerBlock-node_exec_id={node_exec_id}] " f"No pending tool calls found. This may indicate an issue with the " diff --git a/autogpt_platform/backend/backend/blocks/time_blocks.py b/autogpt_platform/backend/backend/blocks/time_blocks.py index 4b060aea5c..adeeb3bee0 100644 --- a/autogpt_platform/backend/backend/blocks/time_blocks.py +++ b/autogpt_platform/backend/backend/blocks/time_blocks.py @@ -156,6 +156,10 @@ class CountdownTimerBlock(Block): days: Union[int, str] = SchemaField( advanced=False, description="Duration in days", default=0 ) + repeat: int = SchemaField( + description="Number of times to repeat the timer", + default=1, + ) class Output(BlockSchema): output_message: Any = SchemaField( @@ -187,5 +191,6 @@ class CountdownTimerBlock(Block): total_seconds = seconds + minutes * 60 + hours * 3600 + days * 86400 - time.sleep(total_seconds) - yield "output_message", input_data.input_message + for _ in range(input_data.repeat): + time.sleep(total_seconds) + yield "output_message", input_data.input_message