Spaces:
Sleeping
Sleeping
import gradio as gr | |
import os | |
import json | |
import logging | |
import time | |
import random | |
# Set up logging | |
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s') | |
logger = logging.getLogger(__name__) | |
# Define mock responses for reliability | |
MOCK_RESPONSES = [ | |
"I understand how you're feeling. Would you like to talk more about what's been going on?", | |
"That sounds challenging. I'm here to support you through this. What has been helping you cope so far?", | |
"Thank you for sharing that with me. How long have you been feeling this way?", | |
"I hear you. It's important to acknowledge these emotions. Would it help to explore some calming techniques?", | |
"I appreciate you opening up. Is there anything specific that triggers these feelings for you?", | |
"Your feelings are valid. What kind of support would be most helpful for you right now?", | |
"I'm here to listen without judgment. Would you like to talk more about this or would you prefer some suggestions?", | |
"It takes courage to express how you're feeling. How can I best support you today?", | |
"That's really challenging to deal with. Have you been able to talk to anyone else about this?", | |
"I'm glad you reached out. Sometimes just putting feelings into words can help us process them better." | |
] | |
def select_mock_response(prompt): | |
"""Select an appropriate mock response based on the input.""" | |
# Simple keyword matching for a slightly more relevant response | |
if any(word in prompt.lower() for word in ["sad", "depress", "down", "unhappy"]): | |
return "I understand you're feeling down. Remember that emotions come and go, and you won't feel this way forever. What small activity might bring you a moment of joy today?" | |
elif any(word in prompt.lower() for word in ["anxious", "worry", "stress", "nervous"]): | |
return "I hear that anxiety is affecting you. Taking slow, deep breaths can help calm your nervous system. Would you like to try a quick breathing exercise together?" | |
elif any(word in prompt.lower() for word in ["angry", "mad", "frustrated", "upset"]): | |
return "It sounds like you're feeling frustrated. That's completely valid. Sometimes it helps to express these feelings in a safe way. What usually helps you process anger?" | |
elif any(word in prompt.lower() for word in ["happy", "joy", "excite", "great"]): | |
return "I'm glad to hear you're feeling positive! Moments of joy are worth celebrating. What contributed to this good feeling?" | |
elif any(word in prompt.lower() for word in ["confus", "uncertain", "lost"]): | |
return "Feeling uncertain can be uncomfortable. Breaking things down into smaller parts sometimes helps provide clarity. What specific aspect feels most confusing right now?" | |
elif "hello" in prompt.lower() or "hi" in prompt.lower(): | |
return "Hello! I'm Nova, here to support your emotional wellbeing. How are you feeling today?" | |
else: | |
# Return a random response if no keywords match | |
return random.choice(MOCK_RESPONSES) | |
def generate_response(prompt): | |
"""Generate a response using our mock system.""" | |
logger.info(f"Generating response for: {prompt[:30]}...") | |
start_time = time.time() | |
# Get appropriate mock response | |
response = select_mock_response(prompt) | |
# Simulate a brief delay for realism (but not too long) | |
time.sleep(0.5) | |
logger.info(f"Response generated in {time.time() - start_time:.2f} seconds") | |
return response | |
# API endpoint that mimics your current backend API | |
def chat_api(message): | |
"""API endpoint that returns a response in the same format as your backend.""" | |
response_text = generate_response(message) | |
# Create a response format similar to your current backend | |
response = { | |
"status": "ok", | |
"data": { | |
"response": response_text, | |
"emotions": [{"label": "neutral", "score": 1.0}], # Simplified emotions | |
"triggers": [{"label": "unknown", "score": 1.0}], # Simplified triggers | |
"actions": ["Check in with yourself"], | |
"guidance": [ | |
{"message": "How are you feeling right now?", "confidence": 0.9} | |
], | |
"timestamp": None # Will be filled by your backend | |
}, | |
"meta": { | |
"model_used": "nova-rule-based", | |
"debug": None | |
} | |
} | |
return json.dumps(response) | |
# Create Gradio Interface | |
with gr.Blocks() as demo: | |
gr.Markdown(f"# NOVA Rule-Based Backend\n**Note:** Using reliable rule-based responses for faster performance") | |
with gr.Tab("Chat"): | |
with gr.Row(): | |
with gr.Column(): | |
message_input = gr.Textbox( | |
label="Your message", | |
placeholder="Type your message here...", | |
lines=2 | |
) | |
submit_btn = gr.Button("Send") | |
with gr.Column(): | |
output = gr.Textbox(label="Response") | |
submit_btn.click(generate_response, inputs=message_input, outputs=output) | |
with gr.Tab("API"): | |
gr.Markdown(f""" | |
## API Endpoint | |
Send POST requests to: `https://ram-n-nova-llm-backend.hf.space/api/predict` | |
**Request format:** | |
```json | |
{{ | |
"data": ["Your message here"] | |
}} | |
``` | |
**Response format:** | |
```json | |
{{ | |
"data": "{{\\\"status\\\": \\\"ok\\\", \\\"data\\\": {{\\\"response\\\": \\\"Generated response\\\", ...}}}}" | |
}} | |
``` | |
""") | |
api_input = gr.Textbox(label="Test API Input", placeholder="Type your message here...") | |
api_output = gr.JSON(label="API Response") | |
api_btn = gr.Button("Test API") | |
api_btn.click(chat_api, inputs=api_input, outputs=api_output) | |
# Create a direct API endpoint | |
interface = gr.Interface( | |
fn=chat_api, | |
inputs="text", | |
outputs="json", | |
title="NOVA API Endpoint", | |
description="Send a message to get a response", | |
examples=["I'm feeling sad today", "I'm anxious about my test tomorrow"], | |
) | |
# Launch the app | |
demo.launch() |