Spaces:
Running
Running
| import streamlit as st | |
| import plotly.graph_objs as go | |
| import plotly.express as px | |
| from plotly.subplots import make_subplots | |
| from main import CryptoCrew | |
| import time | |
| import os | |
| import pandas as pd | |
| st.set_page_config(page_title="Advanced Crypto Analyst", page_icon="π", layout="wide") | |
| # Custom CSS for better styling | |
| st.markdown(""" | |
| <style> | |
| .metric-card { | |
| background-color: #f0f2f6; | |
| padding: 1rem; | |
| border-radius: 0.5rem; | |
| margin: 0.5rem 0; | |
| } | |
| .positive { color: #00ff00; } | |
| .negative { color: #ff0000; } | |
| .neutral { color: #808080; } | |
| </style> | |
| """, unsafe_allow_html=True) | |
| st.title("β‘ Advanced Crypto Analyst") | |
| st.markdown("*Powered by Together AI with Enhanced Multi-Agent Analysis*") | |
| # Enhanced caching with longer TTL for detailed analysis | |
| # Cache for 10 minutes | |
| def analyze_crypto(crypto_name): | |
| crypto_crew = CryptoCrew(crypto_name.lower()) | |
| return crypto_crew.run() | |
| # Input section | |
| col1, col2 = st.columns([3, 1]) | |
| with col1: | |
| crypto = st.text_input("Enter cryptocurrency name:", placeholder="bitcoin, ethereum, solana, cardano...") | |
| with col2: | |
| st.markdown("<br>", unsafe_allow_html=True) | |
| analyze_btn = st.button("π Analyze", type="primary", use_container_width=True) | |
| if analyze_btn and crypto: | |
| start_time = time.time() | |
| with st.spinner("π Performing comprehensive analysis... This may take 30-60 seconds for detailed results!"): | |
| try: | |
| result = analyze_crypto(crypto) | |
| end_time = time.time() | |
| # Enhanced header metrics | |
| st.markdown("## π Analysis Dashboard") | |
| col1, col2, col3, col4 = st.columns(4) | |
| with col1: | |
| st.metric("Analysis Time", f"{end_time - start_time:.1f}s", "β Complete") | |
| with col2: | |
| rec = result.get("recommendation", {}).get("action", "HOLD") | |
| confidence = result.get("recommendation", {}).get("confidence", "Medium") | |
| st.metric("Recommendation", rec, f"Confidence: {confidence}") | |
| with col3: | |
| risk = result.get("risk_assessment", "Moderate Risk") | |
| st.metric("Risk Level", risk) | |
| with col4: | |
| last_updated = result.get("last_updated", "Unknown") | |
| st.metric("Last Updated", last_updated.split()[1] if " " in last_updated else "N/A") | |
| # Market Data Section | |
| st.markdown("## π° Market Metrics") | |
| market_data = result.get("market_data", {}) | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| price = market_data.get("current_price", "N/A") | |
| price_change_24h = market_data.get("price_change_24h", "N/A") | |
| st.metric("Current Price", price, price_change_24h) | |
| with col2: | |
| market_cap = market_data.get("market_cap", "N/A") | |
| st.metric("Market Cap", market_cap) | |
| with col3: | |
| volume_24h = market_data.get("volume_24h", "N/A") | |
| st.metric("24h Volume", volume_24h) | |
| col4, col5, col6 = st.columns(3) | |
| with col4: | |
| price_change_7d = market_data.get("price_change_7d", "N/A") | |
| st.metric("7-Day Change", price_change_7d) | |
| with col5: | |
| dominance = market_data.get("market_dominance", "N/A") | |
| st.metric("Market Dominance", dominance) | |
| with col6: | |
| st.metric("Analysis Depth", "Advanced", "π― Multi-Agent") | |
| # Technical Analysis Section | |
| st.markdown("## π Technical Analysis") | |
| technical_data = result.get("technical_data", {}) | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| rsi = technical_data.get("rsi", "N/A") | |
| rsi_signal = technical_data.get("rsi_signal", "Neutral") | |
| st.metric("RSI (14)", rsi, rsi_signal) | |
| trend = technical_data.get("trend", "Neutral") | |
| st.metric("Current Trend", trend) | |
| with col2: | |
| ma_7d = technical_data.get("moving_average_7d", "N/A") | |
| st.metric("7-Day MA", ma_7d) | |
| support = technical_data.get("support_level", "N/A") | |
| resistance = technical_data.get("resistance_level", "N/A") | |
| st.metric("Support | Resistance", f"{support} | {resistance}") | |
| # Enhanced Sentiment Analysis with Fixed Chart | |
| st.markdown("## π Multi-Source Sentiment Analysis") | |
| sentiment_data = result.get("sentiment", {}) | |
| # Create properly differentiated sentiment chart | |
| categories = list(sentiment_data.keys()) | |
| values = [] | |
| colors = [] | |
| sentiment_texts = [] | |
| for category, sentiment in sentiment_data.items(): | |
| sentiment_texts.append(sentiment) | |
| if sentiment == "Positive": | |
| values.append(1) | |
| colors.append('#00C851') # Green | |
| elif sentiment == "Negative": | |
| values.append(-1) | |
| colors.append('#FF4444') # Red | |
| else: | |
| values.append(0) | |
| colors.append('#FFBB33') # Orange for neutral | |
| # Create sentiment visualization | |
| fig = go.Figure(data=[go.Bar( | |
| x=categories, | |
| y=values, | |
| marker_color=colors, | |
| text=sentiment_texts, | |
| textposition='auto', | |
| hovertemplate='<b>%{x}</b><br>Sentiment: %{text}<br>Score: %{y}<extra></extra>' | |
| )]) | |
| fig.update_layout( | |
| title="Sentiment Distribution Across Sources", | |
| xaxis_title="Analysis Source", | |
| yaxis_title="Sentiment Score", | |
| yaxis=dict( | |
| tickvals=[-1, 0, 1], | |
| ticktext=["Negative", "Neutral", "Positive"], | |
| range=[-1.2, 1.2] | |
| ), | |
| height=500, | |
| showlegend=False, | |
| plot_bgcolor='rgba(0,0,0,0)', | |
| paper_bgcolor='rgba(0,0,0,0)' | |
| ) | |
| st.plotly_chart(fig, use_container_width=True) | |
| # Sentiment Details | |
| col1, col2, col3, col4 = st.columns(4) | |
| sentiments = ["overall", "social_media", "news", "community"] | |
| columns = [col1, col2, col3, col4] | |
| for sentiment_type, col in zip(sentiments, columns): | |
| sentiment_val = sentiment_data.get(sentiment_type, "Neutral") | |
| color_class = "positive" if sentiment_val == "Positive" else "negative" if sentiment_val == "Negative" else "neutral" | |
| col.markdown(f"**{sentiment_type.replace('_', ' ').title()}**") | |
| col.markdown(f'<span class="{color_class}">{sentiment_val}</span>', unsafe_allow_html=True) | |
| # Investment Recommendation Section | |
| st.markdown("## π― Investment Recommendation") | |
| recommendation = result.get("recommendation", {}) | |
| action = recommendation.get("action", "HOLD") | |
| confidence = recommendation.get("confidence", "Medium") | |
| reasoning = recommendation.get("reasoning", "Standard analysis completed") | |
| # Color-coded recommendation | |
| rec_colors = {"BUY": "π’", "SELL": "π΄", "HOLD": "π‘"} | |
| rec_bg_colors = {"BUY": "#d4edda", "SELL": "#f8d7da", "HOLD": "#fff3cd"} | |
| st.markdown(f""" | |
| <div style="background-color: {rec_bg_colors.get(action, '#f8f9fa')}; | |
| padding: 1rem; border-radius: 0.5rem; margin: 1rem 0;"> | |
| <h3>{rec_colors.get(action, 'π‘')} Investment Recommendation: {action}</h3> | |
| <p><strong>Confidence Level:</strong> {confidence}</p> | |
| <p><strong>Reasoning:</strong> {reasoning}</p> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| # Additional recommendation details | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| time_horizon = recommendation.get("time_horizon", "Medium-term") | |
| st.info(f"**Time Horizon:** {time_horizon}") | |
| with col2: | |
| risk_level = recommendation.get("risk_level", "Moderate") | |
| st.info(f"**Risk Level:** {risk_level}") | |
| with col3: | |
| st.info(f"**Analysis Type:** Multi-Agent AI") | |
| # Detailed Analysis Summary | |
| st.markdown("## π Detailed Analysis Summary") | |
| with st.expander("View Full Analysis Report", expanded=False): | |
| st.write(result.get("summary", "No detailed summary available")) | |
| # Risk Assessment | |
| st.markdown("## β οΈ Risk Assessment") | |
| st.warning(f"**Risk Level:** {result.get('risk_assessment', 'Moderate Risk')}") | |
| except Exception as e: | |
| st.error(f"Analysis failed: {str(e)}") | |
| st.info(""" | |
| π‘ **Troubleshooting Tips:** | |
| - Use full cryptocurrency names (e.g., 'bitcoin' not 'btc') | |
| - Ensure your API key is properly configured | |
| - Try again if the analysis times out | |
| - Check network connectivity | |
| """) | |
| # Enhanced Sidebar | |
| with st.sidebar: | |
| st.header("βοΈ System Status") | |
| # API Status Check | |
| api_key_status = "β Connected" if os.getenv("TOGETHER_API_KEY") else "β Missing API Key" | |
| st.write(f"**Together AI:** {api_key_status}") | |
| if not os.getenv("TOGETHER_API_KEY"): | |
| st.error("Add TOGETHER_API_KEY to your environment variables") | |
| else: | |
| st.success("API Configuration Valid") | |
| st.markdown("---") | |
| st.markdown("### π Analysis Features") | |
| st.markdown(""" | |
| β **Market Data Analysis** | |
| - Real-time price & volume | |
| - Market cap & dominance | |
| - Price change tracking | |
| β **Technical Analysis** | |
| - RSI & Moving Averages | |
| - Support/Resistance levels | |
| - Trend identification | |
| β **Sentiment Analysis** | |
| - Social media monitoring | |
| - News sentiment tracking | |
| - Community analysis | |
| β **AI Recommendations** | |
| - Multi-agent analysis | |
| - Risk assessment | |
| - Entry/exit strategies | |
| """) | |
| st.markdown("---") | |
| st.markdown("### β‘ Performance") | |
| st.markdown(""" | |
| - **Analysis Time:** 30-60s | |
| - **Model:** Llama 3.1 8B Turbo | |
| - **Agents:** 3 Specialized AI Agents | |
| - **Data Sources:** Multiple APIs | |
| """) | |
| # Footer | |
| st.markdown("---") | |
| st.markdown("### π Advanced Analytics Dashboard") | |
| cols = st.columns(4) | |
| with cols[0]: | |
| st.metric("AI Agents", "3", "π€ Specialized") | |
| with cols[1]: | |
| st.metric("Data Sources", "Multiple", "π Real-time") | |
| with cols[2]: | |
| st.metric("Analysis Depth", "Professional", "β Institutional Grade") | |
| with cols[3]: | |
| st.metric("Update Frequency", "Real-time", "π Live Data") | |