import gradio as gr
import google.generativeai as genai
import os
from datetime import datetime
from typing import List, Optional, Dict, Any, Tuple
import asyncio
import httpx # Библиотека для асинхронных HTTP-запросов
# --- 1. Конфигурация API и Моделей ---
GOOGLE_API_KEY = os.environ.get('GOOGLE_API_KEY')
if not GOOGLE_API_KEY:
raise gr.Error("Переменная окружения GOOGLE_API_KEY не установлена.")
try:
genai.configure(api_key=GOOGLE_API_KEY)
except Exception as e:
raise gr.Error(f"Ошибка при настройке Google Gemini API: {e}.")
def get_available_models() -> List[str]:
available_models = []
try:
for m in genai.list_models():
if 'generateContent' in m.supported_generation_methods:
if 'vision' not in m.name.lower() and 'tts' not in m.name.lower() and 'audio' not in m.name.lower():
available_models.append(m.name)
except Exception as e:
print(f"Предупреждение: Не удалось получить список моделей: {e}.")
return sorted(list(set(available_models)))
AVAILABLE_MODELS = get_available_models()
if not AVAILABLE_MODELS:
raise gr.Error("Не найдено моделей, совместимых с 'generateContent'.")
# --- Константы для настройки ---
DEFAULT_NUM_AI_VARIANTS = 1
# --- 2. Логика генерации ответов ---
def format_history_for_gemini(history: List[List[Optional[str]]]) -> List[Dict[str, Any]]:
gemini_history = []
for turn in history:
if isinstance(turn, (list, tuple)) and len(turn) >= 2:
user_message, bot_message = turn[0], turn[1]
if user_message: gemini_history.append({'role': 'user', 'parts': [{'text': str(user_message)}]})
if bot_message and bot_message != "...":
gemini_history.append({'role': 'model', 'parts': [{'text': "Ответ сгенерирован."}]}) # Упрощенная заглушка
if history and history[-1][0]:
gemini_history.append({'role': 'user', 'parts': [{'text': str(history[-1][0])}]})
return gemini_history
async def generate_single_variant_async(history: List, model_name: str, temperature: float):
try:
model = genai.GenerativeModel(model_name=model_name)
chat_history_for_context = history[:-1]
last_user_prompt = history[-1]['parts'][0]['text']
chat = model.start_chat(history=chat_history_for_context)
response = await chat.send_message_async(
last_user_prompt,
generation_config=genai.types.GenerationConfig(temperature=temperature)
)
return response.text.strip()
except Exception as e:
return f'Ошибка генерации: {e}'
def format_variants_html(variants: List[str]) -> str:
if not variants: return ""
html_outputs = []
for i, variant_text in enumerate(variants):
js_safe_text = variant_text.replace('`', '\\`').replace('\n', '\\n').replace("'", "\\'")
copy_button_html = f""""""
if "Ошибка" in variant_text:
html_outputs.append(f'