File size: 11,280 Bytes
ec21955 c54eb17 4f31d00 |
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 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 |
import gradio as gr
import warnings
# 抑制所有警告
warnings.filterwarnings('ignore')
import os
import sys
#sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
from Smurfs.inference.smurfs_worker import smurfs_hotpot_worker, smurfs_worker, stream_smurfs_worker
# from Smurfs.tools.tool_env import HotpotToolEnv
from Smurfs.deploy import global_dict
from Smurfs.model.openai_model.openai_model import OpenAI_Model
from Smurfs.agents.answer_agent.answer import stream_answer_agent
from Smurfs.agents.executor_agent.executor import stream_executor_agent
from Smurfs.agents.planning_agent.planner import stream_hotpot_planning_agent
from Smurfs.agents.verifier_agent.verifier import stream_verifier_agent
from Smurfs.tools.docqa.api import tool_env as docqa_tool_env
from Smurfs.tools.hotpotQA.api import tool_env as hotpot_tool_env
from Smurfs.tools.math.api import tool_env as math_tool_env
from Smurfs.tools.shell.api import tool_env as shell_tool_env
from Smurfs.tools.websearch.api import tool_env as websearch_tool_env
import json
import threading
import joblib
from tqdm import tqdm
import time
from PyPDF2 import PdfReader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from datetime import datetime
current_datetime = datetime.now()
# user_input = gr.Textbox(show_label=False, placeholder="Input...", lines=10).style(container=False)
# inp = gr.Textbox(placeholder="Enter your task")
# css = """
# .btn {background-color: blue; color: white;}
# #bot {background-color: blue; color: white;}
# #e {display: inline-block; vertical-align: middle;}
# """
# def update(name):
# return f"<span style='color: red'>Welcome to Gradio, {name}!</span>"
tool_env_map = {
"shell": shell_tool_env,
"math": math_tool_env,
"docqa": docqa_tool_env,
"hotpotQA": hotpot_tool_env,
"websearch": websearch_tool_env
}
total_env, env_name_list = {}, []
def loading():
return "Loading..."
def load_text_from_pdf(up, key=None):
global global_dict
if key == None:
key = os.environ.get("OPENAI_API_KEY")
pdf_path = up.name
pdf_reader = PdfReader(pdf_path)
text = ""
for page in pdf_reader.pages:
text += page.extract_text()
# split into chunks
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
add_start_index=True
)
chunks = text_splitter.split_text(text)
# create embeddings
# embeddings = OpenAIEmbeddings()
embeddings = OpenAIEmbeddings(openai_api_key=key)
global_dict["knowledge_base"] = FAISS.from_texts(chunks, embeddings)
return "upload success!"
#return knowledge_base
def update(query, OPENAI_API_KEY, BING_SUBSCRIPT_KEY, WOLFRAMALPH_APP_ID, WEATHER_API_KEYS):
global total_env, env_name_list
# print(total_env)
# print(BING_SUBSCRIPT_KEY)
# print(WOLFRAMALPH_APP_ID)
# print(WEATHER_API_KEYS)
# model_name = "mistralai/mistral-7b-instruct-v0.2"
model_name = "gpt-4"
method_name = "cli_inference"
tool_doc_path = "Smurfs/tools/tool_doc.json"
if OPENAI_API_KEY == None or OPENAI_API_KEY == '':
yield [(query, "No OPENAI KEY provided!")]
raise KeyError
if (BING_SUBSCRIPT_KEY == None or BING_SUBSCRIPT_KEY == ''):
yield [(query, "No BING_SUBSCRIPT_KEY provided! Please register one from https://www.microsoft.com/en-us/bing/apis/bing-web-search-api and add it to your keys")]
raise KeyError
if WOLFRAMALPH_APP_ID == None or WOLFRAMALPH_APP_ID == '':
yield [(query, "No WOLFRAMALPH_APP_ID provided! please register one from https://products.wolframalpha.com/api/ and add it to your keys")]
raise KeyError
if WEATHER_API_KEYS == None or WEATHER_API_KEYS == '':
yield [(query, "No WEATHER_API_KEYS provided! Please register one from https://www.weatherapi.com/ and add it to")]
raise KeyError
llm = OpenAI_Model(model_name=model_name, api_key=OPENAI_API_KEY)
#llm = OpenRouter_Model(model_name=model_name)
if "docqa" in total_env:
sys_prompt = llm.sys_prompt + "You already have access to the file uploaded by the user. So just answer the question from the user, you don't need to find the file first."
llm.change_sys_prompt(sys_prompt)
else:
llm.set_default_sys_prompt()
# parser_llm = OpenAI_Model(model_name="gpt-4")
with open(tool_doc_path, "r") as f:
tool_doc = json.load(f)
tool_doc["bing_search"]["api_description"] += f"Today is {current_datetime.year}.{current_datetime.month}.{current_datetime.day}"
available_tools = []
for env_name in env_name_list:
available_tools.append(tool_doc[env_name])
test_set = "cli"
output_dir = f"data/{method_name}/{test_set}/answer"
results_dir = f"data/{method_name}/{test_set}/results.json"
if not os.path.exists(f"data/{method_name}/{test_set}/parser_log"):
os.makedirs(f"data/{method_name}/{test_set}/parser_log")
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# HP_answer_agent = answer_agent(llm=parser_llm, logger_dir=f"data/{method_name}/{test_set}/parser_log")
# worker = smurfs_hotpot_worker(available_tools, HotpotToolEnv, llm, method_name, test_set, answer_agent, executor_agent,hotpot_planning_agent, verifier_agent)
#print(total_env)
worker = stream_smurfs_worker(available_tools, total_env, llm, method_name, test_set, stream_answer_agent, stream_executor_agent, stream_hotpot_planning_agent, stream_verifier_agent, OPENAI_API_KEY, BING_SUBSCRIPT_KEY, WOLFRAMALPH_APP_ID, WEATHER_API_KEYS)
stream_generator = worker.run(query, 0)
# messages = []
while True:
try:
response = next(stream_generator)
messages = [(query, response)]
yield messages
except StopIteration:
break
# query = input("Please Enter Your Task: ")
# cli_run(query, worker)
# def rs_to_tool_env(rs):
# total_env = {}
# env_name_list = []
# for tool_system in rs:
# tool = tool_system.split(": ")[0]
# env = tool_env_map[tool]
# print(f"env: {env}")
# for e in env:
# if e not in env_name_list:
# total_env[e] = env[e]
# env_name_list.append(e)
# print(total_env)
# return total_env, env_name_list
# def merge(rs):
# total_env, env_name_list = rs_to_tool_env(rs)
# return total_env, env_name_list
def update_tools(rs):
global total_env, env_name_list
total_env = {}
env_name_list = []
for tool_system in rs:
tool = tool_system.split(": ")[0]
env = tool_env_map[tool]
print(f"env: {env}")
for e in env:
if e not in env_name_list:
total_env[e] = env[e]
env_name_list.append(e)
print(total_env)
#return total_env, env_name_list
def user(user_msg):
return user_msg
tools = ["math: Tool that can handle mathematical problems",
"docqa: Tool that can answer questions about your uploaded file",
"hotpotQA: Tool that can do multi-hop commonsense reasoning",
"websearch: Tool that can do web search to answer your question"]
websearch_example = ["请根据深圳明天的天气推荐给我推荐一套穿搭方案,结果用中文输出。", "今年的中秋节是哪天?用中文输出"]
math_example = ["Calc integral of sin(x)+2x^2+3x+1 from 0 to 1", "When both sides of a right triangle are 6 and 8, what is the length of the other side?"]
inp = gr.Textbox(placeholder="Please input your task", label="Task")
with gr.Blocks() as demo:
gr.HTML("""<h1 align="center">Smurfs</h1>""")
#gr.Markdown("""<figure><a href=https://yoursmiles.org/h-smurf.php><img src=https://yoursmiles.org/hsmile/smurf/h3602.gif></a><a href=https://yoursmiles.org/h-smurf.php><img src=https://yoursmiles.org/hsmile/smurf/h3607.gif></a><a href=https://yoursmiles.org/h-smurf.php><img src=https://yoursmiles.org/hsmile/smurf/h3623.gif></a><a href=https://yoursmiles.org/h-smurf.php><img src=https://yoursmiles.org/hsmile/smurf/h3625.gif></a></figure>""")
#gr.HTML("""<a href=https://yoursmiles.org/h-smurf.php><img src=https://yoursmiles.org/hsmile/smurf/h3602.gif>""")
with gr.Row():
with gr.Column(scale=1):
inp.render()
rs = gr.Dropdown(choices=tools, label="Tool Systems", multiselect=True)
file_output = gr.File(file_types=[".pdf"])
with gr.Accordion("Keys", open=False):
# model_name = gr.Dropdown(label="Moel Name", choices=["gpt-3.5", "gpt-4o", "gpt-4"])
openai_key = gr.Textbox(label="OpenAI API Key", placeholder="Please Enter Your OpenAI API Key")
bing_search_key = gr.Textbox(label="BingSearch Key", placeholder="Please Enter Your BingSearch Key from https://www.microsoft.com/en-us/bing/apis/bing-web-search-api")
wolframalpha_key = gr.Textbox(label="Wolframalpha API Key", placeholder="Please Enter Your WOLFRAMALPH_APP_ID from https://products.wolframalpha.com/api/")
weather_key = gr.Textbox(label="Weather API Key", placeholder="Please Enter Your Weather API Key from https://www.weatherapi.com/")
gr.Examples(["Who is the brother of the 2022 NBA FMVP?", "How much older is Lebron James than his oldest son?", "Calc integral of sin(x)+2x^2+3x+1 from 0 to 1", "Calculate the length of the hypotenuse of a right triangle when the other two sides are 6 and 8", "请根据深圳明天的天气推荐给我推荐一套穿搭方案,结果用中文输出。", "今年的中秋节是哪天?用中文输出"], inp)
_submit = gr.Button("Submit")
stop = gr.Button("Stop")
clear = gr.Button("Clear")
#upload = gr.UploadButton("Click to upload your pdf file")
# btn = gr.Button("Run", elem_id="bot", elem_classes="btn")
#with gr.Column(scale=1, elem_id="e"):
# chatbox = gr.HTML()
chatbox = gr.Chatbot(height=300)
# btn.click(fn=update, inputs=inp, outputs=chatbox)
file_output.upload(load_text_from_pdf, [file_output, openai_key], None)
#upload.upload(loading, None, inp).then(load_text_from_pdf, upload, inp)
rs.change(update_tools, rs, None)
click_event = _submit.click(user, inp, inp).then(update, [inp, openai_key, bing_search_key, wolframalpha_key, weather_key], chatbox)
stop.click(None, None, None, cancels=[click_event])
#inp.submit(user, inp, inp).then(update, inp, chatbox)
clear.click(lambda: (None, None), None, [inp, chatbox], queue=False)
# theme=gr.themes.Default().set(button_primary_border_color_dark=, hover)
# demo.load(
# None,
# None,
# _js="""
# () => {
# const params = new URLSearchParams(window.location.search);
# if (!params.has('__theme')){
# params.set('__theme', 'dark');
# window.location.search = params.toString();
# }
# }
# """,
# )
if __name__ == "__main__":
demo.queue().launch() |