Spaces:
Runtime error
Runtime error
File size: 7,813 Bytes
4a8ac8b 7e5261e 14d257f 7e5261e 4a8ac8b db07900 4a8ac8b 7ea7941 4a8ac8b 8276bc3 7ea7941 4a8ac8b 8c8d4ad 7ea7941 4a8ac8b bd93483 4a8ac8b bd93483 4a8ac8b 8276bc3 4a8ac8b 7ea7941 c08168a 7ea7941 bd93483 666a2c5 4a8ac8b bd93483 06bea5a bd93483 c08168a bd93483 983867e bd93483 06bea5a bd93483 4a8ac8b bd93483 7ea7941 4a8ac8b bd93483 4a8ac8b bd93483 4a8ac8b 7ea7941 bd93483 7ea7941 80d0d4e 7ea7941 bd93483 7ea7941 80d0d4e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
import gradio as gr
from huggingface_hub import InferenceClient
import json
from bs4 import BeautifulSoup
import requests
from transformers import LlavaProcessor, LlavaForConditionalGeneration, TextIteratorStreamer
from threading import Thread
import torch
model_id = "llava-hf/llava-interleave-qwen-0.5b-hf"
processor = LlavaProcessor.from_pretrained(model_id)
model = LlavaForConditionalGeneration.from_pretrained(model_id)
model.to("cpu")
def extract_text_from_webpage(html_content):
soup = BeautifulSoup(html_content, 'html.parser')
for tag in soup(["script", "style", "header", "footer"]):
tag.extract()
return soup.get_text(strip=True)
def search(query):
term = query
all_results = []
max_chars_per_page = 8000
with requests.Session() as session:
resp = session.get(
url="https://www.google.com/search",
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0"},
params={"q": term, "num": 3, "udm": 14},
timeout=5,
)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "html.parser")
result_block = soup.find_all("div", attrs={"class": "g"})
for result in result_block:
link = result.find("a", href=True)["href"]
try:
webpage = session.get(link, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0"}, timeout=5)
webpage.raise_for_status()
visible_text = extract_text_from_webpage(webpage.text)
if len(visible_text) > max_chars_per_page:
visible_text = visible_text[:max_chars_per_page]
all_results.append({"link": link, "text": visible_text})
except requests.exceptions.RequestException:
all_results.append({"link": link, "text": None})
return all_results
# Initialize inference clients for different models
client_gemma = InferenceClient("mistralai/Mistral-7B-Instruct-v0.3")
client_mixtral = InferenceClient("NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO")
client_llama = InferenceClient("meta-llama/Meta-Llama-3-8B-Instruct")
# Define the main chat function
def respond(question, history):
func_caller = []
user_prompt = question
functions_metadata = [
{"type": "function", "function": {"name": "web_search", "description": "Search query on google", "parameters": {"type": "object", "properties": {"query": {"type": "string", "description": "web search query"}}, "required": ["query"]}}},
{"type": "function", "function": {"name": "general_query", "description": "Reply general query of USER", "parameters": {"type": "object", "properties": {"prompt": {"type": "string", "description": "A detailed prompt"}}, "required": ["prompt"]}}},
]
for msg in history:
func_caller.append({"role": "user", "content": f"{str(msg[0])}"})
func_caller.append({"role": "assistant", "content": f"{str(msg[1])}"})
func_caller.append({"role": "user", "content": f'[SYSTEM]You are a helpful assistant. You have access to the following functions: \n {str(functions_metadata)}\n\nTo use these functions respond with:\n<functioncall> {{ "name": "function_name", "arguments": {{ "arg_1": "value_1", "arg_1": "value_1", ... }} }} </functioncall> [USER] {question}'})
response = client_gemma.chat_completion(func_caller, max_tokens=200)
response = str(response)
try:
response = response[int(response.find("{")):int(response.rindex("</"))]
except:
response = response[int(response.find("{")):(int(response.rfind("}"))+1)]
response = response.replace("\\n", "")
response = response.replace("\\'", "'")
response = response.replace('\\"', '"')
response = response.replace('\\', '')
print(f"\n{response}")
try:
json_data = json.loads(str(response))
if json_data["name"] == "web_search":
query = json_data["arguments"]["query"]
web_results = search(query)
web2 = ' '.join([f"Link: {res['link']}\nText: {res['text']}\n\n" for res in web_results])
messages = f"system\nYou are OpenCHAT mini a helpful assistant. You are provided with WEB results from which you can find informations to answer users query in Structured and More better way. You do not say Unnecesarry things Only say thing which is important and relevant. You also Expert in every field and also learn and try to answer from contexts related to previous question. Try your best to give best response possible to user. You also try to show emotions using Emojis and reply like human, use short forms, friendly tone and emotions."
for msg in history:
messages += f"\nuser\n{str(msg[0])}"
messages += f"\nassistant\n{str(msg[1])}"
messages += f"\nuser\n{question}\nweb_result\n{web2}\nassistant\n"
stream = client_mixtral.text_generation(messages, max_new_tokens=2000, do_sample=True, stream=True, details=True, return_full_text=False)
output = ""
for response in stream:
if not response.token.text == "":
output += response.token.text
yield output
else:
messages = f"system\nYou are OpenCHAT mini a helpful assistant. You answers users query like human friend. You are also Expert in every field and also learn and try to answer from contexts related to previous question. Try your best to give best response possible to user. You also try to show emotions using Emojis and reply like human, use short forms, friendly tone and emotions."
for msg in history:
messages += f"\nuser\n{str(msg[0])}"
messages += f"\nassistant\n{str(msg[1])}"
messages += f"\nuser\n{question}\nassistant\n"
stream = client_llama.text_generation(messages, max_new_tokens=2000, do_sample=True, stream=True, details=True, return_full_text=False)
output = ""
for response in stream:
if not response.token.text == "":
output += response.token.text
yield output
except:
messages = f"system\nYou are OpenCHAT mini a helpful assistant. You answers users query like human friend. You are also Expert in every field and also learn and try to answer from contexts related to previous question. Try your best to give best response possible to user. You also try to show emotions using Emojis and reply like human, use short forms, friendly tone and emotions."
for msg in history:
messages += f"\nuser\n{str(msg[0])}"
messages += f"\nassistant\n{str(msg[1])}"
messages += f"\nuser\n{question}\nassistant\n"
stream = client_llama.text_generation(messages, max_new_tokens=2000, do_sample=True, stream=True, details=True, return_full_text=False)
output = ""
for response in stream:
if not response.token.text == "":
output += response.token.text
yield output
# Create the Gradio interface
demo = gr.Interface(
fn=respond,
inputs=gr.Textbox(label="Question"),
outputs=gr.Textbox(label="Response"),
description="# OpenGPT 4o mini\n### You can engage in chat, generate images, perform web searches, and Q&A with images.",
examples=[
{"question": "Hi, who are you?"},
{"question": "What's the current price of Bitcoin?"},
{"question": "Search and tell me what's the release date of llama 3 400b."},
{"question": "Write me a Python function to calculate the first 10 digits of the Fibonacci sequence."},
],
)
demo.launch(show_error=True)
|