Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| import os | |
| import gradio as gr | |
| from datasets import load_dataset | |
| from dataclasses import dataclass | |
| from typing import Any | |
| # HF token should be set as environment variable HF_TOKEN | |
| class DatasetViewer: | |
| dataset: Any = None | |
| current_index: int = 0 | |
| total_items: int = 0 | |
| show_answer: bool = False | |
| def load_dataset(self, dataset_name: str = "yourbench/reachy_mini_info_benchmark", | |
| subset: str = "prepared_lighteval"): | |
| try: | |
| self.dataset = load_dataset(dataset_name, subset) | |
| # Try to get the first available split | |
| if isinstance(self.dataset, dict): | |
| first_split = next(iter(self.dataset.keys())) | |
| self.dataset = self.dataset[first_split] | |
| self.total_items = len(self.dataset) | |
| self.current_index = 0 | |
| self.show_answer = False | |
| return True | |
| except Exception as e: | |
| print(f"Error loading dataset: {e}") | |
| # Create mock data for demonstration | |
| self.create_mock_data() | |
| return False | |
| def create_mock_data(self): | |
| """Create mock data that simulates yourbench dataset structure""" | |
| mock_data = [ | |
| { | |
| "question": "What is the capital of France?", | |
| "ground_truth_answer": "Paris", | |
| "document_summary": "France is a country in Western Europe.", | |
| "question_category": "geography", | |
| "estimated_difficulty": 2, | |
| "kind": "single_shot", | |
| "additional_instructions": "Ask generalizable questions." | |
| }, | |
| { | |
| "question": "Explain the concept of object-oriented programming.", | |
| "ground_truth_answer": "Object-oriented programming (OOP) is a programming paradigm based on the concept of 'objects', which can contain data and code: data in the form of fields, and code in the form of procedures. Key principles include encapsulation, inheritance, and polymorphism.", | |
| "document_summary": "Programming concepts", | |
| "question_category": "computer_science", | |
| "estimated_difficulty": 4, | |
| "kind": "single_shot", | |
| "additional_instructions": "Provide detailed explanations." | |
| }, | |
| ] | |
| # Create a mock dataset-like structure | |
| class MockDataset: | |
| def __init__(self, data): | |
| self.data = data | |
| def __len__(self): | |
| return len(self.data) | |
| def __getitem__(self, idx): | |
| return self.data[idx] | |
| self.dataset = MockDataset(mock_data) | |
| self.total_items = len(mock_data) | |
| self.current_index = 0 | |
| self.show_answer = False | |
| viewer = DatasetViewer() | |
| viewer.load_dataset() | |
| def get_current_item(): | |
| if viewer.dataset is None or viewer.total_items == 0: | |
| return {"question": "No data available", "answer": "", "context": "", "task": "", "difficulty": ""} | |
| item = viewer.dataset[viewer.current_index] | |
| # Map actual dataset fields to expected interface fields | |
| mapped_item = { | |
| "question": item.get("question", "No question available"), | |
| "answer": item.get("ground_truth_answer", "No answer available"), | |
| "context": item.get("document_summary", "No context available"), | |
| "task": item.get("question_category", "Unknown category"), | |
| "difficulty": str(item.get("estimated_difficulty", "Unknown")), | |
| "additional_instructions": item.get("additional_instructions", ""), | |
| "kind": item.get("kind", ""), | |
| "citations": item.get("citations", []), | |
| "document_id": item.get("document_id", ""), | |
| } | |
| return mapped_item | |
| def get_card_content(): | |
| item = get_current_item() | |
| if viewer.show_answer: | |
| # Show answer side | |
| content = f""" | |
| <div style="text-align: center; padding: 40px; min-height: 400px; display: flex; flex-direction: column; justify-content: center;"> | |
| <h1 style="color: #2d5aa0; font-size: 2.5em; margin-bottom: 30px;">Answer</h1> | |
| <div style="font-size: 1.4em; line-height: 1.6; color: #333; max-width: 800px; margin: 0 auto;"> | |
| {item['answer']} | |
| </div> | |
| </div> | |
| """ | |
| button_text = "Show Question" | |
| else: | |
| # Show question side | |
| content = f""" | |
| <div style="text-align: center; padding: 40px; min-height: 400px; display: flex; flex-direction: column; justify-content: center;"> | |
| <h1 style="color: #2d5aa0; font-size: 2.5em; margin-bottom: 30px;">Question</h1> | |
| <div style="font-size: 1.4em; line-height: 1.6; color: #333; max-width: 800px; margin: 0 auto;"> | |
| {item['question']} | |
| </div> | |
| </div> | |
| """ | |
| button_text = "Show Answer" | |
| return content, button_text | |
| def get_metadata(): | |
| item = get_current_item() | |
| context = item.get('context', 'No context') | |
| task = item.get('task', 'Unknown task') | |
| difficulty = item.get('difficulty', 'Unknown') | |
| kind = item.get('kind', 'Unknown') | |
| additional_instructions = item.get('additional_instructions', '') | |
| metadata = f"Category: {task} | Difficulty: {difficulty}/5 | Type: {kind}" | |
| if additional_instructions: | |
| metadata += f" | Instructions: {additional_instructions}" | |
| # Truncate context if too long | |
| if len(context) > 150: | |
| context = context[:150] + "..." | |
| return metadata, context | |
| def toggle_answer(): | |
| viewer.show_answer = not viewer.show_answer | |
| content, button_text = get_card_content() | |
| return content, button_text | |
| def next_item(): | |
| if viewer.total_items > 0: | |
| viewer.current_index = (viewer.current_index + 1) % viewer.total_items | |
| viewer.show_answer = False | |
| content, button_text = get_card_content() | |
| metadata, context = get_metadata() | |
| progress = f"{viewer.current_index + 1} of {viewer.total_items}" | |
| return content, button_text, metadata, context, progress | |
| def previous_item(): | |
| if viewer.total_items > 0: | |
| viewer.current_index = (viewer.current_index - 1) % viewer.total_items | |
| viewer.show_answer = False | |
| content, button_text = get_card_content() | |
| metadata, context = get_metadata() | |
| progress = f"{viewer.current_index + 1} of {viewer.total_items}" | |
| return content, button_text, metadata, context, progress | |
| def jump_to_item(item_number): | |
| if viewer.total_items > 0 and 1 <= item_number <= viewer.total_items: | |
| viewer.current_index = item_number - 1 | |
| viewer.show_answer = False | |
| content, button_text = get_card_content() | |
| metadata, context = get_metadata() | |
| progress = f"{viewer.current_index + 1} of {viewer.total_items}" | |
| return content, button_text, metadata, context, progress | |
| # Initialize | |
| initial_content, initial_button_text = get_card_content() | |
| initial_metadata, initial_context = get_metadata() | |
| initial_progress = f"{viewer.current_index + 1} of {viewer.total_items}" | |
| # Custom CSS for flashcard styling | |
| css = """ | |
| .flashcard { | |
| border: 2px solid #ddd; | |
| border-radius: 15px; | |
| box-shadow: 0 4px 8px rgba(0,0,0,0.1); | |
| background: white; | |
| margin: 20px 0; | |
| min-height: 500px; | |
| } | |
| .controls { | |
| text-align: center; | |
| padding: 20px; | |
| } | |
| .metadata { | |
| background: #f8f9fa; | |
| padding: 15px; | |
| border-radius: 8px; | |
| margin: 10px 0; | |
| font-size: 0.9em; | |
| color: #666; | |
| } | |
| .context { | |
| background: #fff3cd; | |
| padding: 15px; | |
| border-radius: 8px; | |
| margin: 10px 0; | |
| font-size: 0.9em; | |
| color: #856404; | |
| border: 1px solid #ffeaa7; | |
| } | |
| .progress { | |
| text-align: center; | |
| font-size: 1.2em; | |
| font-weight: bold; | |
| color: #2d5aa0; | |
| margin: 20px 0; | |
| } | |
| """ | |
| # Create Gradio interface | |
| with gr.Blocks(css=css, title="Reachy Trivia") as demo: | |
| gr.Markdown("# π€ Reachy Trivia") | |
| gr.Markdown(""" | |
| **Test your knowledge about Reachy Mini and Reachy 2!** | |
| Reachy Mini is the $299 open-source desktop robot designed for AI developers, educators, and hobbyists. | |
| With its expressive antennas, screen-based eyes, and full Python programmability, it's the perfect companion | |
| for exploring human-robot interaction and AI development. | |
| *Questions generated by Yourbench - HuggingFace's Dynamic Evaluation Generation Platform* | |
| """) | |
| # Main flashcard area | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| flashcard = gr.HTML(initial_content, elem_classes=["flashcard"]) | |
| # Controls | |
| with gr.Row(elem_classes=["controls"]): | |
| prev_btn = gr.Button("Previous", size="lg", variant="secondary") | |
| toggle_btn = gr.Button(initial_button_text, size="lg", variant="primary") | |
| next_btn = gr.Button("Next", size="lg", variant="secondary") | |
| # Progress | |
| progress_display = gr.HTML(f'<div class="progress">{initial_progress}</div>') | |
| # Metadata and navigation sidebar | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| metadata_display = gr.HTML(f'<div class="metadata">{initial_metadata}</div>') | |
| context_display = gr.HTML(f'<div class="context">Context: {initial_context}</div>') | |
| with gr.Column(scale=1): | |
| gr.Markdown("### Jump to Item") | |
| jump_input = gr.Number( | |
| label="Item Number", | |
| value=1, | |
| minimum=1, | |
| maximum=viewer.total_items, | |
| precision=0 | |
| ) | |
| jump_btn = gr.Button("Jump", variant="secondary") | |
| gr.Markdown("---") | |
| gr.Markdown("### About Reachy Mini") | |
| gr.Markdown(""" | |
| **Key Features:** | |
| - π― $299 open-source desktop robot | |
| - π± Expressive screen-based eyes | |
| - π§ Full Python programmability | |
| - π€ Human-robot interaction focus | |
| - π§ Hugging Face AI integration | |
| - π¦ DIY assembly kit | |
| """) | |
| gr.Markdown("*Questions powered by [YouBench](https://huggingface.co/yourbench)*") | |
| # Event handlers | |
| toggle_btn.click( | |
| toggle_answer, | |
| outputs=[flashcard, toggle_btn] | |
| ) | |
| next_btn.click( | |
| next_item, | |
| outputs=[flashcard, toggle_btn, metadata_display, context_display, progress_display] | |
| ) | |
| prev_btn.click( | |
| previous_item, | |
| outputs=[flashcard, toggle_btn, metadata_display, context_display, progress_display] | |
| ) | |
| jump_btn.click( | |
| jump_to_item, | |
| inputs=[jump_input], | |
| outputs=[flashcard, toggle_btn, metadata_display, context_display, progress_display] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() |