diff --git a/backend/sample.env b/backend/sample.env index 1d361d0a82..08658931e5 100644 --- a/backend/sample.env +++ b/backend/sample.env @@ -89,9 +89,9 @@ PROMPT_STUDIO_FILE_PATH=/app/prompt-studio-data # Structure Tool Image (Runs prompt studio exported tools) # https://hub.docker.com/r/unstract/tool-structure -STRUCTURE_TOOL_IMAGE_URL="docker:unstract/tool-structure:0.0.92" +STRUCTURE_TOOL_IMAGE_URL="docker:unstract/tool-structure:0.0.94" STRUCTURE_TOOL_IMAGE_NAME="unstract/tool-structure" -STRUCTURE_TOOL_IMAGE_TAG="0.0.92" +STRUCTURE_TOOL_IMAGE_TAG="0.0.94" # Feature Flags EVALUATION_SERVER_IP=unstract-flipt diff --git a/runner/sample.env b/runner/sample.env index 9a4fd29722..723bc89612 100644 --- a/runner/sample.env +++ b/runner/sample.env @@ -52,7 +52,7 @@ FLASK_APP=unstract.runner:app # Tool Sidecar TOOL_SIDECAR_ENABLED=False TOOL_SIDECAR_IMAGE_NAME="unstract/tool-sidecar" -TOOL_SIDECAR_IMAGE_TAG="0.2.0" +TOOL_SIDECAR_IMAGE_TAG="0.2.1" TOOL_EXECUTION_CACHE_TTL_IN_SECOND=86400 # 24 Hours # File Execution Tracker diff --git a/tool-sidecar/src/unstract/tool_sidecar/log_processor.py b/tool-sidecar/src/unstract/tool_sidecar/log_processor.py index 86ade0cd72..7d02954a86 100644 --- a/tool-sidecar/src/unstract/tool_sidecar/log_processor.py +++ b/tool-sidecar/src/unstract/tool_sidecar/log_processor.py @@ -7,7 +7,9 @@ import json import logging import os +import signal import time +import types from datetime import UTC, datetime from typing import Any @@ -26,6 +28,14 @@ logger = logging.getLogger(__name__) +def _signal_handler(signum: int, _frame: types.FrameType | None): + """Handle shutdown signals gracefully.""" + sig = signal.Signals(signum) + signal_name = sig.name + logger.warning(f"RECEIVED SIGNAL: {signal_name}") + logger.warning("Initiating graceful shutdown...") + + class LogProcessor: def __init__( self, @@ -246,6 +256,10 @@ def main(): """Main entry point for the sidecar container. Sets up the log processor with environment variables and starts monitoring. """ + # Set up signal handlers for graceful shutdown + signal.signal(signal.SIGTERM, _signal_handler) + signal.signal(signal.SIGINT, _signal_handler) + # Get configuration from environment log_path = os.getenv(Env.LOG_PATH, "/shared/logs/logs.txt") redis_host = os.getenv(Env.REDIS_HOST) diff --git a/tools/classifier/src/config/properties.json b/tools/classifier/src/config/properties.json index 56dae89292..132343a73d 100644 --- a/tools/classifier/src/config/properties.json +++ b/tools/classifier/src/config/properties.json @@ -2,7 +2,7 @@ "schemaVersion": "0.0.1", "displayName": "File Classifier", "functionName": "classify", - "toolVersion": "0.0.73", + "toolVersion": "0.0.74", "description": "Classifies a file into a bin based on its contents", "input": { "description": "File to be classified" diff --git a/tools/structure/src/config/properties.json b/tools/structure/src/config/properties.json index 8a09fdb705..6726c9dc32 100644 --- a/tools/structure/src/config/properties.json +++ b/tools/structure/src/config/properties.json @@ -2,7 +2,7 @@ "schemaVersion": "0.0.1", "displayName": "Structure Tool", "functionName": "structure_tool", - "toolVersion": "0.0.93", + "toolVersion": "0.0.94", "description": "This is a template tool which can answer set of input prompts designed in the Prompt Studio", "input": { "description": "File that needs to be indexed and parsed for answers" diff --git a/tools/text_extractor/src/config/properties.json b/tools/text_extractor/src/config/properties.json index 9d7d35e12e..fd8a767e35 100644 --- a/tools/text_extractor/src/config/properties.json +++ b/tools/text_extractor/src/config/properties.json @@ -2,7 +2,7 @@ "schemaVersion": "0.0.1", "displayName": "Text Extractor", "functionName": "text_extractor", - "toolVersion": "0.0.69", + "toolVersion": "0.0.70", "description": "The Text Extractor is a powerful tool designed to convert documents to its text form or Extract texts from documents", "input": { "description": "Document" diff --git a/unstract/sdk1/src/unstract/sdk1/tool/entrypoint.py b/unstract/sdk1/src/unstract/sdk1/tool/entrypoint.py index 831be97d06..a5d1837872 100644 --- a/unstract/sdk1/src/unstract/sdk1/tool/entrypoint.py +++ b/unstract/sdk1/src/unstract/sdk1/tool/entrypoint.py @@ -1,11 +1,25 @@ +import logging +import signal +import types + from unstract.sdk1.tool.base import BaseTool from unstract.sdk1.tool.executor import ToolExecutor from unstract.sdk1.tool.parser import ToolArgsParser +logger = logging.getLogger(__name__) + class ToolEntrypoint: """Class that contains methods for the entrypoint for a tool.""" + @staticmethod + def _signal_handler(signum: int, _frame: types.FrameType | None) -> None: + """Handle SIGTERM and SIGINT signals.""" + sig = signal.Signals(signum) + signal_name = sig.name + logger.warning(f"RECEIVED SIGNAL: {signal_name}") + logger.warning("Initiating graceful shutdown...") + @staticmethod def launch(tool: BaseTool, args: list[str]) -> None: """Entrypoint function for a tool. @@ -17,6 +31,10 @@ def launch(tool: BaseTool, args: list[str]) -> None: tool (AbstractTool): Tool to execute args (List[str]): Arguments passed to a tool """ + # Register signal handlers for graceful shutdown + signal.signal(signal.SIGTERM, ToolEntrypoint._signal_handler) + signal.signal(signal.SIGINT, ToolEntrypoint._signal_handler) + parsed_args = ToolArgsParser.parse_args(args) executor = ToolExecutor(tool=tool) executor.execute(parsed_args) diff --git a/unstract/tool-registry/tool_registry_config/public_tools.json b/unstract/tool-registry/tool_registry_config/public_tools.json index 0d1a767f39..b9b4d9b97b 100644 --- a/unstract/tool-registry/tool_registry_config/public_tools.json +++ b/unstract/tool-registry/tool_registry_config/public_tools.json @@ -5,7 +5,7 @@ "schemaVersion": "0.0.1", "displayName": "File Classifier", "functionName": "classify", - "toolVersion": "0.0.73", + "toolVersion": "0.0.74", "description": "Classifies a file into a bin based on its contents", "input": { "description": "File to be classified" @@ -106,9 +106,9 @@ "properties": {} }, "icon": "\n\n \n \n \n \n \n \n \n \n \n \n \n\n", - "image_url": "docker:unstract/tool-classifier:0.0.73", + "image_url": "docker:unstract/tool-classifier:0.0.74", "image_name": "unstract/tool-classifier", - "image_tag": "0.0.73" + "image_tag": "0.0.74" }, "text_extractor": { "tool_uid": "text_extractor", @@ -116,7 +116,7 @@ "schemaVersion": "0.0.1", "displayName": "Text Extractor", "functionName": "text_extractor", - "toolVersion": "0.0.69", + "toolVersion": "0.0.70", "description": "The Text Extractor is a powerful tool designed to convert documents to its text form or Extract texts from documents", "input": { "description": "Document" @@ -191,8 +191,8 @@ } }, "icon": "\n\n \n \n \n \n \n \n \n \n \n \n \n\n", - "image_url": "docker:unstract/tool-text-extractor:0.0.69", + "image_url": "docker:unstract/tool-text-extractor:0.0.70", "image_name": "unstract/tool-text-extractor", - "image_tag": "0.0.69" + "image_tag": "0.0.70" } }