roadz commited on
Commit
a6b68d3
·
verified ·
1 Parent(s): 5f6532e

Upload 3 files

Browse files
Files changed (3) hide show
  1. README.md +32 -0
  2. app.py +165 -0
  3. requirements.txt +4 -0
README.md ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # AI Dialogue Lab - Gradio Version
2
+
3
+ Интерактивный интерфейс для проведения диалогов между AI моделями (Claude и Grok)
4
+
5
+ ## Особенности
6
+ - Оптимизация промптов перед началом диалога
7
+ - Настраиваемое количество итераций (1-5)
8
+ - Визуализация процесса обдумывания
9
+ - Простой и понятный интерфейс
10
+
11
+ ## Запуск локально
12
+ 1. Установите зависимости:
13
+ ```bash
14
+ pip install -r requirements.txt
15
+ ```
16
+
17
+ 2. Создайте файл .env с API ключами:
18
+ ```
19
+ ANTHROPIC_API_KEY=your_claude_api_key
20
+ XAI_API_KEY=your_grok_api_key
21
+ ```
22
+
23
+ 3. Запустите приложение:
24
+ ```bash
25
+ python app.py
26
+ ```
27
+
28
+ ## Развертывание на Hugging Face Space
29
+ 1. Создайте новый Space с SDK Gradio
30
+ 2. Загрузите все файлы
31
+ 3. Добавьте секреты ANTHROPIC_API_KEY и XAI_API_KEY в настройках Space
32
+ 4. Дождитесь автоматического деплоя
app.py ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+ import asyncio
4
+ import json
5
+ from datetime import datetime
6
+ from dialogue.manager import DialogueManager
7
+ from dotenv import load_dotenv
8
+
9
+ # Загружаем переменные окружения
10
+ load_dotenv()
11
+
12
+ def create_interface():
13
+ with gr.Blocks(theme=gr.themes.Soft()) as interface:
14
+ gr.Markdown("# AI Dialogue Lab")
15
+
16
+ state = gr.State({"is_processing": False})
17
+
18
+ with gr.Row():
19
+ with gr.Column(scale=3):
20
+ topic = gr.TextArea(
21
+ label="Тема для обсуждения",
22
+ placeholder="Опишите тему максимально подробно...",
23
+ lines=4
24
+ )
25
+ with gr.Column(scale=1):
26
+ iterations = gr.Slider(
27
+ minimum=1,
28
+ maximum=5,
29
+ step=1,
30
+ value=3,
31
+ label="Количество итераций"
32
+ )
33
+
34
+ with gr.Row():
35
+ start_btn = gr.Button("Начать", variant="primary")
36
+ save_btn = gr.Button("Сохранить")
37
+ clear_btn = gr.Button("Очистить")
38
+
39
+ status = gr.Markdown("")
40
+ chatbot = gr.Chatbot(label="Диалог", height=600)
41
+ dialogue_history = gr.State([])
42
+
43
+ def save_dialogue(history):
44
+ if not history:
45
+ return "❌ Нет данных для сохранения"
46
+
47
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
48
+ filename = f"dialogue_{timestamp}.json"
49
+
50
+ data = {
51
+ "timestamp": datetime.now().isoformat(),
52
+ "messages": history
53
+ }
54
+
55
+ with open(filename, "w", encoding="utf-8") as f:
56
+ json.dump(data, f, ensure_ascii=False, indent=2)
57
+
58
+ return f"✅ Диалог сохранен в файл: {filename}"
59
+
60
+ def update_ui_state(is_processing: bool):
61
+ return {
62
+ start_btn: gr.Button(interactive=not is_processing),
63
+ topic: gr.TextArea(interactive=not is_processing),
64
+ iterations: gr.Slider(interactive=not is_processing),
65
+ save_btn: gr.Button(interactive=not is_processing and bool(dialogue_history))
66
+ }
67
+
68
+ async def start_dialogue(topic_text, num_iterations):
69
+ # Деактивируем элементы интерфейса
70
+ start_btn.interactive = False
71
+ topic.interactive = False
72
+ iterations.interactive = False
73
+ save_btn.interactive = False
74
+
75
+ chat_history = []
76
+ dialogue_history = []
77
+
78
+ try:
79
+ manager = DialogueManager(topic_text, num_iterations)
80
+
81
+ # Оптимизация промпта
82
+ yield "🔄 Оптимизация запроса...", chat_history
83
+
84
+ optimized = await manager.optimize_prompt(topic_text)
85
+ chat_history = [("🔧 System", f"Оптимизированная тема:\n{optimized}")]
86
+ dialogue_history = chat_history.copy()
87
+ yield "✨ Начинаем диалог...", chat_history
88
+
89
+ current_prompt = optimized
90
+ for i in range(num_iterations):
91
+ # Ход Claude
92
+ yield "🤔 Claude обдумывает ответ...", chat_history
93
+
94
+ claude_response = await manager.claude.generate_response(current_prompt)
95
+ chat_history.append(("🔵 Claude", claude_response))
96
+ dialogue_history = chat_history.copy()
97
+ yield f"✨ Ход {i+1}/{num_iterations}: Claude ответил", chat_history
98
+
99
+ # Ход Grok
100
+ yield "🤔 Grok обдумывает ответ...", chat_history
101
+
102
+ grok_response = await manager.grok.generate_response(claude_response)
103
+ chat_history.append(("🟢 Grok", grok_response))
104
+ dialogue_history = chat_history.copy()
105
+ yield f"✨ Ход {i+1}/{num_iterations}: Grok ответил", chat_history
106
+
107
+ current_prompt = grok_response
108
+
109
+ # Активируем элементы интерфейса
110
+ start_btn.interactive = True
111
+ topic.interactive = True
112
+ iterations.interactive = True
113
+ save_btn.interactive = True
114
+
115
+ yield "✅ Диалог завершен", chat_history
116
+
117
+ except Exception as e:
118
+ # В случае ошибки тоже акти��ируем элементы
119
+ start_btn.interactive = True
120
+ topic.interactive = True
121
+ iterations.interactive = True
122
+ save_btn.interactive = False
123
+ yield f"❌ Ошибка: {str(e)}", chat_history
124
+
125
+ def clear_chat():
126
+ return {
127
+ status: "",
128
+ chatbot: [],
129
+ dialogue_history: [],
130
+ start_btn: gr.Button(interactive=True),
131
+ topic: gr.TextArea(interactive=True),
132
+ iterations: gr.Slider(interactive=True),
133
+ save_btn: gr.Button(interactive=False)
134
+ }
135
+
136
+ start_btn.click(
137
+ fn=start_dialogue,
138
+ inputs=[topic, iterations],
139
+ outputs=[status, chatbot],
140
+ api_name="start_dialogue",
141
+ show_progress="full"
142
+ ).then(
143
+ lambda: gr.Button(interactive=True),
144
+ None,
145
+ [start_btn]
146
+ )
147
+
148
+ save_btn.click(
149
+ fn=save_dialogue,
150
+ inputs=[dialogue_history],
151
+ outputs=[status],
152
+ api_name="save_dialogue"
153
+ )
154
+
155
+ clear_btn.click(
156
+ fn=clear_chat,
157
+ outputs=[status, chatbot, dialogue_history, start_btn, topic, iterations, save_btn],
158
+ api_name="clear_chat"
159
+ )
160
+
161
+ return interface
162
+
163
+ if __name__ == "__main__":
164
+ interface = create_interface()
165
+ interface.queue().launch()
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gradio>=4.0.0
2
+ anthropic>=0.17.0
3
+ python-dotenv>=1.0.0
4
+ aiohttp>=3.8.5