File size: 6,210 Bytes
d6a8ad7
0fc768b
 
4244d2c
0fc768b
f134ba7
10cff5d
c6219ec
4244d2c
 
8f7fdc3
f134ba7
 
10cff5d
 
 
 
f134ba7
10cff5d
 
c38a10f
0fc768b
10cff5d
 
 
 
 
 
 
 
 
0fc768b
 
10cff5d
 
 
 
 
 
 
 
 
 
 
 
 
 
0fc768b
f134ba7
10cff5d
 
 
f134ba7
10cff5d
 
 
 
 
 
 
 
 
f134ba7
0fc768b
10cff5d
 
 
 
 
0fc768b
10cff5d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f603eb2
10cff5d
f603eb2
10cff5d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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}")