1212from django .conf import settings
1313from django .db .models .manager import BaseManager
1414from file_management .file_management_helper import FileManagerHelper
15+ from prompt_studio .modifier_loader import ModifierConfig
16+ from prompt_studio .modifier_loader import load_plugins as load_modifier_plugins
1517from prompt_studio .prompt_profile_manager .models import ProfileManager
1618from prompt_studio .prompt_profile_manager .profile_manager_helper import (
1719 ProfileManagerHelper ,
2830 EmptyPromptError ,
2931 IndexingAPIError ,
3032 NoPromptsFound ,
33+ OperationNotSupported ,
3134 PermissionError ,
3235)
3336from prompt_studio .prompt_studio_core .models import CustomTool
5356
5457logger = logging .getLogger (__name__ )
5558
59+ modifier_loader = load_modifier_plugins ()
60+
5661
5762class PromptStudioHelper :
5863 """Helper class for Custom tool operations."""
@@ -434,6 +439,10 @@ def _execute_single_prompt(
434439 text_processor : Optional [type [Any ]] = None ,
435440 ):
436441 prompt_instance = PromptStudioHelper ._fetch_prompt_from_id (id )
442+
443+ if prompt_instance .enforce_type == TSPKeys .TABLE and not modifier_loader :
444+ raise OperationNotSupported ()
445+
437446 prompt_name = prompt_instance .prompt_key
438447 PromptStudioHelper ._publish_log (
439448 {
@@ -523,7 +532,9 @@ def _execute_prompts_in_single_pass(
523532 prompts = [
524533 prompt
525534 for prompt in prompts
526- if prompt .prompt_type != TSPKeys .NOTES and prompt .active
535+ if prompt .prompt_type != TSPKeys .NOTES
536+ and prompt .active
537+ and prompt .enforce_type != TSPKeys .TABLE
527538 ]
528539 if not prompts :
529540 logger .error (f"[{ tool_id or 'NA' } ] No prompts found for id: { id } " )
@@ -583,6 +594,19 @@ def _get_document_path(org_id, user_id, tool_id, doc_name):
583594 )
584595 return str (Path (doc_path ) / doc_name )
585596
597+ @staticmethod
598+ def _get_extract_or_summary_document_path (
599+ org_id , user_id , tool_id , doc_name , doc_type
600+ ) -> str :
601+ doc_path = FileManagerHelper .handle_sub_directory_for_tenants (
602+ org_id = org_id ,
603+ user_id = user_id ,
604+ tool_id = tool_id ,
605+ is_create = False ,
606+ )
607+ extracted_doc_name = Path (doc_name ).stem + TSPKeys .TXT_EXTENTION
608+ return str (Path (doc_path ) / doc_type / extracted_doc_name )
609+
586610 @staticmethod
587611 def _handle_response (
588612 response ,
@@ -698,7 +722,7 @@ def _fetch_response(
698722 "status" : IndexingStatus .PENDING_STATUS .value ,
699723 "message" : IndexingStatus .DOCUMENT_BEING_INDEXED .value ,
700724 }
701-
725+ tool_id = str ( tool . tool_id )
702726 output : dict [str , Any ] = {}
703727 outputs : list [dict [str , Any ]] = []
704728 grammer_dict = {}
@@ -738,6 +762,10 @@ def _fetch_response(
738762 attr_val = getattr (prompt , attr )
739763 output [TSPKeys .EVAL_SETTINGS ][attr ] = attr_val
740764
765+ output = PromptStudioHelper .fetch_table_settings_if_enabled (
766+ doc_name , prompt , org_id , user_id , tool_id , output
767+ )
768+
741769 outputs .append (output )
742770
743771 tool_settings = {}
@@ -754,8 +782,6 @@ def _fetch_response(
754782 settings , TSPKeys .PLATFORM_POSTAMBLE .upper (), ""
755783 )
756784
757- tool_id = str (tool .tool_id )
758-
759785 file_hash = ToolUtils .get_hash_from_file (file_path = doc_path )
760786
761787 payload = {
@@ -789,6 +815,36 @@ def _fetch_response(
789815 output_response = json .loads (answer ["structure_output" ])
790816 return output_response
791817
818+ @staticmethod
819+ def fetch_table_settings_if_enabled (
820+ doc_name : str ,
821+ prompt : ToolStudioPrompt ,
822+ org_id : str ,
823+ user_id : str ,
824+ tool_id : str ,
825+ output : dict [str , Any ],
826+ ) -> dict [str , Any ]:
827+
828+ if prompt .enforce_type == TSPKeys .TABLE :
829+ extract_doc_path : str = (
830+ PromptStudioHelper ._get_extract_or_summary_document_path (
831+ org_id , user_id , tool_id , doc_name , TSPKeys .EXTRACT
832+ )
833+ )
834+ for modifier_plugin in modifier_loader :
835+ cls = modifier_plugin [ModifierConfig .METADATA ][
836+ ModifierConfig .METADATA_SERVICE_CLASS
837+ ]
838+ output = cls .update (
839+ output = output ,
840+ tool_id = tool_id ,
841+ prompt_id = str (prompt .prompt_id ),
842+ prompt = prompt .prompt ,
843+ input_file = extract_doc_path ,
844+ )
845+
846+ return output
847+
792848 @staticmethod
793849 def dynamic_indexer (
794850 profile_manager : ProfileManager ,
0 commit comments