AnatoliiG commited on
Commit
c23e8fc
·
1 Parent(s): d833d70

Update helpers.py

Browse files
Files changed (1) hide show
  1. src/utils/helpers.py +33 -27
src/utils/helpers.py CHANGED
@@ -68,41 +68,47 @@ def web_search(query: str, max_results: int = 3) -> list:
68
 
69
 
70
  def extract_search_query(text: str):
71
- """Надежно извлекает запрос из ответа роутера."""
72
  if not text:
73
  return None
74
 
75
- # Вырезаем теги мыслей, если упрямая модель их всё же сгенерировала
76
- text_clean = re.sub(r"<think>.*?</think>", "", text, flags=re.DOTALL).strip()
77
- if not text_clean:
78
- text_clean = text # Если ответ состоял только из тегов, ищем внутри них
79
 
80
- try:
81
- # 1. Ищем блок ```json ... ```
82
- json_match = re.search(r"```(?:json)?\s*(\{.*?\})\s*```", text_clean, re.DOTALL)
83
- if json_match:
84
- data = json.loads(json_match.group(1))
85
- # Проверяем флаг search (строго True)
86
- if data.get("search") is True or str(data.get("search")).lower() == "true":
87
- return data.get("query")
88
- return None
89
 
90
- # 2. Ищем просто фигурные скобки (голый JSON)
91
- bare_json = re.search(r"\{.*?\}", text_clean, re.DOTALL)
92
- if bare_json:
93
- data = json.loads(bare_json.group(0))
 
 
 
 
 
 
94
  if data.get("search") is True or str(data.get("search")).lower() == "true":
95
  return data.get("query")
96
- return None
97
- except Exception as e:
98
- print(f"Ошибка парсинга JSON роутера: {e}")
99
 
100
- # 3. Резервный вариант на случай старых галлюцинаций
101
- if "'type': 'search'" in text or '"type": "search"' in text:
102
- match = re.search(r"['\"]text['\"]\s*:\s*['\"](.*?)['\"]", text)
 
 
103
  if match:
104
- raw_q = match.group(1)
105
- sub_match = re.search(r'"([^"]+)"', raw_q)
106
- return (sub_match.group(1) if sub_match else raw_q).strip()
 
 
 
 
 
 
107
 
108
  return None
 
68
 
69
 
70
  def extract_search_query(text: str):
71
+ """Супер-надежный парсер запроса поддержкой XML, JSON и логов)."""
72
  if not text:
73
  return None
74
 
75
+ # ВЫВОДИМ В КОНСОЛЬ ТО, ЧТО РЕАЛЬНО ПОДУМАЛ РОУТЕР
76
+ print(f"\n--- [DEBUG] RAW ROUTER OUTPUT ---\n{text}\n---------------------------\n")
 
 
77
 
78
+ # 1. Очищаем от размышлений
79
+ clean = re.sub(r"<think>.*?</think>", "", text, flags=re.DOTALL).strip()
80
+ if not clean:
81
+ clean = text
 
 
 
 
 
82
 
83
+ # 2. Ищем XML-тег (наш новый основной метод)
84
+ xml_match = re.search(r"<search>(.*?)</search>", clean, re.IGNORECASE)
85
+ if xml_match:
86
+ return xml_match.group(1).strip()
87
+
88
+ # 3. Резерв на случай JSON
89
+ json_match = re.search(r"\{.*?\}", clean, re.DOTALL)
90
+ if json_match:
91
+ try:
92
+ data = json.loads(json_match.group(0))
93
  if data.get("search") is True or str(data.get("search")).lower() == "true":
94
  return data.get("query")
95
+ except:
96
+ pass
 
97
 
98
+ # 4. Резерв на случай "старых галлюцинаций" с массивами
99
+ if "search" in text.lower():
100
+ match = re.search(
101
+ r"(?:запрос|query|text)['\"]\s*:\s*['\"]([^'\"]+)['\"]", text, re.IGNORECASE
102
+ )
103
  if match:
104
+ val = match.group(1)
105
+ val = re.sub(
106
+ r"^(?:🔍\s*)?(?:Поиск(?:\s*по\s*запросу)?|Search):\s*",
107
+ "",
108
+ val,
109
+ flags=re.IGNORECASE,
110
+ ).strip()
111
+ if val and val.lower() not in ["no", "false", "none", "no_search"]:
112
+ return val
113
 
114
  return None