Kelm-Clinic / app.py
G-Rost's picture
Update app.py
d9b19ed verified
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)