|
|
| 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)) |
|
|
| |
| 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 = [] |
| |
| 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 = [ |
| "Гороскоп на день для Льва", |
| "Совместимость Рыбы и Скорпион", |
| "Гороскоп на неделю для Тельца", |
| "Кармические задачи для Девы", |
| "Гороскоп на год для всех знаков", |
| "Совет для Овна в любви", |
| "Общие черты Льва" |
| ] |
|
|
| |
| with gr.Blocks(title="AI Астролог-ассистент") as demo: |
| gr.Markdown( |
| """ |
| # 🌟 AI Астролог-ассистент |
| Задавайте любые вопросы: <br> |
| • **Гороскоп на день/неделю/месяц/год для любого знака**<br> |
| • **Совместимость пары**<br> |
| • **Кармические задачи**<br> |
| • **Астрологические советы для развития**<br> |
| --- |
| """ |
| ) |
| 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() |