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()