Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import time | |
| from openai import OpenAI | |
| import re | |
| import os | |
| client = OpenAI(api_key=os.environ.get("openai")) | |
| model="gpt-4o-mini" | |
| ################## scheduler | |
| from apscheduler.schedulers.background import BackgroundScheduler | |
| from datetime import datetime | |
| import time | |
| import requests | |
| from bs4 import BeautifulSoup | |
| def keep_alive_adverse(): | |
| url = 'https://huggingface.co/spaces/davoodwadi/ProsocialChatbot' | |
| response = requests.get(url) | |
| # Check if the request was successful | |
| if response.status_code == 200: | |
| print('success') | |
| soup = BeautifulSoup(response.content, 'html.parser') | |
| print(datetime.now()) | |
| print(soup.title.string) | |
| else: | |
| print(f'URL: {url} failed') | |
| print('*'*20) | |
| hours = 12 | |
| interval = 60*60*hours | |
| scheduler = BackgroundScheduler() | |
| scheduler.add_job(keep_alive_adverse, 'interval', seconds=interval) | |
| scheduler.start() | |
| ################## | |
| # llm = Llama(model_path="./snorkel-mistral-pairrm-dpo.Q4_K_M.gguf", | |
| # chat_format="chatml", | |
| # n_gpu_layers=0, # cpu only | |
| # n_ctx=6000) | |
| def split_text(text, llm, chunk_size): | |
| text_newline = text.split('\n') | |
| text_newline = [t for t in text_newline if len(t)>0] | |
| summary_list=[] | |
| new_list=[] | |
| for i, t in enumerate(text_newline): | |
| new_list.append(t) | |
| n_tokens=get_num_tokens('\n\n\n'.join(new_list), llm) | |
| if i==(len(text_newline)-1): | |
| summary_list.append('\n\n'.join(new_list)) | |
| elif n_tokens>chunk_size: | |
| summary_list.append('\n\n'.join(new_list)) | |
| new_list=[] | |
| return summary_list | |
| def all_to_list(all_sum, llm, chunk_size): | |
| summary_list = split_text(all_sum, llm, chunk_size) | |
| len_chunks = [get_num_tokens(chunk, llm) for chunk in summary_list] | |
| print(f'len_chunks: {len_chunks}') | |
| print(f'total parts: {len(summary_list)}') | |
| return summary_list | |
| def clean_output(text): | |
| text = text.replace('`','') | |
| text = re.sub(r'\d+\.', '', text) # removes numeric bullet points | |
| text = text.replace('- ',' ') | |
| text = text.replace('*','') | |
| text = text.replace('+','') | |
| return text | |
| def get_content_length(messages, llm): | |
| # print(messages) | |
| # user_list=[m for m in messages if m['role']=='user'] | |
| # assistant_list=[m for m in messages if m['role']=='assistant'] | |
| system_list=[m for m in messages if m['role']=='system'] | |
| # print(f'system: {system_list}') | |
| content_total=system_list[0]['content'] | |
| for i, (m) in enumerate(messages[1:]): | |
| content_total+=m['content'] | |
| return get_num_tokens(content_total, llm) | |
| def pop_first_user_assistant(messages): | |
| new_messages=[entry for i, entry in enumerate(messages) if i not in [1,2]] | |
| return new_messages | |
| def get_num_tokens(text, llm): | |
| bytes_string = text.encode('utf-8') | |
| tokens = llm.tokenize(bytes_string) | |
| return len(tokens) | |
| def response_stream(): | |
| global writer_messages, editor_messages, turn | |
| if turn=='writer': | |
| yield | |
| else: | |
| yield | |
| def adverse(message, history): | |
| global writer_messages, editor_messages, turn | |
| if len(message)>0: | |
| out = set_system_prompts(message) | |
| print(out) | |
| total_response = '' | |
| for i in range(8): | |
| # update writer_messages | |
| if len(writer_messages)==1: # first call | |
| writer_messages.append({ | |
| 'role':'user', | |
| 'content':'start your response now.', | |
| }) | |
| # check whose turn it is | |
| turn = 'writer' if len(writer_messages)%2==0 else 'editor' | |
| list_of_messages = writer_messages if turn=='writer' else editor_messages | |
| print(f'turn: {turn}\n\nlist_of_messages: {list_of_messages}') | |
| total_response+=f'\n\n\n**turn: {turn}**\n' | |
| ############################# | |
| # call llm.create_chat_completion for whoever's turn | |
| # response_iter | |
| # response_str = f'writer {len(writer_messages)}' if turn=='writer' else f'editor {len(editor_messages)}' | |
| # response_iter = iter(response_str.split(' ')) | |
| # response_iter = llm.create_chat_completion( | |
| # list_of_messages, # Prompt | |
| # max_tokens=-1, | |
| # stop=["###"], | |
| # stream=True | |
| # ) | |
| response_iter = client.chat.completions.create( | |
| model=model, | |
| messages=list_of_messages, | |
| stream=True, | |
| ) | |
| response='' | |
| for chunk in response_iter: | |
| try: | |
| response+=chunk.choices[0].delta.content | |
| total_response+=chunk.choices[0].delta.content | |
| # time.sleep(1) | |
| # print(f'chunk: {chunk}') | |
| yield total_response | |
| except Exception as e: | |
| print(e) | |
| total_response+='\n\n' | |
| if turn=='editor': | |
| response+='\nNow rewrite your response keeping my suggestions in mind.\n' | |
| ############################# | |
| # update writer_messages and editor_messages | |
| if turn=='writer': | |
| writer_messages.append({ | |
| 'role':'assistant', | |
| 'content':response, | |
| }) | |
| editor_messages.append({ | |
| 'role':'user', | |
| 'content':response, | |
| }) | |
| else: # editor | |
| writer_messages.append({ | |
| 'role':'user', | |
| 'content':response, | |
| }) | |
| editor_messages.append({ | |
| 'role':'assistant', | |
| 'content':response, | |
| }) | |
| max_tokens=4_000 | |
| chunk_size=1000 | |
| max_words = 10_000 | |
| print(f'max_words: {max_words}') | |
| # llm = Llama(model_path="E:\\yt\\bookSummary/Snorkel-Mistral-PairRM-DPO/snorkel-mistral-pairrm-dpo.Q4_K_M.gguf", chat_format="chatml", n_gpu_layers=-1, n_ctx=6000) | |
| writer_system_prompt_unformatted = '''You are a helpful assistant. | |
| {topic}''' | |
| editor_system_prompt_unformatted = '''You are a helpful editor. | |
| You give instructions on what I should write and provide feedback on my response. | |
| The topic I'm writing about is in the triple backticks: | |
| ```{topic}``` | |
| You should reinforce me to make my response match perfectly to the topic. | |
| You should analyze my response and provide reasoning to see if my response if correct. | |
| If my response is not correct you should use your analysis to guide me to the right response. | |
| You should push me to make my response as close as possible to the topic.''' | |
| writer_messages = [{'role':'system','content':writer_system_prompt_unformatted}] | |
| editor_messages = [{'role':'system','content':editor_system_prompt_unformatted}] | |
| turn = 'writer' | |
| def set_system_prompts(x): | |
| global writer_system_prompt, editor_system_prompt, writer_messages, editor_messages, writer_system_prompt_unformatted, editor_system_prompt_unformatted | |
| writer_system_prompt = writer_system_prompt_unformatted.format(topic=x) | |
| editor_system_prompt = editor_system_prompt_unformatted.format(topic=x) | |
| writer_messages = [{'role':'system','content':writer_system_prompt}] | |
| editor_messages = [{'role':'system','content':editor_system_prompt}] | |
| return f'writer system prompt:\n{writer_system_prompt}\n\neditor system prompt:\n{editor_system_prompt}' | |
| # with gr.Blocks() as demo: | |
| # gr.Markdown( | |
| # """ | |
| # # Multi Agent LLMs for End-to-End Story Generation | |
| # """) | |
| # hyper = gr.Interface( | |
| # fn=set_system_prompts, | |
| # inputs=gr.Textbox(placeholder="What is the topic?", label = 'Topic', lines=4), | |
| # outputs=gr.Textbox(label='System prompt to use', lines=4) | |
| # ) | |
| # out_test = gr.Textbox(lines=4) | |
| # button = gr.Button("test") | |
| # button.click(lambda : f"{writer_system_prompt} \n\n\n{editor_system_prompt}", outputs=out_test) | |
| # chat_textbox = gr.Textbox(lines=10) | |
| chat = gr.ChatInterface( | |
| fn=adverse, | |
| examples=["Start the story", "Write a poem", 'The funniest joke ever!'], | |
| title="Multi-Agent Bot", | |
| autofocus=False, | |
| fill_height=True, | |
| # fill_vertical_space=True, | |
| # additional_inputs = hyper, | |
| # textbox = chat_textbox, | |
| ).queue() | |
| if __name__ == "__main__": | |
| chat.launch() | |