Encyclopedia / app.py
baconnier's picture
Update app.py
f603eb2 verified
raw
history blame
6.21 kB
import gradio as gr
import json
import os
from dotenv import load_dotenv
from art_explorer import ExplorationPathGenerator
from typing import Dict, Any, Optional, Union
from datetime import datetime
# Load environment variables
load_dotenv()
# Initialize the generator with error handling
try:
api_key = os.getenv("GROQ_API_KEY")
if not api_key:
raise ValueError("GROQ_API_KEY not found in environment variables")
generator = ExplorationPathGenerator(api_key=api_key)
except Exception as e:
print(f"Error initializing ExplorationPathGenerator: {e}")
raise
def format_output(result: Dict[str, Any]) -> str:
"""Format the exploration result for display with error handling"""
try:
return json.dumps(result, indent=2, ensure_ascii=False)
except Exception as e:
return json.dumps({
"error": str(e),
"status": "failed",
"message": "Failed to format output"
}, indent=2)
def parse_json_input(json_str: str, default_value: Any) -> Any:
"""
Safely parse JSON input with detailed error handling
Args:
json_str: JSON string to parse
default_value: Fallback value if parsing fails
"""
if not json_str or json_str.strip() in ('', '{}', '[]'):
return default_value
try:
return json.loads(json_str)
except json.JSONDecodeError as e:
print(f"JSON parse error: {e}")
return default_value
def validate_parameters(
depth: int,
domain: str,
parameters: Dict[str, Any]
) -> Dict[str, Any]:
"""Validate and merge exploration parameters"""
validated_params = {
"depth": max(1, min(10, depth)), # Clamp depth between 1-10
"domain": domain if domain.strip() else None,
"previous_explorations": []
}
if isinstance(parameters, dict):
validated_params.update(parameters)
return validated_params
def explore(
query: str,
path_history: str = "[]",
parameters: str = "{}",
depth: int = 5,
domain: str = ""
) -> str:
"""
Generate exploration path based on user input with comprehensive error handling
Args:
query (str): User's exploration query
path_history (str): JSON string of previous exploration path
parameters (str): JSON string of exploration parameters
depth (int): Exploration depth parameter (1-10)
domain (str): Specific domain context
Returns:
str: Formatted JSON string of exploration results or error message
"""
try:
# Input validation
if not query.strip():
raise ValueError("Query cannot be empty")
# Parse and validate inputs
selected_path = parse_json_input(path_history, [])
custom_parameters = parse_json_input(parameters, {})
# Validate and merge parameters
exploration_parameters = validate_parameters(depth, domain, custom_parameters)
# Debug logging
print(f"Processing query: {query}")
print(f"Parameters: {json.dumps(exploration_parameters, indent=2)}")
# Generate exploration path - FIXED HERE: changed user_query to query
result = generator.generate_exploration_path(
query=query, # Changed from user_query to query
selected_path=selected_path,
exploration_parameters=exploration_parameters
)
# Validate result
if not isinstance(result, dict):
raise ValueError("Invalid response format from generator")
return format_output(result)
except Exception as e:
error_response = {
"error": str(e),
"status": "failed",
"message": "Failed to generate exploration path",
"details": {
"query": query,
"depth": depth,
"domain": domain
}
}
print(f"Error in explore function: {e}")
return format_output(error_response)
def create_interface() -> gr.Interface:
"""Create and configure the Gradio interface with enhanced examples and documentation"""
inputs = [
gr.Textbox(
label="Exploration Query",
placeholder="Enter your art history exploration query...",
lines=2
),
gr.Textbox(
label="Path History (JSON)",
placeholder="[]",
lines=3,
value="[]"
),
gr.Textbox(
label="Additional Parameters (JSON)",
placeholder="{}",
lines=3,
value="{}"
),
gr.Slider(
label="Exploration Depth",
minimum=1,
maximum=10,
value=5,
step=1
),
gr.Textbox(
label="Domain Context",
placeholder="Optional: Specify art history period or movement",
lines=1
)
]
output = gr.Textbox(
label="Exploration Result",
lines=20
)
examples = [
[
"Explore the evolution of Renaissance painting techniques",
"[]",
"{}",
5,
"Renaissance"
],
[
"Investigate the influence of Japanese art on Impressionism",
"[]",
"{}",
7,
"Impressionism"
],
[
"Analyze the development of Cubism through Picasso's work",
"[]",
"{}",
6,
"Cubism"
]
]
return gr.Interface(
fn=explore,
inputs=inputs,
outputs=output,
title="Art History Exploration Path Generator",
description="""Generate structured exploration paths for art history queries.
## Features:
- Dynamic exploration path generation
- Contextual understanding of art history
- Multi-dimensional analysis
- Customizable exploration depth
## Usage:
1. Enter your art history query
2. Adjust exploration depth (1-10)
3. Optionally specify domain context
4. View generated exploration path""",
examples=examples,
theme="default",
analytics_enabled=False
)
if __name__ == "__main__":
try:
print(f"===== Application Startup at {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} =====")
# Create interface
iface = create_interface()
# Launch with custom configurations
iface.launch()
except Exception as e:
print(f"Failed to launch interface: {e}")