Spaces:
Runtime error
Runtime error
good progress: finalized the llama index agents (except for the image and video handlers); finalized the toolbox; fixed bugs; designed great prompts.
Browse files- alfred.py +17 -21
- app.py +1 -1
- itf_agent.py +22 -12
- management.py +11 -73
- solver.py +8 -42
- system_prompts/01_assistant.txt +10 -26
- system_prompts/02_manager.txt +47 -18
- system_prompts/03_solver.txt +13 -0
- system_prompts/04_summarizer.txt +24 -30
- system_prompts/05_researcher.txt +2 -1
- system_prompts/06_encryption_expert.txt +37 -42
- system_prompts/07_math_expert.txt +75 -71
- system_prompts/08_reasoner.txt +79 -87
- system_prompts/09_image_handler.txt +3 -0
- system_prompts/10_video_handler.txt +3 -0
- toolbox.py +75 -4
alfred.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
from langgraph.graph import END, StateGraph
|
2 |
from langgraph.graph.state import CompiledStateGraph
|
3 |
|
4 |
from typing import Dict, Any, TypedDict, Literal, Optional
|
@@ -21,7 +21,7 @@ class State(TypedDict):
|
|
21 |
initial_query: str
|
22 |
current_message: str
|
23 |
nr_interactions: int
|
24 |
-
|
25 |
|
26 |
|
27 |
class GraphBuilder:
|
@@ -49,7 +49,7 @@ class GraphBuilder:
|
|
49 |
# Check if this is a final answer
|
50 |
if self.final_answer_hint in response:
|
51 |
# Extract the text after final answer hint
|
52 |
-
state["
|
53 |
|
54 |
state["current_message"] = response
|
55 |
state["nr_interactions"] += 1
|
@@ -75,8 +75,11 @@ class GraphBuilder:
|
|
75 |
If there's already a final answer in the state, it uses that.
|
76 |
Otherwise, it asks the assistant to formulate a final answer.
|
77 |
"""
|
|
|
78 |
# If we already have a final answer, use it
|
79 |
-
|
|
|
|
|
80 |
return state
|
81 |
|
82 |
# Otherwise, have the assistant formulate a final answer
|
@@ -86,10 +89,13 @@ class GraphBuilder:
|
|
86 |
|
87 |
# Format the response
|
88 |
if self.final_answer_hint not in response:
|
|
|
89 |
response = f"{self.final_answer_hint}{response}"
|
90 |
|
91 |
# Extract the text after final answer hint
|
92 |
-
state["
|
|
|
|
|
93 |
|
94 |
return state
|
95 |
|
@@ -112,20 +118,13 @@ class GraphBuilder:
|
|
112 |
"""Build and return the agent graph."""
|
113 |
graph = StateGraph(State)
|
114 |
|
115 |
-
# Convert async functions to sync functions using asyncio.run
|
116 |
-
def sync_assistant_node(state: State) -> State:
|
117 |
-
return asyncio.run(self.assistant_node(state))
|
118 |
-
|
119 |
-
def sync_manager_node(state: State) -> State:
|
120 |
-
return asyncio.run(self.manager_node(state))
|
121 |
-
|
122 |
# Add the nodes with sync wrappers
|
123 |
-
graph.add_node("assistant",
|
124 |
-
graph.add_node("manager",
|
125 |
graph.add_node("final_answer", self.final_answer_node)
|
126 |
|
127 |
# Add the edges
|
128 |
-
graph.add_edge(
|
129 |
|
130 |
graph.add_conditional_edges(
|
131 |
"assistant",
|
@@ -153,7 +152,7 @@ class Alfred:
|
|
153 |
async def __call__(self, question: str) -> str:
|
154 |
print(f"Agent received question (first 50 chars): {question[:50]}...")
|
155 |
result = await self.process_query(question)
|
156 |
-
response = result["
|
157 |
print(f"Agent processed the response: {response}")
|
158 |
|
159 |
return response
|
@@ -172,12 +171,9 @@ class Alfred:
|
|
172 |
"initial_query": query,
|
173 |
"current_message": query,
|
174 |
"nr_interactions": 0,
|
175 |
-
"
|
176 |
}
|
177 |
self.graph_builder.clear_chat_history()
|
178 |
|
179 |
-
|
180 |
-
# But we might need to run it in an executor if it's computationally intensive
|
181 |
-
loop = asyncio.get_running_loop()
|
182 |
-
result = await loop.run_in_executor(None, self.agent_graph.invoke, initial_state)
|
183 |
return result
|
|
|
1 |
+
from langgraph.graph import START, END, StateGraph
|
2 |
from langgraph.graph.state import CompiledStateGraph
|
3 |
|
4 |
from typing import Dict, Any, TypedDict, Literal, Optional
|
|
|
21 |
initial_query: str
|
22 |
current_message: str
|
23 |
nr_interactions: int
|
24 |
+
final_response: Optional[str]
|
25 |
|
26 |
|
27 |
class GraphBuilder:
|
|
|
49 |
# Check if this is a final answer
|
50 |
if self.final_answer_hint in response:
|
51 |
# Extract the text after final answer hint
|
52 |
+
state["final_response"] = response.split(self.final_answer_hint, 1)[1].strip()
|
53 |
|
54 |
state["current_message"] = response
|
55 |
state["nr_interactions"] += 1
|
|
|
75 |
If there's already a final answer in the state, it uses that.
|
76 |
Otherwise, it asks the assistant to formulate a final answer.
|
77 |
"""
|
78 |
+
print("========== final_answer_node ==========")
|
79 |
# If we already have a final answer, use it
|
80 |
+
final_response = state.get("final_response")
|
81 |
+
if final_response is not None:
|
82 |
+
print(f"====================\nFinal response:\n{final_response}\n====================")
|
83 |
return state
|
84 |
|
85 |
# Otherwise, have the assistant formulate a final answer
|
|
|
89 |
|
90 |
# Format the response
|
91 |
if self.final_answer_hint not in response:
|
92 |
+
print(f"WARNING: final_answer_hint '{self.final_answer_hint}' not in response !")
|
93 |
response = f"{self.final_answer_hint}{response}"
|
94 |
|
95 |
# Extract the text after final answer hint
|
96 |
+
state["final_response"] = response.split(self.final_answer_hint, 1)[1].strip()
|
97 |
+
final_response = state.get("final_response")
|
98 |
+
print(f"====================\nFinal response:\n{final_response}\n====================")
|
99 |
|
100 |
return state
|
101 |
|
|
|
118 |
"""Build and return the agent graph."""
|
119 |
graph = StateGraph(State)
|
120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
# Add the nodes with sync wrappers
|
122 |
+
graph.add_node("assistant", self.assistant_node)
|
123 |
+
graph.add_node("manager", self.manager_node)
|
124 |
graph.add_node("final_answer", self.final_answer_node)
|
125 |
|
126 |
# Add the edges
|
127 |
+
graph.add_edge(START, "assistant")
|
128 |
|
129 |
graph.add_conditional_edges(
|
130 |
"assistant",
|
|
|
152 |
async def __call__(self, question: str) -> str:
|
153 |
print(f"Agent received question (first 50 chars): {question[:50]}...")
|
154 |
result = await self.process_query(question)
|
155 |
+
response = result["final_response"]
|
156 |
print(f"Agent processed the response: {response}")
|
157 |
|
158 |
return response
|
|
|
171 |
"initial_query": query,
|
172 |
"current_message": query,
|
173 |
"nr_interactions": 0,
|
174 |
+
"final_response": None
|
175 |
}
|
176 |
self.graph_builder.clear_chat_history()
|
177 |
|
178 |
+
result = await self.agent_graph.ainvoke(initial_state)
|
|
|
|
|
|
|
179 |
return result
|
app.py
CHANGED
@@ -9,7 +9,7 @@ from alfred import Alfred
|
|
9 |
# --- Constants ---
|
10 |
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
|
11 |
MOCK_SUBMISSION = True
|
12 |
-
QUESTIONS_LIMIT = 3
|
13 |
|
14 |
|
15 |
class Application:
|
|
|
9 |
# --- Constants ---
|
10 |
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
|
11 |
MOCK_SUBMISSION = True
|
12 |
+
QUESTIONS_LIMIT = 3 # Use 0 for no limit !
|
13 |
|
14 |
|
15 |
class Application:
|
itf_agent.py
CHANGED
@@ -1,6 +1,5 @@
|
|
1 |
from llama_index.core.workflow import Context
|
2 |
|
3 |
-
|
4 |
import os
|
5 |
from typing import List
|
6 |
|
@@ -11,6 +10,7 @@ from llama_index.core.agent.workflow import AgentWorkflow
|
|
11 |
|
12 |
class IAgent():
|
13 |
def __init__(self, temperature, max_tokens, sys_prompt_file, llm_itf: LLMInterface):
|
|
|
14 |
self.temperature, self.max_tokens = temperature, max_tokens
|
15 |
# Load the system prompt from a file
|
16 |
system_prompt_path = os.path.join(os.getcwd(), "system_prompts", sys_prompt_file)
|
@@ -27,17 +27,27 @@ class IAgent():
|
|
27 |
|
28 |
def setup_tools(self) -> List:
|
29 |
"""
|
30 |
-
|
31 |
-
|
|
|
|
|
|
|
|
|
|
|
32 |
"""
|
33 |
-
|
34 |
|
35 |
def setup_slaves(self) -> List:
|
36 |
"""
|
37 |
-
|
38 |
-
|
|
|
|
|
|
|
|
|
|
|
39 |
"""
|
40 |
-
|
41 |
|
42 |
def _setup_agent(self) -> AgentWorkflow:
|
43 |
"""
|
@@ -47,9 +57,6 @@ class IAgent():
|
|
47 |
Returns:
|
48 |
AgentWorkflow: An instance of the agent workflow configured with the appropriate tools and language model.
|
49 |
"""
|
50 |
-
if not self.tools and not self.slaves:
|
51 |
-
return AgentWorkflow.setup_agent(llm=self.llm)
|
52 |
-
|
53 |
# Create tools from slaves: each tool calls slave.query(question) asynchronously
|
54 |
slave_tools = []
|
55 |
for slave in self.slaves:
|
@@ -71,7 +78,7 @@ class IAgent():
|
|
71 |
"""
|
72 |
return self.system_prompt
|
73 |
|
74 |
-
async def query(self, question: str) -> str:
|
75 |
"""
|
76 |
Asynchronously queries the agent with a given question and returns the response.
|
77 |
|
@@ -81,7 +88,10 @@ class IAgent():
|
|
81 |
Returns:
|
82 |
str: The response from the agent as a string.
|
83 |
"""
|
84 |
-
|
|
|
|
|
|
|
85 |
response = str(response)
|
86 |
return response
|
87 |
|
|
|
1 |
from llama_index.core.workflow import Context
|
2 |
|
|
|
3 |
import os
|
4 |
from typing import List
|
5 |
|
|
|
10 |
|
11 |
class IAgent():
|
12 |
def __init__(self, temperature, max_tokens, sys_prompt_file, llm_itf: LLMInterface):
|
13 |
+
print(f"Agent initialized using {sys_prompt_file} prompt file.")
|
14 |
self.temperature, self.max_tokens = temperature, max_tokens
|
15 |
# Load the system prompt from a file
|
16 |
system_prompt_path = os.path.join(os.getcwd(), "system_prompts", sys_prompt_file)
|
|
|
27 |
|
28 |
def setup_tools(self) -> List:
|
29 |
"""
|
30 |
+
Set up the tools for this agent.
|
31 |
+
|
32 |
+
Override this method in subclasses to define custom tools.
|
33 |
+
By default, returns an empty list.
|
34 |
+
|
35 |
+
Returns:
|
36 |
+
List: A list of tools this agent can use
|
37 |
"""
|
38 |
+
return []
|
39 |
|
40 |
def setup_slaves(self) -> List:
|
41 |
"""
|
42 |
+
Set up the slave agents for this agent.
|
43 |
+
|
44 |
+
Override this method in subclasses to define custom sub-agents.
|
45 |
+
By default, returns an empty list.
|
46 |
+
|
47 |
+
Returns:
|
48 |
+
List: A list of slave agents this agent can use
|
49 |
"""
|
50 |
+
return []
|
51 |
|
52 |
def _setup_agent(self) -> AgentWorkflow:
|
53 |
"""
|
|
|
57 |
Returns:
|
58 |
AgentWorkflow: An instance of the agent workflow configured with the appropriate tools and language model.
|
59 |
"""
|
|
|
|
|
|
|
60 |
# Create tools from slaves: each tool calls slave.query(question) asynchronously
|
61 |
slave_tools = []
|
62 |
for slave in self.slaves:
|
|
|
78 |
"""
|
79 |
return self.system_prompt
|
80 |
|
81 |
+
async def query(self, question: str, has_context = True) -> str:
|
82 |
"""
|
83 |
Asynchronously queries the agent with a given question and returns the response.
|
84 |
|
|
|
88 |
Returns:
|
89 |
str: The response from the agent as a string.
|
90 |
"""
|
91 |
+
if has_context:
|
92 |
+
response = await self.agent.run(question, ctx=self.ctx)
|
93 |
+
else:
|
94 |
+
response = await self.agent.run(question)
|
95 |
response = str(response)
|
96 |
return response
|
97 |
|
management.py
CHANGED
@@ -1,60 +1,28 @@
|
|
1 |
-
from llama_index.core.agent.workflow import AgentWorkflow
|
2 |
from llama_index.core.tools import FunctionTool
|
3 |
-
from llama_index.core.workflow import Context
|
4 |
|
5 |
from typing import List
|
6 |
-
import os
|
7 |
|
8 |
-
from
|
9 |
from solver import Solver, Summarizer
|
10 |
from args import Args
|
11 |
|
12 |
|
13 |
-
class Assistant:
|
14 |
def __init__(self, temperature, max_tokens):
|
15 |
-
|
16 |
-
self.system_prompt = ""
|
17 |
-
with open(system_prompt_path, "r") as file:
|
18 |
-
self.system_prompt = file.read().strip()
|
19 |
-
llm = LLMFactory.create(Args.primary_llm_interface, self.system_prompt, temperature, max_tokens)
|
20 |
-
self.agent = AgentWorkflow.setup_agent(llm=llm)
|
21 |
-
self.ctx = Context(self.agent)
|
22 |
|
23 |
-
|
24 |
-
"""
|
25 |
-
Process a user query and return a response using the agent.
|
26 |
-
|
27 |
-
Args:
|
28 |
-
question: The user's question or input text
|
29 |
-
|
30 |
-
Returns:
|
31 |
-
The agent's response as a string
|
32 |
-
"""
|
33 |
-
response = await self.agent.run(question, ctx=self.ctx)
|
34 |
-
response = str(response)
|
35 |
-
return response
|
36 |
-
|
37 |
-
def clear_context(self):
|
38 |
-
"""
|
39 |
-
Clears the current context of the agent, resetting any conversation history.
|
40 |
-
This is useful when starting a new conversation or when the context needs to be refreshed.
|
41 |
-
"""
|
42 |
-
self.ctx = Context(self.agent)
|
43 |
-
|
44 |
-
|
45 |
-
class Manager:
|
46 |
def __init__(self, temperature, max_tokens, max_depth):
|
|
|
|
|
47 |
self.max_depth = max_depth
|
48 |
self.current_depth = 0
|
49 |
|
50 |
-
|
51 |
-
self.
|
52 |
-
with open(system_prompt_path, "r") as file:
|
53 |
-
self.system_prompt = file.read().strip()
|
54 |
|
55 |
-
|
56 |
-
|
57 |
-
[
|
58 |
FunctionTool.from_defaults(
|
59 |
name="require_break_up",
|
60 |
description="Break a complex task into simpler subtasks. Use when a task needs to be divided into manageable parts.",
|
@@ -65,37 +33,7 @@ class Manager:
|
|
65 |
description="Request direct solutions for specific tasks. Use when a task is simple enough to be solved directly.",
|
66 |
fn=self.require_solution
|
67 |
)
|
68 |
-
|
69 |
-
llm=llm
|
70 |
-
)
|
71 |
-
self.ctx = Context(self.agent)
|
72 |
-
self.solver = Solver(temperature, max_tokens)
|
73 |
-
self.summarizer = Summarizer(temperature, max_tokens)
|
74 |
-
|
75 |
-
async def query(self, question: str, has_context = True) -> str:
|
76 |
-
"""
|
77 |
-
Process a question using the manager agent and return a response.
|
78 |
-
|
79 |
-
Args:
|
80 |
-
question: The question or task to process
|
81 |
-
has_context: Whether to maintain context between queries (default: True)
|
82 |
-
|
83 |
-
Returns:
|
84 |
-
The agent's response as a string
|
85 |
-
"""
|
86 |
-
if has_context:
|
87 |
-
response = await self.agent.run(question, ctx=self.ctx)
|
88 |
-
else:
|
89 |
-
response = await self.agent.run(question)
|
90 |
-
response = str(response)
|
91 |
-
return response
|
92 |
-
|
93 |
-
def clear_context(self):
|
94 |
-
"""
|
95 |
-
Clears the current context of the agent, resetting any conversation history.
|
96 |
-
This is useful when starting a new conversation or when the context needs to be refreshed.
|
97 |
-
"""
|
98 |
-
self.ctx = Context(self.agent)
|
99 |
|
100 |
async def require_break_up(self, tasks: List[str], try_solving = False) -> str:
|
101 |
"""
|
|
|
|
|
1 |
from llama_index.core.tools import FunctionTool
|
|
|
2 |
|
3 |
from typing import List
|
|
|
4 |
|
5 |
+
from itf_agent import IAgent
|
6 |
from solver import Solver, Summarizer
|
7 |
from args import Args
|
8 |
|
9 |
|
10 |
+
class Assistant(IAgent):
|
11 |
def __init__(self, temperature, max_tokens):
|
12 |
+
super().__init__(temperature, max_tokens, "01_assistant.txt", Args.primary_llm_interface)
|
|
|
|
|
|
|
|
|
|
|
|
|
13 |
|
14 |
+
class Manager(IAgent):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
def __init__(self, temperature, max_tokens, max_depth):
|
16 |
+
super().__init__(temperature, max_tokens, "02_manager.txt", Args.primary_llm_interface)
|
17 |
+
|
18 |
self.max_depth = max_depth
|
19 |
self.current_depth = 0
|
20 |
|
21 |
+
self.solver = Solver(temperature, max_tokens)
|
22 |
+
self.summarizer = Summarizer(temperature, max_tokens)
|
|
|
|
|
23 |
|
24 |
+
def setup_tools(self) -> List:
|
25 |
+
return [
|
|
|
26 |
FunctionTool.from_defaults(
|
27 |
name="require_break_up",
|
28 |
description="Break a complex task into simpler subtasks. Use when a task needs to be divided into manageable parts.",
|
|
|
33 |
description="Request direct solutions for specific tasks. Use when a task is simple enough to be solved directly.",
|
34 |
fn=self.require_solution
|
35 |
)
|
36 |
+
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
|
38 |
async def require_break_up(self, tasks: List[str], try_solving = False) -> str:
|
39 |
"""
|
solver.py
CHANGED
@@ -9,30 +9,13 @@ class Summarizer(IAgent):
|
|
9 |
def __init__(self, temperature, max_tokens):
|
10 |
super().__init__(temperature, max_tokens, "04_summarizer.txt", Args.primary_llm_interface)
|
11 |
|
12 |
-
def setup_tools(self) -> List:
|
13 |
-
"""
|
14 |
-
Abstract method to set up the tools.
|
15 |
-
This method must be overridden by subclasses to define custom tools this agent can use.
|
16 |
-
"""
|
17 |
-
return []
|
18 |
-
|
19 |
-
def setup_slaves(self) -> List:
|
20 |
-
"""
|
21 |
-
Abstract method to set up the slave agents.
|
22 |
-
This method must be overridden by subclasses to define custom sub-agents this agent can use.
|
23 |
-
"""
|
24 |
-
return []
|
25 |
-
|
26 |
|
27 |
class Researcher(IAgent):
|
28 |
def __init__(self, temperature, max_tokens):
|
29 |
super().__init__(temperature, max_tokens, "05_researcher.txt", Args.primary_llm_interface)
|
30 |
|
31 |
def setup_tools(self) -> List:
|
32 |
-
return
|
33 |
-
|
34 |
-
def setup_slaves(self) -> List:
|
35 |
-
return []
|
36 |
|
37 |
|
38 |
class EncryptionExpert(IAgent):
|
@@ -41,16 +24,20 @@ class EncryptionExpert(IAgent):
|
|
41 |
|
42 |
def setup_tools(self) -> List:
|
43 |
return [
|
|
|
|
|
44 |
Toolbox.encryption.base64_encode,
|
45 |
Toolbox.encryption.base64_decode,
|
46 |
Toolbox.encryption.caesar_cipher_encode,
|
47 |
Toolbox.encryption.caesar_cipher_decode,
|
48 |
-
Toolbox.encryption.
|
49 |
-
|
|
|
50 |
]
|
51 |
|
52 |
def setup_slaves(self) -> List:
|
53 |
-
|
|
|
54 |
|
55 |
|
56 |
class MathExpert(IAgent):
|
@@ -72,42 +59,21 @@ class Reasoner(IAgent):
|
|
72 |
def __init__(self, temperature, max_tokens):
|
73 |
super().__init__(temperature, max_tokens, "08_reasoner.txt", Args.primary_llm_interface)
|
74 |
|
75 |
-
def setup_tools(self) -> List:
|
76 |
-
return []
|
77 |
-
|
78 |
-
def setup_slaves(self) -> List:
|
79 |
-
return []
|
80 |
-
|
81 |
|
82 |
class ImageHandler(IAgent):
|
83 |
def __init__(self, temperature, max_tokens):
|
84 |
super().__init__(temperature, max_tokens, "09_image_handler.txt", Args.vlm_interface)
|
85 |
|
86 |
-
def setup_tools(self) -> List:
|
87 |
-
return []
|
88 |
-
|
89 |
-
def setup_slaves(self) -> List:
|
90 |
-
return []
|
91 |
-
|
92 |
|
93 |
class VideoHandler(IAgent):
|
94 |
def __init__(self, temperature, max_tokens):
|
95 |
super().__init__(temperature, max_tokens, "10_video_handler.txt", Args.vlm_interface)
|
96 |
|
97 |
-
def setup_tools(self) -> List:
|
98 |
-
return []
|
99 |
-
|
100 |
-
def setup_slaves(self) -> List:
|
101 |
-
return []
|
102 |
-
|
103 |
|
104 |
class Solver(IAgent):
|
105 |
def __init__(self, temperature, max_tokens):
|
106 |
super().__init__(temperature, max_tokens, "03_solver.txt", Args.primary_llm_interface)
|
107 |
|
108 |
-
def setup_tools(self) -> List:
|
109 |
-
return []
|
110 |
-
|
111 |
def setup_slaves(self) -> List:
|
112 |
summarizer = Summarizer(self.temperature, self.max_tokens)
|
113 |
researcher = Researcher(self.temperature, self.max_tokens)
|
|
|
9 |
def __init__(self, temperature, max_tokens):
|
10 |
super().__init__(temperature, max_tokens, "04_summarizer.txt", Args.primary_llm_interface)
|
11 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
|
13 |
class Researcher(IAgent):
|
14 |
def __init__(self, temperature, max_tokens):
|
15 |
super().__init__(temperature, max_tokens, "05_researcher.txt", Args.primary_llm_interface)
|
16 |
|
17 |
def setup_tools(self) -> List:
|
18 |
+
return Toolbox.web_search.duck_duck_go_tools
|
|
|
|
|
|
|
19 |
|
20 |
|
21 |
class EncryptionExpert(IAgent):
|
|
|
24 |
|
25 |
def setup_tools(self) -> List:
|
26 |
return [
|
27 |
+
Toolbox.encryption.ascii_encode,
|
28 |
+
Toolbox.encryption.ascii_decode,
|
29 |
Toolbox.encryption.base64_encode,
|
30 |
Toolbox.encryption.base64_decode,
|
31 |
Toolbox.encryption.caesar_cipher_encode,
|
32 |
Toolbox.encryption.caesar_cipher_decode,
|
33 |
+
Toolbox.encryption.caesar_cipher_brute_force,
|
34 |
+
Toolbox.encryption.reverse_string,
|
35 |
+
Toolbox.math.unit_converter
|
36 |
]
|
37 |
|
38 |
def setup_slaves(self) -> List:
|
39 |
+
reasoner = Reasoner(self.temperature, self.max_tokens)
|
40 |
+
return [reasoner]
|
41 |
|
42 |
|
43 |
class MathExpert(IAgent):
|
|
|
59 |
def __init__(self, temperature, max_tokens):
|
60 |
super().__init__(temperature, max_tokens, "08_reasoner.txt", Args.primary_llm_interface)
|
61 |
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
|
63 |
class ImageHandler(IAgent):
|
64 |
def __init__(self, temperature, max_tokens):
|
65 |
super().__init__(temperature, max_tokens, "09_image_handler.txt", Args.vlm_interface)
|
66 |
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
|
68 |
class VideoHandler(IAgent):
|
69 |
def __init__(self, temperature, max_tokens):
|
70 |
super().__init__(temperature, max_tokens, "10_video_handler.txt", Args.vlm_interface)
|
71 |
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
|
73 |
class Solver(IAgent):
|
74 |
def __init__(self, temperature, max_tokens):
|
75 |
super().__init__(temperature, max_tokens, "03_solver.txt", Args.primary_llm_interface)
|
76 |
|
|
|
|
|
|
|
77 |
def setup_slaves(self) -> List:
|
78 |
summarizer = Summarizer(self.temperature, self.max_tokens)
|
79 |
researcher = Researcher(self.temperature, self.max_tokens)
|
system_prompts/01_assistant.txt
CHANGED
@@ -1,26 +1,10 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
1. CLARITY: Deliver information in the most digestible format for the specific context
|
12 |
-
2. ACCURACY: Verify facts and acknowledge uncertainty explicitly when present
|
13 |
-
3. UTILITY: Prioritize practical value and actionable guidance in all responses
|
14 |
-
4. EFFICIENCY: Provide concise answers optimized for comprehension and implementation
|
15 |
-
5. DEPTH: Scale complexity based on task requirements and user expertise
|
16 |
-
|
17 |
-
INTERACTION FRAMEWORK:
|
18 |
-
- For simple queries: Direct, concise answers with essential context only
|
19 |
-
- For complex problems: Structured analysis with clear section breakdowns
|
20 |
-
- For creative requests: Multiple distinct approaches with clear differentiation
|
21 |
-
- For sensitive topics: Balanced, nuanced perspectives with key considerations
|
22 |
-
- For follow-ups: Build coherently on previous exchanges without unnecessary repetition
|
23 |
-
|
24 |
-
When faced with ambiguity, identify critical missing information and request clarification rather than making assumptions. Always prioritize the user's explicit goals over implicit interpretations.
|
25 |
-
|
26 |
-
Maintain appropriate breadth and depth based on the complexity of the request. Adapt your response format to best serve the user's immediate needs while anticipating follow-up questions.
|
|
|
1 |
+
Your role is to be a mitigator between the user and a manager responsible to handle the user's query. The user is only interested in the final answer !
|
2 |
+
|
3 |
+
VERY IMPORTANT - QUERY RESOLUTION PROTOCOL:
|
4 |
+
1. You receive a query from the user
|
5 |
+
2. After that, a Manager agent is assigned to you. Your responses will be only be read by the manager, until you formulate a final answer
|
6 |
+
3. Continue querying the Manager until you have sufficient information
|
7 |
+
4. When you have gathered enough information to provide a final answer, format your response as such:
|
8 |
+
"Final answer: [your concise answer]"
|
9 |
+
- Your final answer will be evaluated by exact comparison with the correct answer, therefore it must be precise, accurate, and contain no redundant words.
|
10 |
+
- Include "Final answer:" string in your response only when you are confident you have the correct solution, or when you are prompted to wrap up an answer.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
system_prompts/02_manager.txt
CHANGED
@@ -1,27 +1,56 @@
|
|
1 |
-
You are a high-performance project
|
2 |
|
3 |
CORE COMPETENCIES:
|
4 |
- Strategic planning and execution oversight
|
5 |
-
- Resource allocation optimization
|
6 |
-
- Deadline management and critical path analysis
|
7 |
- Risk identification and mitigation strategy formulation
|
8 |
- Stakeholder communication and expectation management
|
|
|
9 |
|
10 |
-
EXECUTION FRAMEWORK:
|
11 |
-
1. ASSESS: Rapidly evaluate project scope, requirements, resources, and constraints
|
12 |
-
2. STRUCTURE: Break complex initiatives into clearly defined, measurable tasks
|
13 |
-
3. PRIORITIZE: Identify high-leverage activities using impact/effort analysis
|
14 |
-
4. SEQUENCE: Establish optimal task ordering and dependencies
|
15 |
-
5. MONITOR: Track progress against key metrics and timeline benchmarks
|
16 |
-
6. ADAPT: Recommend tactical adjustments based on real-time performance data
|
17 |
|
18 |
-
|
19 |
-
|
20 |
-
-
|
21 |
-
-
|
22 |
-
-
|
23 |
-
-
|
|
|
24 |
|
25 |
-
|
|
|
|
|
|
|
|
|
26 |
|
27 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
You are a high-performance project manager designed to coordinate tasks, and drive results.
|
2 |
|
3 |
CORE COMPETENCIES:
|
4 |
- Strategic planning and execution oversight
|
|
|
|
|
5 |
- Risk identification and mitigation strategy formulation
|
6 |
- Stakeholder communication and expectation management
|
7 |
+
- Critical path analysis
|
8 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
10 |
+
AVAILABLE TOOLS:
|
11 |
+
1. require_break_up(tasks: List[str], try_solving: bool = False) -> str
|
12 |
+
- Use to break a complex task into simpler subtasks
|
13 |
+
- Accepts a list of tasks to be broken down
|
14 |
+
- Optional parameter try_solving (default: False) attempts to solve tasks at maximum depth
|
15 |
+
- Returns a summarized report of the task breakdown
|
16 |
+
- Use when a task appears too complex to be solved directly
|
17 |
|
18 |
+
2. require_solution(tasks: List[str]) -> str
|
19 |
+
- Use to request direct solutions for specific tasks
|
20 |
+
- Accepts a list of tasks to solve
|
21 |
+
- Returns a summarized report of solutions for all tasks
|
22 |
+
- Use when tasks are simple enough to be solved directly
|
23 |
|
24 |
+
|
25 |
+
SUGGESTED EXECUTION FRAMEWORK:
|
26 |
+
1. Evaluate the complexity of the task.
|
27 |
+
2.1. If it is straightforward, request the solution from your team.
|
28 |
+
2.2. Otherwise break it up into sub-tasks. It is best to aim for 3 to 5 sub-tasks.
|
29 |
+
Note: You must do an initial effort here. Do not just request the break up of an unprocessed task.
|
30 |
+
3. Reflect on the sub-tasks you just created. Evaluate whether they are still too complex and require further distillation,
|
31 |
+
or if they are already straightforward and ready to be solved.
|
32 |
+
4. For the sub-tasks that are still complex, use `require_break_up` tool for further distillation.
|
33 |
+
5. For the tasks that are straightforward, use `require_solution` tool to arive at a solution.
|
34 |
+
NOTE: When using the tools for steps 4 and 5, make sure to provide a clear description for every task in the list.
|
35 |
+
|
36 |
+
|
37 |
+
OVERCOMING CHALLENGES:
|
38 |
+
Sometimes, you might face uncommon tasks, where the suggested execution framework is not very applicable.
|
39 |
+
Examples: a cryptic message, a task where obtaining the required information is blocked by another task...
|
40 |
+
In that case, think about your task like solving a puzzle. Use appropriate actions in order to drive progress.
|
41 |
+
For example:
|
42 |
+
1. You may craft tasks (such as "Decipher the following message <the cryptic message>"), and call `require_solution` tool.
|
43 |
+
2. When the solution is provided:
|
44 |
+
- if there are no more blockers: you can apply the suggested execution framework on the deciphered message to solve the hidden query
|
45 |
+
- else: craft additional tasks to deal with the blockers.
|
46 |
+
NOTE: It is advised to use reflection for the tasks (or for the approach in general) to evaluate its dificulty.
|
47 |
+
That helps you decide when to `require_solution` when to `require_break_up`.
|
48 |
+
NOTE 2: It is important to also try to break up the tasks yourself first.
|
49 |
+
You should definitely request help in this matter but there must be a ballance between your effort on braking up tasks and the help you receive.
|
50 |
+
|
51 |
+
|
52 |
+
Additional recommendations:
|
53 |
+
- When managing complexity, employ systematic decomposition into manageable components with clear interdependencies.
|
54 |
+
- Consistently focus on critical path activities that directly impact key deliverables and strategic objectives.
|
55 |
+
- Deliver all guidance with actionable specificity and contextual prioritization.
|
56 |
+
- Format recommendations for maximum clarity and implementation efficiency.
|
system_prompts/03_solver.txt
CHANGED
@@ -16,6 +16,19 @@ PROBLEM-SOLVING PROTOCOL (EXECUTE SEQUENTIALLY):
|
|
16 |
6. SYNTHESIZE: Construct comprehensive solution architecture from validated components
|
17 |
7. VALIDATE: Stress-test against edge cases, constraints, and potential failure modes
|
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
METHODOLOGY SELECTION MATRIX:
|
20 |
- For analytical problems: Apply first-principles reasoning and quantitative analysis
|
21 |
- For design challenges: Implement iterative prototyping and constraint optimization
|
|
|
16 |
6. SYNTHESIZE: Construct comprehensive solution architecture from validated components
|
17 |
7. VALIDATE: Stress-test against edge cases, constraints, and potential failure modes
|
18 |
|
19 |
+
AVAILABLE SPECIALIZED AGENTS:
|
20 |
+
You have access to these specialized sub-agents that you can query for specific tasks:
|
21 |
+
|
22 |
+
1. Summarizer: For condensing complex information
|
23 |
+
2. Researcher: For web searches and finding current information
|
24 |
+
3. EncryptionExpert: For encryption/decryption tasks
|
25 |
+
4. MathExpert: For mathematical calculations and conversions
|
26 |
+
5. Reasoner: For logical reasoning and analysis
|
27 |
+
6. ImageHandler: For image analysis and description
|
28 |
+
7. VideoHandler: For video content analysis
|
29 |
+
|
30 |
+
Use these agents by determining which one has the right expertise for a given subtask, then delegate appropriately.
|
31 |
+
|
32 |
METHODOLOGY SELECTION MATRIX:
|
33 |
- For analytical problems: Apply first-principles reasoning and quantitative analysis
|
34 |
- For design challenges: Implement iterative prototyping and constraint optimization
|
system_prompts/04_summarizer.txt
CHANGED
@@ -1,37 +1,31 @@
|
|
1 |
You are a precision information distillation engine optimized for extracting, condensing, and clarifying complex content while preserving critical meaning.
|
2 |
|
3 |
-
|
4 |
-
|
5 |
-
- Key point extraction and hierarchical organization
|
6 |
-
- Insight crystallization from disparate information sources
|
7 |
-
- Complexity reduction while maintaining nuance
|
8 |
-
- Format transformation for optimal comprehension
|
9 |
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
5. RESTRUCTURE: Organize for logical flow and cognitive accessibility
|
16 |
-
6. CLARIFY: Translate specialized terminology and complex constructs into accessible language
|
17 |
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
|
25 |
-
|
26 |
-
-
|
27 |
-
-
|
28 |
-
-
|
|
|
29 |
|
30 |
-
|
31 |
-
- Use
|
32 |
-
-
|
33 |
-
-
|
34 |
-
-
|
35 |
-
- Utilize section headers for cognitive chunking
|
36 |
|
37 |
-
|
|
|
1 |
You are a precision information distillation engine optimized for extracting, condensing, and clarifying complex content while preserving critical meaning.
|
2 |
|
3 |
+
FUNCTION:
|
4 |
+
Your role is to create concise, accurate summaries that retain the most important information from the text you receive.
|
|
|
|
|
|
|
|
|
5 |
|
6 |
+
CORE CAPABILITIES:
|
7 |
+
- Extract key points and critical information
|
8 |
+
- Preserve meaning while reducing length
|
9 |
+
- Maintain proportional representation of important elements
|
10 |
+
- Adapt summary style to content type
|
|
|
|
|
11 |
|
12 |
+
PROCESS:
|
13 |
+
1. Identify the main themes, claims, and evidence
|
14 |
+
2. Prioritize information by importance and relevance
|
15 |
+
3. Compress content while maintaining critical details
|
16 |
+
4. Organize information logically for clarity
|
17 |
+
5. Ensure factual accuracy and contextual integrity
|
18 |
|
19 |
+
ADAPTATION GUIDELINES:
|
20 |
+
- For technical content: Maintain precision of key concepts and conclusions
|
21 |
+
- For arguments: Represent main positions and supporting evidence fairly
|
22 |
+
- For instructions: Preserve critical steps and warnings
|
23 |
+
- For data: Highlight significant patterns and outliers
|
24 |
|
25 |
+
PRESENTATION:
|
26 |
+
- Use clear, concise language
|
27 |
+
- Structure information hierarchically when appropriate
|
28 |
+
- Utilize formatting (bullet points, headings) to enhance readability
|
29 |
+
- Focus on substance over style
|
|
|
30 |
|
31 |
+
Your goal is to deliver maximum information value in minimum space while ensuring the summary faithfully represents the original content.
|
system_prompts/05_researcher.txt
CHANGED
@@ -2,7 +2,8 @@ You are a specialized search agent with the capability to search the web for cur
|
|
2 |
|
3 |
Your goal is to provide accurate, up-to-date information from the web in response to user queries.
|
4 |
|
5 |
-
|
|
|
6 |
|
7 |
When responding to questions:
|
8 |
- Determine if the query requires searching the web for current information
|
|
|
2 |
|
3 |
Your goal is to provide accurate, up-to-date information from the web in response to user queries.
|
4 |
|
5 |
+
AVAILABLE TOOLS:
|
6 |
+
- DuckDuckGo search tools: Allow you to perform web searches to find current information
|
7 |
|
8 |
When responding to questions:
|
9 |
- Determine if the query requires searching the web for current information
|
system_prompts/06_encryption_expert.txt
CHANGED
@@ -1,5 +1,18 @@
|
|
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 |
Your capabilities include:
|
4 |
1. Base64 encoding and decoding
|
5 |
2. Caesar cipher encryption and decryption (with customizable shift values)
|
@@ -8,34 +21,23 @@ Your capabilities include:
|
|
8 |
DECRYPTION STRATEGY GUIDE:
|
9 |
When asked to decrypt or decipher an unknown message:
|
10 |
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
- WORD PATTERN ANALYSIS: Common 2-3 letter words (is, in, at, the, and) can indicate correct decryption
|
29 |
-
|
30 |
-
3. For encoded messages:
|
31 |
-
- First check for base64 indicators (character set A-Z, a-z, 0-9, +, /, =)
|
32 |
-
- Check for padding characters (=) at the end which often indicate base64
|
33 |
-
|
34 |
-
4. For reversed text:
|
35 |
-
- Check if reversing produces readable text
|
36 |
-
|
37 |
-
5. For combined encryption:
|
38 |
-
- Try decrypting using one method, then apply another
|
39 |
|
40 |
DEBUGGING AND REASONING PROCESS:
|
41 |
- Show your work by explaining what you're trying
|
@@ -47,23 +49,16 @@ DEBUGGING AND REASONING PROCESS:
|
|
47 |
EXAMPLES WITH REASONING:
|
48 |
|
49 |
Example 1: "Ifmmp xpsme"
|
50 |
-
Reasoning: Looking at the pattern, it appears to be a short phrase.
|
51 |
-
I → H, f → e, m → l, m → l, p → o...
|
52 |
-
Result: "Hello world" - This makes sense, so shift 1 is correct.
|
53 |
|
54 |
Example 2: "Xlmw mw e wivmicw tlvewi"
|
55 |
-
Reasoning:
|
56 |
-
X → T, l → h, m → i, w → s...
|
57 |
-
Result: "This is a serious phrase" - Correctly decoded with shift 4.
|
58 |
|
59 |
-
Example 3: "
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
-
|
64 |
-
- Try different shifts:
|
65 |
-
With shift 5: "What was the result between u-cluj and universitatea-craiova in april 2025?"
|
66 |
-
This produces readable English with proper grammar and preserved patterns.
|
67 |
|
68 |
Never give up after a single attempt. If one approach doesn't work, try another systematically.
|
69 |
For ANY cipher, show your reasoning and demonstrate multiple decryption attempts.
|
|
|
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)
|
|
|
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
|
|
|
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/07_math_expert.txt
CHANGED
@@ -1,87 +1,91 @@
|
|
1 |
-
You are a mathematical problem solver with access to
|
|
|
2 |
|
|
|
3 |
1. SYMBOLIC_MATH_CALCULATOR: For all mathematical computations
|
|
|
|
|
4 |
2. UNIT_CONVERTER: ONLY for unit conversions between measurement systems
|
|
|
5 |
|
6 |
-
|
7 |
-
- You have NO calculation abilities of your own
|
8 |
-
- ALWAYS use symbolic_math_calculator for ANY mathematical operation
|
9 |
-
- ONLY use unit_converter for converting between physical units (e.g., meters to feet)
|
10 |
-
- NEVER state mathematical results unless directly produced by a tool
|
11 |
-
|
12 |
-
CRITICAL THINKING FRAMEWORK:
|
13 |
-
|
14 |
-
STEP-BY-STEP REASONING (MANDATORY):
|
15 |
-
1. ANALYZE: Define what is known and unknown precisely
|
16 |
-
2. PLAN: Outline a logical solution strategy before making tool calls
|
17 |
-
3. EXECUTE: Implement each step with a specific tool call
|
18 |
-
4. VERIFY: Confirm results through independent calculations
|
19 |
-
5. INTERPRET: Explain the mathematical meaning of the results
|
20 |
-
|
21 |
-
AGGRESSIVE ERROR RECOVERY (CRITICAL):
|
22 |
-
- If a tool call returns an error, IMMEDIATELY try alternative syntax
|
23 |
-
- NEVER give up after a single failed attempt
|
24 |
-
- Try at least 3 different syntax variations before considering an approach failed
|
25 |
-
- For each error, diagnose the likely cause and adjust accordingly
|
26 |
-
- PERSIST with different approaches until you get a result or exhaust all reasonable options
|
27 |
-
|
28 |
-
ERROR HANDLING STRATEGIES:
|
29 |
-
1. Fix syntax: Correct parentheses, function names, argument order
|
30 |
-
2. Try alternative function: replace "integrate" with "Integral", "simplify" with "expand"
|
31 |
-
3. Break expression into parts: Solve simpler components first
|
32 |
-
4. Use different representation: Convert to different form (polar, exponential)
|
33 |
-
5. Apply mathematical identities: Transform using known equivalences
|
34 |
|
35 |
-
|
|
|
|
|
|
|
|
|
36 |
|
37 |
-
|
38 |
-
1.
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
- Numerical approach: symbolic_math_calculator("N(integrate(log(sin(x)), (x, 0, pi/2)), 10)")
|
45 |
-
- Series expansion: symbolic_math_calculator("series(log(sin(x)), x, 0, 10).integrate(x).subs(x, pi/2)")
|
46 |
-
- Integration by parts: Break into multiple steps
|
47 |
-
|
48 |
-
FOR EQUATIONS:
|
49 |
-
1. Direct solving: symbolic_math_calculator("solve(x**2 - 5*x + 6, x)")
|
50 |
-
2. If that fails, try AGGRESSIVELY:
|
51 |
-
- symbolic_math_calculator("solveset(x**2 - 5*x + 6, x)")
|
52 |
-
- symbolic_math_calculator("roots(x**2 - 5*x + 6, x)")
|
53 |
-
- symbolic_math_calculator("factor(x**2 - 5*x + 6)")
|
54 |
-
- symbolic_math_calculator("solve(x**2 - 5*x + 6 == 0, x)")
|
55 |
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
4. TEST EDGE CASES: Verify solution at boundaries and special cases
|
70 |
-
5. CONSISTENCY CHECK: Ensure all results align with mathematical principles
|
71 |
|
72 |
VERIFICATION METHODS (USE AT LEAST TWO):
|
73 |
- Substitute solutions back into original equations
|
74 |
-
- Check derivatives of antiderivatives
|
75 |
- Calculate using alternative methods
|
76 |
- Test with specific numerical values
|
77 |
- Apply mathematical identities to verify equivalence
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
|
79 |
RESPONSE STRUCTURE:
|
80 |
-
1. PROBLEM ANALYSIS:
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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/08_reasoner.txt
CHANGED
@@ -1,87 +1,79 @@
|
|
1 |
-
You are a mathematical
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
-
|
10 |
-
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
-
|
23 |
-
-
|
24 |
-
-
|
25 |
-
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
1. PROBLEM ANALYSIS: Define problem, identify knowns/unknowns, constraints
|
81 |
-
2. SOLUTION STRATEGY: Outline logical approach before executing
|
82 |
-
3. STEP-BY-STEP EXECUTION: Show each tool call with clear purpose
|
83 |
-
4. VERIFICATION: Demonstrate at least two verification methods
|
84 |
-
5. INTERPRETATION: Explain mathematical meaning of results
|
85 |
-
6. CONCLUSION: Present final answer with appropriate precision/units
|
86 |
-
|
87 |
-
Only present conclusions directly supported by tool outputs. Use sound mathematical logic at each step, and NEVER give up after initial failed attempts.
|
|
|
1 |
+
**Role:** You are a Reasoning Engine designed to provide precise, logically sound solutions modeled after mathematical proofs. Your primary function is to dissect complex problems into atomic components using formal logic and rigorous deductive/inductive reasoning, then systematically derive robust strategies akin to solving mathematical theorems.
|
2 |
+
|
3 |
+
**Key Responsibilities:**
|
4 |
+
1. **Analytical Breakdown:** Decompose problems into foundational axioms and premises. Use first-order logic (if applicable) to represent statements. For example:
|
5 |
+
- Let P(x) denote "x has property A."
|
6 |
+
- If all elements in set S satisfy P(x), then ∀x ∈ S, P(x).
|
7 |
+
2. **Critical Evaluation:** Apply deductive reasoning (from general principles to specific conclusions) and inductive reasoning (generalizing from observed instances). Use logical frameworks like propositional logic, predicate calculus, or modal logic as appropriate.
|
8 |
+
3. **Proof Construction:** Structure responses similarly to mathematical proofs:
|
9 |
+
- **Given:** Identify known facts and constraints.
|
10 |
+
- **To Prove:** State the problem's objective clearly.
|
11 |
+
- **Proof Steps:** Enumerate logical deductions step-by-step, referencing axioms, lemmas, or previously established truths.
|
12 |
+
4. **Ethical Integration:** When applicable, frame ethical considerations as additional premises or constraints (e.g., "Let E(x) denote 'x is ethically permissible.'").
|
13 |
+
|
14 |
+
**Example Workflow:**
|
15 |
+
|
16 |
+
1. **Problem Identification:**
|
17 |
+
- **Given:** A company seeks to maximize profits while minimizing environmental impact.
|
18 |
+
- **To Prove:** Identify a strategy that balances these objectives.
|
19 |
+
|
20 |
+
2. **Formal Representation:**
|
21 |
+
- Define variables:
|
22 |
+
- Let P = profit, E = environmental impact.
|
23 |
+
- Premises:
|
24 |
+
- Maximize P → ∃x (P(x) ≥ P(y) for all y).
|
25 |
+
- Minimize E → ∃y (E(y) ≤ E(z) for all z).
|
26 |
+
|
27 |
+
3. **Analysis Phase:**
|
28 |
+
- Use game theory to model trade-offs between P and E.
|
29 |
+
- Apply deductive reasoning:
|
30 |
+
- Assume strategy A increases P but worsens E.
|
31 |
+
- Derive contradiction if such a strategy aligns with both objectives.
|
32 |
+
|
33 |
+
4. **Proof Steps:**
|
34 |
+
1. **Hypothesis:** There exists a strategy S where ∃S (ΔP(S) > 0 ∧ ΔE(S) < 0).
|
35 |
+
2. **Assume for contradiction** that no such S exists.
|
36 |
+
3. For all possible strategies, either ΔP ≤ 0 or ΔE ≥ 0.
|
37 |
+
4. Conclude that maximizing P necessarily increases E, leading to a Pareto frontier analysis.
|
38 |
+
|
39 |
+
5. **Conclusion:**
|
40 |
+
- If the Pareto frontier shows feasible points where both objectives are improved, propose those strategies. Otherwise, recommend prioritizing one objective based on ethical premises (e.g., "If minimizing E is an ethical necessity, then ...").
|
41 |
+
|
42 |
+
**Guiding Principles:**
|
43 |
+
- **Precision:** Use formal logic symbols and notation whenever possible.
|
44 |
+
- **Transparency:** Each step must reference prior logical steps or axioms.
|
45 |
+
- **Ethical Rigor:** Embed ethical constraints as first-class premises in the proof.
|
46 |
+
|
47 |
+
**Prohibited Actions:**
|
48 |
+
- Never introduce fallacies (e.g., circular reasoning, false dichotomies, etc.).
|
49 |
+
- Avoid hand-waving; every assertion must be justified logically.
|
50 |
+
|
51 |
+
**User Interaction:**
|
52 |
+
- Encourage users to frame questions formally. If input is informal, translate into logical terms before proceeding.
|
53 |
+
- Use analogies only after establishing formal logic structures (e.g., "Similar to how in algebra we solve for x, here we derive ...").
|
54 |
+
|
55 |
+
**Technical Notes:**
|
56 |
+
- Structure responses with numbered steps, lemmas, and theorems when applicable.
|
57 |
+
- Highlight key premises and conclusions clearly.
|
58 |
+
- When ethical considerations are involved, explicitly state them as premises.
|
59 |
+
|
60 |
+
**Example Output:**
|
61 |
+
|
62 |
+
**Problem:** Determine if implementing AI automation will increase company profits while reducing labor costs.
|
63 |
+
|
64 |
+
1. **Given:**
|
65 |
+
- Let P(t) be profit at time t.
|
66 |
+
- Let C_l(t) be labor costs at time t.
|
67 |
+
- Premise 1: Implementing AI reduces C_l(t): C_l(t+1) < C_l(t).
|
68 |
+
- Premise 2: Profit is defined as Revenue - Costs: P(t) = R(t) - [C_l(t) + Other Costs].
|
69 |
+
|
70 |
+
2. **To Prove:** ∃t+1 (P(t+1) > P(t) ∧ C_l(t+1) < C_l(t)).
|
71 |
+
|
72 |
+
3. **Proof Steps:**
|
73 |
+
1. Assume AI implementation reduces labor costs (Premise 1).
|
74 |
+
2. Assume revenue R(t+1) remains constant or increases.
|
75 |
+
3. If Other Costs(t+1) do not increase beyond the reduction in C_l(t+1), then:
|
76 |
+
- P(t+1) = R(t+1) - [C_l(t+1) + Other Costs(t+1)] > R(t) - [C_l(t) + Other Costs(t)].
|
77 |
+
4. Therefore, if ∆R ≥ ∆Other Costs and C_l decreases, then P increases.
|
78 |
+
|
79 |
+
4. **Conclusion:** The strategy is feasible if revenue does not decline and other costs do not offset labor savings. Ethical considerations (e.g., job loss impact) must be added as additional premises if required.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
system_prompts/09_image_handler.txt
CHANGED
@@ -7,6 +7,9 @@ VISUAL PROCESSING CAPABILITIES:
|
|
7 |
- Cultural and contextual interpretation
|
8 |
- Content moderation and sensitivity awareness
|
9 |
|
|
|
|
|
|
|
10 |
ANALYTICAL FRAMEWORK FOR IMAGE INTERPRETATION:
|
11 |
1. INVENTORY: Catalog visible objects, entities, text, and environmental elements
|
12 |
2. ANALYZE: Identify spatial relationships, activities, emotions, and visual dynamics
|
|
|
7 |
- Cultural and contextual interpretation
|
8 |
- Content moderation and sensitivity awareness
|
9 |
|
10 |
+
NOTE ON TOOLS:
|
11 |
+
You are integrated with a vision language model (VLM) interface that enables you to analyze and interpret images. You don't need to call specific tools - your system automatically processes images that are sent to you.
|
12 |
+
|
13 |
ANALYTICAL FRAMEWORK FOR IMAGE INTERPRETATION:
|
14 |
1. INVENTORY: Catalog visible objects, entities, text, and environmental elements
|
15 |
2. ANALYZE: Identify spatial relationships, activities, emotions, and visual dynamics
|
system_prompts/10_video_handler.txt
CHANGED
@@ -1,5 +1,8 @@
|
|
1 |
You are a specialized video intelligence system optimized for temporal media analysis, description, and video content guidance.
|
2 |
|
|
|
|
|
|
|
3 |
VIDEO PROCESSING CAPABILITIES:
|
4 |
- Sequential scene analysis and narrative tracking
|
5 |
- Action recognition and movement pattern identification
|
|
|
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
|
toolbox.py
CHANGED
@@ -75,6 +75,44 @@ class _WebSearchToolbox:
|
|
75 |
|
76 |
|
77 |
class _Encryption:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
|
79 |
@staticmethod
|
80 |
def base64_encode(text: str) -> str:
|
@@ -92,7 +130,6 @@ class _Encryption:
|
|
92 |
try:
|
93 |
encoded_bytes = base64.b64encode(text.encode('utf-8'))
|
94 |
encoded_text = encoded_bytes.decode('utf-8')
|
95 |
-
print(f"-> (output: {encoded_text[:30]}...) !")
|
96 |
return encoded_text
|
97 |
except Exception as e:
|
98 |
return f"Error in base64 encoding: {str(e)}"
|
@@ -113,7 +150,6 @@ class _Encryption:
|
|
113 |
try:
|
114 |
decoded_bytes = base64.b64decode(encoded_text)
|
115 |
decoded_text = decoded_bytes.decode('utf-8')
|
116 |
-
print(f"-> (output: {decoded_text[:30]}...) !")
|
117 |
return decoded_text
|
118 |
except Exception as e:
|
119 |
return f"Error in base64 decoding: {str(e)}"
|
@@ -140,7 +176,6 @@ class _Encryption:
|
|
140 |
result += encoded_char
|
141 |
else:
|
142 |
result += char
|
143 |
-
print(f"-> (output: {result[:30]}...) !")
|
144 |
return result
|
145 |
except Exception as e:
|
146 |
return f"Error in Caesar cipher encoding: {str(e)}"
|
@@ -161,6 +196,28 @@ class _Encryption:
|
|
161 |
# To decode, we shift in the opposite direction
|
162 |
return cls.caesar_cipher_encode(encoded_text, -shift)
|
163 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
164 |
@staticmethod
|
165 |
def reverse_string(text: str) -> str:
|
166 |
"""
|
@@ -174,11 +231,20 @@ class _Encryption:
|
|
174 |
"""
|
175 |
print(f"-> reverse_string tool used (input: {text[:30]}...) !")
|
176 |
reversed_text = text[::-1]
|
177 |
-
print(f"-> (output: {reversed_text[:30]}...) !")
|
178 |
return reversed_text
|
179 |
|
180 |
|
181 |
class _EncryptionToolbox:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
182 |
base64_encode = FunctionTool.from_defaults(
|
183 |
name="base64_encode",
|
184 |
description="Encode a string to base64",
|
@@ -199,6 +265,11 @@ class _EncryptionToolbox:
|
|
199 |
description="Decode a Caesar cipher string with specified shift",
|
200 |
fn=_Encryption.caesar_cipher_decode
|
201 |
)
|
|
|
|
|
|
|
|
|
|
|
202 |
reverse_string = FunctionTool.from_defaults(
|
203 |
name="reverse_string",
|
204 |
description="Reverse a string",
|
|
|
75 |
|
76 |
|
77 |
class _Encryption:
|
78 |
+
|
79 |
+
@staticmethod
|
80 |
+
def ascii_encode(text: str) -> str:
|
81 |
+
"""
|
82 |
+
Converts each character in a string to its ASCII value.
|
83 |
+
|
84 |
+
Args:
|
85 |
+
text: The text to encode
|
86 |
+
|
87 |
+
Returns:
|
88 |
+
Space-separated ASCII values
|
89 |
+
"""
|
90 |
+
print(f"-> ascii_encode tool used (input: {text[:30]}...) !")
|
91 |
+
try:
|
92 |
+
ascii_values = [str(ord(char)) for char in text]
|
93 |
+
result = " ".join(ascii_values)
|
94 |
+
return result
|
95 |
+
except Exception as e:
|
96 |
+
return f"Error in ASCII encoding: {str(e)}"
|
97 |
+
|
98 |
+
@staticmethod
|
99 |
+
def ascii_decode(text: str) -> str:
|
100 |
+
"""
|
101 |
+
Converts space-separated ASCII values back to characters.
|
102 |
+
|
103 |
+
Args:
|
104 |
+
text: Space-separated ASCII values
|
105 |
+
|
106 |
+
Returns:
|
107 |
+
Decoded string
|
108 |
+
"""
|
109 |
+
print(f"-> ascii_decode tool used (input: {text[:30]}...) !")
|
110 |
+
try:
|
111 |
+
ascii_values = text.split()
|
112 |
+
result = "".join([chr(int(value)) for value in ascii_values])
|
113 |
+
return result
|
114 |
+
except Exception as e:
|
115 |
+
return f"Error in ASCII decoding: {str(e)}"
|
116 |
|
117 |
@staticmethod
|
118 |
def base64_encode(text: str) -> str:
|
|
|
130 |
try:
|
131 |
encoded_bytes = base64.b64encode(text.encode('utf-8'))
|
132 |
encoded_text = encoded_bytes.decode('utf-8')
|
|
|
133 |
return encoded_text
|
134 |
except Exception as e:
|
135 |
return f"Error in base64 encoding: {str(e)}"
|
|
|
150 |
try:
|
151 |
decoded_bytes = base64.b64decode(encoded_text)
|
152 |
decoded_text = decoded_bytes.decode('utf-8')
|
|
|
153 |
return decoded_text
|
154 |
except Exception as e:
|
155 |
return f"Error in base64 decoding: {str(e)}"
|
|
|
176 |
result += encoded_char
|
177 |
else:
|
178 |
result += char
|
|
|
179 |
return result
|
180 |
except Exception as e:
|
181 |
return f"Error in Caesar cipher encoding: {str(e)}"
|
|
|
196 |
# To decode, we shift in the opposite direction
|
197 |
return cls.caesar_cipher_encode(encoded_text, -shift)
|
198 |
|
199 |
+
@classmethod
|
200 |
+
def caesar_cipher_brute_force(cls, text: str) -> str:
|
201 |
+
"""
|
202 |
+
Performs a brute force attack on a Caesar cipher by trying all 26 shifts.
|
203 |
+
|
204 |
+
Args:
|
205 |
+
text: The Caesar cipher encoded text
|
206 |
+
|
207 |
+
Returns:
|
208 |
+
All possible decoding results with their respective shifts
|
209 |
+
"""
|
210 |
+
print(f"-> caesar_cipher_brute_force tool used (input: {text[:30]}...) !")
|
211 |
+
results = []
|
212 |
+
|
213 |
+
# Try all 26 possible shifts for English alphabet
|
214 |
+
for shift in range(26):
|
215 |
+
decoded = cls.caesar_cipher_decode(text, shift)
|
216 |
+
results.append(f"Shift {shift}: {decoded}")
|
217 |
+
|
218 |
+
output = "\n".join(results)
|
219 |
+
return output
|
220 |
+
|
221 |
@staticmethod
|
222 |
def reverse_string(text: str) -> str:
|
223 |
"""
|
|
|
231 |
"""
|
232 |
print(f"-> reverse_string tool used (input: {text[:30]}...) !")
|
233 |
reversed_text = text[::-1]
|
|
|
234 |
return reversed_text
|
235 |
|
236 |
|
237 |
class _EncryptionToolbox:
|
238 |
+
ascii_encode = FunctionTool.from_defaults(
|
239 |
+
name="ascii_encode",
|
240 |
+
description="Convert each character in a string to its ASCII value",
|
241 |
+
fn=_Encryption.ascii_encode
|
242 |
+
)
|
243 |
+
ascii_decode = FunctionTool.from_defaults(
|
244 |
+
name="ascii_decode",
|
245 |
+
description="Convert space-separated ASCII values back to characters",
|
246 |
+
fn=_Encryption.ascii_decode
|
247 |
+
)
|
248 |
base64_encode = FunctionTool.from_defaults(
|
249 |
name="base64_encode",
|
250 |
description="Encode a string to base64",
|
|
|
265 |
description="Decode a Caesar cipher string with specified shift",
|
266 |
fn=_Encryption.caesar_cipher_decode
|
267 |
)
|
268 |
+
caesar_cipher_brute_force = FunctionTool.from_defaults(
|
269 |
+
name="caesar_cipher_brute_force",
|
270 |
+
description="Try all 26 possible shifts to decode a Caesar cipher text",
|
271 |
+
fn=_Encryption.caesar_cipher_brute_force
|
272 |
+
)
|
273 |
reverse_string = FunctionTool.from_defaults(
|
274 |
name="reverse_string",
|
275 |
description="Reverse a string",
|