import gradio as gr import openai import requests import json import os from duckduckgo_search import ddg import datetime from datetime import datetime, date, time, timedelta def search_duckduckgo(query): keywords = query results = ddg(keywords, region='wt-wt', safesearch='Off', time='m') filtered_results = [{"title": res["title"], "body": res["body"]} for res in results] print(filtered_results) return filtered_results def get_search_query(task): response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content": f"Given the task: {task}. Generate a concise search query with 1-3 keywords."} ] ) search_query = response.choices[0]['message']['content'].strip() print("Agent 2: ",search_query) return search_query def summarize_search_result(task, search_result): response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content":f"Given the task '{task}' and the search result '{json.dumps(search_result)}', provide a summarized result."} ] ) summary = response.choices[0]['message']['content'].strip() return summary def agent_1(objective): response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content":f"Given the objective '{objective}', create a list of tasks that are closely related to the objective. If needed add specific key words from objective to the task sentence"} ] ) tasks = response.choices[0]['message']['content'].strip().split('\n') return tasks def agent_2(task): search_query = get_search_query(task) print("Agent 2") print(search_query) search_results = search_duckduckgo(search_query) summarized_result = summarize_search_result(task, search_results) print(summarized_result) return summarized_result def agent_3(objective, last_result, tasks): task_list = '\n'.join(tasks) response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content":f"Given the objective '{objective}', the last result '{json.dumps(last_result)}', and the task list:\n{task_list}\n\nRank the tasks based on their relevance to the objective."} ] ) modified_tasks = response.choices[0]['message']['content'].strip().split('\n') print("Agent 3") print(modified_tasks) return modified_tasks def summarize_result(objective, result): response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content":f"Given the objective '{objective}' and the final result '{json.dumps(result)}', provide a summary."} ] ) summary = response.choices[0]['message']['content'].strip() return summary def generate_final_answer(objective, all_results): response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "user", "content":f"Given the objective '{objective}' and the collected results '{json.dumps(all_results)}', provide a final answer addressing the objective."} ] ) final_answer = response.choices[0]['message']['content'].strip() return final_answer def main(objective, loop_count): tasks = agent_1(objective) all_results = [] completed_tasks = [] for i in range(loop_count): print(i+1) if i < len(tasks): print('NEXT TASK: ',tasks[i]) completed_tasks.append(tasks[i]) result = agent_2(tasks[i]) all_results.append(result) tasks = agent_3(objective, result, tasks) print('*********************') else: break final_answer = generate_final_answer(objective, all_results) return final_answer,completed_tasks,tasks def getbabyagianswer(objective,loop_count,openapikey): dateforfilesave=datetime.today().strftime("%d-%m-%Y %I:%M%p") print(objective) print(dateforfilesave) if openapikey=='': return ["Please provide OpenAPI Key","Please provide OpenAPI Key","Please provide OpenAPI Key"] os.environ['OPENAI_API_KEY'] = str(openapikey) openai.api_key=str(openapikey) final_summary,completed_tasts,all_tasks = main(objective, int(loop_count)) print("Final Summary:", final_summary) return final_summary,completed_tasts,all_tasks with gr.Blocks() as demo: gr.Markdown("

GPT4 created BabyAGI

") gr.Markdown( """ This is part of a series of experiments using BabyAGI as a "framework" to construct focused use cases (ex: idea generation). In this GPT-4 was prompted to create a BabyAGI with task creation & execution agents but with constraints to give answer with a specified number of loops. Unlike the original BabyAGI concept, this is not open-ended. \n\nNote: This is a series of experiments to understand AI agents and hence do check the quality of output. OpenAI agents (gpt-3.5-turbo) & DuckDuckGo search are used. The analysis takes roughly 120 secs & may not always be consistent. An error occurs when the OpenAI Api key is not provided/ ChatGPT API is overloaded/ ChatGPT is unable to correctly decipher & format the output\n\n""" ) with gr.Row() as row: with gr.Column(): textboxtopic = gr.Textbox(placeholder="Enter Objective/ Goal...", lines=1,label='Objective') with gr.Column(): textboxloopcount = gr.Textbox(placeholder="Enter # of loops...", lines=1,label='Loop Count') with gr.Column(): textboxopenapi = gr.Textbox(placeholder="Enter OpenAPI Key...", lines=1,label='OpenAPI Key') with gr.Row() as row: examples = gr.Examples(examples=['Give me a startup idea in healthcare technology for India','Which is a must see destination in Mysore?','Find me a unique cuisine restaurant in bangalore','Give me a startup idea for AI in music streaming'], inputs=[textboxtopic]) with gr.Row() as row: btn = gr.Button("Unleash AI Agent") with gr.Row() as row: with gr.Column(): answer1 = gr.Textbox(placeholder="", lines=1,label='Answer') with gr.Column(): fulltasklist1 = gr.Textbox(placeholder="", lines=1,label='Full Task List') with gr.Column(): completedtasklist1 = gr.Textbox(placeholder="", lines=1,label='Completed Tasks') btn.click(getbabyagianswer, inputs=[textboxtopic,textboxloopcount,textboxopenapi,],outputs=[answer1,fulltasklist1,completedtasklist1]) demo.launch(debug=True)