| |
| """ |
| Interactive Crossword Clue Tester |
| Allows user to test custom word-topic combinations with the best performing API model. |
| """ |
|
|
| import sys |
| import logging |
| from pathlib import Path |
|
|
| |
| sys.path.insert(0, str(Path(__file__).parent)) |
|
|
| try: |
| from api_clue_generator import APIClueGenerator |
| API_AVAILABLE = True |
| except ImportError as e: |
| print(f"β Import error: {e}") |
| API_AVAILABLE = False |
|
|
| |
| logging.basicConfig( |
| level=logging.WARNING, |
| format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' |
| ) |
|
|
|
|
| def interactive_clue_tester(): |
| """Interactive mode for testing crossword clue generation.""" |
| if not API_AVAILABLE: |
| print("β Cannot run interactive tester - API generator not available") |
| return |
| |
| print("π§ͺ Interactive Crossword Clue Tester") |
| print("=" * 50) |
| print("Test custom word-topic combinations using multiple AI models via API") |
| |
| |
| generator = APIClueGenerator() |
| |
| print(f"\nπ€ Available models: {len(generator.models)}") |
| |
| |
| print("\nModels being tested:") |
| for i, (key, model) in enumerate(generator.models.items(), 1): |
| print(f" {i}. {key}") |
| |
| print("\n" + "=" * 50) |
| print("π― INTERACTIVE MODE") |
| print("=" * 50) |
| print("Enter word-topic pairs to test AI clue generation.") |
| print("Format: word,topic (e.g., 'elephant,animals')") |
| print("") |
| print("Commands:") |
| print(" quit/exit/q - Exit the program") |
| print(" help - Show this help") |
| print(" models - List all models") |
| print(" best - Use only the best performing model") |
| print("-" * 50) |
| |
| use_best_only = False |
| best_model = None |
| |
| while True: |
| try: |
| user_input = input("\nπ Enter word,topic (or command): ").strip() |
| |
| if user_input.lower() in ['quit', 'exit', 'q']: |
| print("π Thanks for testing! Goodbye!") |
| break |
| |
| elif user_input.lower() == 'help': |
| print("\nCommands:") |
| print(" word,topic - Generate clues (e.g., 'guitar,music')") |
| print(" models - List all available models") |
| print(" best - Toggle best-model-only mode") |
| print(" quit - Exit") |
| continue |
| |
| elif user_input.lower() == 'models': |
| print(f"\nAvailable models ({len(generator.models)}):") |
| for i, (key, model) in enumerate(generator.models.items(), 1): |
| print(f" {i}. {key} - {model}") |
| continue |
| |
| elif user_input.lower() == 'best': |
| use_best_only = not use_best_only |
| if use_best_only: |
| print("π Best-model-only mode ENABLED") |
| print(" Will test with highest-rated model only for faster results") |
| else: |
| print("π€ All-models mode ENABLED") |
| print(" Will test with all available models") |
| continue |
| |
| elif not user_input or ',' not in user_input: |
| print("β Invalid format. Use: word,topic (e.g., 'cat,animals')") |
| print(" Or type 'help' for commands") |
| continue |
| |
| |
| parts = user_input.split(',', 1) |
| word = parts[0].strip().upper() |
| topic = parts[1].strip().lower() |
| |
| if not word or not topic: |
| print("β Both word and topic are required") |
| continue |
| |
| print(f"\nπ― Generating clues for: '{word}' + '{topic}'") |
| print("-" * 40) |
| |
| if use_best_only and best_model: |
| |
| print(f"Using best model: {best_model}") |
| |
| results = generator.generate_clue(word, topic) |
| |
| results = {best_model: results.get(best_model)} |
| else: |
| |
| results = generator.generate_clue(word, topic) |
| |
| |
| valid_results = [] |
| for model_key, clue in results.items(): |
| if clue: |
| quality, score = generator.evaluate_clue_quality(word, clue) |
| valid_results.append((model_key, clue, quality, score)) |
| |
| |
| if quality == "EXCELLENT": |
| quality_icon = "β
" |
| elif quality == "GOOD": |
| quality_icon = "π" |
| elif quality == "ACCEPTABLE": |
| quality_icon = "β οΈ " |
| else: |
| quality_icon = "β" |
| |
| print(f"{quality_icon} {model_key:20} | {quality:10} | {clue}") |
| else: |
| print(f"β {model_key:20} | FAILED | No response") |
| |
| |
| if valid_results: |
| |
| valid_results.sort(key=lambda x: x[3], reverse=True) |
| best_result = valid_results[0] |
| |
| print(f"\nπ Best result: {best_result[1]}") |
| print(f" Model: {best_result[0]}") |
| print(f" Quality: {best_result[2]} (score: {best_result[3]:.2f})") |
| |
| |
| if not best_model or best_result[3] > 0.7: |
| best_model = best_result[0] |
| |
| else: |
| print("β No valid clues generated by any model") |
| |
| except KeyboardInterrupt: |
| print("\nπ Interrupted. Goodbye!") |
| break |
| except Exception as e: |
| print(f"β Error: {e}") |
| print("Please try again or type 'quit' to exit") |
|
|
|
|
| def main(): |
| """Run the interactive clue tester.""" |
| interactive_clue_tester() |
|
|
|
|
| if __name__ == "__main__": |
| main() |