ed
80eebfb83b
refactor(ai_client): migrate get_token_stats count_tokens to Result[int] (Phase 11 sites 9+10)
...
Both sites 9 (gemini) and 10 (gemini_cli) in get_token_stats had:
try: _ensure_gemini_client()
if _gemini_client:
resp = _gemini_client.models.count_tokens(model=_model, contents=md_content)
total_tokens = cast(int, resp.total_tokens)
except Exception: pass
Body: pass = SS violation.
New helper _count_gemini_tokens_for_stats_result(md_content) -> Result[int]:
- Returns Result(data=token_count) on success
- Returns Result(data=0, errors=[ErrorInfo]) on SDK failure or warmup failure
- Caller treats 0 as 'token count unavailable' and falls back to
character-based estimation
Legacy get_token_stats now uses:
if p in ('gemini', 'gemini_cli'):
total_tokens = _count_gemini_tokens_for_stats_result(md_content).data
(combined both branches into one since the logic was identical)
Audit: ai_client SS 5 -> 3. COMPLIANT 31 -> 32.
2026-06-20 14:03:28 -04:00
..
2026-06-19 21:13:46 -04:00
2026-06-20 14:03:28 -04:00
2026-06-08 00:46:12 -04:00
2026-06-08 00:33:21 -04:00
2026-06-19 10:59:18 -04:00
2026-06-08 00:47:21 -04:00
2026-06-18 12:09:00 -04:00
2026-06-17 00:38:29 -04:00
2026-06-17 00:38:29 -04:00
2026-06-17 00:38:29 -04:00
2026-06-15 13:54:57 -04:00
2026-06-11 14:48:03 -04:00
2026-06-13 18:05:12 -04:00
2026-06-17 00:32:33 -04:00
2026-06-17 00:38:29 -04:00
2026-06-08 20:46:41 -04:00
2026-06-08 17:49:34 -04:00
2026-06-08 15:19:30 -04:00
2026-06-07 19:54:17 -04:00
2026-06-08 20:46:41 -04:00
2026-06-07 10:20:17 -04:00
2026-06-08 10:13:07 -04:00
2026-06-06 22:02:35 -04:00
2026-06-08 23:45:25 -04:00
2026-06-19 14:25:53 -04:00
2026-06-19 12:40:26 -04:00
2026-06-19 19:13:20 -04:00
2026-06-19 16:24:01 -04:00
2026-06-08 23:45:25 -04:00
2026-06-08 20:46:41 -04:00
2026-06-07 19:54:17 -04:00
2026-06-07 10:23:45 -04:00
2026-06-07 10:54:51 -04:00
2026-06-17 18:53:25 -04:00
2026-06-18 09:37:28 -04:00
2026-06-20 11:59:20 -04:00
2026-06-07 15:24:57 -04:00
2026-06-20 01:47:23 -04:00
2026-06-07 19:54:17 -04:00
2026-06-20 12:15:15 -04:00
2026-06-08 00:41:20 -04:00
2026-06-08 01:14:12 -04:00
2026-06-08 00:27:04 -04:00
2026-06-09 17:01:14 -04:00
2026-06-09 16:40:18 -04:00
2026-06-17 19:15:51 -04:00
2026-06-17 00:29:21 -04:00
2026-06-17 00:33:36 -04:00
2026-06-09 18:42:53 -04:00
2026-06-17 22:38:17 -04:00
2026-06-18 12:09:00 -04:00
2026-06-17 23:15:57 -04:00
2026-06-17 22:38:17 -04:00
2026-06-17 00:38:29 -04:00
2026-06-17 00:38:29 -04:00
2026-06-07 19:54:17 -04:00
2026-06-15 18:21:58 -04:00
2026-06-18 17:55:05 -04:00
2026-06-07 21:21:38 -04:00
2026-06-19 14:25:53 -04:00
2026-06-16 19:06:09 -04:00
2026-06-07 10:10:53 -04:00
2026-06-17 00:38:29 -04:00
2026-06-17 00:38:29 -04:00
2026-06-17 00:38:29 -04:00
2026-06-15 14:15:52 -04:00
2026-06-07 21:21:38 -04:00
2026-06-15 13:04:45 -04:00
2026-06-17 00:38:29 -04:00
2026-06-09 15:37:47 -04:00
2026-06-20 02:26:42 -04:00
2026-06-07 14:43:36 -04:00
2026-06-07 19:54:17 -04:00
2026-06-19 12:36:21 -04:00
2026-06-19 09:40:01 -04:00
2026-06-07 19:54:17 -04:00
2026-06-06 21:29:03 -04:00
2026-06-08 15:19:30 -04:00
2026-06-17 00:38:29 -04:00
2026-06-17 00:38:29 -04:00
2026-06-07 19:54:17 -04:00
2026-06-17 22:42:10 -04:00
2026-06-17 22:42:10 -04:00
2026-06-08 17:51:39 -04:00
2026-06-07 19:54:17 -04:00
2026-06-07 01:34:48 -04:00
2026-06-15 09:41:39 -04:00
2026-06-09 15:37:47 -04:00
2026-06-17 00:38:29 -04:00
2026-06-15 11:04:46 -04:00
2026-06-09 15:42:00 -04:00
2026-06-18 14:26:12 -04:00
2026-06-08 21:17:54 -04:00
2026-06-15 13:52:38 -04:00
2026-06-15 13:25:31 -04:00
2026-06-15 18:27:40 -04:00
2026-06-07 21:21:38 -04:00
2026-06-12 18:07:16 -04:00
2026-06-13 18:57:44 -04:00
2026-06-07 19:54:17 -04:00
2026-06-07 17:57:36 -04:00
2026-06-10 09:16:46 -04:00
2026-06-07 10:01:40 -04:00
2026-06-07 19:54:17 -04:00
2026-06-18 14:40:04 -04:00
2026-06-13 17:50:43 -04:00
2026-06-17 00:38:29 -04:00
2026-06-19 12:36:21 -04:00
2026-06-17 00:30:48 -04:00
2026-06-17 22:31:35 -04:00
2026-06-07 19:54:17 -04:00
2026-06-19 12:36:21 -04:00
2026-06-17 00:38:29 -04:00
2026-06-07 19:54:17 -04:00
2026-06-19 09:40:01 -04:00
2026-06-07 16:56:05 -04:00
2026-06-11 16:38:09 -04:00
2026-06-11 16:38:09 -04:00
2026-06-20 08:25:27 -04:00
2026-06-08 00:47:03 -04:00
2026-06-15 18:05:45 -04:00
2026-06-09 17:10:33 -04:00
2026-06-12 20:14:01 -04:00
2026-06-12 20:14:40 -04:00
2026-06-17 00:38:29 -04:00
2026-06-10 17:20:57 -04:00
2026-06-10 14:43:27 -04:00
2026-06-16 00:09:02 -04:00
2026-06-09 10:37:14 -04:00
2026-06-10 15:14:35 -04:00
2026-06-12 16:29:22 -04:00
2026-06-17 00:38:29 -04:00
2026-06-09 16:14:40 -04:00
2026-06-17 22:29:36 -04:00
2026-06-17 00:38:29 -04:00
2026-06-19 12:36:21 -04:00
2026-06-17 00:38:29 -04:00
2026-06-09 16:25:44 -04:00
2026-06-07 19:54:17 -04:00
2026-06-19 14:25:53 -04:00
2026-06-17 14:20:17 -04:00
2026-06-17 10:26:32 -04:00
2026-06-15 14:26:32 -04:00
2026-06-20 01:45:34 -04:00
2026-06-16 19:13:30 -04:00
2026-06-16 20:25:44 -04:00
2026-06-17 14:50:01 -04:00
2026-06-19 07:41:15 -04:00
2026-06-16 22:26:04 -04:00
2026-06-17 00:38:29 -04:00
2026-06-17 00:38:29 -04:00
2026-06-17 00:38:29 -04:00
2026-06-09 16:14:40 -04:00
2026-06-11 21:46:41 -04:00
2026-06-10 15:13:25 -04:00
2026-06-10 15:45:44 -04:00
2026-06-06 22:48:50 -04:00
2026-06-07 16:02:30 -04:00
2026-06-09 20:45:24 -04:00
2026-06-10 15:14:35 -04:00