Spaces:
Running
Running
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) | |