Spaces:
Running
Running
SilverElixir commited on
Add files via upload
Browse files- bot.py +16 -0
- 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():
|