import streamlit as st import requests import os import json import pandas as pd import plotly.graph_objects as go # Function to call the Together AI model for the initial analysis def call_ai_model_initial(all_message): url = "https://api.together.xyz/v1/chat/completions" payload = { "model": "NousResearch/Nous-Hermes-2-Yi-34B", "temperature": 1.05, "top_p": 0.9, "top_k": 50, "repetition_penalty": 1, "n": 1, "messages": [{"role": "user", "content": all_message}], "stream_tokens": True, } TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY') if TOGETHER_API_KEY is None: raise ValueError("TOGETHER_API_KEY environment variable not set.") headers = { "accept": "application/json", "content-type": "application/json", "Authorization": f"Bearer {TOGETHER_API_KEY}", } response = requests.post(url, json=payload, headers=headers, stream=True) response.raise_for_status() # Ensure HTTP request was successful return response # Function to call the Together AI model for analyzing the text and computing performance score def call_ai_model_analysis(analysis_text): url = "https://api.together.xyz/v1/chat/completions" payload = { "model": "NousResearch/Nous-Hermes-2-Yi-34B", "temperature": 1.05, "top_p": 0.9, "top_k": 50, "repetition_penalty": 1, "n": 1, "messages": [{"role": "user", "content": analysis_text}], "stream_tokens": True, } TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY') if TOGETHER_API_KEY is None: raise ValueError("TOGETHER_API_KEY environment variable not set.") headers = { "accept": "application/json", "content-type": "application/json", "Authorization": f"Bearer {TOGETHER_API_KEY}", } response = requests.post(url, json=payload, headers=headers, stream=True) response.raise_for_status() # Ensure HTTP request was successful return response # Streamlit app layout st.title("Climate Impact on Sports Performance and Infrastructure") st.write("Analyze and visualize the impact of climate conditions on sports performance and infrastructure.") # Inputs for climate conditions temperature = st.number_input("Temperature (°C):", min_value=-50, max_value=50, value=25) humidity = st.number_input("Humidity (%):", min_value=0, max_value=100, value=50) wind_speed = st.number_input("Wind Speed (km/h):", min_value=0.0, max_value=200.0, value=15.0) uv_index = st.number_input("UV Index:", min_value=0, max_value=11, value=5) air_quality_index = st.number_input("Air Quality Index:", min_value=0, max_value=500, value=100) precipitation = st.number_input("Precipitation (mm):", min_value=0.0, max_value=500.0, value=10.0) atmospheric_pressure = st.number_input("Atmospheric Pressure (hPa):", min_value=900, max_value=1100, value=1013) # Sports and athlete inputs sports = st.multiselect("Select sports:", ["Football", "Tennis", "Athletics", "Swimming", "Basketball", "Golf"]) athlete_types = st.multiselect("Select athlete types:", ["Professional", "Amateur", "Youth", "Senior"]) # Infrastructure inputs infrastructure_types = st.multiselect("Select infrastructure types:", ["Outdoor Stadium", "Indoor Arena", "Swimming Pool", "Tennis Court", "Golf Course"]) if st.button("Generate Prediction"): all_message = ( f"Assess the impact on sports performance, athletes, and infrastructure based on climate conditions: " f"Temperature {temperature}°C, Humidity {humidity}%, Wind Speed {wind_speed} km/h, UV Index {uv_index}, " f"Air Quality Index {air_quality_index}, Precipitation {precipitation} mm, Atmospheric Pressure {atmospheric_pressure} hPa. " f"Sports: {', '.join(sports)}. Athlete types: {', '.join(athlete_types)}. " f"Infrastructure types: {', '.join(infrastructure_types)}. " f"Provide a detailed analysis of how these conditions affect performance, health, and infrastructure. " f"Include specific impacts for each sport, athlete type, and infrastructure type. " f"Also, provide an overall performance score and an infrastructure impact score, both as percentages. Lastly i need you organize everything in tables, not random paragraphs and do your best to be accurate in your analysis" ) try: with st.spinner("Analyzing climate conditions..."): initial_response = call_ai_model_initial(all_message) initial_text = "" for line in initial_response.iter_lines(): if line: line_content = line.decode('utf-8') if line_content.startswith("data: "): line_content = line_content[6:] # Strip "data: " prefix try: json_data = json.loads(line_content) if "choices" in json_data: delta = json_data["choices"][0]["delta"] if "content" in delta: initial_text += delta["content"] except json.JSONDecodeError: continue st.success("Initial analysis completed!") with st.spinner("Generating predictions..."): analysis_text = ( f"Based on the following analysis, provide a performance score and an infrastructure impact score, " f"both as percentages. Include lines that say 'Performance Score: XX%' and 'Infrastructure Impact Score: YY%' " f"in your response. Here's the text to analyze: {initial_text}" ) analysis_response = call_ai_model_analysis(analysis_text) analysis_result = "" for line in analysis_response.iter_lines(): if line: line_content = line.decode('utf-8') if line_content.startswith("data: "): line_content = line_content[6:] # Strip "data: " prefix try: json_data = json.loads(line_content) if "choices" in json_data: delta = json_data["choices"][0]["delta"] if "content" in delta: analysis_result += delta["content"] except json.JSONDecodeError: continue st.success("Predictions generated!") # Extract performance and infrastructure scores from the analysis result performance_score = "N/A" infrastructure_score = "N/A" for line in analysis_result.split('\n'): if "performance score:" in line.lower(): performance_score = line.split(":")[-1].strip() elif "infrastructure impact score:" in line.lower(): infrastructure_score = line.split(":")[-1].strip() # Prepare data for visualization results_data = { "Condition": ["Temperature", "Humidity", "Wind Speed", "UV Index", "Air Quality Index", "Precipitation", "Atmospheric Pressure"], "Value": [temperature, humidity, wind_speed, uv_index, air_quality_index, precipitation, atmospheric_pressure] } results_df = pd.DataFrame(results_data) # Display results in a table st.subheader("Climate Conditions Summary") st.table(results_df) # Create a radar chart for climate conditions fig = go.Figure(data=go.Scatterpolar( r=[temperature/50*100, humidity, wind_speed/2, uv_index/11*100, air_quality_index/5, precipitation/5, (atmospheric_pressure-900)/2], theta=results_df['Condition'], fill='toself' )) fig.update_layout( polar=dict( radialaxis=dict(visible=True, range=[0, 100]) ), showlegend=False ) st.plotly_chart(fig) # Display prediction st.subheader("Predicted Impact on Performance and Infrastructure") st.markdown(initial_text.strip()) # Display performance and infrastructure scores col1, col2 = st.columns(2) with col1: st.metric("Performance Score", performance_score) with col2: st.metric("Infrastructure Impact Score", infrastructure_score) # Display analyzed sports and infrastructure st.subheader("Analyzed Components") col1, col2, col3 = st.columns(3) with col1: st.write("**Sports:**") for sport in sports: st.write(f"- {sport}") with col2: st.write("**Athlete Types:**") for athlete_type in athlete_types: st.write(f"- {athlete_type}") with col3: st.write("**Infrastructure Types:**") for infra_type in infrastructure_types: st.write(f"- {infra_type}") # Display raw analysis result for debugging with st.expander("Show Raw Analysis"): st.text(analysis_result) except ValueError as ve: st.error(f"Configuration error: {ve}") except requests.exceptions.RequestException as re: st.error(f"Request error: {re}") except Exception as e: st.error(f"An unexpected error occurred: {e}")