File size: 4,254 Bytes
43c192f
af1b567
 
 
43c192f
af1b567
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12fa79e
af1b567
 
 
 
 
 
 
 
12fa79e
af1b567
12fa79e
af1b567
 
 
2f33702
af1b567
 
 
 
2f33702
af1b567
 
2252124
af1b567
 
 
 
 
 
 
 
 
 
 
 
 
8e84e2a
af1b567
8e84e2a
af1b567
2f33702
 
8e84e2a
 
2f33702
12fa79e
8e84e2a
2f33702
3a3437f
 
 
af1b567
 
 
 
 
 
 
 
3a3437f
 
af1b567
2f33702
af1b567
 
 
8e84e2a
af1b567
 
97eaf87
 
 
2f33702
01c1d14
 
 
 
 
 
af1b567
 
2f33702
af1b567
 
 
 
01c1d14
 
 
 
 
 
12fa79e
97eaf87
 
43c192f
af1b567
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import gradio as gr
import google.generativeai as genai
import os
import asyncio  # Import для асинхронности

# Безопасное получение API ключа
GEMINI_API_KEY = "AIzaSyBoqoPX-9uzvXyxzse0gRwH8_P9xO6O3Bc"
if not GEMINI_API_KEY:
    print("Error: GEMINI_API_KEY environment variable not set.")
    exit()

genai.configure(api_key=GEMINI_API_KEY)

AVAILABLE_MODELS = ["gemini-1.5-flash", "gemini-1.5-pro", "gemini-2.0-flash-thinking-exp"]

# Инициализация моделей один раз при запуске приложения
MODELS = {model_name: genai.GenerativeModel(model_name=model_name) for model_name in AVAILABLE_MODELS}

async def respond(message, history, selected_model):
    model = MODELS.get(selected_model)
    if not model:
        yield {"role": "assistant", "content": "Error: Selected model not available."}
        return

    try:
        chat = model.start_chat(history=history)
        response_stream = chat.send_message(message, stream=True)
        full_response = ""
        for chunk in response_stream:
            full_response += (chunk.text or "")
            yield {"role": "assistant", "content": full_response}
    except Exception as e:
        yield {"role": "assistant", "content": f"Error during API call: {e}"}

async def respond_thinking(message, history, selected_model):
    if "thinking" not in selected_model:
        yield {"role": "assistant", "content": "Thinking model не выбрана."}, ""
        return

    model = MODELS.get(selected_model)
    if not model:
        yield {"role": "assistant", "content": "Error: Selected model not available."}, ""
        return

    yield {"role": "assistant", "content": "Думаю..."}

    try:
        response = model.generate_content(message)
        thinking_process_text = ""
        model_response_text = ""

        if response.candidates:
            for part in response.candidates[0].content.parts:
                if hasattr(part, 'thought') and part.thought == True:
                    thinking_process_text += f"Model Thought:\n{part.text}\n\n"
                else:
                    model_response_text += (part.text or "")

        yield {"role": "assistant", "content": model_response_text}, thinking_process_text
    except Exception as e:
        yield {"role": "assistant", "content": f"Error during API call: {e}"}, f"Error during API call: {e}"

async def process_message(message, history, model_name):
    if "thinking" in model_name:
        async for response, thinking in respond_thinking(message, history, model_name):
            yield response
    else:
        async for response in respond(message, history, model_name):
            yield response

def clear_thinking():
    return ""

with gr.Blocks() as demo:
    gr.Markdown("# Gemini Chatbot с режимом размышления")

    with gr.Row():
        model_selection = gr.Dropdown(
            AVAILABLE_MODELS, value="gemini-1.5-flash", label="Выберите модель Gemini"
        )

    thinking_output = gr.Code(label="Процесс размышления (для моделей с размышлением)")

    chatbot = gr.ChatInterface(
        process_message,  # Функция обработки сообщений передается сюда
        additional_inputs=[model_selection],
        title="Gemini Chat",
        description="Общайтесь с моделями Gemini от Google.",
        type="messages"
    )

    with gr.Row():
        clear_button = gr.Button("Очистить")

    def change_chatbot(model_name):
        return gr.ChatInterface.update()

    async def update_thinking(history):
        if history and history[-1][0] == "assistant" and len(history[-1]) > 1:
            return history[-1][1]
        return ""

    model_selection.change(
        change_chatbot,
        inputs=[model_selection],
        outputs=[chatbot],
    )

    chatbot.on_message(
        update_thinking,
        inputs=[chatbot],
        outputs=[thinking_output]
    )

    clear_button.click(lambda: None, None, chatbot, queue=False)
    clear_button.click(clear_thinking, outputs=[thinking_output], queue=False)

if __name__ == "__main__":
    demo.launch()