davoodwadi's picture
gpt-4o-mini
f027525 verified
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()