Spaces:
Running
Running
Upload bot.py
Browse files
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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})
|