|
import os |
|
from dotenv import load_dotenv |
|
import time |
|
from datetime import datetime |
|
from skills.skill_registry import SkillRegistry |
|
from tasks.task_registry import TaskRegistry |
|
from ongoing_tasks import ongoing_tasks |
|
|
|
load_dotenv() |
|
|
|
api_keys = { |
|
'openai': os.getenv('OPENAI_API_KEY'), |
|
'serpapi': os.getenv('SERPAPI_API_KEY') |
|
|
|
} |
|
|
|
OBJECTIVE = "Research Yohei Nakajima and write a poem about him." |
|
LOAD_SKILLS = ['web_search', 'text_completion', 'code_reader','google_jobs_api_search','image_generation','startup_analysis','play_music','game_generation'] |
|
|
|
REFLECTION = False |
|
|
|
def run_single_task(task_id, task, skill_registry, task_outputs, OBJECTIVE, task_registry): |
|
"""Execute a single task and update its status""" |
|
task_output = task_registry.execute_task(task_id, task, skill_registry, task_outputs, OBJECTIVE) |
|
|
|
task_outputs[task_id]["output"] = task_output |
|
task_outputs[task_id]["completed"] = True |
|
task_outputs[task_id]["description"] = task.get('description', 'No description available') |
|
task_outputs[task_id]["skill"] = task.get('skill', 'No skill information available') |
|
|
|
if task_output: |
|
task_registry.update_tasks({"id": task_id, "status": "completed", "result": task_output}) |
|
|
|
completed_task = task_registry.get_task(task_id) |
|
print(f"Task #{task_id}: {completed_task.get('task')} [COMPLETED][{completed_task.get('skill')}]") |
|
|
|
if REFLECTION: |
|
new_tasks, insert_after_ids, tasks_to_update = task_registry.reflect_on_output(task_output, skill_descriptions) |
|
for new_task, after_id in zip(new_tasks, insert_after_ids): |
|
task_registry.add_task(new_task, after_id) |
|
|
|
if isinstance(tasks_to_update, dict) and tasks_to_update: |
|
tasks_to_update = [tasks_to_update] |
|
|
|
for task_to_update in tasks_to_update: |
|
task_registry.update_tasks(task_to_update) |
|
|
|
|
|
|
|
|
|
def run_main_loop(OBJECTIVE, LOAD_SKILLS, api_keys, REFLECTION=False): |
|
"""Main execution loop""" |
|
try: |
|
skill_descriptions = ",".join(f"[{skill.name}: {skill.description}]" for skill in global_skill_registry.skills.values()) |
|
task_registry = TaskRegistry() |
|
task_registry.create_tasklist(OBJECTIVE, skill_descriptions) |
|
|
|
skill_names = [skill.name for skill in global_skill_registry.skills.values()] |
|
session_summary = f"OBJECTIVE:{OBJECTIVE}.#SKILLS:{','.join(skill_names)}.#" |
|
|
|
task_outputs = {task["id"]: {"completed": False, "output": None} for task in task_registry.get_tasks()} |
|
|
|
task_output = None |
|
|
|
while not all(task["completed"] for task in task_outputs.values()): |
|
tasks = task_registry.get_tasks() |
|
task_registry.print_tasklist(tasks) |
|
|
|
for task in tasks: |
|
if task["id"] not in task_outputs: |
|
task_outputs[task["id"]] = {"completed": False, "output": None} |
|
|
|
ready_tasks = [(task["id"], task) for task in tasks if all((dep in task_outputs and task_outputs[dep]["completed"]) for dep in task.get('dependent_task_ids', [])) and not task_outputs[task["id"]]["completed"]] |
|
|
|
for task_id, task in ready_tasks: |
|
run_single_task(task_id, task, global_skill_registry, task_outputs, OBJECTIVE, task_registry) |
|
|
|
time.sleep(0.1) |
|
|
|
|
|
last_task_id = tasks[-1]["id"] if tasks else None |
|
task_output = task_outputs[last_task_id]["output"] if last_task_id else None |
|
|
|
task_registry.reflect_on_final(OBJECTIVE, task_registry.get_tasks(), task_output, skill_descriptions) |
|
global_skill_registry.reflect_skills(OBJECTIVE, task_registry.get_tasks(), task_output, skill_descriptions) |
|
|
|
with open(f'output/output_{datetime.now().strftime("%d_%m_%Y_%H_%M_%S")}.txt', 'w') as file: |
|
file.write(session_summary) |
|
print("...file saved.") |
|
print("END") |
|
|
|
return task_output |
|
|
|
except Exception as e: |
|
return f"An error occurred: {e}" |
|
|
|
|
|
|
|
|
|
global_skill_registry = SkillRegistry(api_keys=api_keys, main_loop_function=run_main_loop, skill_names=LOAD_SKILLS) |
|
|
|
|
|
def execute_skill(skill_name, objective, task_id): |
|
"""Execute a single skill""" |
|
skill = global_skill_registry.get_skill(skill_name) |
|
if skill: |
|
try: |
|
result = skill.execute(objective, "", objective) |
|
ongoing_tasks[task_id].update({"status": "completed", "output": result}) |
|
except Exception as e: |
|
ongoing_tasks[task_id].update({"status": "error", "error": str(e)}) |
|
return task_id |
|
return "Skill not found :(" |
|
|
|
def execute_task_list(objective, api_keys, task_id): |
|
"""Execute a list of tasks""" |
|
try: |
|
task_registry = TaskRegistry() |
|
result = run_main_loop(objective, get_skills(), api_keys) |
|
ongoing_tasks[task_id].update({"status": "completed", "output": result}) |
|
return task_registry.get_tasks(), task_id |
|
except Exception as e: |
|
ongoing_tasks[task_id].update({"status": "error", "error": str(e)}) |
|
print(f"Error in execute_task_list: {e}") |
|
return task_id |
|
|
|
|
|
|
|
def get_skills(): |
|
"""Return the global skill registry""" |
|
|
|
global global_skill_registry |
|
print("Returning GLOBAL SKILL REGISTRY") |
|
return global_skill_registry |
|
|
|
|
|
global_skill_registry = SkillRegistry(api_keys=api_keys, main_loop_function=run_main_loop, skill_names=LOAD_SKILLS) |
|
|
|
if __name__ == "__main__": |
|
run_main_loop(OBJECTIVE, LOAD_SKILLS, api_keys, REFLECTION) |