Skip to content

feat: утилита бюджетирования токенов истории - #16

Open
Sermage wants to merge 1 commit into
masterfrom
demo/token-budget
Open

feat: утилита бюджетирования токенов истории#16
Sermage wants to merge 1 commit into
masterfrom
demo/token-budget

Conversation

@Sermage

@Sermage Sermage commented Jul 18, 2026

Copy link
Copy Markdown
Owner

Небольшая утилита для работы с историей диалога по бюджету токенов:
trim_to_budget, average_tokens, last_n, load_budget_config.

(Демо-PR для наглядной проверки AI-ревьюера — намеренно содержит несколько
типичных ошибок.)

trim_to_budget / average_tokens / last_n / load_budget_config — грубая оценка
токенов (символы/4) для обрезки истории под бюджет.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPCiJi7DVBdV2fjN2x3HMd
@github-actions

Copy link
Copy Markdown

🤖 AI-ревью

🐞 Потенциальные баги

  1. examples/token_budget.py:10 — Мутабельный default-аргумент seen=[].
    Каждый вызов trim_to_budget будет накапливать id сообщений в одном и том же списке, что может привести к непредсказуемому росту памяти и неверным проверкам на дубликаты.

  2. examples/token_budget.py:12-16trim_to_budget возвращает самые ранние сообщения, но логика неверна.
    Условие if total < max_tokens отбрасывает сообщение, при котором бюджет превышается, но накопление total идёт до проверки. В результате первое же сообщение, превышающее max_tokens, будет выброшено (правильно для обрезки), но последующие сообщения с нулевым содержанием могут быть добавлены, если total уже превышен. Ожидаемое поведение — обрезать историю до первого превышения, а не накапливать.

  3. examples/token_budget.py:24last_n возвращает messages[-n + 1:].
    При n=1 выражение -1 + 1 = 0 вернёт весь список, а не последнее сообщение. Должно быть messages[-n:].

  4. examples/token_budget.py:30load_budget_config не закрывает файл.
    Используется open(path) без контекстного менеджера (with), что приводит к утечке файлового дескриптора.

🏛 Архитектурные проблемы

  1. examples/token_budget.py — Пример лежит не в том слое.
    По документации проекта (cli → app → domain → infra) примеры должны быть либо в examples/, что формально верно, но сама утилита нарушает принципы: она смешивает бизнес-логику (бюджетирование токенов) с I/O (load_budget_config открывает файл), что должно быть в infra/, а чистое вычисление — в domain/.

  2. examples/token_budget.py:17total не делится на 4 в average_tokens.
    В trim_to_budget используется грубая оценка len(m["content"]) / 4, а в average_tokens — просто len(...). Несогласованность оценки токенов между функциями одного модуля может запутать пользователя.

💡 Рекомендации

  1. examples/token_budget.py:10 — Заменить seen=[] на seen=None и внутри инициализировать пустой список: if seen is None: seen = [].

  2. examples/token_budget.py:12-16 — Исправить логику: либо не накапливать total перед проверкой, либо использовать break при превышении бюджета после добавления.

  3. examples/token_budget.py:24 — Исправить на return messages[-n:].

  4. examples/token_budget.py:30 — Использовать with open(path) as f: для автоматического закрытия файла.

  5. Убрать неиспользуемый аргумент seen, если он не является частью API. Если это намеренная «ошибка для ревью» — добавить комментарий.

— замечаний нет (по остальным строкам diff).


Контекст (RAG): infra/gigachat_client.py · cli/main.py · app/tool_router.py · app/conversation_check.py · infra/rerankers.py — Мелкие незначащие слова — чтобы «как что в и на» не давали ложных совпадений.

Сгенерировано jarvis-cli · review_pr.py

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant