pranavkv commited on
Commit
b49ed74
Β·
verified Β·
1 Parent(s): baabed0

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +105 -299
app.py CHANGED
@@ -234,159 +234,59 @@ class UltimateTopcoderMCPEngine:
234
  return None
235
 
236
  def convert_topcoder_challenge(self, tc_data: Dict) -> Challenge:
237
- """FIXED: Debug what's actually in the MCP challenge data"""
238
  try:
239
- print(f"\nπŸ” === CONVERTING CHALLENGE DATA ===")
240
- print(f"πŸ“Š Raw challenge keys: {list(tc_data.keys())}")
241
-
242
- # Show first few fields for debugging
243
- for key, value in list(tc_data.items())[:10]: # Show first 10 fields
244
- if isinstance(value, str):
245
- print(f" {key}: '{value[:100]}{'...' if len(str(value)) > 100 else ''}'")
246
- elif isinstance(value, (int, float, bool)):
247
- print(f" {key}: {value}")
248
- elif isinstance(value, list):
249
- print(f" {key}: list with {len(value)} items")
250
- if len(value) > 0 and isinstance(value[0], dict):
251
- print(f" First item keys: {list(value[0].keys())}")
252
- elif isinstance(value, dict):
253
- print(f" {key}: dict with keys {list(value.keys())}")
254
- else:
255
- print(f" {key}: {type(value)}")
256
-
257
- # Extract basic fields with debugging
258
- challenge_id = str(tc_data.get('id', tc_data.get('challengeId', 'unknown')))
259
- print(f"πŸ†” Extracted ID: {challenge_id}")
260
-
261
- title = tc_data.get('name', tc_data.get('title', tc_data.get('challengeName', 'Topcoder Challenge')))
262
- print(f"πŸ“ Extracted title: {title}")
263
-
264
- description = tc_data.get('description', tc_data.get('overview', tc_data.get('summary', 'Challenge description not available')))
265
- print(f"πŸ“„ Extracted description: {description[:100]}...")
266
 
267
- # Extract technologies/skills with detailed debugging
268
  technologies = []
269
- print(f"πŸ”§ Looking for technologies...")
270
-
271
- # Check skills field
272
  skills = tc_data.get('skills', [])
273
- print(f" Skills field: {skills}")
274
- if skills:
275
- for skill in skills:
276
- if isinstance(skill, dict):
277
- skill_name = skill.get('name', skill.get('skillName', ''))
278
- if skill_name:
279
- technologies.append(skill_name)
280
- print(f" Added skill: {skill_name}")
281
- elif isinstance(skill, str):
282
- technologies.append(skill)
283
- print(f" Added skill: {skill}")
284
-
285
- # Check technologies field
286
- tech_field = tc_data.get('technologies', [])
287
- print(f" Technologies field: {tech_field}")
288
- if tech_field:
289
- for tech in tech_field:
290
- if isinstance(tech, dict):
291
- tech_name = tech.get('name', tech.get('technologyName', ''))
292
- if tech_name:
293
- technologies.append(tech_name)
294
- print(f" Added tech: {tech_name}")
295
- elif isinstance(tech, str):
296
- technologies.append(tech)
297
- print(f" Added tech: {tech}")
298
-
299
- # Check tags field
300
- tags = tc_data.get('tags', [])
301
- print(f" Tags field: {tags}")
302
- if tags:
303
- for tag in tags[:3]: # Limit to 3 tags
304
- if isinstance(tag, str):
305
- technologies.append(tag)
306
- print(f" Added tag: {tag}")
307
-
308
- # If no technologies found, try other fields
309
- if not technologies:
310
- print(f" No technologies found, checking other fields...")
311
- track = tc_data.get('track', tc_data.get('trackName', ''))
312
- if track:
313
- technologies.append(track)
314
- print(f" Added track: {track}")
315
-
316
- challenge_type = tc_data.get('type', tc_data.get('challengeType', ''))
317
- if challenge_type:
318
- technologies.append(challenge_type)
319
- print(f" Added type: {challenge_type}")
320
 
321
- # Remove duplicates
322
- technologies = list(set(technologies))
323
- print(f"πŸ› οΈ Final technologies: {technologies}")
324
-
325
- # Extract prize information with debugging
326
- print(f"πŸ’° Looking for prize information...")
327
  total_prize = 0
328
-
329
- # Check prizeSets
330
  prize_sets = tc_data.get('prizeSets', [])
331
- print(f" Prize sets: {prize_sets}")
332
- if prize_sets:
333
- for prize_set in prize_sets:
334
- if isinstance(prize_set, dict) and prize_set.get('type') == 'placement':
335
- prizes = prize_set.get('prizes', [])
336
- for prize in prizes:
337
- if isinstance(prize, dict) and prize.get('type') == 'USD':
338
- prize_value = prize.get('value', 0)
339
- total_prize += prize_value
340
- print(f" Added prize: ${prize_value}")
341
-
342
- # Check overview field
343
- if total_prize == 0:
344
- overview = tc_data.get('overview', {})
345
- if isinstance(overview, dict):
346
- overview_prize = overview.get('totalPrizes', 0)
347
- if overview_prize:
348
- total_prize = overview_prize
349
- print(f" Found overview prize: ${total_prize}")
350
-
351
- # Check direct prize field
352
- if total_prize == 0:
353
- direct_prize = tc_data.get('prize', tc_data.get('totalPrize', 0))
354
- if direct_prize:
355
- total_prize = direct_prize
356
- print(f" Found direct prize: ${total_prize}")
357
 
358
  prize = f"${total_prize:,}" if total_prize > 0 else "Merit-based"
359
- print(f"πŸ’° Final prize: {prize}")
360
 
361
- # Extract other fields
362
- challenge_type = tc_data.get('type', tc_data.get('challengeType', 'Challenge'))
363
  difficulty_mapping = {
364
  'First2Finish': 'Beginner',
365
- 'Code': 'Intermediate',
366
  'Assembly Competition': 'Advanced',
367
  'UI Prototype Competition': 'Intermediate',
368
  'Copilot Posting': 'Beginner',
369
  'Bug Hunt': 'Beginner',
370
- 'Test Suites': 'Intermediate',
371
- 'Challenge': 'Intermediate'
372
  }
373
  difficulty = difficulty_mapping.get(challenge_type, 'Intermediate')
374
- print(f"πŸ“Š Difficulty: {difficulty} (from type: {challenge_type})")
375
 
376
- registrants = tc_data.get('numOfRegistrants', tc_data.get('registrants', 0))
377
- print(f"πŸ‘₯ Registrants: {registrants}")
378
-
379
- status = tc_data.get('status', 'Unknown')
380
  if status == 'Completed':
381
  time_estimate = "Recently completed"
382
  elif status in ['Active', 'Draft']:
383
  time_estimate = "Active challenge"
384
- else:
385
- time_estimate = "Variable duration"
386
- print(f"⏰ Time estimate: {time_estimate} (from status: {status})")
387
 
388
- # Create challenge object
389
- challenge = Challenge(
390
  id=challenge_id,
391
  title=title,
392
  description=description[:300] + "..." if len(description) > 300 else description,
@@ -396,19 +296,9 @@ class UltimateTopcoderMCPEngine:
396
  time_estimate=time_estimate,
397
  registrants=registrants
398
  )
399
-
400
- print(f"βœ… Created challenge: {challenge.title}")
401
- print(f" Technologies: {challenge.technologies}")
402
- print(f" Prize: {challenge.prize}")
403
- print(f" Registrants: {challenge.registrants}")
404
- print(f"πŸ” === CHALLENGE CONVERSION COMPLETE ===\n")
405
-
406
- return challenge
407
 
408
  except Exception as e:
409
- print(f"❌ Error converting challenge data: {e}")
410
- print(f"Raw data keys: {list(tc_data.keys()) if isinstance(tc_data, dict) else 'Not a dict'}")
411
- # Return a basic challenge object as fallback
412
  return Challenge(
413
  id=str(tc_data.get('id', 'unknown')),
414
  title=str(tc_data.get('name', 'Challenge')),
@@ -448,88 +338,94 @@ class UltimateTopcoderMCPEngine:
448
  sort_by: str = None,
449
  sort_order: str = None,
450
  ) -> List[Challenge]:
451
- """FIXED: Guaranteed to return real challenges when MCP works"""
452
-
453
- print(f"πŸ”„ Fetching REAL challenges (limit: {limit})")
454
- print(f"🎯 Query: '{query}' | Skills: {user_profile.skills}")
455
 
456
  # Always try to connect
 
457
  connection_success = await self.initialize_connection()
 
458
  if not connection_success:
459
- print("❌ Could not establish MCP connection")
460
  return []
461
 
462
- # Build simple query that we KNOW works from debug
463
- mcp_query = {"perPage": min(limit, 20)}
 
 
 
 
 
 
464
 
465
- # Add search term if provided
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
466
  if query.strip():
467
  mcp_query["search"] = query.strip()
468
-
469
- # Add status filter
470
- if status and status != "":
471
- mcp_query["status"] = status
472
 
473
- print(f"πŸ”§ MCP Query: {mcp_query}")
 
 
 
 
474
 
475
- # Call the MCP tool (we know this works from debug)
476
  result = await self.call_tool("query-tc-challenges", mcp_query)
477
-
478
  if not result:
479
  print("❌ No result from MCP tool call")
480
  return []
481
 
482
- print(f"πŸ“Š Got MCP result with keys: {list(result.keys()) if isinstance(result, dict) else 'Not dict'}")
483
-
484
- # Extract challenge data (we know it's in structuredContent.data from debug)
485
- challenge_data_list = []
486
-
487
  if isinstance(result, dict):
488
- # Primary location: structuredContent.data
489
- if "structuredContent" in result:
490
- structured = result["structuredContent"]
491
- if isinstance(structured, dict) and "data" in structured:
492
- challenge_data_list = structured["data"]
493
- print(f"βœ… Found {len(challenge_data_list)} challenges in structuredContent.data")
494
-
495
- # Fallback: direct data field
496
- elif "data" in result:
497
- challenge_data_list = result["data"]
498
- print(f"βœ… Found {len(challenge_data_list)} challenges in data field")
499
 
500
- if not challenge_data_list:
501
- print("❌ No challenge data found in response")
502
- return []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
503
 
504
- print(f"🎯 Processing {len(challenge_data_list)} raw challenges...")
505
-
506
- # Convert to Challenge objects
507
  challenges = []
508
- for i, item in enumerate(challenge_data_list):
509
  if isinstance(item, dict):
510
  try:
511
  challenge = self.convert_topcoder_challenge(item)
512
  challenges.append(challenge)
513
-
514
- # Show details for first challenge
515
- if i == 0:
516
- print(f"πŸ“‹ Sample: {challenge.title} | {challenge.prize} | {challenge.technologies}")
517
-
518
  except Exception as e:
519
- print(f"⚠️ Error converting challenge {i}: {e}")
520
- # Don't let one bad challenge break everything
521
  continue
522
- else:
523
- print(f"⚠️ Unexpected challenge format at index {i}: {type(item)}")
524
 
525
- print(f"πŸŽ‰ SUCCESSFULLY converted {len(challenges)} REAL challenges!")
526
-
527
- # IMPORTANT: Always return challenges if we got any data at all
528
- if len(challenges) > 0:
529
- return challenges
530
- else:
531
- print("❌ No challenges could be converted from raw data")
532
- return []
533
 
534
  def calculate_advanced_compatibility_score(self, challenge: Challenge, user_profile: UserProfile, query: str) -> tuple:
535
  score = 0.0
@@ -688,16 +584,10 @@ class UltimateTopcoderMCPEngine:
688
  sort_by: str = None, sort_order: str = None,
689
  limit: int = 50
690
  ) -> Dict[str, Any]:
691
- """FIXED: Debug the actual recommendation flow"""
692
  start_time = datetime.now()
693
- print(f"\n🎯 === STARTING RECOMMENDATION REQUEST ===")
694
- print(f"🎯 User skills: {user_profile.skills}")
695
- print(f"🎯 Query: '{query}'")
696
- print(f"🎯 Status filter: {status}")
697
- print(f"🎯 Limit: {limit}")
698
-
699
- # FIXED: Try to get real challenges with detailed debugging
700
- print(f"\nπŸ”„ Step 1: Attempting to fetch REAL challenges...")
701
  real_challenges = await self.fetch_real_challenges(
702
  user_profile=user_profile,
703
  query=query,
@@ -711,45 +601,29 @@ class UltimateTopcoderMCPEngine:
711
  sort_order=sort_order,
712
  )
713
 
714
- print(f"πŸ“Š Step 2: fetch_real_challenges returned {len(real_challenges)} challenges")
715
-
716
- # Determine data source and challenges to use
717
- if real_challenges and len(real_challenges) > 0:
718
  challenges = real_challenges
719
- data_source = f"πŸ”₯ REAL Topcoder MCP Server ({len(challenges)} live challenges)"
720
- print(f"βœ… Step 3: Using {len(challenges)} REAL MCP challenges!")
721
-
722
- # Show sample challenge details
723
- if challenges:
724
- sample = challenges[0]
725
- print(f"πŸ“‹ Sample real challenge: {sample.title} | {sample.prize} | {sample.technologies}")
726
  else:
727
  challenges = self.mock_challenges
728
- data_source = "⚑ Enhanced Intelligence Engine (Premium Dataset)"
729
- print(f"⚠️ Step 3: No real challenges returned, using {len(challenges)} fallback challenges")
730
- print(f"πŸ” Debug: Why no real challenges? Check fetch_real_challenges output above")
731
 
732
- # Score and rank challenges
733
- print(f"\n🧠 Step 4: Scoring {len(challenges)} challenges...")
734
  scored_challenges = []
735
  for challenge in challenges:
736
  score, factors = self.calculate_advanced_compatibility_score(challenge, user_profile, query)
737
  challenge.compatibility_score = score
738
  challenge.rationale = f"Match: {score:.0f}%. " + ". ".join(factors[:2]) + "."
739
  scored_challenges.append(challenge)
740
-
741
  scored_challenges.sort(key=lambda x: x.compatibility_score, reverse=True)
742
  recommendations = scored_challenges[:5]
743
-
744
  processing_time = (datetime.now() - start_time).total_seconds()
745
  query_techs = self.extract_technologies_from_query(query)
746
  avg_score = sum(c.compatibility_score for c in challenges) / len(challenges) if challenges else 0
747
-
748
- print(f"βœ… Step 5: Generated {len(recommendations)} recommendations in {processing_time:.3f}s")
749
- print(f"πŸ† Top recommendation: {recommendations[0].title} ({recommendations[0].compatibility_score:.0f}%)")
750
- print(f"πŸ“Š Data source being reported: {data_source}")
751
- print(f"🎯 === RECOMMENDATION REQUEST COMPLETE ===\n")
752
-
753
  return {
754
  "recommendations": [asdict(rec) for rec in recommendations],
755
  "insights": {
@@ -762,7 +636,7 @@ class UltimateTopcoderMCPEngine:
762
  "session_active": bool(self.session_id),
763
  "mcp_connected": self.is_connected,
764
  "algorithm_version": "Advanced Multi-Factor v2.0",
765
- "topcoder_total": f"{len(challenges)} challenges analyzed"
766
  }
767
  }
768
 
@@ -1405,72 +1279,6 @@ def check_mcp_status():
1405
 
1406
  return "\n".join(results)
1407
 
1408
- def debug_mcp_queries():
1409
- """Debug specific MCP queries to see what works"""
1410
- results = []
1411
- results.append("πŸ” DEBUG MCP QUERY TESTING")
1412
- results.append("=" * 40)
1413
-
1414
- async def test_different_queries():
1415
- # Test queries that should work vs ones that don't
1416
- test_queries = [
1417
- ("AI", {"search": "AI", "perPage": 5}),
1418
- ("Python", {"search": "Python", "perPage": 5}),
1419
- ("React", {"search": "React", "perPage": 5}),
1420
- ("JavaScript", {"search": "JavaScript", "perPage": 5}),
1421
- ("AI with tags", {"tags": ["AI"], "perPage": 5}),
1422
- ("Python with tags", {"tags": ["Python"], "perPage": 5}),
1423
- ("Simple empty", {"perPage": 5}),
1424
- ("Status only", {"status": "Active", "perPage": 5}),
1425
- ("AI minimal", {"search": "ai", "perPage": 3})
1426
- ]
1427
-
1428
- for query_name, query_params in test_queries:
1429
- results.append(f"\nπŸ§ͺ Testing: {query_name}")
1430
- results.append(f"πŸ“‹ Parameters: {query_params}")
1431
-
1432
- try:
1433
- result = await intelligence_engine.call_tool("query-tc-challenges", query_params)
1434
-
1435
- if result:
1436
- results.append(f"βœ… Got response!")
1437
- if isinstance(result, dict):
1438
- results.append(f"πŸ“Š Response keys: {list(result.keys())}")
1439
-
1440
- # Check for data
1441
- challenge_count = 0
1442
- if "structuredContent" in result and "data" in result["structuredContent"]:
1443
- challenge_count = len(result["structuredContent"]["data"])
1444
- elif "data" in result:
1445
- challenge_count = len(result["data"])
1446
-
1447
- results.append(f"🎯 Challenge count: {challenge_count}")
1448
-
1449
- if challenge_count > 0:
1450
- results.append(f"πŸ”₯ SUCCESS! {query_name} returned {challenge_count} challenges")
1451
- else:
1452
- results.append(f"⚠️ {query_name} returned empty data")
1453
- else:
1454
- results.append(f"πŸ“Š Response type: {type(result)}")
1455
- else:
1456
- results.append(f"❌ No response for {query_name}")
1457
-
1458
- except Exception as e:
1459
- results.append(f"❌ Error testing {query_name}: {str(e)}")
1460
-
1461
- # Run the async test
1462
- try:
1463
- asyncio.run(test_different_queries())
1464
- except Exception as e:
1465
- results.append(f"❌ Test failed: {str(e)}")
1466
-
1467
- results.append("\n🎯 ANALYSIS:")
1468
- results.append("This will show which query patterns work with the real MCP server.")
1469
- results.append("If only 'AI' queries work, it might be a server-side data issue.")
1470
- results.append("If multiple queries work, it might be our parsing logic.")
1471
-
1472
- return "\n".join(results)
1473
-
1474
  def create_ultimate_interface():
1475
  """Create the ULTIMATE Gradio interface combining all features"""
1476
  print("🎨 Creating ULTIMATE Gradio interface...")
@@ -1683,7 +1491,7 @@ def create_ultimate_interface():
1683
  outputs=[enhanced_chatbot, enhanced_chat_input]
1684
  )
1685
 
1686
- # Tab 3: FIXED ULTIMATE Performance - ALL OPTIONS RESTORED + DEBUG
1687
  with gr.TabItem("⚑ ULTIMATE Performance"):
1688
  gr.Markdown("""
1689
  ### πŸ§ͺ ULTIMATE System Performance & Real MCP Integration
@@ -1696,7 +1504,6 @@ def create_ultimate_interface():
1696
  ultimate_test_btn = gr.Button("πŸ§ͺ Run ULTIMATE Performance Test", variant="secondary", size="lg", elem_classes="ultimate-btn")
1697
  quick_benchmark_btn = gr.Button("⚑ Quick Benchmark", variant="secondary")
1698
  mcp_status_btn = gr.Button("πŸ”₯ Check Real MCP Status", variant="secondary")
1699
- debug_queries_btn = gr.Button("πŸ” Debug MCP Queries", variant="secondary")
1700
 
1701
  with gr.Column():
1702
  ultimate_test_output = gr.Textbox(
@@ -1705,11 +1512,10 @@ def create_ultimate_interface():
1705
  show_label=True
1706
  )
1707
 
1708
- # FIXED: Connect all test functions including debug
1709
  ultimate_test_btn.click(run_ultimate_performance_test, outputs=ultimate_test_output)
1710
  quick_benchmark_btn.click(quick_benchmark, outputs=ultimate_test_output)
1711
  mcp_status_btn.click(check_mcp_status, outputs=ultimate_test_output)
1712
- debug_queries_btn.click(debug_mcp_queries, outputs=ultimate_test_output)
1713
 
1714
  # Tab 4: ULTIMATE About & Documentation
1715
  with gr.TabItem("ℹ️ ULTIMATE About"):
 
234
  return None
235
 
236
  def convert_topcoder_challenge(self, tc_data: Dict) -> Challenge:
237
+ """Enhanced data conversion from Topcoder MCP response"""
238
  try:
239
+ challenge_id = str(tc_data.get('id', 'unknown'))
240
+ title = tc_data.get('name', 'Topcoder Challenge')
241
+ description = tc_data.get('description', 'Challenge description not available')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
242
 
 
243
  technologies = []
 
 
 
244
  skills = tc_data.get('skills', [])
245
+ for skill in skills:
246
+ if isinstance(skill, dict) and 'name' in skill:
247
+ technologies.append(skill['name'])
248
+
249
+ if 'technologies' in tc_data:
250
+ tech_list = tc_data['technologies']
251
+ if isinstance(tech_list, list):
252
+ for tech in tech_list:
253
+ if isinstance(tech, dict) and 'name' in tech:
254
+ technologies.append(tech['name'])
255
+ elif isinstance(tech, str):
256
+ technologies.append(tech)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
 
 
 
 
 
 
 
258
  total_prize = 0
 
 
259
  prize_sets = tc_data.get('prizeSets', [])
260
+ for prize_set in prize_sets:
261
+ if prize_set.get('type') == 'placement':
262
+ prizes = prize_set.get('prizes', [])
263
+ for prize in prizes:
264
+ if prize.get('type') == 'USD':
265
+ total_prize += prize.get('value', 0)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
266
 
267
  prize = f"${total_prize:,}" if total_prize > 0 else "Merit-based"
 
268
 
269
+ challenge_type = tc_data.get('type', 'Unknown')
 
270
  difficulty_mapping = {
271
  'First2Finish': 'Beginner',
272
+ 'Code': 'Intermediate',
273
  'Assembly Competition': 'Advanced',
274
  'UI Prototype Competition': 'Intermediate',
275
  'Copilot Posting': 'Beginner',
276
  'Bug Hunt': 'Beginner',
277
+ 'Test Suites': 'Intermediate'
 
278
  }
279
  difficulty = difficulty_mapping.get(challenge_type, 'Intermediate')
 
280
 
281
+ time_estimate = "Variable duration"
282
+ registrants = tc_data.get('numOfRegistrants', 0)
283
+ status = tc_data.get('status', '')
 
284
  if status == 'Completed':
285
  time_estimate = "Recently completed"
286
  elif status in ['Active', 'Draft']:
287
  time_estimate = "Active challenge"
 
 
 
288
 
289
+ return Challenge(
 
290
  id=challenge_id,
291
  title=title,
292
  description=description[:300] + "..." if len(description) > 300 else description,
 
296
  time_estimate=time_estimate,
297
  registrants=registrants
298
  )
 
 
 
 
 
 
 
 
299
 
300
  except Exception as e:
301
+ print(f"❌ Error converting challenge: {e}")
 
 
302
  return Challenge(
303
  id=str(tc_data.get('id', 'unknown')),
304
  title=str(tc_data.get('name', 'Challenge')),
 
338
  sort_by: str = None,
339
  sort_order: str = None,
340
  ) -> List[Challenge]:
341
+ """FIXED: More aggressive real challenge fetching"""
 
 
 
342
 
343
  # Always try to connect
344
+ print(f"πŸ”„ Attempting to fetch REAL challenges (limit: {limit})")
345
  connection_success = await self.initialize_connection()
346
+
347
  if not connection_success:
348
+ print("❌ Could not establish MCP connection, using fallback")
349
  return []
350
 
351
+ # Build comprehensive query parameters
352
+ skill_keywords = self.extract_technologies_from_query(
353
+ query + " " + " ".join(user_profile.skills + user_profile.interests)
354
+ )
355
+
356
+ mcp_query = {
357
+ "perPage": limit,
358
+ }
359
 
360
+ # Add filters based on user input
361
+ if status:
362
+ mcp_query["status"] = status
363
+ else:
364
+ mcp_query["status"] = "Active" # Default to active
365
+
366
+ if prize_min is not None:
367
+ mcp_query["totalPrizesFrom"] = prize_min
368
+ if prize_max is not None:
369
+ mcp_query["totalPrizesTo"] = prize_max
370
+ if challenge_type:
371
+ mcp_query["type"] = challenge_type
372
+ if track:
373
+ mcp_query["track"] = track
374
+ if skill_keywords:
375
+ mcp_query["tags"] = skill_keywords
376
  if query.strip():
377
  mcp_query["search"] = query.strip()
 
 
 
 
378
 
379
+ # Set sorting
380
+ mcp_query["sortBy"] = sort_by if sort_by else "overview.totalPrizes"
381
+ mcp_query["sortOrder"] = sort_order if sort_order else "desc"
382
+
383
+ print(f"πŸ”§ MCP Query parameters: {mcp_query}")
384
 
385
+ # Call the MCP tool
386
  result = await self.call_tool("query-tc-challenges", mcp_query)
 
387
  if not result:
388
  print("❌ No result from MCP tool call")
389
  return []
390
 
391
+ print(f"πŸ“Š Raw MCP result type: {type(result)}")
 
 
 
 
392
  if isinstance(result, dict):
393
+ print(f"πŸ“Š MCP result keys: {list(result.keys())}")
 
 
 
 
 
 
 
 
 
 
394
 
395
+ # FIXED: Better response parsing - handle multiple formats
396
+ challenge_data_list = []
397
+ if "structuredContent" in result:
398
+ structured = result["structuredContent"]
399
+ if isinstance(structured, dict) and "data" in structured:
400
+ challenge_data_list = structured["data"]
401
+ print(f"βœ… Found {len(challenge_data_list)} challenges in structuredContent")
402
+ elif "data" in result:
403
+ challenge_data_list = result["data"]
404
+ print(f"βœ… Found {len(challenge_data_list)} challenges in data")
405
+ elif "content" in result and len(result["content"]) > 0:
406
+ content_item = result["content"][0]
407
+ if isinstance(content_item, dict) and content_item.get("type") == "text":
408
+ try:
409
+ text_content = content_item.get("text", "")
410
+ parsed_data = json.loads(text_content)
411
+ if "data" in parsed_data:
412
+ challenge_data_list = parsed_data["data"]
413
+ print(f"βœ… Found {len(challenge_data_list)} challenges in parsed content")
414
+ except json.JSONDecodeError:
415
+ pass
416
 
 
 
 
417
  challenges = []
418
+ for item in challenge_data_list:
419
  if isinstance(item, dict):
420
  try:
421
  challenge = self.convert_topcoder_challenge(item)
422
  challenges.append(challenge)
 
 
 
 
 
423
  except Exception as e:
424
+ print(f"Error converting challenge: {e}")
 
425
  continue
 
 
426
 
427
+ print(f"🎯 Successfully converted {len(challenges)} REAL challenges")
428
+ return challenges
 
 
 
 
 
 
429
 
430
  def calculate_advanced_compatibility_score(self, challenge: Challenge, user_profile: UserProfile, query: str) -> tuple:
431
  score = 0.0
 
584
  sort_by: str = None, sort_order: str = None,
585
  limit: int = 50
586
  ) -> Dict[str, Any]:
 
587
  start_time = datetime.now()
588
+ print(f"🎯 Analyzing profile: {user_profile.skills} | Level: {user_profile.experience_level}")
589
+
590
+ # FIXED: More aggressive real data fetching
 
 
 
 
 
591
  real_challenges = await self.fetch_real_challenges(
592
  user_profile=user_profile,
593
  query=query,
 
601
  sort_order=sort_order,
602
  )
603
 
604
+ if real_challenges:
 
 
 
605
  challenges = real_challenges
606
+ data_source = "πŸ”₯ REAL Topcoder MCP Server (4,596+ challenges)"
607
+ print(f"πŸŽ‰ Using {len(challenges)} REAL Topcoder challenges!")
 
 
 
 
 
608
  else:
609
  challenges = self.mock_challenges
610
+ data_source = "✨ Enhanced Intelligence Engine (Premium Dataset)"
611
+ print(f"⚑ Using {len(challenges)} premium challenges with advanced algorithms")
 
612
 
 
 
613
  scored_challenges = []
614
  for challenge in challenges:
615
  score, factors = self.calculate_advanced_compatibility_score(challenge, user_profile, query)
616
  challenge.compatibility_score = score
617
  challenge.rationale = f"Match: {score:.0f}%. " + ". ".join(factors[:2]) + "."
618
  scored_challenges.append(challenge)
 
619
  scored_challenges.sort(key=lambda x: x.compatibility_score, reverse=True)
620
  recommendations = scored_challenges[:5]
 
621
  processing_time = (datetime.now() - start_time).total_seconds()
622
  query_techs = self.extract_technologies_from_query(query)
623
  avg_score = sum(c.compatibility_score for c in challenges) / len(challenges) if challenges else 0
624
+ print(f"βœ… Generated {len(recommendations)} recommendations in {processing_time:.3f}s:")
625
+ for i, rec in enumerate(recommendations, 1):
626
+ print(f" {i}. {rec.title} - {rec.compatibility_score:.0f}% compatibility")
 
 
 
627
  return {
628
  "recommendations": [asdict(rec) for rec in recommendations],
629
  "insights": {
 
636
  "session_active": bool(self.session_id),
637
  "mcp_connected": self.is_connected,
638
  "algorithm_version": "Advanced Multi-Factor v2.0",
639
+ "topcoder_total": "4,596+ live challenges" if real_challenges else "Premium dataset"
640
  }
641
  }
642
 
 
1279
 
1280
  return "\n".join(results)
1281
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1282
  def create_ultimate_interface():
1283
  """Create the ULTIMATE Gradio interface combining all features"""
1284
  print("🎨 Creating ULTIMATE Gradio interface...")
 
1491
  outputs=[enhanced_chatbot, enhanced_chat_input]
1492
  )
1493
 
1494
+ # Tab 3: FIXED ULTIMATE Performance - ALL OPTIONS RESTORED
1495
  with gr.TabItem("⚑ ULTIMATE Performance"):
1496
  gr.Markdown("""
1497
  ### πŸ§ͺ ULTIMATE System Performance & Real MCP Integration
 
1504
  ultimate_test_btn = gr.Button("πŸ§ͺ Run ULTIMATE Performance Test", variant="secondary", size="lg", elem_classes="ultimate-btn")
1505
  quick_benchmark_btn = gr.Button("⚑ Quick Benchmark", variant="secondary")
1506
  mcp_status_btn = gr.Button("πŸ”₯ Check Real MCP Status", variant="secondary")
 
1507
 
1508
  with gr.Column():
1509
  ultimate_test_output = gr.Textbox(
 
1512
  show_label=True
1513
  )
1514
 
1515
+ # FIXED: Connect all test functions
1516
  ultimate_test_btn.click(run_ultimate_performance_test, outputs=ultimate_test_output)
1517
  quick_benchmark_btn.click(quick_benchmark, outputs=ultimate_test_output)
1518
  mcp_status_btn.click(check_mcp_status, outputs=ultimate_test_output)
 
1519
 
1520
  # Tab 4: ULTIMATE About & Documentation
1521
  with gr.TabItem("ℹ️ ULTIMATE About"):