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() | |