Spaces:
Build error
Build error
| import gradio as gr | |
| from typing import Optional, Tuple | |
| from queue import Empty, Queue | |
| from threading import Thread | |
| from bot.web_scrapping.crawler_and_indexer import content_crawler_and_index | |
| from bot.utils.callbacks import QueueCallback | |
| from bot.utils.constanst import set_api_key, stop_api_key | |
| from bot.utils.show_log import logger | |
| from bot.web_scrapping.default import * | |
| from langchain.chat_models import ChatOpenAI | |
| from langchain.prompts import HumanMessagePromptTemplate | |
| from langchain.schema import AIMessage, BaseMessage, HumanMessage, SystemMessage | |
| def apply_api_key(api_key): | |
| api_key = set_api_key(api_key=api_key) | |
| return f'Successfully set {api_key}' | |
| human_message_prompt_template = HumanMessagePromptTemplate.from_template("{text}") | |
| def bot_learning(urls, file_formats, llm, prompt, chat_mode=False): | |
| index = content_crawler_and_index(url=str(urls), llm=llm, prompt=prompt, file_format=file_formats) | |
| if chat_mode: | |
| return index | |
| else: | |
| return 'Training Completed' | |
| def chat_start( | |
| chat: Optional[ChatOpenAI], | |
| message: str, | |
| chatbot_messages: ChatHistory, | |
| messages: List[BaseMessage], ) -> Tuple[str, str, ChatOpenAI, ChatHistory, List[BaseMessage]]: | |
| if not chat: | |
| queue = Queue() | |
| chat = ChatOpenAI( | |
| model_name=MODELS_NAMES[0], | |
| temperature=DEFAULT_TEMPERATURE, | |
| streaming=True, | |
| callbacks=([QueueCallback(queue)]) | |
| ) | |
| else: | |
| queue = chat.callbacks[0].queue | |
| job_done = object() | |
| messages.append(HumanMessage(content=f':{message}')) | |
| chatbot_messages.append((message, "")) | |
| index = bot_learning(urls='NO_URL', file_formats='txt', llm=chat, prompt=message, chat_mode=True) | |
| def query_retrieval(): | |
| response = index.query() | |
| chatbot_message = AIMessage(content=response) | |
| messages.append(chatbot_message) | |
| queue.put(job_done) | |
| t = Thread(target=query_retrieval) | |
| t.start() | |
| content = "" | |
| while True: | |
| try: | |
| next_token = queue.get(True, timeout=1) | |
| if next_token is job_done: | |
| break | |
| content += next_token | |
| chatbot_messages[-1] = (message, content) | |
| yield chat, "", chatbot_messages, messages | |
| except Empty: | |
| continue | |
| messages.append(AIMessage(content=content)) | |
| return chat, "", chatbot_messages, messages | |
| def system_prompt_handler(value: str) -> str: | |
| return value | |
| def on_clear_button_click(system_prompt: str) -> Tuple[str, List, List]: | |
| return "", [], [SystemMessage(content=system_prompt)] | |
| def on_apply_settings_button_click( | |
| system_prompt: str, model_name: str, temperature: float | |
| ): | |
| logger.info( | |
| f"Applying settings: model_name={model_name}, temperature={temperature}" | |
| ) | |
| chat = ChatOpenAI( | |
| model_name=model_name, | |
| temperature=temperature, | |
| streaming=True, | |
| callbacks=[QueueCallback(Queue())], | |
| max_tokens=1000, | |
| ) | |
| chat.callbacks[0].queue.empty() | |
| return chat, *on_clear_button_click(system_prompt) | |
| def main(): | |
| with gr.Blocks() as demo: | |
| system_prompt = gr.State(default_system_prompt) | |
| messages = gr.State([SystemMessage(content=default_system_prompt)]) | |
| chat = gr.State(None) | |
| with gr.Column(elem_id="col_container"): | |
| gr.Markdown("# Welcome to OWN-GPT! π€") | |
| gr.Markdown( | |
| "Demo Chat Bot Platform" | |
| ) | |
| chatbot = gr.Chatbot() | |
| with gr.Column(): | |
| message = gr.Textbox(label="Type some message") | |
| message.submit( | |
| chat_start, | |
| [chat, message, chatbot, messages], | |
| [chat, message, chatbot, messages], | |
| queue=True, | |
| ) | |
| message_button = gr.Button("Submit", variant="primary") | |
| message_button.click( | |
| chat_start, | |
| [chat, message, chatbot, messages], | |
| [chat, message, chatbot, messages], | |
| ) | |
| with gr.Column(): | |
| learning_status = gr.Textbox(label='Training Status') | |
| url = gr.Textbox(label="URL to Documents") | |
| file_format = gr.Textbox(label="Set your file format:", placeholder='Example: pdf, txt') | |
| url.submit( | |
| bot_learning, | |
| [url, file_format, chat, message], | |
| [learning_status] | |
| ) | |
| training_button = gr.Button("Training", variant="primary") | |
| training_button.click( | |
| bot_learning, | |
| [url, file_format, chat, message], | |
| [learning_status] | |
| ) | |
| with gr.Row(): | |
| with gr.Column(): | |
| clear_button = gr.Button("Clear") | |
| clear_button.click( | |
| on_clear_button_click, | |
| [system_prompt], | |
| [message, chatbot, messages], | |
| queue=False, | |
| ) | |
| with gr.Accordion("Settings", open=False): | |
| model_name = gr.Dropdown( | |
| choices=MODELS_NAMES, value=MODELS_NAMES[0], label="model" | |
| ) | |
| temperature = gr.Slider( | |
| minimum=0.0, | |
| maximum=1.0, | |
| value=0.7, | |
| step=0.1, | |
| label="temperature", | |
| interactive=True, | |
| ) | |
| apply_settings_button = gr.Button("Apply") | |
| apply_settings_button.click( | |
| on_apply_settings_button_click, | |
| [system_prompt, model_name, temperature], | |
| [chat, message, chatbot, messages], | |
| ) | |
| with gr.Row(): | |
| with gr.Column(): | |
| status = gr.Textbox(label='API KEY STATUS') | |
| api_key_set = gr.Textbox(label='Set your OPENAI API KEY') | |
| api_key_set_button = gr.Button("Set API key") | |
| api_key_set_button.click( | |
| apply_api_key, | |
| [api_key_set], | |
| [status] | |
| ) | |
| with gr.Column(): | |
| status_2 = gr.Textbox(label='STOP API KEY STATUS') | |
| stop_api_button = gr.Button('Stop API key') | |
| stop_api_button.click( | |
| stop_api_key, | |
| [], | |
| [status_2]) | |
| with gr.Column(): | |
| system_prompt_area = gr.TextArea( | |
| default_system_prompt, lines=4, label="prompt", interactive=True | |
| ) | |
| system_prompt_area.input( | |
| system_prompt_handler, | |
| inputs=[system_prompt_area], | |
| outputs=[system_prompt], | |
| ) | |
| system_prompt_button = gr.Button("Set") | |
| system_prompt_button.click( | |
| on_apply_settings_button_click, | |
| [system_prompt, model_name, temperature], | |
| [chat, message, chatbot, messages], | |
| ) | |
| return demo | |
| if __name__ == '__main__': | |
| demo = main() | |
| demo.queue() | |
| demo.launch(share=True) | |