diff --git a/eval/dovodka/proba_gemini.py b/eval/dovodka/proba_gemini.py index 2f9b0ca7..0beca626 100644 --- a/eval/dovodka/proba_gemini.py +++ b/eval/dovodka/proba_gemini.py @@ -43,10 +43,21 @@ def main() -> int: sysm = "\n\n".join(x["content"] for x in full if x["role"] == "system") usr = next(x["content"] for x in full if x["role"] == "user") led = R.MONEY.Guarded("ФД-N", default_expect=0.01) + # ⚠ ТРЕТИЙ СЛУЧАЙ — РЕШАЮЩИЙ. Первые два показали, что счётчик исправен и полный промт доезжает, + # КОГДА системное сообщение ОДНО. Боевой арм шлёт ДВА системных (ядро роли + банк-закон) плюс + # user, и намерил 515 токенов — это примерно ровно размер ОДНОГО user-сообщения. Проверяем + # прямую гипотезу: слой OpenAI у Gemini теряет системные сообщения, когда их больше одного. cases = [("короткий system", "short", "Ты — переводчик. " + MARK), - ("ПОЛНЫЙ system роли", "full", sysm + "\n\n" + MARK)] + ("ПОЛНЫЙ system роли", "full", sysm + "\n\n" + MARK), + ("ДВА системных, как у боевого арма", "two", None)] for name, slug, s in cases: - msgs = [{"role": "system", "content": s}, {"role": "user", "content": usr}] + if s is None: + msgs = [x for x in full if x["role"] == "system"] + msgs = [dict(x) for x in msgs] + [{"role": "user", "content": usr}] + msgs[0]["content"] = msgs[0]["content"] + "\n\n" + MARK + s = "\n\n".join(x["content"] for x in msgs if x["role"] == "system") + else: + msgs = [{"role": "system", "content": s}, {"role": "user", "content": usr}] rec = R.MONEY.purchase(led, f"dv-n-probe-gemsys-{slug}", "gemini-3.1-flash-lite", R.ED22.client("gemini-3.1-flash-lite"), R.call_kwargs("gemini-3.1-flash-lite", msgs, "RE"),