Lahtina commited on
Commit
2b1aab9
·
verified ·
1 Parent(s): 1c2daa6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +127 -28
app.py CHANGED
@@ -1,42 +1,141 @@
1
 
2
  import gradio as gr
3
  import requests
 
4
 
5
  PROMPT_SYSTEM = (
6
- "Ты — виртуальный астролог. "
7
- "Отвечай кратко и понятно на астрологические вопросы: гороскоп на день, неделю, месяц или год "
8
- "для любого знака зодиака (давая общий прогноз), кармические задачи для людей с этим знаком, "
9
- "совместимость по знакам зодиака, советы по личным отношениям и развитию. "
10
- "Не давай медицинских или финансовых диагнозов."
 
 
11
  )
12
 
13
- def astro_assistant(question):
14
- # Используем бесплатную модель Llama-3 через HuggingFace Inference API
15
- api_url = "https://api-inference.huggingface.co/models/meta-llama/Meta-Llama-3-8B-Instruct"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  payload = {
17
- "inputs": [
18
- {"role": "system", "content": PROMPT_SYSTEM},
19
- {"role": "user", "content": question}
20
- ],
21
  "parameters": {
22
- "max_new_tokens": 256,
23
  "top_p": 0.95,
24
- "temperature": 0.7,
25
  }
26
  }
27
- response = requests.post(api_url, headers={}, json=payload)
28
- data = response.json()
29
- return data.get('generated_text', "Извините, сейчас не могу ответить. Попробуйте позже.")
30
-
31
- iface = gr.Interface(
32
- astro_assistant,
33
- gr.Textbox(lines=2, label="Ваш вопрос по астрологии"),
34
- gr.Textbox(lines=6, label="Ответ AI-астролога"),
35
- title="AI Астролог-ассистент Гороскопы и Совместимость",
36
- description=(
37
- "Задайте вопрос: «Гороскоп на неделю для Льва», "
38
- "«Моя совместимость со Скорпионом», «Кармические задачи Близнецов» и др."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  )
40
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
 
42
- iface.launch()
 
1
 
2
  import gradio as gr
3
  import requests
4
+ import re
5
 
6
  PROMPT_SYSTEM = (
7
+ "Ты — виртуальный астролог, отвечай интересно, понятно и позитивно. "
8
+ "Умей давать грамотные гороскопы на день, неделю, месяц, год для каждого знака зодиака, "
9
+ "расскажи о кармических задачах, характеристиках, давай советы для самореализации и отношений. "
10
+ "Расскажи о совместимости двух знаков (например, 'Совместимость Дева и Лев'). "
11
+ "Если спрашивают гороскоп отвечай только про тот срок (день/неделя/месяц/год), который просят. "
12
+ "Если спрашивают про совместимость — только совместимость этих знаков. "
13
+ "Не давай медицинских или финансовых советов."
14
  )
15
 
16
+ # --- Распознавание даты по ключевым словам
17
+ def detect_timeframe(text):
18
+ if re.search(r"\b(сегодня|на день|на сегодня|день)\b", text, re.IGNORECASE):
19
+ return "день"
20
+ elif re.search(r"\b(на неделю|неделя|неделю)\b", text, re.IGNORECASE):
21
+ return "неделя"
22
+ elif re.search(r"\b(на месяц|месяц|месяца)\b", text, re.IGNORECASE):
23
+ return "месяц"
24
+ elif re.search(r"\b(на год|год|году)\b", text, re.IGNORECASE):
25
+ return "год"
26
+ else:
27
+ return None
28
+
29
+ # --- Вспомогательная функция извлечения знаков зодиака из текста
30
+ ZODIACS = [
31
+ "овен", "телец", "близнец", "рак", "лев", "дева", "весы", "скорпион",
32
+ "стрелец", "козерог", "водолей", "рыбы", "овна", "тельца", "близнецов",
33
+ "рака", "льва", "девы", "весов", "скорпиона", "стрельца", "козерога",
34
+ "водолея", "рыб"
35
+ ]
36
+ def extract_zodiacs(text):
37
+ found = []
38
+ for z in ZODIACS:
39
+ if re.search(rf"\b{z}\b", text, re.IGNORECASE):
40
+ found.append(z.capitalize())
41
+ # Убираем дубликаты
42
+ return list(set(found))
43
+
44
+ # --- Основная функция общения с HuggingFace Inference API
45
+ def astro_assistant(message, history=[]):
46
+ prompt = PROMPT_SYSTEM
47
+ time_type = detect_timeframe(message)
48
+ signs = extract_zodiacs(message)
49
+ if "совместим" in message.lower() or "пара" in message.lower():
50
+ topic = "совместимость"
51
+ elif "карми" in message.lower():
52
+ topic = "карма"
53
+ elif time_type:
54
+ topic = f"гороскоп на {time_type}"
55
+ else:
56
+ topic = "общее астрологическое описание"
57
+
58
+ chat_history = []
59
+ # Добавим историю беседы (история max 3 сообщения, не обязательно – можно убрать)
60
+ for prev_q, prev_a in history[-3:]:
61
+ chat_history.append({"role": "user", "content": prev_q})
62
+ chat_history.append({"role": "assistant", "content": prev_a})
63
+ # Добавим системный промпт, затем историю, затем новое сообщение пользователя
64
+ messages = (
65
+ [{"role": "system", "content": prompt}]
66
+ + chat_history
67
+ + [{"role": "user", "content": message}]
68
+ )
69
  payload = {
70
+ "inputs": messages,
 
 
 
71
  "parameters": {
72
+ "max_new_tokens": 320,
73
  "top_p": 0.95,
74
+ "temperature": 0.8,
75
  }
76
  }
77
+ try:
78
+ response = requests.post(
79
+ "https://api-inference.huggingface.co/models/HuggingFaceH4/zephyr-7b-beta",
80
+ headers={},
81
+ json=payload,
82
+ timeout=60
83
+ )
84
+ if response.status_code != 200:
85
+ return f"Ошибка HF API: {response.status_code}\n{response.text}", history
86
+ data = response.json()
87
+ reply = data.get("generated_text", "Ответ не получен, попробуйте иначе переформулировать вопрос.
88
+ ")
89
+ history = history + [[message, reply]]
90
+ return reply, history
91
+ except Exception as e:
92
+ return f"Ошибка: {e}", history
93
+
94
+ # --- Примеры для подсказок пользователю
95
+ example_questions = [
96
+ "Гороскоп на день для Льва",
97
+ "Совместимость Рыбы и Скорпион",
98
+ "Гороскоп на неделю для Тельца",
99
+ "Кармические задачи для Девы",
100
+ "Гороскоп на год для всех знаков",
101
+ "Совет для Овна в любви",
102
+ "Общие черты Льва"
103
+ ]
104
+
105
+ # --- Интерфейс Gradio (чата)
106
+ with gr.Blocks(title="AI Астролог-ассистент") as demo:
107
+ gr.Markdown(
108
+ """
109
+ # 🌟 AI Астролог-ассистент
110
+ Задавайте любые вопросы: <br>
111
+ • **Гороскоп на день/неделю/месяц/год для любого знака**<br>
112
+ • **Совместимость пары**<br>
113
+ • **Кармические задачи**<br>
114
+ • **Астрологические советы для развития**<br>
115
+ ---
116
+ """
117
  )
118
+ chatbot = gr.Chatbot(label="Диалог с AI-астрологом", height=400)
119
+ with gr.Row():
120
+ msg = gr.Textbox(label="Ваш вопрос", placeholder="Например: Кармические задачи для Весов")
121
+ with gr.Row():
122
+ submit = gr.Button("Отправить")
123
+ clear = gr.Button("Очистить чат")
124
+
125
+ examples = gr.Examples(
126
+ examples=example_questions,
127
+ inputs=[msg]
128
+ )
129
+
130
+ history_state = gr.State([])
131
+
132
+ def handle_msg(user_message, chat_history):
133
+ reply, updated_history = astro_assistant(user_message, chat_history)
134
+ return updated_history + [[user_message, reply]], updated_history
135
+
136
+ submit.click(handle_msg, inputs=[msg, history_state], outputs=[chatbot, history_state])
137
+ msg.submit(handle_msg, inputs=[msg, history_state], outputs=[chatbot, history_state])
138
+ clear.click(lambda: ([], []), outputs=[chatbot, history_state])
139
+
140
+ demo.launch()
141