Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import requests | |
| import os | |
| from dotenv import load_dotenv | |
| from openai import OpenAI | |
| # Load environment variables from .env file | |
| load_dotenv() | |
| # Get API keys from environment variables | |
| ALPHA_VANTAGE_API_KEY = os.getenv('ALPHA_VANTAGE_API_KEY') | |
| OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') | |
| # Validate API keys | |
| if not ALPHA_VANTAGE_API_KEY or not OPENAI_API_KEY: | |
| raise ValueError("Missing API keys. Please check your .env file.") | |
| # Configure OpenAI | |
| client = OpenAI(api_key=OPENAI_API_KEY) | |
| def get_stock_price(symbol): | |
| """Fetch stock price from Alpha Vantage API""" | |
| if not symbol: | |
| return "Please enter a stock symbol" | |
| url = f"https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol={symbol}&apikey={ALPHA_VANTAGE_API_KEY}" | |
| response = requests.get(url) | |
| data = response.json() | |
| if "Global Quote" in data and "05. price" in data["Global Quote"]: | |
| return float(data["Global Quote"]["05. price"]) | |
| elif "Note" in data: # API rate limit message | |
| return "API rate limit reached. Please try again in a minute." | |
| return "Stock symbol not found" | |
| def get_ai_analysis(company_name): | |
| """Get AI analysis using GPT-3.5""" | |
| prompt = f""" | |
| Provide a brief analysis of {company_name} as a long-term investment. | |
| Consider historical milestones, recent announcements, and market position. | |
| Keep the response under 150 words. | |
| """ | |
| response = client.chat.completions.create( | |
| model="gpt-3.5-turbo", | |
| messages=[ | |
| {"role": "system", "content": "You are a financial analyst providing brief stock analyses."}, | |
| {"role": "user", "content": prompt} | |
| ] | |
| ) | |
| return response.choices[0].message.content | |
| def get_stock_symbol(company_name): | |
| """Convert company name to stock symbol using GPT-3.5""" | |
| prompt = f""" | |
| What is the stock symbol for {company_name}? | |
| Provide only the symbol without any additional text or explanation. | |
| For example, if asked about Apple, respond with: AAPL | |
| """ | |
| try: | |
| response = client.chat.completions.create( | |
| model="gpt-3.5-turbo", | |
| messages=[ | |
| {"role": "system", "content": "You are a financial expert. Respond only with stock symbols in capital letters."}, | |
| {"role": "user", "content": prompt} | |
| ] | |
| ) | |
| return response.choices[0].message.content.strip() | |
| except Exception as e: | |
| return None | |
| def analyze_stock(company_input): | |
| """Main function to process user input and return results""" | |
| try: | |
| # Convert company name to symbol if needed | |
| if not company_input.isupper() or len(company_input.split()) > 1: | |
| symbol = get_stock_symbol(company_input) | |
| if not symbol: | |
| return "Could not determine stock symbol", "Please try entering the stock symbol directly" | |
| else: | |
| symbol = company_input | |
| # Get stock price | |
| price = get_stock_price(symbol) | |
| # Get AI analysis | |
| analysis = get_ai_analysis(company_input) | |
| return f"${price:.2f}" if isinstance(price, float) else price, analysis | |
| except Exception as e: | |
| return str(e), "Error occurred while analyzing the stock" | |
| # Update Gradio interface | |
| iface = gr.Interface( | |
| fn=analyze_stock, | |
| inputs=[ | |
| gr.Textbox(label="Enter Company Name or Symbol (e.g., 'Apple' or 'AAPL')", placeholder="Enter company name or stock symbol...") | |
| ], | |
| outputs=[ | |
| gr.Textbox(label="Current Stock Price"), | |
| gr.Textbox(label="AI Analysis", lines=5) | |
| ], | |
| title="Stock Analysis Assistant", | |
| description="Get real-time stock prices and AI-powered investment analysis", | |
| theme=gr.themes.Soft() | |
| ) | |
| # Launch the application | |
| if __name__ == "__main__": | |
| iface.launch() |