Spaces:
Configuration error
Configuration error
File size: 13,122 Bytes
9feb1f1 | 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 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 | #!/usr/bin/env python
"""
SKENAI-RENO Event Processing Demo
---------------------------------
This Gradio app demonstrates how the SKENAI-RENO event processing pipeline
enriches events with AI insights using Hugging Face models.
"""
import gradio as gr
import requests
import json
import os
import time
import numpy as np
import pandas as pd
import plotly.express as px
from datetime import datetime, timedelta
# Configure API access (in production, use Secrets)
API_KEY = os.environ.get("HF_API_KEY", "")
HF_ENDPOINT = "https://api-inference.huggingface.co/models/"
# Sample models to use for different event types
MODEL_MAPPING = {
"user_feedback": "distilbert-base-uncased-finetuned-sst-2-english",
"transaction": "bert-base-uncased",
"system_event": "gpt2",
"achievement": "roberta-base"
}
def process_event(event_type, event_content, user_id="user123", game_id="game456"):
"""Process an event through the SKENAI-RENO pipeline with Hugging Face model."""
# Select model based on event type
model_id = MODEL_MAPPING.get(event_type, "distilbert-base-uncased-finetuned-sst-2-english")
# Prepare payload for Hugging Face model
payload = {
"inputs": event_content,
}
# For demo purposes, simulate API call if no key is provided
if not API_KEY:
# Simulate processing delay
time.sleep(1)
# Generate simulated AI insights based on event type
if event_type == "user_feedback":
ai_insights = [
{"label": "POSITIVE", "score": 0.92},
{"label": "NEGATIVE", "score": 0.08}
]
elif event_type == "transaction":
ai_insights = {
"transaction_type": "purchase",
"value_assessment": "high",
"confidence": 0.87
}
elif event_type == "achievement":
ai_insights = {
"achievement_level": "significant",
"percentile": 85,
"engagement_impact": "positive"
}
else:
ai_insights = {
"classification": "routine",
"priority": "low",
"action_required": False
}
else:
# Call Hugging Face Inference API with actual key
try:
headers = {"Authorization": f"Bearer {API_KEY}"}
response = requests.post(
f"{HF_ENDPOINT}{model_id}",
headers=headers,
json=payload,
timeout=10
)
ai_insights = response.json()
except Exception as e:
ai_insights = {"error": str(e)}
# Current timestamp for the demo
current_time = datetime.now().isoformat()
# Format response as it would appear in the SKENAI-RENO pipeline
enriched_event = {
"event_id": f"evt-{int(time.time())}-{hash(event_content) % 10000}",
"type": event_type,
"content": event_content,
"user_id": user_id,
"game_id": game_id,
"timestamp": current_time,
"ai_enrichment": {
"model_id": model_id,
"insights": ai_insights,
"processed_timestamp": current_time
},
"processing": {
"lambda_execution_time_ms": 120,
"sqs_wait_time_ms": 15,
"dynamodb_write_time_ms": 8
}
}
# Add relevant additional fields based on event type
if event_type == "transaction":
enriched_event["transaction_details"] = {
"amount": 4.99,
"currency": "USD",
"item_id": "coins_500",
"payment_method": "app_store"
}
elif event_type == "achievement":
enriched_event["achievement_details"] = {
"achievement_id": "level_completion",
"level": 10,
"score": 95,
"completion_time_sec": 320
}
return json.dumps(enriched_event, indent=2)
def generate_metrics_visualization():
"""Generate a sample visualization of event processing metrics."""
# Create sample data for the past 7 days
dates = [(datetime.now() - timedelta(days=i)).strftime('%Y-%m-%d') for i in range(7)]
dates.reverse()
# Sample event counts by type
event_types = ["user_feedback", "transaction", "system_event", "achievement"]
data = []
for date in dates:
for event_type in event_types:
# Generate some random data with trends
if event_type == "transaction":
# Transactions increasing over time
count = np.random.randint(800, 1200) + (dates.index(date) * 50)
elif event_type == "user_feedback":
# Feedback relatively stable
count = np.random.randint(400, 600)
elif event_type == "achievement":
# Achievements with weekly pattern (higher on weekends)
day_of_week = datetime.strptime(date, '%Y-%m-%d').weekday()
weekend_boost = 200 if day_of_week >= 5 else 0
count = np.random.randint(300, 500) + weekend_boost
else:
# System events decreasing (good sign, fewer errors)
count = np.random.randint(100, 300) - (dates.index(date) * 10)
count = max(count, 50) # Ensure not negative
data.append({
"Date": date,
"Event Type": event_type,
"Count": count
})
# Create DataFrame
df = pd.DataFrame(data)
# Create plot
fig = px.line(
df,
x="Date",
y="Count",
color="Event Type",
title="SKENAI-RENO: Event Processing Volume (Last 7 Days)",
markers=True
)
fig.update_layout(
xaxis_title="Date",
yaxis_title="Number of Events",
legend_title="Event Type",
template="plotly_white"
)
return fig
def create_processing_pipeline_visualization():
"""Create a visual representation of the SKENAI-RENO event processing pipeline."""
# Sample data for pipeline stages and their performance metrics
stages = [
"Redpanda",
"Lambda Connector",
"SQS Queue",
"AI Processor Lambda",
"DynamoDB"
]
avg_latency = [5, 25, 15, 120, 8]
error_rate = [0.01, 0.05, 0.001, 0.2, 0.02]
# Create DataFrame
df = pd.DataFrame({
"Stage": stages,
"Average Latency (ms)": avg_latency,
"Error Rate (%)": [e * 100 for e in error_rate]
})
# Create bar chart for latency
fig_latency = px.bar(
df,
x="Stage",
y="Average Latency (ms)",
title="Pipeline Stage Latency",
color="Average Latency (ms)",
color_continuous_scale="Viridis"
)
# Create bar chart for error rates
fig_errors = px.bar(
df,
x="Stage",
y="Error Rate (%)",
title="Pipeline Stage Error Rates",
color="Error Rate (%)",
color_continuous_scale="Reds"
)
return fig_latency, fig_errors
# Define the Gradio interface
with gr.Blocks(theme=gr.themes.Soft(primary_hue="indigo")) as demo:
gr.Markdown("# SKENAI-RENO Event Processing Demo")
gr.Markdown("""
Experience the power of AI-enriched event processing with SKENAI-RENO's serverless pipeline.
This demo simulates how events from gaming and enterprise applications are processed
and enriched with AI insights in real-time.
""")
with gr.Tabs():
with gr.TabItem("Event Processing Simulator"):
with gr.Row():
with gr.Column(scale=2):
gr.Markdown("### Input Event Details")
with gr.Row():
event_type = gr.Dropdown(
choices=["user_feedback", "transaction", "system_event", "achievement"],
value="user_feedback",
label="Event Type"
)
with gr.Row():
user_id = gr.Textbox(value="user123", label="User ID")
game_id = gr.Textbox(value="game456", label="Game/App ID")
with gr.Row():
event_content = gr.Textbox(
lines=5,
placeholder="Enter event content here...",
label="Event Content"
)
with gr.Row():
submit_btn = gr.Button("Process Event", variant="primary")
with gr.Column(scale=3):
gr.Markdown("### Enriched Event Output")
output = gr.JSON()
with gr.Row():
gr.Markdown("### Example Events")
with gr.Row():
example1 = gr.Button("User Feedback Example")
example2 = gr.Button("Transaction Example")
example3 = gr.Button("Achievement Example")
# Set up example event handlers
example1.click(
lambda: ["user_feedback", "user123", "game456", "I love this game! The new level design is amazing."],
outputs=[event_type, user_id, game_id, event_content]
)
example2.click(
lambda: ["transaction", "user789", "game456", "User purchased 500 coins for $4.99"],
outputs=[event_type, user_id, game_id, event_content]
)
example3.click(
lambda: ["achievement", "user456", "game789", "User completed level 10 with score 95/100"],
outputs=[event_type, user_id, game_id, event_content]
)
with gr.TabItem("System Analytics"):
gr.Markdown("### SKENAI-RENO Event Processing Analytics")
gr.Markdown("""
This dashboard shows sample analytics of the SKENAI-RENO event processing pipeline.
In a production environment, these metrics would be generated from real-time CloudWatch data.
""")
with gr.Row():
metrics_plot = gr.Plot()
with gr.Row():
with gr.Column():
latency_plot = gr.Plot()
with gr.Column():
error_plot = gr.Plot()
refresh_btn = gr.Button("Refresh Analytics")
with gr.TabItem("About SKENAI-RENO"):
gr.Markdown("""
# About SKENAI-RENO
SKENAI-RENO is a fully serverless event processing pipeline designed for high-reliability,
AI-enhanced insights, and seamless integration with existing systems.
## Key Features
* **Serverless Architecture**: AWS Lambda, SQS, DynamoDB
* **AI Enrichment**: Hugging Face models integrated directly into the event pipeline
* **High Reliability**: Idempotent processing, dead-letter queues, comprehensive monitoring
* **Enterprise Ready**: Secure, scalable, and compliant
## Technical Architecture
SKENAI-RENO uses a multi-stage serverless architecture:
1. **Event Sources**: Capture events from various sources (gaming, web, mobile, IoT)
2. **Redpanda**: High-performance event streaming platform
3. **Lambda Connector**: Processes events from Redpanda and sends to SQS
4. **SQS Queue**: Decouples components and provides buffering
5. **AI Processor Lambda**: Enriches events with AI insights using Hugging Face models
6. **DynamoDB**: Stores processed events for analysis and retrieval
## Integration Options
* REST API for direct event submission
* SDK libraries for major platforms
* Webhook integrations
* Custom connectors for enterprise systems
## Learn More
For enterprise solutions and partnership opportunities, visit [skenai-reno.com](https://skenai-reno.com)
""")
# Set up event handlers
submit_btn.click(
process_event,
inputs=[event_type, event_content, user_id, game_id],
outputs=output
)
# Initialize and refresh the analytics
refresh_btn.click(
lambda: [generate_metrics_visualization(), *create_processing_pipeline_visualization()],
outputs=[metrics_plot, latency_plot, error_plot]
)
# Initialize the analytics on page load
demo.load(
lambda: [generate_metrics_visualization(), *create_processing_pipeline_visualization()],
outputs=[metrics_plot, latency_plot, error_plot]
)
# Launch the app
if __name__ == "__main__":
demo.launch()
|