import openai import pinecone import time from collections import deque from typing import Dict, List #Set API Keys OPENAI_API_KEY = "" PINECONE_API_KEY = "" PINECONE_ENVIRONMENT = "us-east1-gcp" #Pinecone Environment (eg. "us-east1-gcp") #Set Variables YOUR_TABLE_NAME = "test-table" OBJECTIVE = "Solve world hunger." YOUR_FIRST_TASK = "Develop a task list." #Print OBJECTIVE print("\033[96m\033[1m"+"\n*****OBJECTIVE*****\n"+"\033[0m\033[0m") print(OBJECTIVE) # Configure OpenAI and Pinecone openai.api_key = OPENAI_API_KEY pinecone.init(api_key=PINECONE_API_KEY, environment=PINECONE_ENVIRONMENT) # Create Pinecone index table_name = YOUR_TABLE_NAME dimension = 1536 metric = "cosine" pod_type = "p1" if table_name not in pinecone.list_indexes(): pinecone.create_index(table_name, dimension=dimension, metric=metric, pod_type=pod_type) # Connect to the index index = pinecone.Index(table_name) # Task list task_list = deque([]) def add_task(task: Dict): task_list.append(task) def get_ada_embedding(text): text = text.replace("\n", " ") return openai.Embedding.create(input=[text], model="text-embedding-ada-002")["data"][0]["embedding"] def task_creation_agent(objective: str, result: Dict, task_description: str, task_list: List[str]): prompt = f"You are an task creation AI that uses the result of an execution agent to create new tasks with the following objective: {objective}, The last completed task has the result: {result}. This result was based on this task description: {task_description}. These are incomplete tasks: {', '.join(task_list)}. Based on the result, create new tasks to be completed by the AI system that do not overlap with incomplete tasks. Return the tasks as an array." response = openai.Completion.create(engine="text-davinci-003",prompt=prompt,temperature=0.5,max_tokens=100,top_p=1,frequency_penalty=0,presence_penalty=0) new_tasks = response.choices[0].text.strip().split('\n') return [{"task_name": task_name} for task_name in new_tasks] def prioritization_agent(this_task_id:int): global task_list task_names = [t["task_name"] for t in task_list] next_task_id = int(this_task_id)+1 prompt = f"""You are an task prioritization AI tasked with cleaning the formatting of and reprioritizing the following tasks: {task_names}. Consider the ultimate objective of your team:{OBJECTIVE}. Do not remove any tasks. Return the result as a numbered list, like: #. First task #. Second task Start the task list with number {next_task_id}.""" response = openai.Completion.create(engine="text-davinci-003",prompt=prompt,temperature=0.5,max_tokens=1000,top_p=1,frequency_penalty=0,presence_penalty=0) new_tasks = response.choices[0].text.strip().split('\n') task_list = deque() for task_string in new_tasks: task_parts = task_string.strip().split(".", 1) if len(task_parts) == 2: task_id = task_parts[0].strip() task_name = task_parts[1].strip() task_list.append({"task_id": task_id, "task_name": task_name}) def execution_agent(objective:str,task: str) -> str: #context = context_agent(index="quickstart", query="my_search_query", n=5) context=context_agent(index=YOUR_TABLE_NAME, query=objective, n=5) #print("\n*******RELEVANT CONTEXT******\n") #print(context) response = openai.Completion.create( engine="text-davinci-003", prompt=f"You are an AI who performs one task based on the following objective: {objective}. Your task: {task}\nResponse:", temperature=0.7, max_tokens=2000, top_p=1, frequency_penalty=0, presence_penalty=0 ) return response.choices[0].text.strip() def context_agent(query: str, index: str, n: int): query_embedding = get_ada_embedding(query) index = pinecone.Index(index_name=index) results = index.query(query_embedding, top_k=n, include_metadata=True) #print("***** RESULTS *****") #print(results) sorted_results = sorted(results.matches, key=lambda x: x.score, reverse=True) return [(str(item.metadata['task'])) for item in sorted_results] # Add the first task first_task = { "task_id": 1, "task_name": YOUR_FIRST_TASK } add_task(first_task) # Main loop task_id_counter = 1 while True: if task_list: # Print the task list print("\033[95m\033[1m"+"\n*****TASK LIST*****\n"+"\033[0m\033[0m") for t in task_list: print(str(t['task_id'])+": "+t['task_name']) # Step 1: Pull the first task task = task_list.popleft() print("\033[92m\033[1m"+"\n*****NEXT TASK*****\n"+"\033[0m\033[0m") print(str(task['task_id'])+": "+task['task_name']) # Send to execution function to complete the task based on the context result = execution_agent(OBJECTIVE,task["task_name"]) this_task_id = int(task["task_id"]) print("\033[93m\033[1m"+"\n*****TASK RESULT*****\n"+"\033[0m\033[0m") print(result) # Step 2: Enrich result and store in Pinecone enriched_result = {'data': result} # This is where you should enrich the result if needed result_id = f"result_{task['task_id']}" vector = enriched_result['data'] # extract the actual result from the dictionary index.upsert([(result_id, get_ada_embedding(vector),{"task":task['task_name'],"result":result})]) # Step 3: Create new tasks and reprioritize task list new_tasks = task_creation_agent(OBJECTIVE,enriched_result, task["task_name"], [t["task_name"] for t in task_list]) for new_task in new_tasks: task_id_counter += 1 new_task.update({"task_id": task_id_counter}) add_task(new_task) prioritization_agent(this_task_id) time.sleep(1) # Sleep before checking the task list again