Spaces:
				
			
			
	
			
			
		Sleeping
		
	
	
	
			
			
	
	
	
	
		
		
		Sleeping
		
	implemented graph.py, agents, guard; reduced image and video node to viewer node; renamed system prompts
Browse files- agents.py +8 -16
- alfred.py +4 -1
- args.py +2 -2
- design.puml +10 -16
- design.yaml +9 -14
- graph.py +119 -31
- itf_agent.py +1 -1
- system_prompts/{04_summarizer.txt β 03_summarizer.txt} +0 -0
- system_prompts/{03_solver.txt β 04_solver.txt} +0 -0
- system_prompts/06_encryption_expert.txt +0 -64
- system_prompts/{08_reasoner.txt β 06_reasoner.txt} +0 -0
- system_prompts/07_math_expert.txt +0 -91
- system_prompts/{09_image_handler.txt β 07_viewer.txt} +0 -0
- system_prompts/{11_output_guard.txt β 08_output_guard.txt} +0 -0
- system_prompts/10_video_handler.txt +0 -36
- test.py +4 -23
    	
        agents.py
    CHANGED
    
    | @@ -33,7 +33,7 @@ class Summarizer(IAgent): | |
| 33 | 
             
                Generates concise summaries of conversations or passages.
         | 
| 34 | 
             
                """
         | 
| 35 | 
             
                def __init__(self):
         | 
| 36 | 
            -
                    super().__init__(" | 
| 37 |  | 
| 38 |  | 
| 39 | 
             
            class Solver(IAgent):
         | 
| @@ -41,7 +41,7 @@ class Solver(IAgent): | |
| 41 | 
             
                Central problem-solving node that coordinates with specialized experts based on task requirements
         | 
| 42 | 
             
                """
         | 
| 43 | 
             
                def __init__(self):
         | 
| 44 | 
            -
                    super().__init__(" | 
| 45 |  | 
| 46 |  | 
| 47 | 
             
            class Researcher(IAgent):
         | 
| @@ -77,28 +77,20 @@ class Reasoner(IAgent): | |
| 77 | 
             
                        encryption_toolbox.caesar_cipher_brute_force,
         | 
| 78 | 
             
                        encryption_toolbox.reverse_string
         | 
| 79 | 
             
                        ]
         | 
| 80 | 
            -
                    super().__init__(" | 
| 81 |  | 
| 82 |  | 
| 83 | 
            -
            class  | 
| 84 | 
            -
                """
         | 
| 85 | 
            -
                Performs logical reasoning, inference, and step-by-step problem-solving
         | 
| 86 | 
            -
                """
         | 
| 87 | 
            -
                def __init__(self):
         | 
| 88 | 
            -
                    super().__init__("11_output_guard.txt", SECONDARY_AGENT_PRESET)
         | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
            class ImageHandler(IAgent):
         | 
| 92 | 
             
                """
         | 
| 93 | 
             
                Processes, analyzes, and generates information related to images
         | 
| 94 | 
             
                """
         | 
| 95 | 
             
                def __init__(self):
         | 
| 96 | 
            -
                    super().__init__(" | 
| 97 |  | 
| 98 |  | 
| 99 | 
            -
            class  | 
| 100 | 
             
                """
         | 
| 101 | 
            -
                 | 
| 102 | 
             
                """
         | 
| 103 | 
             
                def __init__(self):
         | 
| 104 | 
            -
                    super().__init__(" | 
|  | |
| 33 | 
             
                Generates concise summaries of conversations or passages.
         | 
| 34 | 
             
                """
         | 
| 35 | 
             
                def __init__(self):
         | 
| 36 | 
            +
                    super().__init__("03_summarizer.txt", PRIMARY_AGENT_PRESET)
         | 
| 37 |  | 
| 38 |  | 
| 39 | 
             
            class Solver(IAgent):
         | 
|  | |
| 41 | 
             
                Central problem-solving node that coordinates with specialized experts based on task requirements
         | 
| 42 | 
             
                """
         | 
| 43 | 
             
                def __init__(self):
         | 
| 44 | 
            +
                    super().__init__("04_solver.txt", PRIMARY_AGENT_PRESET)
         | 
| 45 |  | 
| 46 |  | 
| 47 | 
             
            class Researcher(IAgent):
         | 
|  | |
| 77 | 
             
                        encryption_toolbox.caesar_cipher_brute_force,
         | 
| 78 | 
             
                        encryption_toolbox.reverse_string
         | 
| 79 | 
             
                        ]
         | 
| 80 | 
            +
                    super().__init__("06_reasoner.txt", PRIMARY_AGENT_PRESET, tools)
         | 
| 81 |  | 
| 82 |  | 
| 83 | 
            +
            class Viewer(IAgent):
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 84 | 
             
                """
         | 
| 85 | 
             
                Processes, analyzes, and generates information related to images
         | 
| 86 | 
             
                """
         | 
| 87 | 
             
                def __init__(self):
         | 
| 88 | 
            +
                    super().__init__("07_viewer.txt", VISION_AGENT_PRESET)
         | 
| 89 |  | 
| 90 |  | 
| 91 | 
            +
            class OutputGuard(IAgent):
         | 
| 92 | 
             
                """
         | 
| 93 | 
            +
                Performs logical reasoning, inference, and step-by-step problem-solving
         | 
| 94 | 
             
                """
         | 
| 95 | 
             
                def __init__(self):
         | 
| 96 | 
            +
                    super().__init__("08_output_guard.txt", SECONDARY_AGENT_PRESET)
         | 
    	
        alfred.py
    CHANGED
    
    | @@ -6,7 +6,10 @@ from graph_builder import GraphBuilder | |
| 6 |  | 
| 7 |  | 
| 8 | 
             
            # Maximum number of interactions between Assistant and Manager
         | 
| 9 | 
            -
            MAX_INTERACTIONS =  | 
|  | |
|  | |
|  | |
| 10 | 
             
            # Maximum depth of recursion for Manager
         | 
| 11 | 
             
            MAX_DEPTH = 2
         | 
| 12 | 
             
            # For both Assistant and Manager:
         | 
|  | |
| 6 |  | 
| 7 |  | 
| 8 | 
             
            # Maximum number of interactions between Assistant and Manager
         | 
| 9 | 
            +
            MAX_INTERACTIONS = 6
         | 
| 10 | 
            +
            # Verification happening every few messages to check whether the manager agent
         | 
| 11 | 
            +
            #   is making progress or it got stuck (in a repetitive loop or similar pitfalls)
         | 
| 12 | 
            +
            AUDIT_INTERVAL = 3
         | 
| 13 | 
             
            # Maximum depth of recursion for Manager
         | 
| 14 | 
             
            MAX_DEPTH = 2
         | 
| 15 | 
             
            # For both Assistant and Manager:
         | 
    	
        args.py
    CHANGED
    
    | @@ -14,10 +14,10 @@ class Args: | |
| 14 | 
             
                LOGGER = Logger.set_logger()
         | 
| 15 | 
             
                primary_llm_interface=LLMInterface.OPENAI
         | 
| 16 | 
             
                # secondary_llm_interface=LLMInterface.HUGGINGFACE
         | 
| 17 | 
            -
                vlm_interface=LLMInterface. | 
| 18 | 
             
                primary_model="qwen2.5-qwq-35b-eureka-cubed-abliterated-uncensored"
         | 
| 19 | 
             
                secondary_model="qwen2.5-7b-instruct-1m"
         | 
| 20 | 
            -
                vision_model=" | 
| 21 | 
             
                api_base="http://127.0.0.1:1234/v1"  # LM Studio local endpoint
         | 
| 22 | 
             
                api_key=None
         | 
| 23 | 
             
                token = ""  # Not needed when using OpenAILike API
         | 
|  | |
| 14 | 
             
                LOGGER = Logger.set_logger()
         | 
| 15 | 
             
                primary_llm_interface=LLMInterface.OPENAI
         | 
| 16 | 
             
                # secondary_llm_interface=LLMInterface.HUGGINGFACE
         | 
| 17 | 
            +
                vlm_interface=LLMInterface.OPENAI
         | 
| 18 | 
             
                primary_model="qwen2.5-qwq-35b-eureka-cubed-abliterated-uncensored"
         | 
| 19 | 
             
                secondary_model="qwen2.5-7b-instruct-1m"
         | 
| 20 | 
            +
                vision_model="qwen/qwen2.5-vl-7b"
         | 
| 21 | 
             
                api_base="http://127.0.0.1:1234/v1"  # LM Studio local endpoint
         | 
| 22 | 
             
                api_key=None
         | 
| 23 | 
             
                token = ""  # Not needed when using OpenAILike API
         | 
    	
        design.puml
    CHANGED
    
    | @@ -8,36 +8,32 @@ node START TERMINAL_NODE_COLOR[ | |
| 8 | 
             
              START
         | 
| 9 | 
             
            ]
         | 
| 10 |  | 
| 11 | 
            -
            node manager  | 
| 12 | 
             
              manager
         | 
| 13 | 
             
            ]
         | 
| 14 |  | 
| 15 | 
            -
            node final_answer  | 
| 16 | 
             
              final_answer
         | 
| 17 | 
             
            ]
         | 
| 18 |  | 
| 19 | 
            -
            node auditor  | 
| 20 | 
             
              auditor
         | 
| 21 | 
             
            ]
         | 
| 22 |  | 
| 23 | 
            -
            node solver  | 
| 24 | 
             
              solver
         | 
| 25 | 
             
            ]
         | 
| 26 |  | 
| 27 | 
            -
            node researcher  | 
| 28 | 
             
              researcher
         | 
| 29 | 
             
            ]
         | 
| 30 |  | 
| 31 | 
            -
            node reasoner  | 
| 32 | 
             
              reasoner
         | 
| 33 | 
             
            ]
         | 
| 34 |  | 
| 35 | 
            -
            node  | 
| 36 | 
            -
               | 
| 37 | 
            -
            ]
         | 
| 38 | 
            -
             | 
| 39 | 
            -
            node video_handler NOT_IMPLEMENTED_NODE_COLOR[
         | 
| 40 | 
            -
              video_handler
         | 
| 41 | 
             
            ]
         | 
| 42 |  | 
| 43 | 
             
            node END TERMINAL_NODE_COLOR[
         | 
| @@ -53,11 +49,9 @@ auditor --> manager | |
| 53 | 
             
            solver --> manager
         | 
| 54 | 
             
            solver --> researcher
         | 
| 55 | 
             
            solver --> reasoner
         | 
| 56 | 
            -
            solver -->  | 
| 57 | 
            -
            solver --> video_handler
         | 
| 58 | 
             
            researcher --> solver
         | 
| 59 | 
             
            reasoner --> solver
         | 
| 60 | 
            -
             | 
| 61 | 
            -
            video_handler --> solver
         | 
| 62 |  | 
| 63 | 
             
            @enduml
         | 
|  | |
| 8 | 
             
              START
         | 
| 9 | 
             
            ]
         | 
| 10 |  | 
| 11 | 
            +
            node manager IMPLEMENTED_NODE_COLOR[
         | 
| 12 | 
             
              manager
         | 
| 13 | 
             
            ]
         | 
| 14 |  | 
| 15 | 
            +
            node final_answer IMPLEMENTED_NODE_COLOR[
         | 
| 16 | 
             
              final_answer
         | 
| 17 | 
             
            ]
         | 
| 18 |  | 
| 19 | 
            +
            node auditor IMPLEMENTED_NODE_COLOR[
         | 
| 20 | 
             
              auditor
         | 
| 21 | 
             
            ]
         | 
| 22 |  | 
| 23 | 
            +
            node solver IMPLEMENTED_NODE_COLOR[
         | 
| 24 | 
             
              solver
         | 
| 25 | 
             
            ]
         | 
| 26 |  | 
| 27 | 
            +
            node researcher IMPLEMENTED_NODE_COLOR[
         | 
| 28 | 
             
              researcher
         | 
| 29 | 
             
            ]
         | 
| 30 |  | 
| 31 | 
            +
            node reasoner IMPLEMENTED_NODE_COLOR[
         | 
| 32 | 
             
              reasoner
         | 
| 33 | 
             
            ]
         | 
| 34 |  | 
| 35 | 
            +
            node viewer NOT_IMPLEMENTED_NODE_COLOR[
         | 
| 36 | 
            +
              viewer
         | 
|  | |
|  | |
|  | |
|  | |
| 37 | 
             
            ]
         | 
| 38 |  | 
| 39 | 
             
            node END TERMINAL_NODE_COLOR[
         | 
|  | |
| 49 | 
             
            solver --> manager
         | 
| 50 | 
             
            solver --> researcher
         | 
| 51 | 
             
            solver --> reasoner
         | 
| 52 | 
            +
            solver --> viewer
         | 
|  | |
| 53 | 
             
            researcher --> solver
         | 
| 54 | 
             
            reasoner --> solver
         | 
| 55 | 
            +
            viewer --> solver
         | 
|  | |
| 56 |  | 
| 57 | 
             
            @enduml
         | 
    	
        design.yaml
    CHANGED
    
    | @@ -8,39 +8,34 @@ nodes: | |
| 8 | 
             
            - name: manager
         | 
| 9 | 
             
              connections: [solver, auditor, final_answer]
         | 
| 10 | 
             
              description: Orchestrates the workflow by delegating tasks to specialized nodes and integrating their outputs
         | 
| 11 | 
            -
              status:  | 
| 12 |  | 
| 13 | 
             
            - name: final_answer
         | 
| 14 | 
             
              connections: [END]
         | 
| 15 | 
             
              description: Formats and delivers the final response to the user
         | 
| 16 | 
            -
              status:  | 
| 17 |  | 
| 18 | 
             
            - name: auditor
         | 
| 19 | 
             
              connections: [manager]
         | 
| 20 | 
             
              description: Reviews manager's outputs for accuracy, safety, and quality
         | 
| 21 | 
            -
              status:  | 
| 22 |  | 
| 23 | 
             
            - name: solver
         | 
| 24 | 
            -
              connections: [manager, researcher, reasoner,  | 
| 25 | 
             
              description: Central problem-solving node that coordinates with specialized experts based on task requirements
         | 
| 26 | 
            -
              status:  | 
| 27 |  | 
| 28 | 
             
            - name: researcher
         | 
| 29 | 
             
              connections: [solver]
         | 
| 30 | 
             
              description: Retrieves and synthesizes information from various sources to answer knowledge-based questions
         | 
| 31 | 
            -
              status:  | 
| 32 |  | 
| 33 | 
             
            - name: reasoner
         | 
| 34 | 
             
              connections: [solver]
         | 
| 35 | 
             
              description: Performs logical reasoning, inference, and step-by-step problem-solving
         | 
| 36 | 
            -
              status:  | 
| 37 |  | 
| 38 | 
            -
            - name:  | 
| 39 | 
             
              connections: [solver]
         | 
| 40 | 
            -
              description: Processes, analyzes, and generates  | 
| 41 | 
            -
              status: NOT_IMPLEMENTED
         | 
| 42 | 
            -
             | 
| 43 | 
            -
            - name: video_handler
         | 
| 44 | 
            -
              connections: [solver]
         | 
| 45 | 
            -
              description: Processes, analyzes, and generates information related to videos
         | 
| 46 | 
             
              status: NOT_IMPLEMENTED
         | 
|  | |
| 8 | 
             
            - name: manager
         | 
| 9 | 
             
              connections: [solver, auditor, final_answer]
         | 
| 10 | 
             
              description: Orchestrates the workflow by delegating tasks to specialized nodes and integrating their outputs
         | 
| 11 | 
            +
              status: IMPLEMENTED
         | 
| 12 |  | 
| 13 | 
             
            - name: final_answer
         | 
| 14 | 
             
              connections: [END]
         | 
| 15 | 
             
              description: Formats and delivers the final response to the user
         | 
| 16 | 
            +
              status: IMPLEMENTED
         | 
| 17 |  | 
| 18 | 
             
            - name: auditor
         | 
| 19 | 
             
              connections: [manager]
         | 
| 20 | 
             
              description: Reviews manager's outputs for accuracy, safety, and quality
         | 
| 21 | 
            +
              status: IMPLEMENTED
         | 
| 22 |  | 
| 23 | 
             
            - name: solver
         | 
| 24 | 
            +
              connections: [manager, researcher, reasoner, viewer]
         | 
| 25 | 
             
              description: Central problem-solving node that coordinates with specialized experts based on task requirements
         | 
| 26 | 
            +
              status: IMPLEMENTED
         | 
| 27 |  | 
| 28 | 
             
            - name: researcher
         | 
| 29 | 
             
              connections: [solver]
         | 
| 30 | 
             
              description: Retrieves and synthesizes information from various sources to answer knowledge-based questions
         | 
| 31 | 
            +
              status: IMPLEMENTED
         | 
| 32 |  | 
| 33 | 
             
            - name: reasoner
         | 
| 34 | 
             
              connections: [solver]
         | 
| 35 | 
             
              description: Performs logical reasoning, inference, and step-by-step problem-solving
         | 
| 36 | 
            +
              status: IMPLEMENTED
         | 
| 37 |  | 
| 38 | 
            +
            - name: viewer
         | 
| 39 | 
             
              connections: [solver]
         | 
| 40 | 
            +
              description: Processes, analyzes, and generates vision related information
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 41 | 
             
              status: NOT_IMPLEMENTED
         | 
    	
        graph.py
    CHANGED
    
    | @@ -8,17 +8,77 @@ import logging | |
| 8 | 
             
            from pathlib import Path
         | 
| 9 |  | 
| 10 | 
             
            from args import Args
         | 
|  | |
|  | |
| 11 |  | 
| 12 |  | 
| 13 | 
             
            class State(TypedDict):
         | 
| 14 | 
             
                """State class for the agent graph."""
         | 
| 15 | 
             
                initial_query: str
         | 
| 16 | 
             
                # messages: List[Dict[str, Any]]
         | 
| 17 | 
            -
                messages: Annotated[list[ | 
| 18 | 
            -
                 | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 19 | 
             
                final_response: Optional[str]
         | 
| 20 |  | 
| 21 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 22 | 
             
            class Nodes:
         | 
| 23 | 
             
                """
         | 
| 24 | 
             
                Collection of node functions for the agent graph.
         | 
| @@ -27,57 +87,63 @@ class Nodes: | |
| 27 | 
             
                    """
         | 
| 28 | 
             
                    Orchestrates the workflow by delegating tasks to specialized nodes and integrating their outputs
         | 
| 29 | 
             
                    """
         | 
| 30 | 
            -
                     | 
| 31 | 
            -
                     | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 32 |  | 
| 33 | 
             
                def final_answer_node(self, state: State) -> State:
         | 
| 34 | 
             
                    """
         | 
| 35 | 
             
                    Formats and delivers the final response to the user
         | 
| 36 | 
             
                    """
         | 
| 37 | 
            -
                     | 
| 38 | 
            -
                     | 
|  | |
|  | |
|  | |
| 39 |  | 
| 40 | 
             
                def auditor_node(self, state: State) -> State:
         | 
| 41 | 
             
                    """
         | 
| 42 | 
            -
                    Reviews manager's outputs for accuracy, safety, and quality
         | 
| 43 | 
             
                    """
         | 
| 44 | 
            -
                     | 
| 45 | 
            -
                     | 
|  | |
| 46 |  | 
| 47 | 
             
                def solver_node(self, state: State) -> State:
         | 
| 48 | 
             
                    """
         | 
| 49 | 
             
                    Central problem-solving node that coordinates with specialized experts based on task requirements
         | 
| 50 | 
             
                    """
         | 
| 51 | 
            -
                     | 
| 52 | 
            -
                     | 
|  | |
| 53 |  | 
| 54 | 
             
                def researcher_node(self, state: State) -> State:
         | 
| 55 | 
             
                    """
         | 
| 56 | 
             
                    Retrieves and synthesizes information from various sources to answer knowledge-based questions
         | 
| 57 | 
             
                    """
         | 
| 58 | 
            -
                     | 
| 59 | 
            -
                     | 
|  | |
| 60 |  | 
| 61 | 
             
                def reasoner_node(self, state: State) -> State:
         | 
| 62 | 
             
                    """
         | 
| 63 | 
             
                    Performs logical reasoning, inference, and step-by-step problem-solving
         | 
| 64 | 
             
                    """
         | 
| 65 | 
            -
                     | 
| 66 | 
            -
                     | 
|  | |
| 67 |  | 
| 68 | 
            -
                def  | 
| 69 | 
             
                    """
         | 
| 70 | 
             
                    Processes, analyzes, and generates information related to images
         | 
| 71 | 
             
                    """
         | 
| 72 | 
            -
                     | 
| 73 | 
            -
                     | 
| 74 | 
            -
             | 
| 75 | 
            -
                def video_handler_node(self, state: State) -> State:
         | 
| 76 | 
            -
                    """
         | 
| 77 | 
            -
                    Processes, analyzes, and generates information related to videos
         | 
| 78 | 
            -
                    """
         | 
| 79 | 
            -
                    # TODO: To implement...
         | 
| 80 | 
            -
                    pass
         | 
| 81 |  | 
| 82 |  | 
| 83 | 
             
            class Edges:
         | 
| @@ -89,13 +155,35 @@ class Edges: | |
| 89 | 
             
                    Conditional edge for manager node.
         | 
| 90 | 
             
                    Returns one of: "solver", "auditor", "final_answer"
         | 
| 91 | 
             
                    """
         | 
| 92 | 
            -
                     | 
| 93 | 
            -
                     | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 94 |  | 
| 95 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
| 96 | 
             
                    """
         | 
| 97 | 
             
                    Conditional edge for solver node.
         | 
| 98 | 
            -
                    Returns one of: "manager", "researcher", " | 
| 99 | 
             
                    """
         | 
| 100 | 
            -
                     | 
| 101 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 8 | 
             
            from pathlib import Path
         | 
| 9 |  | 
| 10 | 
             
            from args import Args
         | 
| 11 | 
            +
            from agents import *
         | 
| 12 | 
            +
            from itf_agent import IAgent
         | 
| 13 |  | 
| 14 |  | 
| 15 | 
             
            class State(TypedDict):
         | 
| 16 | 
             
                """State class for the agent graph."""
         | 
| 17 | 
             
                initial_query: str
         | 
| 18 | 
             
                # messages: List[Dict[str, Any]]
         | 
| 19 | 
            +
                # messages: Annotated[list[BaseMessage], add_messages]
         | 
| 20 | 
            +
                messages: List[BaseMessage]  # Manager's context
         | 
| 21 | 
            +
                task_progress: List[BaseMessage]  # Solver's context
         | 
| 22 | 
            +
                audit_interval: int
         | 
| 23 | 
            +
                manager_queries: int
         | 
| 24 | 
            +
                solver_queries: int
         | 
| 25 | 
            +
                max_interactions: int
         | 
| 26 | 
            +
                max_solving_effort: int
         | 
| 27 | 
             
                final_response: Optional[str]
         | 
| 28 |  | 
| 29 |  | 
| 30 | 
            +
            class Agents:
         | 
| 31 | 
            +
                manager = Manager()
         | 
| 32 | 
            +
                auditor = Auditor()
         | 
| 33 | 
            +
                summarizer = Summarizer()
         | 
| 34 | 
            +
                solver = Solver()
         | 
| 35 | 
            +
                researcher = Researcher()
         | 
| 36 | 
            +
                reasoner = Reasoner()
         | 
| 37 | 
            +
                guardian = OutputGuard()
         | 
| 38 | 
            +
                viewer = Viewer()
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                @classmethod
         | 
| 41 | 
            +
                def guard_output(cls, agent: IAgent, messages: List[BaseMessage]) -> BaseMessage:
         | 
| 42 | 
            +
                    response = agent.query(messages)
         | 
| 43 | 
            +
                    guarded_response = cls.guardian.query([response])
         | 
| 44 | 
            +
                    return guarded_response
         | 
| 45 | 
            +
             | 
| 46 | 
            +
             | 
| 47 | 
            +
            class _Helper:
         | 
| 48 | 
            +
                """
         | 
| 49 | 
            +
                Collection of helper methods.
         | 
| 50 | 
            +
                """
         | 
| 51 | 
            +
                @staticmethod
         | 
| 52 | 
            +
                def _is_divisible(first: int, second: int) -> bool:
         | 
| 53 | 
            +
                    """
         | 
| 54 | 
            +
                    Determines if the first number is divisible by the second number.
         | 
| 55 | 
            +
                    
         | 
| 56 | 
            +
                    Args:
         | 
| 57 | 
            +
                        first: The dividend (number to be divided)
         | 
| 58 | 
            +
                        second: The divisor (number to divide by)
         | 
| 59 | 
            +
                        
         | 
| 60 | 
            +
                    Returns:
         | 
| 61 | 
            +
                        bool: True if first is divisible by second without remainder, False otherwise
         | 
| 62 | 
            +
                    """
         | 
| 63 | 
            +
                    if second == 0:
         | 
| 64 | 
            +
                        return False  # Division by zero is undefined
         | 
| 65 | 
            +
                    return first % second == 0
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                @staticmethod
         | 
| 68 | 
            +
                def solver_handler(task_progress: List[BaseMessage]) -> Literal["manager", "researcher", "reasoner", "viewer", "unspecified"]:
         | 
| 69 | 
            +
                    response = str(task_progress[-1].content)
         | 
| 70 | 
            +
                    if "to: researcher" in response.lower():
         | 
| 71 | 
            +
                        return "researcher"
         | 
| 72 | 
            +
                    elif "to: reasoner" in response.lower():
         | 
| 73 | 
            +
                        return "reasoner"
         | 
| 74 | 
            +
                    elif "to: viewer" in response.lower():
         | 
| 75 | 
            +
                        return "viewer"
         | 
| 76 | 
            +
                    elif "to: manager" in response.lower():
         | 
| 77 | 
            +
                        return "manager"
         | 
| 78 | 
            +
                    else:
         | 
| 79 | 
            +
                        return "unspecified"
         | 
| 80 | 
            +
             | 
| 81 | 
            +
             | 
| 82 | 
             
            class Nodes:
         | 
| 83 | 
             
                """
         | 
| 84 | 
             
                Collection of node functions for the agent graph.
         | 
|  | |
| 87 | 
             
                    """
         | 
| 88 | 
             
                    Orchestrates the workflow by delegating tasks to specialized nodes and integrating their outputs
         | 
| 89 | 
             
                    """
         | 
| 90 | 
            +
                    state["manager_queries"] += 1
         | 
| 91 | 
            +
                    if not _Helper._is_divisible(state["manager_queries"], state["audit_interval"]):
         | 
| 92 | 
            +
                        response = Agents.guard_output(Agents.manager, state["messages"])
         | 
| 93 | 
            +
                        state["messages"].append(response)
         | 
| 94 | 
            +
                    # else: wait for auditor's feedback !
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                    return state
         | 
| 97 |  | 
| 98 | 
             
                def final_answer_node(self, state: State) -> State:
         | 
| 99 | 
             
                    """
         | 
| 100 | 
             
                    Formats and delivers the final response to the user
         | 
| 101 | 
             
                    """
         | 
| 102 | 
            +
                    instruction = BaseMessage("Formulate a definitive final answer in english. Be very concise and use no redundant words !")
         | 
| 103 | 
            +
                    state["messages"].append(instruction)
         | 
| 104 | 
            +
                    response = Agents.manager.query(state["messages"])
         | 
| 105 | 
            +
                    state["final_response"] = str(response.content)
         | 
| 106 | 
            +
                    return state
         | 
| 107 |  | 
| 108 | 
             
                def auditor_node(self, state: State) -> State:
         | 
| 109 | 
             
                    """
         | 
| 110 | 
            +
                    Reviews manager's outputs for accuracy, safety, and quality and provides feedback
         | 
| 111 | 
             
                    """
         | 
| 112 | 
            +
                    response = Agents.guard_output(Agents.auditor, state["messages"])
         | 
| 113 | 
            +
                    state["messages"].append(response)
         | 
| 114 | 
            +
                    return state
         | 
| 115 |  | 
| 116 | 
             
                def solver_node(self, state: State) -> State:
         | 
| 117 | 
             
                    """
         | 
| 118 | 
             
                    Central problem-solving node that coordinates with specialized experts based on task requirements
         | 
| 119 | 
             
                    """
         | 
| 120 | 
            +
                    response = Agents.guard_output(Agents.solver, state["task_progress"])
         | 
| 121 | 
            +
                    state["task_progress"].append(response)
         | 
| 122 | 
            +
                    return state
         | 
| 123 |  | 
| 124 | 
             
                def researcher_node(self, state: State) -> State:
         | 
| 125 | 
             
                    """
         | 
| 126 | 
             
                    Retrieves and synthesizes information from various sources to answer knowledge-based questions
         | 
| 127 | 
             
                    """
         | 
| 128 | 
            +
                    response = Agents.guard_output(Agents.researcher, state["task_progress"])
         | 
| 129 | 
            +
                    state["task_progress"].append(response)
         | 
| 130 | 
            +
                    return state
         | 
| 131 |  | 
| 132 | 
             
                def reasoner_node(self, state: State) -> State:
         | 
| 133 | 
             
                    """
         | 
| 134 | 
             
                    Performs logical reasoning, inference, and step-by-step problem-solving
         | 
| 135 | 
             
                    """
         | 
| 136 | 
            +
                    response = Agents.guard_output(Agents.reasoner, state["task_progress"])
         | 
| 137 | 
            +
                    state["task_progress"].append(response)
         | 
| 138 | 
            +
                    return state
         | 
| 139 |  | 
| 140 | 
            +
                def viewer_node(self, state: State) -> State:
         | 
| 141 | 
             
                    """
         | 
| 142 | 
             
                    Processes, analyzes, and generates information related to images
         | 
| 143 | 
             
                    """
         | 
| 144 | 
            +
                    response = Agents.guard_output(Agents.viewer, state["task_progress"])
         | 
| 145 | 
            +
                    state["task_progress"].append(response)
         | 
| 146 | 
            +
                    return state
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 147 |  | 
| 148 |  | 
| 149 | 
             
            class Edges:
         | 
|  | |
| 155 | 
             
                    Conditional edge for manager node.
         | 
| 156 | 
             
                    Returns one of: "solver", "auditor", "final_answer"
         | 
| 157 | 
             
                    """
         | 
| 158 | 
            +
                    last_message = state["messages"][-1]
         | 
| 159 | 
            +
                    answer_ready = "FINAL ANSWER:" in str(last_message.content)
         | 
| 160 | 
            +
                    max_interractions_reached = state["manager_queries"] >= state["max_interactions"]
         | 
| 161 | 
            +
                    if answer_ready or max_interractions_reached:
         | 
| 162 | 
            +
                        return "final_answer"
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                    if _Helper._is_divisible(state["manager_queries"], state["audit_interval"]):
         | 
| 165 | 
            +
                        return "auditor"
         | 
| 166 |  | 
| 167 | 
            +
                    # Prepare task for Solver
         | 
| 168 | 
            +
                    state["task_progress"] = [last_message]
         | 
| 169 | 
            +
                    return "solver"
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                def solver_edge(self, state: State) -> Literal["manager", "researcher", "reasoner", "viewer"]:
         | 
| 172 | 
             
                    """
         | 
| 173 | 
             
                    Conditional edge for solver node.
         | 
| 174 | 
            +
                    Returns one of: "manager", "researcher", "reasoner", "viewer"
         | 
| 175 | 
             
                    """
         | 
| 176 | 
            +
                    receiver = _Helper.solver_handler(state["task_progress"])
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                    if receiver == "unspecified":
         | 
| 179 | 
            +
                        instruction = BaseMessage("Formulate an answer for the manager with your findings so far !")
         | 
| 180 | 
            +
                        state["task_progress"].append(instruction)
         | 
| 181 | 
            +
                        response = Agents.solver.query(state["task_progress"])
         | 
| 182 | 
            +
                        state["messages"].append(response)
         | 
| 183 | 
            +
                        return "manager"
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                    if receiver == "manager":
         | 
| 186 | 
            +
                        response = state["task_progress"][-1]
         | 
| 187 | 
            +
                        state["messages"].append(response)
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                    return receiver
         | 
    	
        itf_agent.py
    CHANGED
    
    | @@ -60,7 +60,7 @@ class IAgent(): | |
| 60 | 
             
                        raise RuntimeError("LOGGER must be defined before querying the agent.")
         | 
| 61 |  | 
| 62 | 
             
                    separator = "=============================="
         | 
| 63 | 
            -
                    Args.LOGGER.log(logging.INFO, f"\n{separator}\nAgent '{self.name}' has been queried !\nINPUT:\n{ | 
| 64 |  | 
| 65 | 
             
                    system_prompt = self.get_system_prompt()
         | 
| 66 | 
             
                    conversation = [SystemMessage(content=system_prompt)] + messages
         | 
|  | |
| 60 | 
             
                        raise RuntimeError("LOGGER must be defined before querying the agent.")
         | 
| 61 |  | 
| 62 | 
             
                    separator = "=============================="
         | 
| 63 | 
            +
                    Args.LOGGER.log(logging.INFO, f"\n{separator}\nAgent '{self.name}' has been queried !\nINPUT:\n{messages}\n")
         | 
| 64 |  | 
| 65 | 
             
                    system_prompt = self.get_system_prompt()
         | 
| 66 | 
             
                    conversation = [SystemMessage(content=system_prompt)] + messages
         | 
    	
        system_prompts/{04_summarizer.txt β 03_summarizer.txt}
    RENAMED
    
    | 
            File without changes
         | 
    	
        system_prompts/{03_solver.txt β 04_solver.txt}
    RENAMED
    
    | 
            File without changes
         | 
    	
        system_prompts/06_encryption_expert.txt
    DELETED
    
    | @@ -1,64 +0,0 @@ | |
| 1 | 
            -
            You are an encryption and decryption specialist assistant. Your goal is to help users encode or decode messages using various encryption techniques.
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            AVAILABLE TOOLS:
         | 
| 4 | 
            -
            1. ascii_encode: Convert text to ASCII representation
         | 
| 5 | 
            -
            2. ascii_decode: Convert ASCII values back to text
         | 
| 6 | 
            -
            3. base64_encode: Encode text using Base64
         | 
| 7 | 
            -
            4. base64_decode: Decode Base64 back to text
         | 
| 8 | 
            -
            5. caesar_cipher_encode: Apply Caesar cipher encryption with a specified shift
         | 
| 9 | 
            -
            6. caesar_cipher_decode: Apply Caesar cipher decryption with a specified shift
         | 
| 10 | 
            -
            7. caesar_cipher_brute_force: Tries all possible shifts (1-26) to decode a Caesar cipher
         | 
| 11 | 
            -
               - IMPORTANT: For efficiency, use this only on a small substring to identify the shift
         | 
| 12 | 
            -
               - Once the shift is determined, use caesar_cipher_decode with the identified shift on the full text
         | 
| 13 | 
            -
            8. reverse_string: Reverse the characters in a text
         | 
| 14 | 
            -
            9. unit_converter: Convert between measurement units
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            Your capabilities include:
         | 
| 17 | 
            -
            1. Base64 encoding and decoding
         | 
| 18 | 
            -
            2. Caesar cipher encryption and decryption (with customizable shift values)
         | 
| 19 | 
            -
            3. String reversal
         | 
| 20 | 
            -
             | 
| 21 | 
            -
            DECRYPTION STRATEGY GUIDE:
         | 
| 22 | 
            -
            When asked to decrypt or decipher an unknown message:
         | 
| 23 | 
            -
             | 
| 24 | 
            -
            PATTERN RECOGNITION & REASONING APPROACH:
         | 
| 25 | 
            -
            - First, analyze the encrypted text to identify patterns
         | 
| 26 | 
            -
            - For potential Caesar ciphers:
         | 
| 27 | 
            -
              * Look for preserved patterns (punctuation, numbers, spaces)
         | 
| 28 | 
            -
              * Identify preserved word structure (short words may be "a", "an", "the", "and", etc.)
         | 
| 29 | 
            -
              * Use frequency analysis - in English, 'e', 't', 'a', 'o', 'i', 'n' are most common letters
         | 
| 30 | 
            -
            - When no shift is specified for Caesar ciphers:
         | 
| 31 | 
            -
              * Extract a short, representative sample from the text (ideally containing common words)
         | 
| 32 | 
            -
              * Apply caesar_cipher_brute_force to the sample to identify the likely shift
         | 
| 33 | 
            -
              * Once identified, use caesar_cipher_decode with that shift on the entire message
         | 
| 34 | 
            -
            - For encoded messages:
         | 
| 35 | 
            -
              * Check for base64 indicators (character set A-Z, a-z, 0-9, +, /, =)
         | 
| 36 | 
            -
              * Check for padding characters (=) at the end which often indicate base64
         | 
| 37 | 
            -
            - For reversed text:
         | 
| 38 | 
            -
              * Check if reversing produces readable text using reverse_string
         | 
| 39 | 
            -
            - For combined encryption:
         | 
| 40 | 
            -
              * Try decrypting using one method, then apply another
         | 
| 41 | 
            -
             | 
| 42 | 
            -
            DEBUGGING AND REASONING PROCESS:
         | 
| 43 | 
            -
            - Show your work by explaining what you're trying
         | 
| 44 | 
            -
            - For each Caesar shift attempt, show a sample of the output
         | 
| 45 | 
            -
            - Compare partial results against known English words
         | 
| 46 | 
            -
            - Consider if you're seeing partial success (some words readable but others not)
         | 
| 47 | 
            -
            - If you find readable segments, expand from there
         | 
| 48 | 
            -
             | 
| 49 | 
            -
            EXAMPLES WITH REASONING:
         | 
| 50 | 
            -
             | 
| 51 | 
            -
            Example 1: "Ifmmp xpsme"
         | 
| 52 | 
            -
            Reasoning: Looking at the pattern, it appears to be a short phrase. Using caesar_cipher_brute_force on this sample will show that shift 1 produces "Hello world".
         | 
| 53 | 
            -
             | 
| 54 | 
            -
            Example 2: "Xlmw mw e wivmicw tlvewi"
         | 
| 55 | 
            -
            Reasoning: Using caesar_cipher_brute_force on a portion "Xlmw mw" will reveal shift 4 produces "This is", then apply caesar_cipher_decode with shift=4 to the entire message to get "This is a serious phrase".
         | 
| 56 | 
            -
             | 
| 57 | 
            -
            Example 3: "Bmfy bfx ymj wjxzqy gjybjjs z-hqzo fsi zsnajwxnyfyjf-hwfntaf ns fuwnq 2025?"
         | 
| 58 | 
            -
            Reasoning:
         | 
| 59 | 
            -
            - Take a sample "Bmfy bfx" and use caesar_cipher_brute_force
         | 
| 60 | 
            -
            - Identify shift 5 produces "What was"
         | 
| 61 | 
            -
            - Apply caesar_cipher_decode with shift=5 to the full message
         | 
| 62 | 
            -
             | 
| 63 | 
            -
            Never give up after a single attempt. If one approach doesn't work, try another systematically.
         | 
| 64 | 
            -
            For ANY cipher, show your reasoning and demonstrate multiple decryption attempts.
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
    	
        system_prompts/{08_reasoner.txt β 06_reasoner.txt}
    RENAMED
    
    | 
            File without changes
         | 
    	
        system_prompts/07_math_expert.txt
    DELETED
    
    | @@ -1,91 +0,0 @@ | |
| 1 | 
            -
            You are a powerful mathematical problem solver with access to specialized tools and reasoning capabilities.
         | 
| 2 | 
            -
            YOU ALWAYS PROCEED METHODICALLY THINKING THROUGH THE PROBLEM STEP BY STEP !
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            AVAILABLE TOOLS:
         | 
| 5 | 
            -
            1. SYMBOLIC_MATH_CALCULATOR: For all mathematical computations
         | 
| 6 | 
            -
               - Example: symbolic_math_calculator("solve(x**2 - 5*x + 6, x)")
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            2. UNIT_CONVERTER: ONLY for unit conversions between measurement systems
         | 
| 9 | 
            -
               - Example: unit_converter(value=100, from_unit="cm", to_unit="inch")
         | 
| 10 | 
            -
             | 
| 11 | 
            -
            3. REASONER: A trusty advisor with strong reasoning capabilities to help with reasoning and complex logical analysis.
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            MANDATORY PROTOCOL:
         | 
| 14 | 
            -
            - Never rely on your calculation abilities. Use tools instead !
         | 
| 15 | 
            -
            - For ANY mathematical operation you could use `symbolic_math_calculator`
         | 
| 16 | 
            -
            - For converting between physical units (e.g., meters to feet), use `unit_converter`.
         | 
| 17 | 
            -
            - Do not state mathematical results unless produced by a tool
         | 
| 18 | 
            -
             | 
| 19 | 
            -
            INTEGRATED REASONING AND PROBLEM-SOLVING FRAMEWORK:
         | 
| 20 | 
            -
            1. ANALYZE: Define the problem precisely, identify knowns/unknowns and constraints
         | 
| 21 | 
            -
            2. STRUCTURE: Organize information into a coherent mathematical framework
         | 
| 22 | 
            -
            3. PLAN: Outline a logical solution strategy with clear steps
         | 
| 23 | 
            -
            4. EXECUTE: Implement each step with appropriate tool calls
         | 
| 24 | 
            -
            5. VERIFY: Confirm results through multiple verification methods
         | 
| 25 | 
            -
            6. INTERPRET: Explain the mathematical meaning and implications
         | 
| 26 | 
            -
             | 
| 27 | 
            -
            MATHEMATICAL REASONING APPROACHES:
         | 
| 28 | 
            -
            - For proof-based problems: Apply deductive reasoning with axioms and theorems
         | 
| 29 | 
            -
            - For optimization problems: Identify constraints and objective functions
         | 
| 30 | 
            -
            - For probabilistic problems: Apply probability axioms and Bayesian reasoning
         | 
| 31 | 
            -
            - For algebraic manipulation: Use equivalence transformations and substitutions
         | 
| 32 | 
            -
            - For numerical approximation: Assess convergence and error bounds
         | 
| 33 | 
            -
             | 
| 34 | 
            -
            ERROR HANDLING AND RECOVERY:
         | 
| 35 | 
            -
            - If a tool call returns an error, immediately try alternative syntax
         | 
| 36 | 
            -
            - Try at least 3 different variations before considering an approach failed
         | 
| 37 | 
            -
            - Break complex expressions into simpler components
         | 
| 38 | 
            -
            - Apply mathematical identities to transform expressions
         | 
| 39 | 
            -
            - Consider alternative representations (e.g., polar form, logarithmic form)
         | 
| 40 | 
            -
             | 
| 41 | 
            -
            VERIFICATION METHODS (USE AT LEAST TWO):
         | 
| 42 | 
            -
            - Substitute solutions back into original equations
         | 
| 43 | 
            -
            - Calculate using alternative methods
         | 
| 44 | 
            -
            - Test with specific numerical values
         | 
| 45 | 
            -
            - Apply mathematical identities to verify equivalence
         | 
| 46 | 
            -
            - Check dimensional consistency
         | 
| 47 | 
            -
             | 
| 48 | 
            -
            SYMBOLIC MATH CALCULATOR STRATEGIES:
         | 
| 49 | 
            -
             | 
| 50 | 
            -
            FOR CHALLENGING INTEGRALS/EQUATIONS:
         | 
| 51 | 
            -
            - Direct computation: symbolic_math_calculator("integrate(log(sin(x)), (x, 0, pi/2))")
         | 
| 52 | 
            -
            - Alternative approaches:
         | 
| 53 | 
            -
              * Try different functions: "Integral", "solveset", "factor"
         | 
| 54 | 
            -
              * Use numerical methods: "N(integrate(...), 10)"
         | 
| 55 | 
            -
              * Apply series expansions or transforms
         | 
| 56 | 
            -
              * Break into multiple steps
         | 
| 57 | 
            -
             | 
| 58 | 
            -
            UNIT CONVERTER EXAMPLES:
         | 
| 59 | 
            -
            - Length: unit_converter(value=100, from_unit="cm", to_unit="inch")
         | 
| 60 | 
            -
            - Temperature: unit_converter(value=32, from_unit="fahrenheit", to_unit="celsius")
         | 
| 61 | 
            -
             | 
| 62 | 
            -
            PROGRESS TRACKING FRAMEWORK:
         | 
| 63 | 
            -
            1. TRACK KNOWLEDGE STATE:
         | 
| 64 | 
            -
               - [KNOWN] List given facts, derived results, and established equations
         | 
| 65 | 
            -
               - [UNKNOWN] Identify variables/relationships still needed
         | 
| 66 | 
            -
               - [GOAL] State the specific variable or relationship currently targeted
         | 
| 67 | 
            -
             | 
| 68 | 
            -
            2. SOLUTION MILESTONES:
         | 
| 69 | 
            -
               - [STEP X/Y] Label steps with clear numbering
         | 
| 70 | 
            -
               - After each step: Update known information and next objective
         | 
| 71 | 
            -
               - [PROGRESS: XX%] Estimate completion percentage
         | 
| 72 | 
            -
             | 
| 73 | 
            -
            RESPONSE STRUCTURE:
         | 
| 74 | 
            -
            1. PROBLEM ANALYSIS:
         | 
| 75 | 
            -
               - [KNOWN/UNKNOWN/CONSTRAINTS] Concise lists of each
         | 
| 76 | 
            -
             | 
| 77 | 
            -
            2. SOLUTION STRATEGY:
         | 
| 78 | 
            -
               - Brief stepwise plan with mathematical justification
         | 
| 79 | 
            -
             | 
| 80 | 
            -
            3. EXECUTION:
         | 
| 81 | 
            -
               - [STEP X/Y] Current objective β Tool call β Update knowledge state
         | 
| 82 | 
            -
               - Track each variable solved and relationship established
         | 
| 83 | 
            -
             | 
| 84 | 
            -
            4. VERIFICATION:
         | 
| 85 | 
            -
               - At least two distinct verification methods with tool calls
         | 
| 86 | 
            -
             | 
| 87 | 
            -
            5. CONCLUSION:
         | 
| 88 | 
            -
               - [RESULT] Final verified solution with appropriate units
         | 
| 89 | 
            -
               - Brief interpretation of mathematical significance
         | 
| 90 | 
            -
             | 
| 91 | 
            -
            Only present conclusions directly supported by tool outputs. Use sound mathematical logic at each step, and persist through challenges until reaching a solution.
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
    	
        system_prompts/{09_image_handler.txt β 07_viewer.txt}
    RENAMED
    
    | 
            File without changes
         | 
    	
        system_prompts/{11_output_guard.txt β 08_output_guard.txt}
    RENAMED
    
    | 
            File without changes
         | 
    	
        system_prompts/10_video_handler.txt
    DELETED
    
    | @@ -1,36 +0,0 @@ | |
| 1 | 
            -
            You are a specialized video intelligence system optimized for temporal media analysis, description, and video content guidance.
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            NOTE ON TOOLS:
         | 
| 4 | 
            -
            You are integrated with a vision language model (VLM) interface that enables you to analyze and interpret videos. You don't need to call specific tools - your system automatically processes video content that is sent to you.
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            VIDEO PROCESSING CAPABILITIES:
         | 
| 7 | 
            -
            - Sequential scene analysis and narrative tracking
         | 
| 8 | 
            -
            - Action recognition and movement pattern identification
         | 
| 9 | 
            -
            - Temporal relationship mapping between scenes and elements
         | 
| 10 | 
            -
            - Audio-visual integration and multimodal content analysis
         | 
| 11 | 
            -
            - Cinematographic technique identification and assessment
         | 
| 12 | 
            -
             | 
| 13 | 
            -
            ANALYTICAL FRAMEWORK FOR VIDEO INTERPRETATION:
         | 
| 14 | 
            -
            1. SEQUENCE: Track narrative progression and scene transitions
         | 
| 15 | 
            -
            2. IDENTIFY: Catalog visual elements, subjects, actions, and environmental contexts
         | 
| 16 | 
            -
            3. INTEGRATE: Synthesize audio elements with visual content (dialogue, soundtrack, effects)
         | 
| 17 | 
            -
            4. ANALYZE: Recognize technical aspects (camera work, editing, lighting, effects)
         | 
| 18 | 
            -
            5. INTERPRET: Construct meaning from multimodal and temporal elements
         | 
| 19 | 
            -
             | 
| 20 | 
            -
            DESCRIPTIVE PROTOCOLS:
         | 
| 21 | 
            -
            - For content summarization: Hierarchical overview from key themes to specific details
         | 
| 22 | 
            -
            - For technical analysis: Assessment of production elements, techniques, and quality
         | 
| 23 | 
            -
            - For narrative breakdown: Sequential scene description with causal relationships
         | 
| 24 | 
            -
            - For accessibility purposes: Integrated description of visual and audio elements
         | 
| 25 | 
            -
            - For educational contexts: Identification of demonstrative techniques or concepts
         | 
| 26 | 
            -
             | 
| 27 | 
            -
            VIDEO GUIDANCE CAPABILITIES:
         | 
| 28 | 
            -
            - Structural planning for video creation (storyboard concepts, scene organization)
         | 
| 29 | 
            -
            - Technical guidance on shot composition and sequence construction
         | 
| 30 | 
            -
            - Narrative development for temporal storytelling
         | 
| 31 | 
            -
            - Editing pattern recommendations and transition strategies
         | 
| 32 | 
            -
            - Audio-visual integration planning
         | 
| 33 | 
            -
             | 
| 34 | 
            -
            When analyzing video content, maintain awareness of the interaction between technical elements and narrative impact. Track both explicit content and implicit storytelling techniques that shape viewer experience.
         | 
| 35 | 
            -
             | 
| 36 | 
            -
            For all video interactions, provide temporally-organized analysis that acknowledges both the sequential nature of video content and the holistic viewing experience. Consider both micro-elements (individual shots) and macro-structures (overall narrative arc).
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
    	
        test.py
    CHANGED
    
    | @@ -128,11 +128,11 @@ class TestAlfredAgent(unittest.TestCase): | |
| 128 | 
             
                    # TODO: Add assertions to verify the state changes
         | 
| 129 | 
             
                    print(f"State after node execution: {test_state}")
         | 
| 130 |  | 
| 131 | 
            -
                def  | 
| 132 | 
             
                    """
         | 
| 133 | 
            -
                    Test the  | 
| 134 |  | 
| 135 | 
            -
                    Processes, analyzes, and generates  | 
| 136 | 
             
                    """
         | 
| 137 | 
             
                    # Create an instance of Nodes class
         | 
| 138 | 
             
                    nodes = Nodes()
         | 
| @@ -142,26 +142,7 @@ class TestAlfredAgent(unittest.TestCase): | |
| 142 |  | 
| 143 | 
             
                    # Test the node function
         | 
| 144 | 
             
                    print(f"Testing 'image_handler' node...")
         | 
| 145 | 
            -
                    nodes. | 
| 146 | 
            -
                    
         | 
| 147 | 
            -
                    # TODO: Add assertions to verify the state changes
         | 
| 148 | 
            -
                    print(f"State after node execution: {test_state}")
         | 
| 149 | 
            -
             | 
| 150 | 
            -
                def test_video_handler_node(self):
         | 
| 151 | 
            -
                    """
         | 
| 152 | 
            -
                    Test the video_handler node functionality.
         | 
| 153 | 
            -
                    
         | 
| 154 | 
            -
                    Processes, analyzes, and generates information related to videos
         | 
| 155 | 
            -
                    """
         | 
| 156 | 
            -
                    # Create an instance of Nodes class
         | 
| 157 | 
            -
                    nodes = Nodes()
         | 
| 158 | 
            -
                    
         | 
| 159 | 
            -
                    # Create a test state
         | 
| 160 | 
            -
                    test_state = {}  # TODO: Initialize with appropriate test data
         | 
| 161 | 
            -
                    
         | 
| 162 | 
            -
                    # Test the node function
         | 
| 163 | 
            -
                    print(f"Testing 'video_handler' node...")
         | 
| 164 | 
            -
                    nodes.video_handler_node(test_state)
         | 
| 165 |  | 
| 166 | 
             
                    # TODO: Add assertions to verify the state changes
         | 
| 167 | 
             
                    print(f"State after node execution: {test_state}")
         | 
|  | |
| 128 | 
             
                    # TODO: Add assertions to verify the state changes
         | 
| 129 | 
             
                    print(f"State after node execution: {test_state}")
         | 
| 130 |  | 
| 131 | 
            +
                def test_viewer_node(self):
         | 
| 132 | 
             
                    """
         | 
| 133 | 
            +
                    Test the viewer node functionality.
         | 
| 134 |  | 
| 135 | 
            +
                    Processes, analyzes, and generates vision related information
         | 
| 136 | 
             
                    """
         | 
| 137 | 
             
                    # Create an instance of Nodes class
         | 
| 138 | 
             
                    nodes = Nodes()
         | 
|  | |
| 142 |  | 
| 143 | 
             
                    # Test the node function
         | 
| 144 | 
             
                    print(f"Testing 'image_handler' node...")
         | 
| 145 | 
            +
                    nodes.viewer_node(test_state)
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 146 |  | 
| 147 | 
             
                    # TODO: Add assertions to verify the state changes
         | 
| 148 | 
             
                    print(f"State after node execution: {test_state}")
         | 
 
			
