SilverElixir commited on
Commit
03d39f1
·
unverified ·
1 Parent(s): cc503f9

Add files via upload

Browse files
Files changed (2) hide show
  1. bot.py +16 -0
  2. test_bot.py +30 -0
bot.py CHANGED
@@ -2874,6 +2874,22 @@ def _build_gemini_call_config(model_id: str, contents: list[types.Content]) -> t
2874
  pass # SDK version doesn't support url_context
2875
  if tools_list:
2876
  kwargs["tools"] = tools_list
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2877
  gconfig = types.GenerateContentConfig(**kwargs) if kwargs else None
2878
 
2879
  # Для моделей без system instruction (Gemma) инжектируем ключевые инструкции
 
2874
  pass # SDK version doesn't support url_context
2875
  if tools_list:
2876
  kwargs["tools"] = tools_list
2877
+ # Эффорт мышления (thinking_level/thinking_budget, google-genai) — низкий ТОЛЬКО
2878
+ # для не-heavy запросов: калибровка 18 августа 2026 поймала gemini-3.7-flash на
2879
+ # 17 таймаутах (22с) из 18 попыток за сессию — снижение эффорта на нетяжёлых
2880
+ # запросах (в т.ч. когда Gemini — просто fallback после отказа OpenRouter) режет
2881
+ # именно этот риск. Heavy-запросы намеренно НЕ трогаем: там таймаут и так более
2882
+ # вероятен, а собственный (medium/dynamic) дефолт модели уже балансирует
2883
+ # скорость/глубину лучше, чем наша угадайка. Gemini 3.x — thinking_level,
2884
+ # Gemini 2.5.x — thinking_budget (в токенах, 0 = выкл); Gemma эффорта не имеет
2885
+ # (no_system уже исключает её выше).
2886
+ if not conf.get("no_system"):
2887
+ last_text = next((p.text for p in reversed(contents[-1].parts) if getattr(p, "text", None)), "") if contents else ""
2888
+ if not _looks_like_heavy_query(last_text):
2889
+ if model_id.startswith("gemini-3"):
2890
+ kwargs["thinking_config"] = types.ThinkingConfig(thinking_level="low")
2891
+ elif model_id.startswith("gemini-2.5"):
2892
+ kwargs["thinking_config"] = types.ThinkingConfig(thinking_budget=0)
2893
  gconfig = types.GenerateContentConfig(**kwargs) if kwargs else None
2894
 
2895
  # Для моделей без system instruction (Gemma) инжектируем ключевые инструкции
test_bot.py CHANGED
@@ -2252,6 +2252,36 @@ def test_build_gemini_call_config_with_system_instruction_model_unaffected():
2252
  assert "БЛАГОПОЛУЧИЕ И ЗДОРОВЬЕ ПОЛЬЗОВАТЕЛЯ" in gconfig.system_instruction
2253
 
2254
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2255
  # ─────────────────── дневной сброс счётчиков квоты (/stats не должен копить вечно) ───────────────────
2256
 
2257
  def test_reset_quota_if_new_day_clears_used_and_exhausted_on_day_rollover():
 
2252
  assert "БЛАГОПОЛУЧИЕ И ЗДОРОВЬЕ ПОЛЬЗОВАТЕЛЯ" in gconfig.system_instruction
2253
 
2254
 
2255
+ # ─────────────── thinking_level/thinking_budget (калибровка 18 августа 2026) ───────────────
2256
+ # gemini-3.7-flash поймана на 17 таймаутах (22с) из 18 попыток за сессию — низкий
2257
+ # эффорт мышления на НЕ-heavy запросах снижает риск таймаута, не трогая heavy-запросы
2258
+ # (там таймаут и так вероятнее, а собственный дефолт модели уже балансирует лучше).
2259
+
2260
+ def test_build_gemini_call_config_sets_low_thinking_level_for_gemini_3_on_light_query():
2261
+ contents = [bot.types.Content(role="user", parts=[bot.types.Part.from_text(text="привет, как дела?")])]
2262
+ _, gconfig = bot._build_gemini_call_config("gemini-3.7-flash", contents)
2263
+ assert gconfig.thinking_config.thinking_level == bot.types.ThinkingLevel.LOW
2264
+
2265
+
2266
+ def test_build_gemini_call_config_sets_zero_thinking_budget_for_gemini_2_5_on_light_query():
2267
+ contents = [bot.types.Content(role="user", parts=[bot.types.Part.from_text(text="столица франции?")])]
2268
+ _, gconfig = bot._build_gemini_call_config("gemini-2.5-flash", contents)
2269
+ assert gconfig.thinking_config.thinking_budget == 0
2270
+
2271
+
2272
+ def test_build_gemini_call_config_does_not_override_thinking_on_heavy_query():
2273
+ contents = [bot.types.Content(role="user", parts=[bot.types.Part.from_text(text="напиши функцию для сортировки списка")])]
2274
+ _, gconfig = bot._build_gemini_call_config("gemini-3.7-flash", contents)
2275
+ assert gconfig.thinking_config is None
2276
+
2277
+
2278
+ def test_build_gemini_call_config_skips_thinking_override_for_gemma():
2279
+ # Gemma не поддерживает thinking_config вообще — no_system уже исключает её.
2280
+ contents = [bot.types.Content(role="user", parts=[bot.types.Part.from_text(text="привет")])]
2281
+ _, gconfig = bot._build_gemini_call_config("gemma-4-26b-a4b-it", contents)
2282
+ assert gconfig is None or gconfig.thinking_config is None
2283
+
2284
+
2285
  # ─────────────────── дневной сброс счётчиков квоты (/stats не должен копить вечно) ───────────────────
2286
 
2287
  def test_reset_quota_if_new_day_clears_used_and_exhausted_on_day_rollover():