File size: 8,245 Bytes
04a0510
380991e
 
 
 
04a0510
fd6c6c7
380991e
 
fd6c6c7
0401525
 
 
380991e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1067ef6
380991e
 
0401525
380991e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4f30126
0401525
1067ef6
4f30126
 
714c540
 
4f30126
714c540
 
 
4f30126
 
 
714c540
 
4f30126
714c540
4f30126
1067ef6
4f30126
 
 
714c540
a3fb953
4f30126
0401525
 
ffb6bce
585a4e3
0401525
 
4f30126
1067ef6
4f30126
 
0401525
 
 
 
4f30126
380991e
 
 
 
04a0510
 
0401525
1067ef6
0401525
1067ef6
4f30126
1067ef6
 
 
4f30126
 
1067ef6
4f30126
 
 
 
 
 
1067ef6
 
 
 
 
 
 
 
0401525
 
 
 
 
 
 
714c540
 
 
4f30126
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
714c540
4f30126
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
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": 7},
                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):
    yield 'Preparing your request 🛠️'
    
    # Step 1: Generate a search term based on the user query
    stream_search = client.chat_completion(
        model="Qwen/Qwen2.5-72B-Instruct",
        messages=[{"role": "user", "content": f"Based on this chat history {history} and the user's request '{user_input}', suggest a Google search term in a single line without specific dates; use 'this year', 'this month', etc. INCLUDE NOTHING IN YOUR RESPONSE EXCEPT THE RELEVANT SEARCH RESULT. EXAMPLE: USER: WHAT IS THE CURRENT PRICE OF COCA COLA STOCK. YOUR RESPONSE: WHAT IS THE CURRENT PRICE OF COCA COLA STOCK"}],
        max_tokens=400,
        stream=True
    )
    
    # Collect the search term
    search_query = ""
    for chunk in stream_search:
        content = chunk.choices[0].delta.content or ''
        search_query += content

    # Step 2: Perform the web search with the generated term
    yield 'Searching the web for relevant information 🌐'
    search_results = search(search_query)
    
    # Format results as a JSON string for model input
    search_results_str = json.dumps(search_results)
    
    # Step 3: Generate a response using the search results
    response = client.chat_completion(
        model="Qwen/Qwen2.5-72B-Instruct",
        messages=[{"role": "user", "content": f"Using the search results: {search_results_str} and chat history {history}, answer the user's query '{user_input}' concisely, using numerical data if available. if they are just making conversation, respond normally, without the data "}],
        max_tokens=3000,
        stream=True
    )

    yield "Analyzing the search results and crafting a response 📊"
    
    # Stream final response
    final_response = ""
    for chunk in response:
        content = chunk.choices[0].delta.content or ''
        final_response += content
        yield final_response

theme = gr.themes.Citrus(
    primary_hue="blue",
    neutral_hue="slate",
)

examples = [
    ["whats the trending social sentiment like for Nvidia"],
    ["What's the latest news on Cisco Systems stock"],
    ["Analyze technical indicators for Adobe, are they presenting buy or sell signals"],
    ["Write me a smart sheet on the trending social sentiment and technical indicators for Nvidia"],
    ["What are the best stocks to buy this month"],
    ["What companies report earnings this week"],
    ["What's Apple's current market cap"],
    ["Analyze the technical indicators for Apple"],
    ["Build an intrinsic value model for Apple"],
    ["Make a table of Apple's stock price for the last 3 days"],
    ["What is Apple's PE ratio and how does it compare to other companies in consumer electronics"],
    ["How did Salesforce perform in its last earnings?"],
    ["What is the average analyst price target for Nvidia"],
    ["What is the outlook for the stock market in 2025"],
    ["When does Nvidia next report earnings"],
    ["What are the latest products from Apple"],
    ["What is Tesla's current price-to-earnings ratio and how does it compare to other car manufacturers?"],
    ["List the top 5 performing stocks in the S&P 500 this month"],
    ["What is the dividend yield for Coca-Cola?"],
    ["Which companies in the tech sector are announcing dividends this month?"],
    ["Analyze the latest moving averages for Microsoft; are they indicating a trend reversal?"],
    ["What is the latest guidance on revenue for Meta?"],
    ["What is the current beta of Amazon stock and how does it compare to the industry average?"],
    ["What are the top-rated ETFs for technology exposure this quarter?"]
]

chatbot = gr.Chatbot(
    label="IM.S",
    avatar_images=[None, BOT_AVATAR],
    show_copy_button=True,
    layout="panel",
    height=700
)

with gr.Blocks(theme=theme) as demo:
    with gr.Column():
        gr.Markdown("## IM.S - Building the Future of Investing")
    
    with gr.Column(scale=3, min_width=600):
        chat_interface = gr.ChatInterface(
            fn=process_query,
            chatbot=chatbot,
            examples=examples
        )
    
    with gr.Column():
        gr.Markdown('''
        **Disclaimer**: The information provided by IM.S is for educational and informational purposes only and does not constitute financial, investment, or professional advice. By using this service, you acknowledge and agree that all decisions you make based on the information provided are made at your own risk. Neither IM.S nor quantineuron.com is liable for any financial losses or damages resulting from reliance on information provided by this chatbot.

        By using IM.S, you agree to be bound by quantineuron.com’s [Terms of Service](https://quantineuron.com/disclaimer-statement/), [Terms and Conditions](https://quantineuron.com/terms-and-conditions/), [Data Protection and Privacy Policy](https://quantineuron.com/data-protection-and-privacy-policy/), [our discalimer statement](https://quantineuron.com/disclaimer-statement/) and this Disclaimer Statement. We recommend reviewing these documents carefully. Your continued use of this service confirms your acceptance of these terms and conditions, and it is your responsibility to stay informed of any updates or changes.

        **Important Note**: Investing in financial markets carries risk, and it is possible to lose some or all of the invested capital. Always consider seeking advice from a qualified financial advisor.
        ''')

demo.launch()