Spaces:
Sleeping
Sleeping
from typing import final | |
import gradio as gr | |
import os | |
import json | |
from bs4 import BeautifulSoup | |
import requests | |
from huggingface_hub import InferenceClient | |
# Define global variables | |
BOT_AVATAR = 'https://automatedstockmining.org/wp-content/uploads/2024/08/south-west-value-mining-logo.webp' | |
hf_token = os.getenv("HF_TOKEN") | |
client = InferenceClient(token=hf_token) | |
custom_css = ''' | |
.gradio-container { | |
font-family: 'Roboto', sans-serif; | |
} | |
.main-header { | |
text-align: center; | |
color: #4a4a4a; | |
margin-bottom: 2rem; | |
} | |
.tab-header { | |
font-size: 1.2rem; | |
font-weight: bold; | |
margin-bottom: 1rem; | |
} | |
.custom-chatbot { | |
border-radius: 10px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
} | |
.custom-button { | |
background-color: #3498db; | |
color: white; | |
border: none; | |
padding: 10px 20px; | |
border-radius: 5px; | |
cursor: pointer; | |
transition: background-color 0.3s ease; | |
} | |
.custom-button:hover { | |
background-color: #2980b9; | |
} | |
''' | |
def extract_text_from_webpage(html): | |
soup = BeautifulSoup(html, "html.parser") | |
for script in soup(["script", "style"]): | |
script.decompose() | |
visible_text = soup.get_text(separator=" ", strip=True) | |
return visible_text | |
def search(query): | |
term = query | |
max_chars_per_page = 8000 | |
all_results = [] | |
with requests.Session() as session: | |
try: | |
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": 4}, | |
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) | |
if link: | |
link = link["href"] | |
try: | |
webpage = session.get(link, headers={"User-Agent": "Mozilla/5.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 as e: | |
print(f"Failed to retrieve {link}: {e}") | |
all_results.append({"link": link, "text": None}) | |
except requests.exceptions.RequestException as e: | |
print(f"Google search failed: {e}") | |
return all_results | |
def process_query(user_input, history): | |
gr.Info('ℹ️ thinking...',duration = 6) | |
# Start with a system message | |
messages = [{'role': 'system', 'content': "YOU ARE IM.X, AN INVESTMENT CHATBOT BUILT BY automatedstockmining.org. "}] | |
# Append history to messages | |
for user, assistant in history: | |
messages.append({'role': 'user', 'content': user}) | |
messages.append({'role': 'assistant', 'content': assistant}) | |
messages.append({'role': 'user', 'content': user_input}) | |
# Perform the web search based on user input | |
search_results = search(user_input) | |
search_results_str = json.dumps(search_results) | |
# Create completion request to HuggingFace client | |
response = client.chat_completion( | |
model="Qwen/Qwen2.5-72B-Instruct", | |
messages=[{"role": "user", "content": f"YOU ARE IM.X, AN INVESTMENT CHATBOT BUILT BY automatedstockmining.org. Answer the user's request '{user_input}' using the following information: {search_results_str} and the chat history{history}. Provide a concise, direct answer in no more than 2-3 sentences. use the appropriate emojis for some of your responses"}], | |
max_tokens=400, | |
stream=True | |
) | |
final_response = "" | |
for chunk in response: | |
content = chunk.choices[0].delta.content or '' | |
final_response += content | |
yield final_response # Yield the accumulated response for real-time streaming | |
theme = gr.themes.Citrus( | |
primary_hue="blue", | |
neutral_hue="slate", | |
) | |
examples = [ | |
["What's the current price of bitcoin"], | |
["What's the latest news on Cisco Systems stock"], | |
["Analyze technical indicators for Adobe, are they presenting buy or sell signals"], | |
["What's the current price of Apple stock"], | |
["What are the best stocks to buy this month"], | |
["What companies report earnings this week"], | |
["What's Apple's current market cap"] | |
] | |
chatbot = gr.Chatbot( | |
label="IM.S", | |
avatar_images=[None, BOT_AVATAR], | |
show_copy_button=True, | |
layout="panel", | |
height = 600 | |
) | |
gr.ChatInterface( | |
theme = theme, | |
fn=process_query, | |
chatbot=chatbot, | |
examples=examples, | |
).launch() | |