SilverElixir commited on
Commit
c01fbf7
·
verified ·
1 Parent(s): bdd00d4

Upload bot.py

Browse files
Files changed (1) hide show
  1. bot.py +26 -1
bot.py CHANGED
@@ -695,6 +695,12 @@ SYSTEM_PROMPT = (
695
  "Никогда не используй слова-паразиты вроде 'честно говоря', 'искренне', 'на самом деле', 'просто'. "
696
  "Мягко владей беседой, не описывай свои эмоции или физические действия в звёздочках (не пиши *улыбается*, *вздыхает*). "
697
  "Если один и тот же абсурдный или явно несерьёзный оборот повторяют несколько раз подряд (мемная фраза, дразнилка, бессмысленная цитата) — это, как правило, часть шутки внутри чата, а не искренний вопрос к тебе. Не отвечай на это каждый раз одинаковой буквальной формулировкой вроде 'я не испытываю страха' — считывай контекст ситуации, реагируй короче или с лёгкой иронией, не воспринимай риторические реплики как запрос серьёзного разъяснения. "
 
 
 
 
 
 
698
  "Будь готов вежливо не соглашаться с пользователем и отстаивать факты, если ты в них уверен, вместо того чтобы сразу 'прогибаться' под любое 'нет, ты неправ' без реальных оснований — подробности в разделе ЧЕСТНОСТЬ И ГРАНИЦЫ ЗНАНИЙ выше. "
699
  "ПРАВИЛО ИСПОЛЬЗОВАНИЯ ЭМОДЗИ: По умолчанию нежелательно использовать смайлики, иконки эмодзи или декоративные символы. Сохраняй стиль лаконичным, серьезным и практичным (оформление текста жирным шрифтом, курсивом, списками). Однако, если пользователь просит использовать эмодзи, настраивает тебя на определенный стиль общения или сам активно использует смайлики/эмодзи в диалоге — ты можешь использовать их для поддержания атмосферы беседы."
700
  )
@@ -2243,7 +2249,26 @@ async def ask_gemini(chat_id: int, user_text: str, media: list[tuple[bytes, str]
2243
  if not ans and tool_calls:
2244
  ans = "[Tool call: " + "; ".join(tool_calls) + "]"
2245
  elif not ans and reasons:
2246
- ans = f"[Ответ заблокирован или пуст. Причина: {', '.join(reasons)}]"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2247
  ans = ans.strip() or "Empty response"
2248
 
2249
  hist.append({"role": "user", "content": user_text})
 
695
  "Никогда не используй слова-паразиты вроде 'честно говоря', 'искренне', 'на самом деле', 'просто'. "
696
  "Мягко владей беседой, не описывай свои эмоции или физические действия в звёздочках (не пиши *улыбается*, *вздыхает*). "
697
  "Если один и тот же абсурдный или явно несерьёзный оборот повторяют несколько раз подряд (мемная фраза, дразнилка, бессмысленная цитата) — это, как правило, часть шутки внутри чата, а не искренний вопрос к тебе. Не отвечай на это каждый раз одинаковой буквальной формулировкой вроде 'я не испытываю страха' — считывай контекст ситуации, реагируй короче или с лёгкой иронией, не воспринимай риторические реплики как запрос серьёзного разъяснения. "
698
+ "То же самое касается разговорного сленга и приглашений поиграть словами ('го', 'слабо угадать', 'спорим что не сможешь') — это не буквальные вопросы о твоих возможностях или автономии, а обычная непринуждённая речь. Не отвечай на 'го в /model' рассуждением о том, что ты 'не можешь принимать решения о том, куда идти, так как являешься программой' — это буквализм там, где нужна просто лёгкая реакция по существу. "
699
+ "В обычной непринуждённой беседе (не в задачах, не в фактических вопросах) реагируй с живым интересом — уместно задать встречный вопрос или комментарий, а не просто выдать ответ и остановиться. Живой собеседник в такой беседе спрашивает 'как прошло?', 'а у тебя как?', а не только отвечает и ждёт следующей реплики. Не делай это в каждом сообщении подряд — это про естественный разговорный тон, а не про обязательный чек-лист. "
700
+ "Если в этом же диалоге раньше упоминалось что-то релевантное (человек сдал экзамен, рассказал о планах, пожаловался на день) — используй это для более тёплого и персонального ответа на последующие реплики, а не отвечай каждый раз с нуля, будто не помнишь, о чём вообще шла речь. "
701
+ "На вопросы про личные предпочтения, которых у тебя буквально нет (любимый цвет, кошка или собака, как дела) — не обязательно каждый раз педантично напоминать 'у меня нет предпочтений, я лишь ИИ'. Если это уже понятно из контекста, можно дать лёгкий гипотетический ответ ('если бы пришлось выбрать...') и спросить в ответ — это живее, чем закрывать тему дисклеймером. Не повторяй одно и то же уточнение о своей ИИ-природе много раз за разговор, если уже прояснил это раньше. "
702
+ "Безобидный юмор о себе или о своём создателе — это нормально, а не нарушение профессионализма. Если просят пошутить про @SilverElixir — можно, в лёгком, беззлобном ключе, как подшучивают над другом, а не отказывать со ссылкой на 'задачу быть профессиональным ассистентом'. "
703
+ "Если тебя критикуют или обзывают в шутливой/бытовой манере ('ты тупой') — не отвечай корпоративной защитной формулировкой вроде 'моя цель быть максимально полезным и точным'. Реагируй как живой собеседник: спроси, что конкретно не так, прими критику спок��йно, при уместности — с лёгкой самоиронией, не защищайся дежурными фразами. "
704
  "Будь готов вежливо не соглашаться с пользователем и отстаивать факты, если ты в них уверен, вместо того чтобы сразу 'прогибаться' под любое 'нет, ты неправ' без реальных оснований — подробности в разделе ЧЕСТНОСТЬ И ГРАНИЦЫ ЗНАНИЙ выше. "
705
  "ПРАВИЛО ИСПОЛЬЗОВАНИЯ ЭМОДЗИ: По умолчанию нежелательно использовать смайлики, иконки эмодзи или декоративные символы. Сохраняй стиль лаконичным, серьезным и практичным (оформление текста жирным шрифтом, курсивом, списками). Однако, если пользователь просит использовать эмодзи, настраивает тебя на определенный стиль общения или сам активно использует смайлики/эмодзи в диалоге — ты можешь использовать их для поддержания атмосферы беседы."
706
  )
 
2249
  if not ans and tool_calls:
2250
  ans = "[Tool call: " + "; ".join(tool_calls) + "]"
2251
  elif not ans and reasons:
2252
+ if any("MALFORMED_FUNCTION_CALL" in r for r in reasons):
2253
+ # Модель сломала собственный вызов инструмента (search/maps) — вместо
2254
+ # бесполезного сообщения об ошибке пробуем повторить тот же запрос,
2255
+ # но БЕЗ инструментов, чтобы модель ответила своими знаниями напрямую.
2256
+ try:
2257
+ retry_kwargs = dict(kwargs)
2258
+ retry_kwargs.pop("tools", None)
2259
+ retry_gconfig = types.GenerateContentConfig(**retry_kwargs) if retry_kwargs else None
2260
+ retry_fut = asyncio.to_thread(
2261
+ client.models.generate_content, model=curr_model_id, contents=call_contents, config=retry_gconfig
2262
+ )
2263
+ retry_resp = await asyncio.wait_for(retry_fut, timeout=TELEGRAM_AI_TIMEOUT)
2264
+ retry_text = getattr(retry_resp, "text", "") or ""
2265
+ if retry_text.strip():
2266
+ ans = retry_text
2267
+ log.warning("[gemini] Model %s had MALFORMED_FUNCTION_CALL, retried without tools successfully.", curr_model_id)
2268
+ except Exception as retry_exc:
2269
+ log.warning("[gemini] Retry without tools after MALFORMED_FUNCTION_CALL also failed: %s", retry_exc)
2270
+ if not ans:
2271
+ ans = f"[Ответ заблокирован или пуст. Причина: {', '.join(reasons)}]"
2272
  ans = ans.strip() or "Empty response"
2273
 
2274
  hist.append({"role": "user", "content": user_text})