IM.S / app.py
James MacQuillan
push
fd6c6c7
raw
history blame
4.99 kB
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()