From 750bef5698c5896981ea7574e685865fe8cea0cd Mon Sep 17 00:00:00 2001 From: root Date: Mon, 9 Mar 2026 15:38:45 +0700 Subject: [PATCH] =?UTF-8?q?fix:=20Mail-Klassifizierung=20Batch-Modus=20(al?= =?UTF-8?q?le=20Mails,=20nicht=20nur=2050)=20+=20Token-Limit=20erh=C3=B6ht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/mail_client.cpython-313.pyc | Bin 20308 -> 20672 bytes homelab-ai-bot/core/mail_client.py | 26 +++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/homelab-ai-bot/core/__pycache__/mail_client.cpython-313.pyc b/homelab-ai-bot/core/__pycache__/mail_client.cpython-313.pyc index 7f87041d6c6fbef51ed9e9c42a789cbc5b8c5e5d..5c912a25e4a34b166a277742044d0b584acb133f 100644 GIT binary patch delta 1713 zcmZuxZA?>F7`~^yrMC3ja!dKLr9i1jJHDYMW<^SIDsEhFhNBy+aFsGz^|Zu|Wa9o9 z_G1b7W}#+_!Od*^+DE!X7dK;!;+733!D*>18;d{2wiulI-jD5^iM8blBuBda>mz{$Rp!$qSdvm=X>sHWZ%h;G*TNoynu`z-srhJTv=>;Vz)JO^$1VguLU6WROPiUBf3$|u>vSnj) zMuEez10sHoW~$r#d$x7<@!OvXVA@)l9P!137#qO!UP$wai2-qccw{)?GQqKyR%b@t zKOBz7Bl{!b0DhO|DE85n;W{(&>f; zbM1H_t>JEIisv=ON%5wp?4FV_)vj(}jD_&GcQ>knCw$&ITSqZ-$yZKrwpbn1$!DFK zph`YlhbXUSgGT16NQai7d>ab=MY5F=Xz@21*4=AL81r|SFA%9qgKrX(Q4B|7VjR!GqQB5_ zo_bXM;Y43F92t(2V0fQ6oMGdG2an(zB#0Nm($=W>iO|+mciTTKN<&xh*}`vWEJ)!y z3IPILc$w1gVKx{yNEH>Coc@C&u|yo-f$g0>#eEVNQ?GXZA?tXAe#IflDYR3#OW_Ow zvRT?Q_yr2mhvhg%`5lZNUmzoI~!1=B5Jxn_hU><48~-*X*7C)=X}_C<4Ml*KIeVj z^Ygy%xqc4cK8uY{3Z4NSRO; zu?o6KiB~O@+t5kwBqlDQB2q$qRxc-1G9RgyR|>%)uWE#7V2Tng5 zctKVxN>L(-GjVBxjI;C0JagJFDfxj;aT+do_G3Fd^t9nB;Jt&s!cCohU1wj6ZR%X> zI@ev^emb#`csID@*x(zMM%MY}O}=fNZ_B7M(;Ix(b;mj%eCrTg^}bVugMRe6w=n48 zZmJt7zv)pi^xJxilq(iY5vE#sJe;0ubzrri7xr)nKJq!R0lx5k956O2T_}v7mPv=u z(F*!Vd5liyl27I}qoh8ZXGVQKgp!7^VZ;Poa_y*s<_dk)A7!ACI4ii4ysWDmwa?#8XfocvExN%+HJS612l>wi>t>Fw!>u z9B}WsZz^9*ZI~M2+0G&CfCB|yc-X1-ID0G5jf2$`S1Pn2lXAta59yREt(b8i7c!$; zIu+%&OiIShg`w)S^}rm5SK(~e`yFyxYI2*tfow3i!{A#6n+%vftEjA-Rk%B7b>t8^ z_zt|%U8W$*aHiX5`p><)6Ta^bSw5v(-FoshHCfeUJQ)+oDzx{MI$1rknqyIEJQ0mg zid2lg5Sz?$;>6SpS)(G^fSDej>PJeO)5|@7bNCy$*!NuNcT79PAj_ba!XQ~@^d8jo zizfL-RaSj$DwUK(@&L~F2UNdMeJs7z|A!*Kt5PW zl8irqnt^?)N0g>ubRbjC?%!hFb>ppKW)$QxHAKUB9W)L)@iiD3{LuCp^U7a`b)2y5 z2zwlP1lA$D_Ag55FF>LQ2ZwgLYH`t`Yf(D0cN list[dict]: {"role": "system", "content": CLASSIFY_PROMPT}, {"role": "user", "content": mail_text}, ], - "max_tokens": 400, + "max_tokens": 2000, "temperature": 0, }, - timeout=30, + timeout=60, ) r.raise_for_status() content = r.json()["choices"][0]["message"]["content"] content = content.strip() - if content.startswith("```"): - content = content.split("\n", 1)[-1].rsplit("```", 1)[0] + if "```" in content: + content = content.split("```", 1)[-1] + if content.startswith("json"): + content = content[4:] + content = content.rsplit("```", 1)[0] + content = content.strip() classifications = json.loads(content) cat_map = {c["idx"]: c["cat"] for c in classifications} @@ -264,8 +268,11 @@ def classify_mails(mails: list[dict], api_key: str) -> list[dict]: return mails +BATCH_SIZE = 40 + + def get_smart_digest(hours: int = 24, api_key: str = "") -> dict: - """Intelligente Mail-Zusammenfassung: holt Mails, klassifiziert per LLM, gruppiert.""" + """Intelligente Mail-Zusammenfassung: holt Mails, klassifiziert per LLM in Batches, gruppiert.""" m = _connect() if not m: return {"error": "IMAP-Verbindung fehlgeschlagen"} @@ -276,7 +283,7 @@ def get_smart_digest(hours: int = 24, api_key: str = "") -> dict: ids = data[0].split() if data[0] else [] mails = [] - for mid in ids[-50:]: + for mid in ids: _, msg_data = m.fetch(mid, "(BODY.PEEK[HEADER])") parsed = _parse_mail(msg_data) if parsed: @@ -291,7 +298,12 @@ def get_smart_digest(hours: int = 24, api_key: str = "") -> dict: return {"total": 0, "mails": [], "summary": {}} if api_key: - mails = classify_mails(mails, api_key) + classified = [] + for i in range(0, len(mails), BATCH_SIZE): + batch = mails[i:i + BATCH_SIZE] + batch = classify_mails(batch, api_key) + classified.extend(batch) + mails = classified summary = {} for m_item in mails: