import requests import gradio as gr import os import random from datetime import datetime, timedelta import plotly.express as px import re api_key = os.getenv("CEREBRAS_API_KEY") url = "https://api.cerebras.ai/v1/chat/completions" headers = { "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" } SAMPLE_LOG = """ 2025-04-12 10:01 UTC | 40.7N, 74.0W | Frequency: 14.5 GHz | Signal Strength: 85% | Message: Routine check, systems OK. 2025-04-12 10:02 UTC | 40.8N, 74.1W | Frequency: 14.7 GHz | Signal Strength: 60% | Message: Noise detected, possible interference. 2025-04-12 10:03 UTC | 40.9N, 74.2W | Frequency: 14.6 GHz | Signal Strength: 90% | Message: Emergency: Low battery alert. """ LOG_HISTORY = [] def generate_random_log(): base_time = datetime(2025, 4, 12, 10, 0) entries = [] for i in range(3): time = (base_time + timedelta(minutes=i)).strftime("%Y-%m-%d %H:%M UTC") lat = round(random.uniform(40.0, 41.0), 1) lon = round(random.uniform(73.0, 74.0), 1) freq = round(random.uniform(14.0, 15.0), 1) signal = random.randint(50, 100) messages = [ "Routine check, systems OK.", "Noise detected, possible interference.", "Emergency: Low battery alert.", "Signal stable, no issues.", "Warning: Solar flare detected." ] message = random.choice(messages) entries.append(f"{time} | {lat}N, {lon}W | Frequency: {freq} GHz | Signal Strength: {signal}% | Message: {message}") return "\n".join(entries) def analyze_log(log_text): if not log_text.strip(): return "Error: Please enter a log.", None, None LOG_HISTORY.append(log_text) data = { "model": "llama-4-scout-17b-16e-instruct", "messages": [ { "role": "user", "content": "Analyze this satellite radio log and summarize in bullet points. Include interference risk scores (0-100, low signal <70% = high risk >80, emergency = 90). Ensure frequencies in issues and details:\n- Issues (e.g., low signal, noise, interference with frequency, risk score)\n- High-priority messages (e.g., emergencies, warnings)\n- Key details (coordinates, times, frequencies, signal strengths)\nLog:\n" + log_text } ], "max_completion_tokens": 500, "temperature": 0.5 } try: response = requests.post(url, json=data, headers=headers) summary = response.json()["choices"][0]["message"]["content"] html = "

Analysis

" signals = [] times = [] for line in log_text.split("\n"): if "Signal Strength" in line: match = re.search(r"Signal Strength: (\d+)%", line) if match: signals.append(int(match.group(1))) time_match = re.search(r"(\d{4}-\d{2}-\d{2} \d{2}:\d{2}) UTC", line) if time_match: times.append(time_match.group(1)[-5:]) fig = px.line(x=times, y=signals, labels={"x": "Time", "y": "Signal (%)"}, title="Signal Trend") if signals and len(signals) == len(times) else None return summary, html, fig except Exception as e: return f"Error: API call failed - {str(e)}", None, None def generate_alert(log_text): if not log_text.strip(): return "Error: Please enter a log." data = { "model": "llama-4-scout-17b-16e-instruct", "messages": [ { "role": "user", "content": "Generate an urgent satellite alert based on this log’s conditions (e.g., interference for noise/low signal, escalation for emergencies). Include frequency, time, coordinates:\nLog:\n" + log_text } ], "max_completion_tokens": 100, "temperature": 0.7 } try: response = requests.post(url, json=data, headers=headers) alert = response.json()["choices"][0]["message"]["content"] return f"
{alert}
" except Exception as e: return f"Error: Alert failed - {str(e)}" def compare_logs(): if len(LOG_HISTORY) < 2: return "Error: Need at least two logs.", None compare_text = "Previous log:\n" + LOG_HISTORY[-2] + "\nCurrent log:\n" + LOG_HISTORY[-1] data = { "model": "llama-4-scout-17b-16e-instruct", "messages": [ { "role": "user", "content": "Compare these two satellite radio logs and summarize trends in bullet points (e.g., signal strength changes, frequency issues, new emergencies):\n" + compare_text } ], "max_completion_tokens": 400, "temperature": 0.5 } try: response = requests.post(url, json=data, headers=headers) comparison = response.json()["choices"][0]["message"]["content"] html = "

Comparison

" return comparison, html except Exception as e: return f"Error: Comparison failed - {str(e)}", None def load_sample_log(): return SAMPLE_LOG def clear_log(): return "" css = """ body, .gradio-container { background: white; color: black; font-family: Roboto, sans-serif; } button { background: #ff6200; color: white; border: none; padding: 8px 16px; border-radius: 5px; } button:hover { background: #e55a00; } .input-text, .output-text { background: white; color: black; border: 1px solid #ff6200; border-radius: 5px; } h3 { color: #ff6200; } .header, .subheader { color: #ff6200; text-align: center; } """ with gr.Blocks(css=css) as interface: gr.Markdown("# Satellite Signal Log Analyzer", elem_classes="header") gr.Markdown("Analyze logs for issues, alerts, and trends.", elem_classes="subheader") log_input = gr.Textbox(lines=5, show_label=False, placeholder="Enter or generate a log...") with gr.Row(): sample_button = gr.Button("Sample Log") random_button = gr.Button("Random Log") clear_button = gr.Button("Clear") with gr.Row(): analyze_button = gr.Button("Analyze") alert_button = gr.Button("Alert") compare_button = gr.Button("Compare Logs") output = gr.HTML(show_label=False) plot_output = gr.Plot(show_label=False) alert_output = gr.HTML(show_label=False) compare_output = gr.HTML(show_label=False) sample_button.click(fn=load_sample_log, outputs=log_input) random_button.click(fn=generate_random_log, outputs=log_input) clear_button.click(fn=clear_log, outputs=log_input) analyze_button.click(fn=analyze_log, inputs=log_input, outputs=[output, output, plot_output]) alert_button.click(fn=generate_alert, inputs=log_input, outputs=alert_output) compare_button.click(fn=compare_logs, outputs=[compare_output, compare_output]) interface.launch()