0.19.0
Итерация 15 плана аудита: память — token budgeting и кэш эмбеддингов.
Added
- Пакет
internal/tokens/— эвристический подсчёт токенов (Count,CountForModel,CountMessages,TruncateByTokens,SplitWords);len/3.5без внешних зависимостей, ±15% относительно tiktoken на смешанных корпусах. Корректная обрезка по rune-границе. ContextBudgetиComputeBudgetвinternal/agent/context.go: масштабируемое распределение токенов по секциям (identity 200, soul 1500, profile 1000, skills 3000, rag 3500, completion 2000, history = остаток). Per-agent масштабирование отcontext_max_tokens(default 16000, min 4000).pruneHistoryByTokens— отрезает историю по бюджету с сохранением парности assistant↔tool (если оставлен tool-result, обязательно тащит предшествующий assistant с tool_calls).shouldSkipRAG— пропускает RAG-вызов для коротких реплик (< 4 слов: «ок», «да», «спасибо», «продолжай»). Исключение — наличие?. Экономит embedding-вызовы и снижает latency.internal/embeddings/cache.go—CachedEmbedder: LRU-кэш одиночных Embed-запросов, capacity=1000, TTL=10min. SHA-256 ключ отmodel + text(изоляция между моделями), defensive copy результата, поточно-безопасен. Multi-text запросы (документ-чанки) проксируются мимо кэша. Подключён вcmd/taigaclaw/main.go:initEmbedder.- Per-agent поле
context_max_tokensвagents(миграция021_llm_usage_breakdownдля SQLite + PG, up/down). 0 = «использовать дефолт пакета». - Поля
system_tokens,rag_tokens,history_tokensвllm_usageиLLMUsageEntry/LLMUsageSummary. Заполняются ContextBuilder, агрегируются вGetLLMUsageSummaryдля аналитики и тюнинга бюджетов. - UI: поле «Размер контекстного окна» в модалке редактирования агента (
web/src/routes/settings/+page.svelte). TS-типыAgent.context_max_tokens,UpdateAgentParams.context_max_tokens,LLMUsageSummary.total_*_tokens. - Тесты: 13 в
internal/tokens, 12 вinternal/embeddings/cache_test.go, 13 вinternal/agent/context_test.go. Все проходят с-race.
Changed
ContextBuilder.BuildMessagesпереписан с учётом бюджетов: system-секции обрезаются поtokens.TruncateByTokens, RAG-секция — поbudget.RAG, история — поpruneHistoryByTokens.LastSectionTokensфиксируется и пишется вllm_usage.actor.recordUsage(ctxBuilder)— теперь принимает builder и сохраняет breakdown по секциям контекста.AgentHandler.Update: принимаетcontext_max_tokens(опционально, валидируется на >=0). СохраняетWorkspacePathиз существующего агента (раньше терялся при Update).
Fixed
SQLiteStore.UpdateAgent/PostgresStore.UpdateAgent: workspace_path сохранялся в SQL, но handler не передавал значение из existing — теперь явно копируется.