mirror of
https://github.com/tcsenpai/agenticSeek.git
synced 2025-06-06 11:05:26 +00:00
feat : re-integrated and improved planner agent
This commit is contained in:
parent
279bdf8c7e
commit
9080697dc0
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,5 @@
|
|||||||
*.wav
|
*.wav
|
||||||
|
*.safetensors
|
||||||
config.ini
|
config.ini
|
||||||
*.egg-info
|
*.egg-info
|
||||||
experimental/
|
experimental/
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
- **Divide and Conquer**: For big tasks, spins up multiple agents to plan and execute.
|
- **Divide and Conquer**: For big tasks, spins up multiple agents to plan and execute.
|
||||||
|
|
||||||
- **Tool-Equipped**: From basic search to flight APIs and file exploration, every agent has it's own tools.
|
- **Tool-Equipped**: From basic search to api and file exploration, every agent has it's own tools.
|
||||||
|
|
||||||
- **Memory**: Remembers what’s useful, your preferences and past sessions conversation.
|
- **Memory**: Remembers what’s useful, your preferences and past sessions conversation.
|
||||||
|
|
||||||
@ -185,11 +185,11 @@ Here are some example usage:
|
|||||||
|
|
||||||
### Casual
|
### Casual
|
||||||
|
|
||||||
> *Tell me a joke*
|
> *Tell me about France*
|
||||||
|
|
||||||
> *Where is flight ABC777 ? my mom is on that plane*
|
> *What is the meaning of life ?*
|
||||||
|
|
||||||
> *what is the meaning of life ?*
|
> *Should I take creatine before or after workout?*
|
||||||
|
|
||||||
|
|
||||||
After you type your query, agenticSeek will allocate the best agent for the task.
|
After you type your query, agenticSeek will allocate the best agent for the task.
|
||||||
|
4
main.py
4
main.py
@ -40,6 +40,10 @@ def main():
|
|||||||
provider=provider, verbose=False),
|
provider=provider, verbose=False),
|
||||||
BrowserAgent(name="Browser",
|
BrowserAgent(name="Browser",
|
||||||
prompt_path="prompts/browser_agent.txt",
|
prompt_path="prompts/browser_agent.txt",
|
||||||
|
provider=provider, verbose=False),
|
||||||
|
# Planner agent is experimental, might work poorly, especially with model < 32b
|
||||||
|
PlannerAgent(name="Planner",
|
||||||
|
prompt_path="prompts/planner_agent.txt",
|
||||||
provider=provider, verbose=False)
|
provider=provider, verbose=False)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
BIN
media/exemples/planning.png
Normal file
BIN
media/exemples/planning.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 344 KiB |
@ -122,7 +122,7 @@ class Agent():
|
|||||||
"Computing... I recommand you have a coffee while I work.",
|
"Computing... I recommand you have a coffee while I work.",
|
||||||
"Hold on, I’m crunching numbers.",
|
"Hold on, I’m crunching numbers.",
|
||||||
"Working on it, please let me think."]
|
"Working on it, please let me think."]
|
||||||
speech_module.speak(messages[random.randint(0, len(messages)-1)])
|
if speech_module: speech_module.speak(messages[random.randint(0, len(messages)-1)])
|
||||||
|
|
||||||
def get_blocks_result(self) -> list:
|
def get_blocks_result(self) -> list:
|
||||||
return self.blocks_result
|
return self.blocks_result
|
||||||
|
@ -252,7 +252,7 @@ class BrowserAgent(Agent):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
animate_thinking(f"Navigating to {links[0]}", color="status")
|
animate_thinking(f"Navigating to {links[0]}", color="status")
|
||||||
speech_module.speak(f"Navigating to {links[0]}")
|
if speech_module: speech_module.speak(f"Navigating to {links[0]}")
|
||||||
self.browser.go_to(links[0])
|
self.browser.go_to(links[0])
|
||||||
self.current_page = links[0]
|
self.current_page = links[0]
|
||||||
self.search_history.append(links[0])
|
self.search_history.append(links[0])
|
||||||
|
@ -17,9 +17,9 @@ class PlannerAgent(Agent):
|
|||||||
}
|
}
|
||||||
self.tools['json'].tag = "json"
|
self.tools['json'].tag = "json"
|
||||||
self.agents = {
|
self.agents = {
|
||||||
"coder": CoderAgent(model, name, prompt_path, provider),
|
"coder": CoderAgent(name, "prompts/coder_agent.txt", provider, verbose=False),
|
||||||
"file": FileAgent(model, name, prompt_path, provider),
|
"file": FileAgent(name, "prompts/file_agent.txt", provider, verbose=False),
|
||||||
"web": BrowserAgent(model, name, prompt_path, provider)
|
"web": BrowserAgent(name, "prompts/browser_agent.txt", provider, verbose=False)
|
||||||
}
|
}
|
||||||
self.role = {
|
self.role = {
|
||||||
"en": "Research, setup and code",
|
"en": "Research, setup and code",
|
||||||
@ -70,12 +70,28 @@ class PlannerAgent(Agent):
|
|||||||
"""
|
"""
|
||||||
return prompt
|
return prompt
|
||||||
|
|
||||||
|
def show_plan(self, json_plan):
|
||||||
|
agents_tasks = self.parse_agent_tasks(json_plan)
|
||||||
|
pretty_print(f"--- Plan ---", color="output")
|
||||||
|
for task_name, task in agents_tasks:
|
||||||
|
pretty_print(f"{task}", color="output")
|
||||||
|
pretty_print(f"--- End of Plan ---", color="output")
|
||||||
|
|
||||||
def process(self, prompt, speech_module) -> str:
|
def process(self, prompt, speech_module) -> str:
|
||||||
self.memory.push('user', prompt)
|
ok = False
|
||||||
self.wait_message(speech_module)
|
|
||||||
animate_thinking("Thinking...", color="status")
|
|
||||||
agents_tasks = (None, None)
|
agents_tasks = (None, None)
|
||||||
answer, reasoning = self.llm_request()
|
while not ok:
|
||||||
|
self.wait_message(speech_module)
|
||||||
|
animate_thinking("Thinking...", color="status")
|
||||||
|
self.memory.push('user', prompt)
|
||||||
|
answer, _ = self.llm_request()
|
||||||
|
self.show_plan(answer)
|
||||||
|
ok_str = input("Is the plan ok? (y/n): ")
|
||||||
|
if ok_str == 'y':
|
||||||
|
ok = True
|
||||||
|
else:
|
||||||
|
prompt = input("Please reformulate: ")
|
||||||
|
|
||||||
agents_tasks = self.parse_agent_tasks(answer)
|
agents_tasks = self.parse_agent_tasks(answer)
|
||||||
if agents_tasks == (None, None):
|
if agents_tasks == (None, None):
|
||||||
return "Failed to parse the tasks", reasoning
|
return "Failed to parse the tasks", reasoning
|
||||||
@ -83,16 +99,14 @@ class PlannerAgent(Agent):
|
|||||||
pretty_print(f"I will {task_name}.", color="info")
|
pretty_print(f"I will {task_name}.", color="info")
|
||||||
agent_prompt = self.make_prompt(task['task'], task['need'])
|
agent_prompt = self.make_prompt(task['task'], task['need'])
|
||||||
pretty_print(f"Assigned agent {task['agent']} to {task_name}", color="info")
|
pretty_print(f"Assigned agent {task['agent']} to {task_name}", color="info")
|
||||||
speech_module.speak(f"I will {task_name}. I assigned the {task['agent']} agent to the task.")
|
if speech_module: speech_module.speak(f"I will {task_name}. I assigned the {task['agent']} agent to the task.")
|
||||||
try:
|
try:
|
||||||
self.agents[task['agent'].lower()].process(agent_prompt, None)
|
self.agents[task['agent'].lower()].process(agent_prompt, speech_module)
|
||||||
pretty_print(f"-- Agent answer ---\n\n", color="output")
|
pretty_print(f"-- Agent answer ---\n\n", color="output")
|
||||||
self.agents[task['agent'].lower()].show_answer()
|
self.agents[task['agent'].lower()].show_answer()
|
||||||
pretty_print(f"\n\n", color="output")
|
pretty_print(f"\n\n", color="output")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
pretty_print(f"Error: {e}", color="failure")
|
raise e
|
||||||
speech_module.speak(f"I encountered an error: {e}")
|
|
||||||
break
|
|
||||||
self.last_answer = answer
|
self.last_answer = answer
|
||||||
return answer, reasoning
|
return answer, reasoning
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user