Spaces:
Sleeping
Sleeping
import os | |
import gradio as gr | |
import asyncio | |
import json | |
from datetime import datetime | |
from dialogue.manager import DialogueManager | |
from dotenv import load_dotenv | |
# Загружаем переменные окружения | |
load_dotenv() | |
def create_interface(): | |
with gr.Blocks(theme=gr.themes.Soft()) as interface: | |
gr.Markdown("# AI Dialogue Lab") | |
state = gr.State({"is_processing": False}) | |
with gr.Row(): | |
with gr.Column(scale=3): | |
topic = gr.TextArea( | |
label="Тема для обсуждения", | |
placeholder="Опишите тему максимально подробно...", | |
lines=4 | |
) | |
with gr.Column(scale=1): | |
iterations = gr.Slider( | |
minimum=1, | |
maximum=5, | |
step=1, | |
value=3, | |
label="Количество итераций" | |
) | |
with gr.Row(): | |
start_btn = gr.Button("Начать", variant="primary") | |
save_btn = gr.Button("Сохранить") | |
clear_btn = gr.Button("Очистить") | |
status = gr.Markdown("") | |
chatbot = gr.Chatbot(label="Диалог", height=600) | |
dialogue_history = gr.State([]) | |
def save_dialogue(history): | |
if not history: | |
return "❌ Нет данных для сохранения" | |
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") | |
filename = f"dialogue_{timestamp}.json" | |
data = { | |
"timestamp": datetime.now().isoformat(), | |
"messages": history | |
} | |
with open(filename, "w", encoding="utf-8") as f: | |
json.dump(data, f, ensure_ascii=False, indent=2) | |
return f"✅ Диалог сохранен в файл: {filename}" | |
def update_ui_state(is_processing: bool): | |
return { | |
start_btn: gr.Button(interactive=not is_processing), | |
topic: gr.TextArea(interactive=not is_processing), | |
iterations: gr.Slider(interactive=not is_processing), | |
save_btn: gr.Button(interactive=not is_processing and bool(dialogue_history)) | |
} | |
async def start_dialogue(topic_text, num_iterations): | |
# Деактивируем элементы интерфейса | |
start_btn.interactive = False | |
topic.interactive = False | |
iterations.interactive = False | |
save_btn.interactive = False | |
chat_history = [] | |
dialogue_history = [] | |
try: | |
manager = DialogueManager(topic_text, num_iterations) | |
# Оптимизация промпта | |
yield "🔄 Оптимизация запроса...", chat_history | |
optimized = await manager.optimize_prompt(topic_text) | |
chat_history = [("🔧 System", f"Оптимизированная тема:\n{optimized}")] | |
dialogue_history = chat_history.copy() | |
yield "✨ Начинаем диалог...", chat_history | |
current_prompt = optimized | |
for i in range(num_iterations): | |
# Ход Claude | |
yield "🤔 Claude обдумывает ответ...", chat_history | |
claude_response = await manager.claude.generate_response(current_prompt) | |
chat_history.append(("🔵 Claude", claude_response)) | |
dialogue_history = chat_history.copy() | |
yield f"✨ Ход {i+1}/{num_iterations}: Claude ответил", chat_history | |
# Ход Grok | |
yield "🤔 Grok обдумывает ответ...", chat_history | |
grok_response = await manager.grok.generate_response(claude_response) | |
chat_history.append(("🟢 Grok", grok_response)) | |
dialogue_history = chat_history.copy() | |
yield f"✨ Ход {i+1}/{num_iterations}: Grok ответил", chat_history | |
current_prompt = grok_response | |
# Активируем элементы интерфейса | |
start_btn.interactive = True | |
topic.interactive = True | |
iterations.interactive = True | |
save_btn.interactive = True | |
yield "✅ Диалог завершен", chat_history | |
except Exception as e: | |
# В случае ошибки тоже активируем элементы | |
start_btn.interactive = True | |
topic.interactive = True | |
iterations.interactive = True | |
save_btn.interactive = False | |
yield f"❌ Ошибка: {str(e)}", chat_history | |
def clear_chat(): | |
return { | |
status: "", | |
chatbot: [], | |
dialogue_history: [], | |
start_btn: gr.Button(interactive=True), | |
topic: gr.TextArea(interactive=True), | |
iterations: gr.Slider(interactive=True), | |
save_btn: gr.Button(interactive=False) | |
} | |
start_btn.click( | |
fn=start_dialogue, | |
inputs=[topic, iterations], | |
outputs=[status, chatbot], | |
api_name="start_dialogue", | |
show_progress="full" | |
).then( | |
lambda: gr.Button(interactive=True), | |
None, | |
[start_btn] | |
) | |
save_btn.click( | |
fn=save_dialogue, | |
inputs=[dialogue_history], | |
outputs=[status], | |
api_name="save_dialogue" | |
) | |
clear_btn.click( | |
fn=clear_chat, | |
outputs=[status, chatbot, dialogue_history, start_btn, topic, iterations, save_btn], | |
api_name="clear_chat" | |
) | |
return interface | |
if __name__ == "__main__": | |
interface = create_interface() | |
interface.queue().launch() |