Spaces:
Sleeping
Sleeping
| import os | |
| import time | |
| import requests | |
| import gradio as gr | |
| import pandas as pd | |
| GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") | |
| GEMINI_MODEL = "gemini-2.5-flash" | |
| GEMINI_API_URL = f"https://generativelanguage.googleapis.com/v1/models/{GEMINI_MODEL}:generateContent" | |
| DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space" | |
| class GeminiAgent: | |
| def __init__(self): | |
| if not GEMINI_API_KEY: | |
| raise ValueError("❌ Переменная окружения GEMINI_API_KEY не установлена.") | |
| def __call__(self, question: str) -> str: | |
| headers = {"Content-Type": "application/json"} | |
| params = {"key": GEMINI_API_KEY} | |
| payload = { | |
| "contents": [{"parts": [{"text": question}]}] | |
| } | |
| for attempt in range(3): | |
| try: | |
| response = requests.post(GEMINI_API_URL, headers=headers, params=params, json=payload) | |
| if response.status_code == 429: | |
| print(f"⚠️ Попытка {attempt+1}: Превышен лимит. Ждём 5 сек.") | |
| time.sleep(5) | |
| continue | |
| response.raise_for_status() | |
| return response.json()["candidates"][0]["content"]["parts"][0]["text"].strip() | |
| except Exception as e: | |
| print(f"❌ Ошибка: {e}") | |
| time.sleep(5) | |
| return "Ошибка при получении ответа от Gemini API" | |
| def run_and_submit_all(profile: gr.OAuthProfile | None): | |
| space_id = os.getenv("SPACE_ID") | |
| if not profile: | |
| return "Пожалуйста, войдите в Hugging Face", None | |
| username = profile.username | |
| agent_code = f"https://huggingface.co/spaces/{space_id}/tree/main" | |
| print(f"Пользователь: {username}") | |
| try: | |
| response = requests.get(f"{DEFAULT_API_URL}/questions", timeout=15) | |
| response.raise_for_status() | |
| questions_data = response.json() | |
| except Exception as e: | |
| return f"❌ Ошибка при загрузке вопросов: {e}", None | |
| agent = GeminiAgent() | |
| results_log = [] | |
| answers_payload = [] | |
| for item in questions_data: | |
| task_id = item.get("task_id") | |
| question_text = item.get("question") | |
| if not task_id or not question_text: | |
| continue | |
| answer = agent(question_text) | |
| results_log.append({"Task ID": task_id, "Question": question_text, "Answer": answer}) | |
| answers_payload.append({"task_id": task_id, "submitted_answer": answer}) | |
| time.sleep(3) # ⏳ Задержка между запросами | |
| try: | |
| submission_data = { | |
| "username": username, | |
| "agent_code": agent_code, | |
| "answers": answers_payload | |
| } | |
| submit_response = requests.post(f"{DEFAULT_API_URL}/submit", json=submission_data) | |
| submit_response.raise_for_status() | |
| result = submit_response.json() | |
| score = result.get("score", "N/A") | |
| return f"✅ Отправка завершена! Ваш результат: {score}%", pd.DataFrame(results_log) | |
| except Exception as e: | |
| return f"❌ Ошибка при отправке ответов: {e}", pd.DataFrame(results_log) | |
| # Gradio UI | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## Gemini 2.5 Agent 🤖") | |
| gr.Markdown("Войдите в Hugging Face и нажмите кнопку для запуска агента.") | |
| gr.LoginButton() | |
| run_btn = gr.Button("▶️ Запустить агента") | |
| status = gr.Textbox(label="Статус") | |
| table = gr.DataFrame(label="Результаты") | |
| run_btn.click(fn=run_and_submit_all, outputs=[status, table]) | |
| if __name__ == "__main__": | |
| demo.launch() |