from huggingface_hub import InferenceClient import requests from bs4 import BeautifulSoup import lxml import gradio as gr import os # Initialize the InferenceClient client = InferenceClient(token=os.getenv("HF_TOKEN")) secretkey = os.getenv("FMP_KEY") # BOT avatar for chat interface BOT_AVATAR = 'https://automatedstockmining.org/wp-content/uploads/2024/09/logo.webp' # API Documentation (placed outside the function) data = ''' # Stock List API stock_list_api = f"https://financialmodelingprep.com/api/v3/stock/list?apikey={secretkey}" # Exchange Traded Fund Search API etf_search_api = f"https://financialmodelingprep.com/api/v3/etf/list?apikey={secretkey}" # Statement Symbols List API statement_symbols_list_api = f"https://financialmodelingprep.com/api/v3/financial-statement-symbol-lists?apikey={secretkey}" # Tradable Search API tradable_search_api = f"https://financialmodelingprep.com/api/v3/available-traded/list?apikey={secretkey}" # Commitment of Traders Report API commitment_of_traders_report_api = f"https://financialmodelingprep.com/api/v4/commitment_of_traders_report/list?apikey={secretkey}" # CIK List API cik_list_api = f"https://financialmodelingprep.com/api/v3/cik_list?apikey={secretkey}" # Euronext Symbols API euronext_symbols_api = f"https://financialmodelingprep.com/api/v3/symbol/available-euronext?apikey={secretkey}" # Symbol Changes API symbol_changes_api = f"https://financialmodelingprep.com/api/v4/symbol_change?apikey={secretkey}" # Exchange Symbols API exchange_symbols_api = f"https://financialmodelingprep.com/api/v3/symbol/{exchange}?apikey={secretkey}" # Available Indexes API available_indexes_api = f"https://financialmodelingprep.com/api/v3/symbol/available-indexes?apikey={secretkey}" # Company Profile API company_profile_api = f"https://financialmodelingprep.com/api/v3/profile/{symbol}?apikey={secretkey}" # Executive Compensation API executive_compensation_api = f"https://financialmodelingprep.com/api/v4/governance/executive_compensation?symbol={symbol}&apikey={secretkey}" # Compensation Benchmark API compensation_benchmark_api = f"https://financialmodelingprep.com/api/v4/executive-compensation-benchmark?year={year}&apikey={secretkey}" # Company Notes API company_notes_api = f"https://financialmodelingprep.com/api/v4/company-notes?symbol={symbol}&apikey={secretkey}" # Historical Employee API historical_employee_api = f"https://financialmodelingprep.com/api/v4/historical/employee_count?symbol={symbol}&apikey={secretkey}" # Employee Count API employee_count_api = f"https://financialmodelingprep.com/api/v4/employee_count?symbol={symbol}&apikey={secretkey}" # Screener (Stock) API stock_screener_api = f"https://financialmodelingprep.com/api/v3/stock-screener?apikey={secretkey}" # Stock Grade API stock_grade_api = f"https://financialmodelingprep.com/api/v3/grade/{symbol}?apikey={secretkey}" # Executives API executives_api = f"https://financialmodelingprep.com/api/v3/key-executives/{symbol}?apikey={secretkey}" # Company Core Information Summary API company_core_info_summary_api = f"https://financialmodelingprep.com/api/v4/company-core-information?symbol={symbol}&apikey={secretkey}" # Market Cap API market_cap_api = f"https://financialmodelingprep.com/api/v3/market-capitalization/{symbol}?apikey={secretkey}" # Historical Market Cap API historical_market_cap_api = f"https://financialmodelingprep.com/api/v3/historical-market-capitalization/{symbol}?limit={limit}&from={start_date}&to={end_date}&apikey={secretkey}" # All Countries API all_countries_api = f"https://financialmodelingprep.com/api/v3/get-all-countries?apikey={secretkey}" # Analyst Estimates API analyst_estimates_api = f"https://financialmodelingprep.com/api/v3/analyst-estimates/{symbol}?apikey={secretkey}" # Analyst Recommendation API analyst_recommendation_api = f"https://financialmodelingprep.com/api/v3/analyst-stock-recommendations/{symbol}?apikey={secretkey}" # Company Logo API company_logo_api = f"https://financialmodelingprep.com/image-stock/{symbol}.png?apikey={secretkey}" # Company Outlook API company_outlook_api = f"https://financialmodelingprep.com/api/v4/company-outlook?symbol={symbol}&apikey={secretkey}" # Stock Peers API stock_peers_api = f"https://financialmodelingprep.com/api/v4/stock_peers?symbol={symbol}&apikey={secretkey}" # Holidays and Trading Hours API market_open_api = f"https://financialmodelingprep.com/api/v3/is-the-market-open?exchange={exchange}&apikey={secretkey}" # All Exchanges Trading Hours API all_exchanges_trading_hours_api = f"https://financialmodelingprep.com/api/v3/is-the-market-open-all?apikey={secretkey}" # Delisted Companies API delisted_companies_api = f"https://financialmodelingprep.com/api/v3/delisted-companies?apikey={secretkey}" # Company Share Float API company_share_float_api = f"https://financialmodelingprep.com/api/v4/shares_float?symbol={symbol}&apikey={secretkey}" # Historical Share Float API historical_share_float_api = f"https://financialmodelingprep.com/api/v4/historical/shares_float?symbol={symbol}&apikey={secretkey}" # All Shares Float API all_shares_float_api = f"https://financialmodelingprep.com/api/v4/shares_float/all?apikey={secretkey}" # All Available Sectors API available_sectors_api = f"https://financialmodelingprep.com/api/v3/sectors-list?apikey={secretkey}" # All Available Industries API available_industries_api = f"https://financialmodelingprep.com/api/v3/industries-list?apikey={secretkey}" # All Available Exchanges API available_exchanges_api = f"https://financialmodelingprep.com/api/v3/exchanges-list?apikey={secretkey}" # Full Quote API full_quote_api = f"https://financialmodelingprep.com/api/v3/quote/{symbol}?apikey={secretkey}" # Quote Order API quote_order_api = f"https://financialmodelingprep.com/api/v3/quote-order/{symbol}?apikey={secretkey}" # Simple Quote API simple_quote_api = f"https://financialmodelingprep.com/api/v3/quote-short/{symbol}?apikey={secretkey}" # OTC Quote API otc_quote_api = f"https://financialmodelingprep.com/api/v3/otc/real-time-price/{symbol}?apikey={secretkey}" # Exchange Prices API exchange_prices_api = f"https://financialmodelingprep.com/api/v3/quotes/{exchange}?apikey={secretkey}" # Stock Price Change API stock_price_change_api = f"https://financialmodelingprep.com/api/v3/stock-price-change/{symbol}?apikey={secretkey}" # Aftermarket Trade API aftermarket_trade_api = f"https://financialmodelingprep.com/api/v4/pre-post-market-trade/{symbol}?apikey={secretkey}" # Aftermarket Quote API aftermarket_quote_api = f"https://financialmodelingprep.com/api/v4/pre-post-market/{symbol}?apikey={secretkey}" # Batch Quote API batch_quote_api = f"https://financialmodelingprep.com/api/v4/batch-pre-post-market/{symbol}?apikey={secretkey}" # Batch Trade API batch_trade_api = f"https://financialmodelingprep.com/api/v4/batch-pre-post-market-trade/{symbol}?apikey={secretkey}" # Last Forex API last_forex_api = f"https://financialmodelingprep.com/api/v4/forex/last/{symbol}?apikey={secretkey}" # Live Full Price w/ Orders API live_full_price_api = f"https://financialmodelingprep.com/api/v3/stock/full/real-time-price/{symbol}?apikey={secretkey}" # All Live Full Price w/ Orders API all_live_full_price_api = f"https://financialmodelingprep.com/api/v3/stock/full/real-time-price?apikey={secretkey}" # Forex Prices API forex_prices_api = f"https://financialmodelingprep.com/api/v3/fx/{symbol}?apikey={secretkey}" # Ratios API ratios_api = f"https://financialmodelingprep.com/api/v3/ratios/{symbol}?period={period}&apikey={secretkey}" # Ratios TTM API ratios_ttm_api = f"https://financialmodelingprep.com/api/v3/ratios-ttm/{symbol}?apikey={secretkey}" # Cashflow Growth API cashflow_growth_api = f"https://financialmodelingprep.com/api/v3/cash-flow-statement-growth/{symbol}?period={period}&apikey={secretkey}" # Income Growth API income_growth_api = f"https://financialmodelingprep.com/api/v3/income-statement-growth/{symbol}?period={period}&apikey={secretkey}" # Balance Sheet Growth API balance_sheet_growth_api = f"https://financialmodelingprep.com/api/v3/balance-sheet-statement-growth/{symbol}?period={period}&apikey={secretkey}" # Financial Growth API financial_growth_api = f"https://financialmodelingprep.com/api/v3/financial-growth/{symbol}?period={period}&apikey={secretkey}" # Financial Score API financial_score_api = f"https://financialmodelingprep.com/api/v4/score?symbol={symbol}&apikey={secretkey}" # Owner Earnings API owner_earnings_api = f"https://financialmodelingprep.com/api/v4/owner_earnings?symbol={symbol}&apikey={secretkey}" # Enterprise Values API enterprise_values_api = f"https://financialmodelingprep.com/api/v3/enterprise-values/{symbol}/?period={period}&apikey={secretkey}" # Discounted Cashflow API discounted_cashflow_api = f"https://financialmodelingprep.com/api/v3/discounted-cash-flow/{symbol}?apikey={secretkey}" # Advanced DCF API advanced_dcf_api = f"https://financialmodelingprep.com/api/v4/advanced_discounted_cash_flow?symbol={symbol}&apikey={secretkey}" # Levered DCF API levered_dcf_api = f"https://financialmodelingprep.com/api/v4/advanced_levered_discounted_cash_flow?symbol={symbol}&apikey={secretkey}" # Company Rating API company_rating_api = f"https://financialmodelingprep.com/api/v3/rating/{symbol}?apikey={secretkey}" # FMP Articles API fmp_articles_api = f"https://financialmodelingprep.com/api/v3/fmp/articles?page={page}&size={size}&apikey={secretkey}" # General News API general_news_api = f"https://financialmodelingprep.com/api/v4/general_news?page={page}&apikey={secretkey}" # Stock News Sentiments RSS Feed API stock_news_sentiments_rss_api = f"https://financialmodelingprep.com/api/v4/stock-news-sentiments-rss-feed?page={page}&apikey={secretkey}" # Forex News API forex_news_api = f"https://financialmodelingprep.com/api/v4/forex_news?page={page}&apikey={secretkey}" # Crypto News API crypto_news_api = f"https://financialmodelingprep.com/api/v4/crypto_news?page={page}&apikey={secretkey}" # Press Releases API press_releases_api = f"https://financialmodelingprep.com/api/v3/press-releases?page={page}&apikey={secretkey}" # Press Releases By Symbol API press_releases_by_symbol_api = f"https://financialmodelingprep.com/api/v3/press-releases/{symbol}?apikey={secretkey}" # Historical Social Sentiment API historical_social_sentiment_api = f"https://financialmodelingprep.com/api/v4/historical/social-sentiment?symbol={symbol}&page={page}&apikey={secretkey}" # Trending Social Sentiment API trending_social_sentiment_api = f"https://financialmodelingprep.com/api/v4/social-sentiments/trending?type={type}&source={source}&apikey={secretkey}" # Social Sentiment Changes API social_sentiment_changes_api = f"https://financialmodelingprep.com/api/v4/social-sentiments/change?type={type}&source={source}&apikey={secretkey}" # Earnings Transcript API earnings_transcript_api = f"https://financialmodelingprep.com/api/v3/earning_call_transcript/{symbol}?year={year}&quarter={quarter}&apikey={secretkey}" # Transcript Dates API transcript_dates_api = f"https://financialmodelingprep.com/api/v4/earning_call_transcript?symbol={symbol}&apikey={secretkey}" # Batch Earning Call Transcript API batch_earning_call_transcript_api = f"https://financialmodelingprep.com/api/v4/batch_earning_call_transcript/{symbol}?year={year}&apikey={secretkey}" # RSS Feed API rss_feed_api = f"https://financialmodelingprep.com/api/v4/rss_feed?limit={limit}&type={type}&from={from_date}&to={to_date}&isDone={is_done}&apikey={secretkey}" # RSS Feed V3 API rss_feed_v3_api = f"https://financialmodelingprep.com/api/v3/rss_feed?page={page}&datatype=csv&apikey={secretkey}" # RSS Feed All API rss_feed_all_api = f"https://financialmodelingprep.com/api/v4/rss_feed_all?page={page}&apikey={secretkey}" # RSS Feed 8-K API rss_feed_8k_api = f"https://financialmodelingprep.com/api/v4/rss_feed_8k?apikey={secretkey}" # SEC Filings API sec_filings_api = f"https://financialmodelingprep.com/api/v3/sec_filings/{symbol}?type={type}&page={page}&apikey={secretkey}" # Individual Industry Classification API individual_industry_classification_api = f"https://financialmodelingprep.com/api/v4/standard_industrial_classification?symbol={symbol}&apikey={secretkey}" # All Industry Classification API all_industry_classification_api = f"https://financialmodelingprep.com/api/v4/standard_industrial_classification/all?apikey={secretkey}" # Industry Classification Codes API industry_classification_codes_api = f"https://financialmodelingprep.com/api/v4/standard_industrial_classification_list?apikey={secretkey}" # Earnings Calendar API earnings_calendar_api = f"https://financialmodelingprep.com/api/v3/earning_calendar?from={from_date}&to={to_date}&apikey={secretkey}" # Earnings Historical & Upcoming API earnings_historical_upcoming_api = f"https://financialmodelingprep.com/api/v3/historical/earning_calendar/{symbol}?apikey={secretkey}" # Earnings Confirmed API earnings_confirmed_api = f"https://financialmodelingprep.com/api/v4/earning-calendar-confirmed?from={from_date}&to={to_date}&apikey={secretkey}" # Earnings Surprises API earnings_surprises_api = f"https://financialmodelingprep.com/api/v3/earnings-surprises/{symbol}?apikey={secretkey}" # Dividends Calendar API dividends_calendar_api = f"https://financialmodelingprep.com/api/v3/stock_dividend_calendar?from={from_date}&to={to_date}&apikey={secretkey}" # Dividends Historical API dividends_historical_api = f"https://financialmodelingprep.com/api/v3/historical-price-full/stock_dividend/{symbol}?apikey={secretkey}" # Splits Calendar API splits_calendar_api = f"https://financialmodelingprep.com/api/v3/stock_split_calendar?from={from_date}&to={to_date}&apikey={secretkey}" # Splits Historical API splits_historical_api = f"https://financialmodelingprep.com/api/v3/historical-price-full/stock_split/{symbol}?apikey={secretkey}" # IPO Confirmed API ipo_confirmed_api = f"https://financialmodelingprep.com/api/v4/ipo-calendar-confirmed?from={from_date}&to={to_date}&apikey={secretkey}" # IPO Prospectus API ipo_prospectus_api = f"https://financialmodelingprep.com/api/v4/ipo-calendar-prospectus?apikey={secretkey}" # IPO Calendar By Symbol API ipo_calendar_by_symbol_api = f"https://financialmodelingprep.com/api/v3/ipo_calendar?apikey={secretkey}" # M&A RSS Feed API ma_rss_feed_api = f"https://financialmodelingprep.com/api/v4/mergers-acquisitions-rss-feed?page={page}&apikey={secretkey}" # Search M&A API search_ma_api = f"https://financialmodelingprep.com/api/v4/mergers-acquisitions/search?name={company_name}&apikey={secretkey}" # Intraday Chart API intraday_chart_api = f"https://financialmodelingprep.com/api/v3/historical-chart/5min/{symbol}?from={from_date}&to={to_date}&apikey={secretkey}" # Daily Chart EOD API daily_chart_eod_api = f"https://financialmodelingprep.com/api/v3/historical-price-full/{symbol}?apikey={secretkey}" # All Forex Prices API all_forex_prices_api = f"https://financialmodelingprep.com/api/v3/fx?apikey={secretkey}" # Simple Moving Average (SMA) API sma_api = f"https://financialmodelingprep.com/api/v3/technical_indicator/5min/{symbol}?type=sma&period={period}&apikey={secretkey}" # Exponential Moving Average (EMA) API ema_api = f"https://financialmodelingprep.com/api/v3/technical_indicator/5min/{symbol}?type=ema&period={period}&apikey={secretkey}" # Weighted Moving Average (WMA) API wma_api = f"https://financialmodelingprep.com/api/v3/technical_indicator/5min/{symbol}?type=wma&period={period}&apikey={secretkey}" # Double Exponential Moving Average (DEMA) API dema_api = f"https://financialmodelingprep.com/api/v3/technical_indicator/5min/{symbol}?type=dema&period={period}&apikey={secretkey}" # Triple Exponential Moving Average (TEMA) API tema_api = f"https://financialmodelingprep.com/api/v3/technical_indicator/5min/{symbol}?type=tema&period={period}&apikey={secretkey}" # Williams %R Indicator API williams_api = f"https://financialmodelingprep.com/api/v3/technical_indicator/5min/{symbol}?type=williams&period={period}&apikey={secretkey}" # Relative Strength Index (RSI) API rsi_api = f"https://financialmodelingprep.com/api/v3/technical_indicator/5min/{symbol}?type=rsi&period={period}&apikey={secretkey}" # Average Directional Index (ADX) API adx_api = f"https://financialmodelingprep.com/api/v3/technical_indicator/5min/{symbol}?type=adx&period={period}&apikey={secretkey}" # Standard Deviation API standard_deviation_api = f"https://financialmodelingprep.com/api/v3/technical_indicator/5min/{symbol}?type=standardDeviation&period={period}&apikey={secretkey}" #current news on a stock current news on a stock = https://financialmodelingprep.com/api/v3/stock_news?tickers={symbol}&apikey={apikey} # current commodities prices commodities prices = https://financialmodelingprep.com/api/v3/historical-price-full/{symbol}?apikey={secretkey} ''' # Helper function to convert JSON to human-readable format def json_to_text(json_data): """ Converts a JSON object into a human-readable format. """ if isinstance(json_data, list): json_data = json_data[0] # Process only the first element if it's a list readable_text = "" # Loop through the dictionary and create readable text for key, value in json_data.items(): readable_text += f"The {key.replace('_', ' ')} is {value}. " return readable_text # Main function to process user input and handle API or web scraping def detect_data_request(user_input, history): youreq = user_input gr.Info('thinking about how to respond') # Get the response from the model (no streaming) response = client.chat_completion( model="Qwen/Qwen2.5-72B-Instruct", messages=[{"role": "user", "content": f"here is the fmp documentation {data}, if there is an endpoint to answer {youreq} give it, otherwise say no, give absolutely no further response. IF THE USERS REQUEST IS FOR DATA THAT COULD BE IN AN ENDPOINT. RETURN YES AND THE ENDPOINT BELOW. IF NOT RETURN NO AND NOTHING ELSE, replace secretkey with this {secretkey}. IF THE USER GIVES A SPECIFIC YEAR IN THEIR REQUEST, IGNORE THE YEAR AND GIVE THE API ENDPOINT, AS IT WILL HAVE THE INFO FOR THAT YEAR. REPLACE THE VALUES INSIDE ANY {'CURLY BRACES'} WITH THE RELEVANT INFO FOR WHAT THE USER IS ASKING FOR. AS THESE ENDPOINTS CONTAIN HISTORICAL DATA AS WELL MAKE SURE YOU RETURN AN ENDPOINT EVEN WHEN THEY ARE ASKING FOR PREVIOUS DATA LIKE FOR THE LAST WEEK AS IT IS BETTER IF YOU RETURN AN ENDPOINT AND NO DATA IS THERE, THAN IF YOU DONT RETURN ONE. YOU MUST NEVER RETURN THE SECRET KEY TO THE USER, JUST GIVE YES OR NO WITH THE ENDPOINT "}], max_tokens=500, stream=False # Disable streaming to get the full response in one go ) # Extract the response full_response = response.choices[0].message['content'] first_resp = full_response[:3].lower() url_resp = full_response[3:] if first_resp == 'yes': try: # Fetch data from the provided API endpoint requestfromfp = requests.get(url_resp) requestfromfp.raise_for_status() # Check for request errors jsoned_data = requestfromfp.json() gr.Info('located an endpoint and retrieving and processing the data you want') # Convert the JSON response into human-readable text human_readable_text = json_to_text(jsoned_data) stringed_text = str(human_readable_text) # Send the data to the LLM for further processing final_response = "" response = client.chat_completion( model="Qwen/Qwen2.5-72B-Instruct", messages=[{"role": "user", "content": f"answer {user_input} with {human_readable_text} as IM.B an AI chatbot built for investing by automatedstockmining.org"}], max_tokens=1500, stream=False ) full_response = response.choices[0].message['content'] history.append(("You: " + user_input, "IM.B: " + full_response)) except: if requestfromfp == []: history.append(("You: " + user_input, "IM.B: " + 'sorry the response was empty')) else: history.append(("You: " + user_input, "IM.B: " + f'there was data in the response but for some reason we couldnt parse it {human_readable_text}')) else: # If no data endpoint exists, switch to scraping a valid webpage response = client.chat_completion( model="Qwen/Qwen2.5-72B-Instruct", messages=[{"role": "user", "content": f"You are an assistant that detects whether the user is asking for data or not. Here is their request: {youreq}. You respond 'yes' if they are and 'no' if not. If yes, then in the second line provide the exact URL, not an API, a valid webpage which is definitely there and easy to scrape. If no, only respond with 'no' and nothing else."}], max_tokens=1500, stream=False ) full_response = response.choices[0].message['content'] if "yes" in full_response.lower(): url = full_response[3:] # Extract the URL part try: gr.Info('searching the web sites that may contain the dat you want') request = requests.get(url) request.raise_for_status() soup_of_data = BeautifulSoup(request.text, 'lxml') tags = ['body'] listed_data = soup_of_data.find_all(tags) # Extract text from relevant tags extracted_content = ''.join([element.get_text(separator=" ", strip=True) for element in listed_data[:100]]) response = client.chat_completion( model="Qwen/Qwen2.5-72B-Instruct", messages=[{"role": "user", "content": f"you are IM.B, an intelligent investing AI model built by automatedstockmining.org, answer this question: {youreq} with this data {extracted_content}, if the data is not there say to the user: sorry, looks like there was error processing the data on our end, please rephrase question, referencing specific websites you want the data from"}], max_tokens=1500, stream=False ) final_response = response.choices[0].message['content'] history.append(("You: " + user_input, "IM.B: " + final_response)) except requests.exceptions.RequestException as e: history.append(("You: " + user_input, f"IM.B: Error fetching URL: {e}")) else: gr.Info('getting your response ready') response = client.chat_completion( model="mistralai/Mistral-7B-Instruct-v0.3", messages=[{"role": "user", "content": f"you are IM.B, an intelligent investing AI model built by automatedstockmining.org however you answer whatever the user requests, answer this question as IM.B, {youreq}, tell the user that you have access to real time data so that if they want some real time data, just ask for it"}], max_tokens=1500, stream=False ) full_response = response.choices[0].message['content'] history.append(("You: " + user_input, "IM.B: " + full_response)) return history, "" # Clear the input box # Function to clear the chat history def clear_history(): return [], "" # Function to undo the last user-bot message pair def undo_last(history): if len(history) > 0: history.pop() # Remove the last user-bot message pair return history, "" # Gradio UI setup with gr.Blocks() as demo: gr.Markdown("