Spaces:
Sleeping
Sleeping
| import os | |
| import gradio as gr | |
| import requests | |
| import pandas as pd | |
| from smolagents import LiteLLMModel, CodeAgent, DuckDuckGoSearchTool | |
| from gaia_tools import ReverseTextTool, RunPythonFileTool, download_server | |
| # ============================== | |
| # System Prompt | |
| # ============================== | |
| SYSTEM_PROMPT = """You are a general AI assistant. I will ask you a question. | |
| Report your thoughts, and finish your answer with just the answer — no prefixes. | |
| Your answer should be: | |
| • A number | |
| OR | |
| • Few words | |
| OR | |
| • Comma-separated list | |
| Rules: | |
| If number: | |
| - No commas | |
| - No units | |
| If string: | |
| - No articles | |
| - No abbreviations | |
| - Write digits as words | |
| Tool Rules: | |
| 1. Use only provided tools. | |
| 2. Use one tool at a time. | |
| 3. If reversed question → use ReverseTextTool. | |
| 4. If .py file → use RunPythonFileTool. | |
| 5. For downloads → use download_server. | |
| """ | |
| DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space" | |
| # ============================== | |
| # Agent Class (NVIDIA Version) | |
| # ============================== | |
| class MyAgent: | |
| def __init__(self): | |
| nvidia_api_key = os.getenv("NVIDIA_API_KEY") | |
| if not nvidia_api_key: | |
| raise ValueError( | |
| "NVIDIA_API_KEY not set in environment variables." | |
| ) | |
| # NVIDIA MiniMax model via LiteLLM | |
| self.model = LiteLLMModel( | |
| model_id="openai/minimaxai/minimax-m2.5", | |
| api_key=nvidia_api_key, | |
| api_base="https://integrate.api.nvidia.com/v1", | |
| system_prompt=SYSTEM_PROMPT | |
| ) | |
| self.agent = CodeAgent( | |
| tools=[ | |
| DuckDuckGoSearchTool(), | |
| ReverseTextTool, | |
| RunPythonFileTool, | |
| download_server | |
| ], | |
| model=self.model, | |
| add_base_tools=True, | |
| ) | |
| def __call__(self, question: str) -> str: | |
| return self.agent.run(question) | |
| # ============================== | |
| # Main Evaluation Function | |
| # ============================== | |
| def run_and_submit_all(profile: gr.OAuthProfile | None): | |
| space_id = os.getenv("SPACE_ID") | |
| if profile: | |
| username = profile.username | |
| print(f"User logged in: {username}") | |
| else: | |
| return "Please login to Hugging Face.", None | |
| questions_url = f"{DEFAULT_API_URL}/questions" | |
| submit_url = f"{DEFAULT_API_URL}/submit" | |
| try: | |
| agent = MyAgent() | |
| except Exception as e: | |
| return f"Error initializing agent: {e}", None | |
| # Fetch questions | |
| try: | |
| response = requests.get( | |
| questions_url, | |
| timeout=15 | |
| ) | |
| response.raise_for_status() | |
| questions_data = response.json() | |
| except Exception as e: | |
| return f"Error fetching questions: {e}", None | |
| results_log = [] | |
| answers_payload = [] | |
| # Run agent | |
| for item in questions_data: | |
| task_id = item.get("task_id") | |
| question_text = item.get("question") | |
| if not task_id or question_text is None: | |
| continue | |
| try: | |
| submitted_answer = agent(question_text) | |
| answers_payload.append({ | |
| "task_id": task_id, | |
| "submitted_answer": submitted_answer | |
| }) | |
| results_log.append({ | |
| "Task ID": task_id, | |
| "Question": question_text, | |
| "Submitted Answer": submitted_answer | |
| }) | |
| except Exception as e: | |
| results_log.append({ | |
| "Task ID": task_id, | |
| "Question": question_text, | |
| "Submitted Answer": f"AGENT ERROR: {e}" | |
| }) | |
| if not answers_payload: | |
| return "Agent did not return answers.", pd.DataFrame(results_log) | |
| submission_data = { | |
| "username": profile.username.strip(), | |
| "agent_code": | |
| f"https://huggingface.co/spaces/{space_id}/tree/main", | |
| "answers": answers_payload | |
| } | |
| # Submit answers | |
| try: | |
| response = requests.post( | |
| submit_url, | |
| json=submission_data, | |
| timeout=60 | |
| ) | |
| response.raise_for_status() | |
| result_data = response.json() | |
| final_status = ( | |
| f"Submission Successful!\n" | |
| f"User: {result_data.get('username')}\n" | |
| f"Score: {result_data.get('score', 'N/A')}% " | |
| f"({result_data.get('correct_count', '?')}/" | |
| f"{result_data.get('total_attempted', '?')} correct)\n" | |
| f"Message: {result_data.get('message', 'No message received.')}" | |
| ) | |
| return final_status, pd.DataFrame(results_log) | |
| except Exception as e: | |
| return f"Submission failed: {e}", pd.DataFrame(results_log) | |
| # ============================== | |
| # Gradio UI | |
| # ============================== | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# NVIDIA MiniMax Agent Runner 🚀") | |
| gr.Markdown(""" | |
| **Instructions** | |
| 1. Add NVIDIA API key in Secrets | |
| 2. Login to HuggingFace | |
| 3. Click Run | |
| """) | |
| gr.LoginButton() | |
| run_button = gr.Button( | |
| "Run Evaluation & Submit All Answers" | |
| ) | |
| status_output = gr.Textbox( | |
| label="Submission Result", | |
| lines=5, | |
| interactive=False | |
| ) | |
| results_table = gr.DataFrame( | |
| label="Results", | |
| wrap=True | |
| ) | |
| run_button.click( | |
| fn=run_and_submit_all, | |
| outputs=[status_output, results_table] | |
| ) | |
| if __name__ == "__main__": | |
| print("🔧 App starting...") | |
| demo.launch( | |
| debug=True, | |
| share=False | |
| ) |