File size: 6,687 Bytes
107ff99
 
 
 
 
 
59f607f
 
107ff99
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d53faba
 
 
 
 
 
 
 
099d7ee
d53faba
75d2e7f
107ff99
 
 
 
 
 
 
f765f5b
107ff99
 
 
 
59f607f
107ff99
d53faba
107ff99
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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("<h1><center>GPT4 created BabyAGI</center></h1>")
    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)