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