import gradio as gr
import requests
import re
PROMPT_SYSTEM = (
"Ты — виртуальный астролог, отвечай интересно, понятно и позитивно. "
"Умей давать грамотные гороскопы на день, неделю, месяц, год для каждого знака зодиака, "
"расскажи о кармических задачах, характеристиках, давай советы для самореализации и отношений. "
"Расскажи о совместимости двух знаков (например, 'Совместимость Дева и Лев'). "
"Если спрашивают гороскоп — отвечай только про тот срок (день/неделя/месяц/год), который просят. "
"Если спрашивают про совместимость — только совместимость этих знаков. "
"Не давай медицинских или финансовых советов."
)
# --- Распознавание даты по ключевым словам
def detect_timeframe(text):
if re.search(r"\b(сегодня|на день|на сегодня|день)\b", text, re.IGNORECASE):
return "день"
elif re.search(r"\b(на неделю|неделя|неделю)\b", text, re.IGNORECASE):
return "неделя"
elif re.search(r"\b(на месяц|месяц|месяца)\b", text, re.IGNORECASE):
return "месяц"
elif re.search(r"\b(на год|год|году)\b", text, re.IGNORECASE):
return "год"
else:
return None
# --- Вспомогательная функция извлечения знаков зодиака из текста
ZODIACS = [
"овен", "телец", "близнец", "рак", "лев", "дева", "весы", "скорпион",
"стрелец", "козерог", "водолей", "рыбы", "овна", "тельца", "близнецов",
"рака", "льва", "девы", "весов", "скорпиона", "стрельца", "козерога",
"водолея", "рыб"
]
def extract_zodiacs(text):
found = []
for z in ZODIACS:
if re.search(rf"\b{z}\b", text, re.IGNORECASE):
found.append(z.capitalize())
# Убираем дубликаты
return list(set(found))
# --- Основная функция общения с HuggingFace Inference API
def astro_assistant(message, history=[]):
prompt = PROMPT_SYSTEM
time_type = detect_timeframe(message)
signs = extract_zodiacs(message)
if "совместим" in message.lower() or "пара" in message.lower():
topic = "совместимость"
elif "карми" in message.lower():
topic = "карма"
elif time_type:
topic = f"гороскоп на {time_type}"
else:
topic = "общее астрологическое описание"
chat_history = []
# Добавим историю беседы (история max 3 сообщения, не обязательно – можно убрать)
for prev_q, prev_a in history[-3:]:
chat_history.append({"role": "user", "content": prev_q})
chat_history.append({"role": "assistant", "content": prev_a})
# Добавим системный промпт, затем историю, затем новое сообщение пользователя
messages = (
[{"role": "system", "content": prompt}]
+ chat_history
+ [{"role": "user", "content": message}]
)
payload = {
"inputs": messages,
"parameters": {
"max_new_tokens": 320,
"top_p": 0.95,
"temperature": 0.8,
}
}
try:
response = requests.post(
"https://api-inference.huggingface.co/models/HuggingFaceH4/zephyr-7b-beta",
headers={},
json=payload,
timeout=60
)
if response.status_code != 200:
return f"Ошибка HF API: {response.status_code}\n{response.text}", history
data = response.json()
reply = data.get("generated_text","Ответ не получен,попробуйте иначе переформулировать вопрос. ")
history = history + [[message, reply]]
return reply, history
except Exception as e:
return f"Ошибка: {e}", history
# --- Примеры для подсказок пользователю
example_questions = [
"Гороскоп на день для Льва",
"Совместимость Рыбы и Скорпион",
"Гороскоп на неделю для Тельца",
"Кармические задачи для Девы",
"Гороскоп на год для всех знаков",
"Совет для Овна в любви",
"Общие черты Льва"
]
# --- Интерфейс Gradio (чата)
with gr.Blocks(title="AI Астролог-ассистент") as demo:
gr.Markdown(
"""
# 🌟 AI Астролог-ассистент
Задавайте любые вопросы:
• **Гороскоп на день/неделю/месяц/год для любого знака**
• **Совместимость пары**
• **Кармические задачи**
• **Астрологические советы для развития**
---
"""
)
chatbot = gr.Chatbot(label="Диалог с AI-астрологом", height=400)
with gr.Row():
msg = gr.Textbox(label="Ваш вопрос", placeholder="Например: Кармические задачи для Весов")
with gr.Row():
submit = gr.Button("Отправить")
clear = gr.Button("Очистить чат")
examples = gr.Examples(
examples=example_questions,
inputs=[msg]
)
history_state = gr.State([])
def handle_msg(user_message, chat_history):
reply, updated_history = astro_assistant(user_message, chat_history)
return updated_history + [[user_message, reply]], updated_history
submit.click(handle_msg, inputs=[msg, history_state], outputs=[chatbot, history_state])
msg.submit(handle_msg, inputs=[msg, history_state], outputs=[chatbot, history_state])
clear.click(lambda: ([], []), outputs=[chatbot, history_state])
demo.launch()