Yermek68 commited on
Commit
e6fa510
·
verified ·
1 Parent(s): 5b714a0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +86 -38
app.py CHANGED
@@ -2,7 +2,6 @@
2
  import os
3
  import requests
4
  import gradio as gr
5
- from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
6
 
7
  # ==========================================================
8
  # 1️⃣ Проверка токена Hugging Face API
@@ -30,78 +29,127 @@ def check_hf_token():
30
  status_message = check_hf_token()
31
 
32
  # ==========================================================
33
- # 2️⃣ Авто-подбор оптимальной модели (умный выбор)
34
  # ==========================================================
35
- def auto_select_model(prompt: str) -> str:
36
- """Определяет лучшую бесплатную модель HF под задачу"""
37
- prompt_lower = prompt.lower()
38
-
39
- # Логика выбора модели
40
- if any(x in prompt_lower for x in ["квант", "физик", "теория", "расчёт", "анализ"]):
41
- return "mistralai/Mistral-7B-Instruct-v0.3"
42
- elif any(x in prompt_lower for x in ["программ", "код", "python", "js", "ошибка", "debug"]):
43
- return "bigcode/starcoder2-3b"
44
- elif any(x in prompt_lower for x in ["переведи", "английский", "translate", "перевод"]):
45
- return "facebook/nllb-200-distilled-600M"
46
- elif any(x in prompt_lower for x in ["психолог", "мотивация", "совет", "эмоции", "отношения"]):
47
- return "meta-llama/Llama-3.2-1B-Instruct"
 
 
 
48
  else:
49
- return "microsoft/Phi-3.5-mini-instruct" # базовая «гуру» модель
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
  # ==========================================================
52
- # 3️⃣ Генерация ответа от выбранной модели
53
  # ==========================================================
54
  def generate_response(user_input: str):
55
  if not user_input.strip():
56
- return "⚠️ Введите запрос"
57
-
58
- # Автоматически выбираем подходящую модель
59
- model_name = auto_select_model(user_input)
60
- print(f"🔍 Выбрана модель: {model_name}")
61
 
62
  token = os.getenv("HF_TOKEN")
63
- headers = {"Authorization": f"Bearer {token}"}
 
64
 
65
- # Используем Inference API Hugging Face
66
- api_url = f"https://api-inference.huggingface.co/models/{model_name}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
 
68
- payload = {"inputs": user_input, "parameters": {"max_new_tokens": 300, "temperature": 0.7}}
69
  try:
70
- response = requests.post(api_url, headers=headers, json=payload, timeout=60)
71
  if response.status_code == 200:
72
  data = response.json()
73
  if isinstance(data, list) and len(data) > 0 and "generated_text" in data[0]:
74
  output = data[0]["generated_text"]
75
  else:
76
  output = str(data)
77
- return f"🤖 Модель: {model_name}\n\n{output}"
78
  else:
79
- return f"⚠️ Ошибка API ({response.status_code}): {response.text}"
80
  except Exception as e:
81
- return f"❌ Ошибка при обращении к модели: {e}"
82
 
83
  # ==========================================================
84
- # 4️⃣ Интерфейс Gradio
85
  # ==========================================================
86
- with gr.Blocks(title="Eroha AgentAPI v3.1Guru Edition") as demo:
87
  gr.Markdown(
88
  f"<div style='background-color:#e8f5e9;padding:10px;border-radius:6px;border:1px solid #4caf50;"
89
  f"color:#2e7d32;font-size:16px;margin-bottom:10px;'>{status_message}</div>"
90
  )
91
- gr.Markdown("### 🤖 Умный агент на базе Hugging Face Inference API")
92
 
93
  with gr.Row():
94
  user_input = gr.Textbox(
95
- label="Введите запрос", placeholder="Например: Объясни, как работает квантовая суперпозиция"
 
 
96
  )
97
- output = gr.Textbox(label="Ответ", placeholder="Здесь появится ответ")
 
 
 
 
98
 
99
- submit_btn = gr.Button("Отправить 🚀")
100
 
101
- submit_btn.click(fn=generate_response, inputs=user_input, outputs=output)
102
 
103
  # ==========================================================
104
- # 5️⃣ Запуск
105
  # ==========================================================
106
  if __name__ == "__main__":
107
  demo.launch(server_name="0.0.0.0", server_port=7860)
 
2
  import os
3
  import requests
4
  import gradio as gr
 
5
 
6
  # ==========================================================
7
  # 1️⃣ Проверка токена Hugging Face API
 
29
  status_message = check_hf_token()
30
 
31
  # ==========================================================
32
+ # 2️⃣ Умный выбор модели с объяснением
33
  # ==========================================================
34
+ def auto_select_model(prompt: str):
35
+ """Определяет оптимальную модель + объяснение выбора"""
36
+ p = prompt.lower()
37
+
38
+ if any(x in p for x in ["квант", "физик", "матем", "логик", "наука", "формул"]):
39
+ return ("mistralai/Mistral-7B-Instruct-v0.3",
40
+ "🔬 Запрос научный, Mistral умеет логически рассуждать и точно объяснять сложные темы.")
41
+ elif any(x in p for x in ["код", "программ", "python", "debug", "ошибк", "скрипт"]):
42
+ return ("bigcode/starcoder2-3b",
43
+ "💻 Обнаружен запрос про программирование Starcoder специализируется на коде и примерах.")
44
+ elif any(x in p for x in ["переведи", "английск", "translate", "перевод"]):
45
+ return ("facebook/nllb-200-distilled-600M",
46
+ "🌍 Запрос про языки — NLLB создан специально для качественного перевода.")
47
+ elif any(x in p for x in ["письмо", "мотивац", "совет", "отношен", "эмоци", "психолог"]):
48
+ return ("meta-llama/Llama-3.2-1B-Instruct",
49
+ "💬 Запрос гуманитарный — Llama хорошо пишет тексты и понимает эмоции.")
50
  else:
51
+ return ("microsoft/Phi-3.5-mini-instruct",
52
+ "🧠 Общий запрос — Phi-3.5 универсален и даёт сбалансированные ответы.")
53
+
54
+ # Резервная цепочка (на случай ошибок)
55
+ FALLBACK_MODELS = [
56
+ "microsoft/Phi-3.5-mini-instruct",
57
+ "mistralai/Mistral-7B-Instruct-v0.3",
58
+ "meta-llama/Llama-3.2-1B-Instruct",
59
+ "bigcode/starcoder2-3b",
60
+ ]
61
+
62
+ # ==========================================================
63
+ # 3️⃣ Проверка доступности модели
64
+ # ==========================================================
65
+ def check_model_status(model_name: str, token: str) -> bool:
66
+ headers = {"Authorization": f"Bearer {token}"}
67
+ url = f"https://huggingface.co/api/models/{model_name}"
68
+ try:
69
+ r = requests.get(url, headers=headers, timeout=10)
70
+ if r.status_code == 200:
71
+ print(f"✅ Модель доступна: {model_name}")
72
+ return True
73
+ else:
74
+ print(f"⚠️ Модель {model_name} недоступна (код {r.status_code})")
75
+ return False
76
+ except Exception as e:
77
+ print(f"❌ Ошибка при проверке модели {model_name}: {e}")
78
+ return False
79
 
80
  # ==========================================================
81
+ # 4️⃣ Генерация ответа
82
  # ==========================================================
83
  def generate_response(user_input: str):
84
  if not user_input.strip():
85
+ return "⚠️ Введите запрос", "—", "—"
 
 
 
 
86
 
87
  token = os.getenv("HF_TOKEN")
88
+ if not token:
89
+ return "❌ Ошибка: HF_TOKEN не найден", "—", "—"
90
 
91
+ # 1. Определяем модель и объяснение
92
+ main_model, reason = auto_select_model(user_input)
93
+ selected_model = main_model
94
+ print(f"🧠 Выбрана модель: {main_model}")
95
+
96
+ # 2. Проверяем доступность
97
+ if not check_model_status(main_model, token):
98
+ for backup in FALLBACK_MODELS:
99
+ if check_model_status(backup, token):
100
+ selected_model = backup
101
+ reason += f"\n🔁 Основная модель недоступна — переключено на резервную: {backup}"
102
+ break
103
+ else:
104
+ return "❌ Все модели недоступны. Попробуй позже.", "—", "—"
105
+
106
+ # 3. Генерация
107
+ api_url = f"https://api-inference.huggingface.co/models/{selected_model}"
108
+ headers = {"Authorization": f"Bearer {token}"}
109
+ payload = {"inputs": user_input, "parameters": {"max_new_tokens": 400, "temperature": 0.7}}
110
 
 
111
  try:
112
+ response = requests.post(api_url, headers=headers, json=payload, timeout=90)
113
  if response.status_code == 200:
114
  data = response.json()
115
  if isinstance(data, list) and len(data) > 0 and "generated_text" in data[0]:
116
  output = data[0]["generated_text"]
117
  else:
118
  output = str(data)
119
+ return output.strip(), selected_model, reason
120
  else:
121
+ return f"⚠️ Ошибка API ({response.status_code}): {response.text}", selected_model, reason
122
  except Exception as e:
123
+ return f"❌ Ошибка при обращении к модели {selected_model}: {e}", selected_model, reason
124
 
125
  # ==========================================================
126
+ # 5️⃣ Интерфейс Gradio
127
  # ==========================================================
128
+ with gr.Blocks(title="Eroha AgentAPI v3.3Explain Edition") as demo:
129
  gr.Markdown(
130
  f"<div style='background-color:#e8f5e9;padding:10px;border-radius:6px;border:1px solid #4caf50;"
131
  f"color:#2e7d32;font-size:16px;margin-bottom:10px;'>{status_message}</div>"
132
  )
133
+ gr.Markdown("### 🤖 Eroha AgentAPI v3.3 Guru + Explain Mode (умный выбор и объяснение)")
134
 
135
  with gr.Row():
136
  user_input = gr.Textbox(
137
+ label="Введите запрос",
138
+ placeholder="Например: Напиши мотивационное письмо для собеседования",
139
+ lines=2,
140
  )
141
+ with gr.Row():
142
+ output = gr.Textbox(label="Ответ", lines=10, placeholder="Здесь появится ответ")
143
+ with gr.Row():
144
+ model_used = gr.Textbox(label="Используемая модель", interactive=False)
145
+ explanation = gr.Textbox(label="Объяснение выбора", interactive=False)
146
 
147
+ submit_btn = gr.Button("🚀 Отправить запрос")
148
 
149
+ submit_btn.click(fn=generate_response, inputs=user_input, outputs=[output, model_used, explanation])
150
 
151
  # ==========================================================
152
+ # 6️⃣ Запуск
153
  # ==========================================================
154
  if __name__ == "__main__":
155
  demo.launch(server_name="0.0.0.0", server_port=7860)