import gradio as gr from utils import * from chains.openai_model import OpenAIModel from config import SEVER, PORT, DEBUG, DEPLOYMENT_ID, SAVE_DIR from vector_db import delete_all, delete_file, handle_upload_file, update_file # Get and load new model def get_model(llm_model_name, temperature=0., top_p=1.0): model = OpenAIModel(llm_model_name=llm_model_name, condense_model_name=llm_model_name, temperature=temperature, top_p=top_p) return model def create_new_model(): return get_model(llm_model_name=DEPLOYMENT_ID) def update_database(files_src): message = handle_upload_file(files_src) saved_file = os.listdir(SAVE_DIR) # saved_file = os.listdir(SAVE_DIR) # if files_src is None: # return gr.update(choices=[]) # for file in files_src: # file_path = file.name # file_name = os.path.basename(file_path) # if file_name in os.listdir(SAVE_DIR): # continue # else: # saved_file.extend([file_name]) return gr.update(choices=saved_file), message # Gradio app title = """

Docs FPT ๐Ÿค–

""" with gr.Blocks() as demo: user_name = gr.State("") history = gr.State([]) current_model = gr.State(create_new_model) with gr.Row(): with gr.Column(scale=1): gr.HTML(title) status_text = "" status_display = gr.Markdown(status_text, elem_id="status_display") with gr.Row().style(equal_height=True): with gr.Column(scale=5): with gr.Row(): chatbot = gr.Chatbot([], elem_id="chatbot").style(height="100%") with gr.Row(): with gr.Column(min_width=225, scale=12): user_input = gr.Textbox( show_label=False, placeholder="Enter here" ).style(container=False) # ask_examples_hidden = gr.Textbox(elem_id="hidden-message") examples_questions = gr.Examples( [ "What are the possible ranks of Fsoft projects?", "What is the rank of a project that has budgeted MM 100 man-month?", "What is the definition of a rank A project?", "ๆƒ…ๅ ฑใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใซ้–ขใ™ใ‚‹ไบ‹ๆ•…ใŒ่ตทใใŸๅ ดๅˆใ€่ชฐใซ้€šๅ ฑใ™ใ‚Œใฐใ‚ˆใ„ใงใ™ใ‹", "ไบ‹ๆ•…ใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นใฏใฉใฎใใ‚‰ใ„ใฎๆœŸ้–“ไฟๅญ˜ใ•ใ‚Œใพใ™ใ‹?", "ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃไบ‹ๆ•…ใŒ้‡ๅคงใ‹ใฉใ†ใ‹ใฏใฉใ†ใ™ใ‚Œใฐใ‚ใ‹ใ‚Šใพใ™ใ‹?" ], [user_input], examples_per_page=6, ) with gr.Column(min_width=42, scale=1): submitBtn = gr.Button("Send", variant="primary") with gr.Row(): emptyBtn = gr.Button( "๐Ÿงน New conversation", elem_id="empty_btn") retryBtn = gr.Button("๐Ÿ”„ Retry") rec = gr.Button("โบ๏ธRecord") record_audio = gr.inputs.Audio(source="microphone", type="filepath") with gr.Row(): gr.Markdown( """ ## ๐Ÿ’ป Key Feature - Chat with an AI chatbot powered by OpenAI's chat API, using the **content of your research document**. - Get **semantic search** answers from your document using **vector databases**. - Perform a **Google search** within the app - **Verify sources** for all generated results. - Support converting **speech to text** for easy input. ### Pine cone Pinecone makes it easy to provide long-term memory for high-performance AI applications. It's a managed, cloud-native vector database with a simple API and no infrastructure hassles. Pinecone serves fresh, filtered query results with low latency at the scale of billions of vectors. https://www.pinecone.io/blog/azure/ ### Azure OpenAI Service https://learn.microsoft.com/en-us/legal/cognitive-services/openai/data-privacy ## ๐Ÿ“ง Contact This tool has been developed by the R&D lab at **QAI** (FPT Software, Ha Noi, Viet Nam) If you have any questions or feature requests, please feel free to reach us out at khangnvt1@fpt.com. """ ) with gr.Column(min_width=50, scale=1.5): with gr.Tab(label="ChatGPT"): # gr.Markdown(f'

Azure OpenAI Service:here

') index_files = gr.Files(label="Files", type="file", multiple=True) use_websearch = gr.Checkbox(label="Google search", value=False, elem_classes="switch_checkbox") custom_websearch = gr.Checkbox(label="Custom web search", value=False, elem_classes="switch_checkbox") with gr.Tab(label="Configuration"): gr.Markdown( "โš ๏ธBe careful to change โš ๏ธ\n\nIf you can't use it, please restore the default settings") with gr.Accordion("Parameter", open=False): temperature_slider = gr.Slider( minimum=-0, maximum=1.0, value=0.0, step=0.1, interactive=True, label="Temperature", ) top_p_slider = gr.Slider( minimum=-0, maximum=1.0, value=1.0, step=0.1, interactive=True, label="Top_p", ) user_identifier = gr.Textbox( show_label=True, placeholder="Enter here", label="User name", value=user_name.value, lines=1, ) loadHistoryBtn = gr.Button("๐Ÿ’พ Load History") with gr.Tab(label="Knowledge DB"): all_files = gr.Dropdown( label="All available files:", multiselect=True, choices=os.listdir(SAVE_DIR), interactive=True ) with gr.Column(): delete_btn = gr.Button("๐Ÿ—‘๏ธ Delete") with gr.Column(): delete_all_btn = gr.Button("๐Ÿ—‘๏ธ Delete all") update_btn = gr.Button("๐Ÿ—‘๏ธ Update DB") index_files.change(update_database, [index_files], [all_files, status_display]) delete_all_btn.click(delete_all, None, [all_files, status_display, index_files]) delete_btn.click(delete_file, [all_files], [all_files, status_display, index_files]) update_btn.click(update_file, None, [status_display]) emptyBtn.click( reset, inputs=[current_model], outputs=[chatbot], show_progress=True, ) retryBtn.click(retry, [chatbot, current_model, use_websearch, custom_websearch], [chatbot]) loadHistoryBtn.click(load_chat_history, [current_model], [chatbot]) rec.click(transcribe, [current_model, record_audio], [user_input]) user_identifier.change(set_user_indentifier, [current_model, user_identifier], None) user_input.submit(predict, [chatbot, current_model, user_input, use_websearch, custom_websearch], [chatbot, status_display], show_progress=True) user_input.submit(lambda: "", None, user_input) submitBtn.click(predict, [chatbot, current_model, user_input, use_websearch, custom_websearch], [chatbot, status_display], show_progress=True) submitBtn.click(lambda: "", None, user_input) demo.queue(concurrency_count=10).launch( server_name=SEVER, server_port=PORT, debug=DEBUG)