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() |