File size: 6,096 Bytes
9f54a3b
71ec4a8
9f54a3b
0e00146
b4026e6
0c48822
251086d
a9c7401
f689a87
71ec4a8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8092b5a
71ec4a8
7fcff87
 
df306bb
7fcff87
df306bb
7fcff87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9e23ab4
 
 
 
 
 
 
 
 
 
7fcff87
9e23ab4
 
 
5531c71
7fcff87
71ec4a8
7fcff87
 
 
 
 
 
df306bb
7fcff87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9e23ab4
7fcff87
8f7d62b
7fcff87
df306bb
251086d
9e23ab4
5531c71
df306bb
7fcff87
251086d
 
71ec4a8
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
import streamlit as st
import requests
import os
import json
import pandas as pd
import time
import matplotlib.pyplot as plt

# Function to call the Together AI model
def call_ai_model(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 request numeric performance data from AI
def get_numeric_performance_data(temperature):
    all_message = (
        f"Provide the expected numeric sports performance value (as a score) at a temperature of {temperature}°C."
    )
    response = call_ai_model(all_message)
    generated_text = ""
    for line in 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 and delta["content"].strip().replace('.', '', 1).isdigit():
                        return float(delta["content"].strip())
            except json.JSONDecodeError:
                continue
    return None

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

if st.button("Generate Prediction"):
    all_message = (
        f"Assess the impact on sports performance 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."
    )

    try:
        with st.spinner("Analyzing climate conditions..."):
            response = call_ai_model(all_message)

        st.success("Initial analysis complete. Generating detailed predictions...")

        generated_text = ""
        for line in 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 and delta["content"].strip().replace('.', '', 1).isdigit():
                            generated_text += delta["content"]
                except json.JSONDecodeError:
                    continue

        st.success("Detailed predictions generated.")

        # 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("Results Summary")
        st.table(results_df)

        # Display prediction
        st.markdown("**Predicted Impact on Performance and Infrastructure:**")
        st.markdown(generated_text.strip())

        st.success("Generating performance data...")

        # Generate numeric performance data for different temperatures
        temperatures = range(-10, 41, 5)  # Temperatures from -10°C to 40°C in 5°C increments
        performance_values = []
        for temp in temperatures:
            st.spinner(f"Fetching performance data for {temp}°C...")
            performance_value = get_numeric_performance_data(temp)
            if performance_value is not None:
                performance_values.append(performance_value)
            time.sleep(1)

        if performance_values:
            # Generate line graph
            fig, ax = plt.subplots()
            ax.plot(temperatures, performance_values, marker='o')
            ax.set_xlabel('Temperature (°C)')
            ax.set_ylabel('Performance Score')
            ax.set_title('Temperature vs. Numeric Sports Performance')
            st.pyplot(fig)

    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}")