File size: 6,234 Bytes
eb8806e
 
 
 
 
 
356e7a1
ca08d83
66b24ee
eb8806e
356e7a1
3be7742
356e7a1
 
830eb06
356e7a1
 
 
 
 
 
eb8806e
356e7a1
 
d9b19ed
cefffe2
356e7a1
 
 
 
9cb71c2
 
 
356e7a1
 
eb8806e
356e7a1
 
 
eb8806e
356e7a1
 
 
eb8806e
356e7a1
eb8806e
 
 
9d71859
eb8806e
 
 
45e9cef
356e7a1
 
eb8806e
356e7a1
 
 
eb8806e
356e7a1
eb8806e
356e7a1
cefffe2
eb8806e
356e7a1
eb8806e
356e7a1
 
eb8806e
356e7a1
 
eb8806e
356e7a1
 
 
 
eb8806e
 
356e7a1
 
 
eb8806e
356e7a1
cefffe2
eb8806e
 
356e7a1
eb8806e
356e7a1
eb8806e
 
356e7a1
 
 
eb8806e
356e7a1
 
45e9cef
 
 
eb8806e
356e7a1
843d97c
4eb8efe
eb8806e
 
843d97c
eb8806e
 
 
 
 
 
 
356e7a1
 
45e9cef
eb8806e
 
356e7a1
5a1d31c
356e7a1
eb8806e
 
356e7a1
45e9cef
 
eb8806e
 
356e7a1
45e9cef
 
eb8806e
 
d9b19ed
45e9cef
eb8806e
 
 
 
 
 
 
 
 
 
356e7a1
 
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import os
import gradio as gr
from gradio import ChatMessage
from typing import Iterator
import google.generativeai as genai

# Отримуємо API ключ Gemini з environment variable
GEMINI_API_KEY = os.getenv("AIzaSyAX0KwZz-3vPFFMPcxZrYkK-b4cUqd6fLQ")
genai.configure(api_key=GEMINI_API_KEY)

# Обираємо модель Gemini
model = genai.GenerativeModel("gemini-1.5-flash")  # або інша доступна модель

def форматувати_історію_чату(повідомлення: list) -> list:
    """Форматує історію чату"""
    форматована_історія = []
    for повідомлення in повідомлення:
        if not (повідомлення.get("role") == "assistant" and "metadata" in повідомлення):
            форматована_історія.append({
                "role": "user" if повідомлення.get("role") == "user" else "assistant",
                "parts": [повідомлення.get("content", "")]
            })
    return форматована_історія

def транслювати_відповідь(повідомлення_користувача: str, повідомлення: list) -> Iterator[list]:
    """Працюю"""

    if not повідомлення_користувача.strip():
        повідомлення.append(ChatMessage(role="assistant", content="Будь ласка, введіть непусте текстове повідомлення."))
        yield повідомлення
        return

    try:
        print(f"\n=== Новий запит (Текст) ===")
        print(f"Повідомлення користувача: {повідомлення_користувача}")

        історія_чату = форматувати_історію_чату(повідомлення)
        чат = model.start_chat(history=історія_чату)
        response = чат.send_message(повідомлення_користувача, stream=True)

        буфер_думок = ""
        буфер_відповіді = ""
        думки_завершені = False

        повідомлення.append(
            ChatMessage(
                role="assistant",
                content="",
                metadata={"title": "⚙️ Працюю"}
            )
        )

        for chunk in response:
            частини = chunk.candidates[0].content.parts
            поточний_шматок = частини[0].text

            if len(частини) == 2 and not думки_завершені:
                буфер_думок += поточний_шматок
                print(f"\n=== Завершена думка ===\n{буфер_думок}")

                повідомлення[-1] = ChatMessage(
                    role="assistant",
                    content=буфер_думок,
                    metadata={"title": "⚙️ Працюю"}
                )
                yield повідомлення

                буфер_відповіді = частини[1].text
                print(f"\n=== Починаємо відповідь ===\n{буфер_відповіді}")

                повідомлення.append(ChatMessage(role="assistant", content=буфер_відповіді))
                думки_завершені = True

            elif думки_завершені:
                буфер_відповіді += поточний_шматок
                print(f"\n=== Шматок відповіді ===\n{поточний_шматок}")
                повідомлення[-1] = ChatMessage(role="assistant", content=буфер_відповіді)

            else:
                буфер_думок += поточний_шматок
                print(f"\n=== Шматок думки ===\n{поточний_шматок}")
                повідомлення[-1] = ChatMessage(
                    role="assistant",
                    content=буфер_думок,
                    metadata={"title": "⚙️ Працюю"}
                )

            yield повідомлення

        print(f"\n=== Остаточна відповідь ===\n{буфер_відповіді}")

    except Exception as e:
        print(f"\n=== Помилка ===\n{str(e)}")
        повідомлення.append(ChatMessage(role="assistant", content=f"Вибачте, сталася помилка: {str(e)}"))
        yield повідомлення

def повідомлення_користувача(msg: str, history: list) -> tuple[str, list]:
    """Додає повідомлення користувача до історії чату."""
    history.append(ChatMessage(role="user", content=msg))
    return "", history


with gr.Blocks(theme=gr.themes.Soft(primary_hue="teal", secondary_hue="slate", neutral_hue="neutral")) as demo:
    gr.Markdown(" Чатбот на основі ШІ. З питань роботи додатка: [email protected] ")

    chatbot = gr.Chatbot(
        type="messages",
        label="Електронний медик",
        render_markdown=True,
        scale=1,
    )

    with gr.Row(equal_height=True):
        input_box = gr.Textbox(
            lines=1,
            label="Повідомлення",
            placeholder="Введіть ваше повідомлення тут...",
            scale=4
        )

        clear_button = gr.Button("Очистити чат", scale=1)

    msg_store = gr.State("")

    input_box.submit(
        lambda msg: (msg, msg, ""),
        inputs=[input_box],
        outputs=[msg_store, input_box, input_box],
        queue=False
    ).then(
        повідомлення_користувача,
        inputs=[msg_store, chatbot],
        outputs=[input_box, chatbot],
        queue=False
    ).then(
        транслювати_відповідь,
        inputs=[msg_store, chatbot],
        outputs=chatbot
    )

    clear_button.click(
        lambda: ([], "", ""),
        outputs=[chatbot, input_box, msg_store],
        queue=False
    )

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