[{"data":1,"prerenderedAt":864},["ShallowReactive",2],{"navigation_docs_ru":3,"-ru-premium-ai-chat":167,"-ru-premium-ai-chat-surround":861},[4,61,101,146],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":60},"Руководство","i-lucide-book-open","\u002Fru\u002Fguide","ru\u002F1.guide",[10,15,20,25,30,35,40,45,50,55],{"title":11,"path":12,"stem":13,"icon":14},"Введение","\u002Fru\u002Fguide\u002Fintroduction","ru\u002F1.guide\u002F01.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Установка","\u002Fru\u002Fguide\u002Finstallation","ru\u002F1.guide\u002F02.installation","i-lucide-smartphone",{"title":21,"path":22,"stem":23,"icon":24},"Авторизация","\u002Fru\u002Fguide\u002Fauth","ru\u002F1.guide\u002F03.auth","i-lucide-lock",{"title":26,"path":27,"stem":28,"icon":29},"Кошельки","\u002Fru\u002Fguide\u002Fwallets","ru\u002F1.guide\u002F04.wallets","i-lucide-wallet",{"title":31,"path":32,"stem":33,"icon":34},"Категории","\u002Fru\u002Fguide\u002Fcategories","ru\u002F1.guide\u002F05.categories","i-lucide-tags",{"title":36,"path":37,"stem":38,"icon":39},"Транзакции","\u002Fru\u002Fguide\u002Ftransactions","ru\u002F1.guide\u002F06.transactions","i-lucide-receipt",{"title":41,"path":42,"stem":43,"icon":44},"Переводы","\u002Fru\u002Fguide\u002Ftransfers","ru\u002F1.guide\u002F07.transfers","i-lucide-arrow-left-right",{"title":46,"path":47,"stem":48,"icon":49},"Статистика","\u002Fru\u002Fguide\u002Fstatistics","ru\u002F1.guide\u002F08.statistics","i-lucide-bar-chart-3",{"title":51,"path":52,"stem":53,"icon":54},"Тема","\u002Fru\u002Fguide\u002Ftheme","ru\u002F1.guide\u002F09.theme","i-lucide-palette",{"title":56,"path":57,"stem":58,"icon":59},"Настройки","\u002Fru\u002Fguide\u002Fsettings","ru\u002F1.guide\u002F10.settings","i-lucide-settings",false,{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":60},"Разработка","i-lucide-code","\u002Fru\u002Fdevelopment","ru\u002F2.development",[67,71,76,81,86,91,96],{"title":16,"path":68,"stem":69,"icon":70},"\u002Fru\u002Fdevelopment\u002Finstallation","ru\u002F2.development\u002F01.installation","i-lucide-download",{"title":72,"path":73,"stem":74,"icon":75},"Граф кодовой базы","\u002Fru\u002Fdevelopment\u002Funderstand-anything","ru\u002F2.development\u002F02.understand-anything","i-lucide-network",{"title":77,"path":78,"stem":79,"icon":80},"Офлайн и PWA","\u002Fru\u002Fdevelopment\u002Foffline","ru\u002F2.development\u002F03.offline","i-lucide-wifi-off",{"title":82,"path":83,"stem":84,"icon":85},"История миграций данных","\u002Fru\u002Fdevelopment\u002Fmigration","ru\u002F2.development\u002F04.migration","i-lucide-database",{"title":87,"path":88,"stem":89,"icon":90},"Деплой","\u002Fru\u002Fdevelopment\u002Fdeployment","ru\u002F2.development\u002F05.deployment","i-lucide-rocket",{"title":92,"path":93,"stem":94,"icon":95},"Тестирование","\u002Fru\u002Fdevelopment\u002Ftesting","ru\u002F2.development\u002F06.testing","i-lucide-flask-conical",{"title":97,"path":98,"stem":99,"icon":100},"Дата-утилиты","\u002Fru\u002Fdevelopment\u002Fdate-utilities","ru\u002F2.development\u002F07.date-utilities","i-lucide-calendar",{"title":102,"icon":103,"path":104,"stem":105,"children":106,"page":60},"Справочник","i-lucide-file-code","\u002Fru\u002Freference","ru\u002F3.reference",[107,112,116,121,126,131,136,141],{"title":108,"path":109,"stem":110,"icon":111},"Архитектура","\u002Fru\u002Freference\u002Farchitecture","ru\u002F3.reference\u002F01.architecture","i-lucide-boxes",{"title":113,"path":114,"stem":115,"icon":44},"Типы транзакций","\u002Fru\u002Freference\u002Ftransaction-types","ru\u002F3.reference\u002F02.transaction-types",{"title":117,"path":118,"stem":119,"icon":120},"Синхронизация","\u002Fru\u002Freference\u002Fsync","ru\u002F3.reference\u002F03.sync","i-lucide-refresh-cw",{"title":122,"path":123,"stem":124,"icon":125},"Офлайн-first","\u002Fru\u002Freference\u002Foffline-first","ru\u002F3.reference\u002F04.offline-first","i-lucide-list-ordered",{"title":127,"path":128,"stem":129,"icon":130},"Тех. решения","\u002Fru\u002Freference\u002Ftech-decisions","ru\u002F3.reference\u002F05.tech-decisions","i-lucide-lightbulb",{"title":132,"path":133,"stem":134,"icon":135},"Валидация","\u002Fru\u002Freference\u002Fvalidation-strategy","ru\u002F3.reference\u002F06.validation-strategy","i-lucide-shield-check",{"title":137,"path":138,"stem":139,"icon":140},"Что изменилось со времён Firebase","\u002Fru\u002Freference\u002Ffirebase-migration","ru\u002F3.reference\u002F07.firebase-migration","i-lucide-hamburger",{"title":142,"path":143,"stem":144,"icon":145},"Производительность","\u002Fru\u002Freference\u002Fperformance","ru\u002F3.reference\u002F08.performance","i-lucide-gauge",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":60},"Премиум","i-lucide-star","\u002Fru\u002Fpremium","ru\u002F4.premium",[152,157,162],{"title":153,"path":154,"stem":155,"icon":156},"Обзор","\u002Fru\u002Fpremium\u002Foverview","ru\u002F4.premium\u002F01.overview","i-lucide-layers",{"title":158,"path":159,"stem":160,"icon":161},"Telegram-бот","\u002Fru\u002Fpremium\u002Ftelegram-bot","ru\u002F4.premium\u002F02.telegram-bot","i-lucide-send",{"title":163,"path":164,"stem":165,"icon":166},"AI Chat","\u002Fru\u002Fpremium\u002Fai-chat","ru\u002F4.premium\u002F03.ai-chat","i-lucide-sparkles",{"id":168,"title":163,"body":169,"description":853,"extension":854,"links":855,"meta":856,"navigation":857,"path":164,"seo":858,"stem":165,"__hash__":860},"docs_ru\u002Fru\u002F4.premium\u002F03.ai-chat.md",{"type":170,"value":171,"toc":831},"minimark",[172,176,199,203,241,244,254,258,269,274,313,317,347,351,367,371,384,388,404,408,415,461,465,471,488,491,495,501,522,526,535,539,607,613,616,622,648,651,655,775,779],[173,174,153],"h2",{"id":175},"обзор",[177,178,179,180,187,188,193,194,198],"p",{},"В Finapp встроен локальный AI ассистент на ",[181,182,186],"a",{"href":183,"rel":184},"https:\u002F\u002Follama.com",[185],"nofollow","Ollama"," и ",[181,189,192],{"href":190,"rel":191},"https:\u002F\u002Ftanstack.com\u002Fai",[185],"@tanstack\u002Fai",". Чат живёт в slide-over панели (",[195,196,197],"code",{},"AiChatPanel.vue",") и предоставляет ~24 tool'а, оборачивающих мутации и запросы Pinia-сторов. Данные не покидают машину пользователя.",[173,200,202],{"id":201},"точки-входа","Точки входа",[204,205,206,218,232],"ul",{},[207,208,209,213,214,217],"li",{},[210,211,212],"strong",{},"FAB-кнопка"," (",[195,215,216],{},"AiFab.vue",") - плавающая кнопка на всех авторизованных страницах",[207,219,220,223,224,227,228,231],{},[210,221,222],{},"Горячая клавиша"," ",[195,225,226],{},"Cmd\u002FCtrl+I"," (см. ",[195,229,230],{},"shortcuts.ts",")",[207,233,234,237,238],{},[210,235,236],{},"Slide-over панель"," справа, ",[195,239,240],{},"sm:max-w-md",[173,242,108],{"id":243},"архитектура",[245,246,251],"pre",{"className":247,"code":249,"language":250},[248],"language-text","User input → AiChatPanel\n  ├── useAiChat.send(text)\n  │   ├── pruneContext(messages) - скользящее окно + сжатие старых tool results\n  │   ├── chat() через @tanstack\u002Fai + адаптер Ollama\n  │   ├── стрим TOOL_CALL_START \u002F TOOL_CALL_ARGS \u002F TOOL_CALL_END \u002F TEXT_MESSAGE_CONTENT\n  │   ├── autoRetry - детект неудачных мутаций + незавершённых chain\n  │   ├── client-side fallback - клиент напрямую исполняет мутации если модель тупит\n  │   ├── toast - визуальный фидбек для мутаций\n  │   └── lastAction tracker - для undo\n  ├── AiToolCallsList.vue - rich cards для каждого tool\n  └── AiMessageContent.vue - markdown-текст ассистента\n","text",[195,252,249],{"__ignoreMap":253},"",[173,255,257],{"id":256},"каталог-tools","Каталог tools",[177,259,260,261,264,265,268],{},"Все tools живут в ",[195,262,263],{},"app\u002Fcomponents\u002Fai\u002Ftools\u002F"," и регистрируются через ",[195,266,267],{},"createAllTools()",".",[270,271,273],"h3",{"id":272},"transactions","Transactions",[204,275,276,288,302],{},[207,277,278,281,282,281,285],{},[195,279,280],{},"create_trn",", ",[195,283,284],{},"create_adjustment",[195,286,287],{},"create_transfer",[207,289,290,281,293,281,296,281,299],{},[195,291,292],{},"update_trn",[195,294,295],{},"delete_trn",[195,297,298],{},"duplicate_trn",[195,300,301],{},"bulk_delete_trns",[207,303,304,281,307,281,310],{},[195,305,306],{},"list_trns",[195,308,309],{},"search_trns",[195,311,312],{},"undo_last_action",[270,314,316],{"id":315},"wallets","Wallets",[204,318,319,333],{},[207,320,321,281,324,281,327,281,330],{},[195,322,323],{},"create_wallet",[195,325,326],{},"update_wallet",[195,328,329],{},"delete_wallet",[195,331,332],{},"list_wallets",[207,334,335,281,338,281,341,281,344],{},[195,336,337],{},"archive_wallet",[195,339,340],{},"unarchive_wallet",[195,342,343],{},"set_wallet_exclude_in_total",[195,345,346],{},"reorder_wallets",[270,348,350],{"id":349},"categories","Categories",[204,352,353],{},[207,354,355,281,358,281,361,281,364],{},[195,356,357],{},"create_category",[195,359,360],{},"update_category",[195,362,363],{},"delete_category",[195,365,366],{},"list_categories",[270,368,370],{"id":369},"analytics","Analytics",[204,372,373],{},[207,374,375,281,378,281,381],{},[195,376,377],{},"get_summary",[195,379,380],{},"get_wallet_stats",[195,382,383],{},"compare_periods",[270,385,387],{"id":386},"settings","Settings",[204,389,390],{},[207,391,392,281,395,281,398,281,401],{},[195,393,394],{},"set_base_currency",[195,396,397],{},"set_locale",[195,399,400],{},"get_settings",[195,402,403],{},"set_theme",[173,405,407],{"id":406},"системный-промпт","Системный промпт",[177,409,410,411,414],{},"В ",[195,412,413],{},"useSystemPrompt.ts",". Ключевые правила:",[204,416,417,423,429,445,451],{},[207,418,419,422],{},[210,420,421],{},"Tool-first:"," любой фактический вопрос о кошельках\u002Fкатегориях\u002Fтранзакциях ВСЕГДА через tool, не из памяти",[207,424,425,428],{},[210,426,427],{},"Multi-turn:"," если не хватает полей - задать ОДИН уточняющий вопрос; на следующем turn смержить данные",[207,430,431,223,434,436,437,436,439,441,442,444],{},[210,432,433],{},"Chain-паттерн:",[195,435,295],{},"\u002F",[195,438,292],{},[195,440,298],{}," требуют сначала ",[195,443,306],{}," для получения id",[207,446,447,450],{},[210,448,449],{},"FORBIDDEN:"," выдумывать id, просить у пользователя id, переиспользовать старые tool results",[207,452,453,456,457,460],{},[210,454,455],{},"DATE RULE:"," не передавать ",[195,458,459],{},"date"," если пользователь не сказал явно",[173,462,464],{"id":463},"сжатие-контекста","Сжатие контекста",[177,466,467,470],{},[195,468,469],{},"pruneContext.ts"," - скользящее окно + сжатие tool results:",[204,472,473,479],{},[207,474,475,478],{},[195,476,477],{},"maxContextTurns"," (default 6) - в модель идут только последние N пар user+assistant",[207,480,481,484,485],{},[195,482,483],{},"compressToolsAfterTurns"," (default 1) - старые tool_calls сжимаются в строку ",[195,486,487],{},"[tool_name: summary]",[177,489,490],{},"Это убирает \"я уже сделал X\" галлюцинации в длинных сессиях.",[173,492,494],{"id":493},"autoretry-client-fallback","AutoRetry + client fallback",[177,496,497,500],{},[195,498,499],{},"useAiChat.ts",":",[502,503,504,516],"ol",{},[207,505,506,509,510,513,514],{},[210,507,508],{},"autoRetry"," - если tool вернул error \u002F ",[195,511,512],{},"ok: false",", отправить retry с реальным id из ",[195,515,306],{},[207,517,518,521],{},[210,519,520],{},"executeFallback"," - если модель всё равно тупит на chain'ах, клиент САМ выполняет мутацию и инжектирует результат как синтетический tool_call",[173,523,525],{"id":524},"auto-clear-при-простое","Auto-clear при простое",[177,527,528,531,532,268],{},[195,529,530],{},"idleMinutesBeforeClear"," (default 30) - если чат был неактивен N минут, история очищается на следующем ",[195,533,534],{},"send()",[173,536,538],{"id":537},"рекомендации-моделей","Рекомендации моделей",[540,541,542,561],"table",{},[543,544,545],"thead",{},[546,547,548,552,555,558],"tr",{},[549,550,551],"th",{},"Модель",[549,553,554],{},"Скорость",[549,556,557],{},"Tools",[549,559,560],{},"Заметки",[562,563,564,581,595],"tbody",{},[546,565,566,572,575,578],{},[567,568,569],"td",{},[210,570,571],{},"gemma4:latest",[567,573,574],{},"fast",[567,576,577],{},"excellent",[567,579,580],{},"По умолчанию. Баланс скорость\u002Fточность",[546,582,583,586,589,592],{},[567,584,585],{},"gemma4:26b",[567,587,588],{},"medium",[567,590,591],{},"good",[567,593,594],{},"Для RAM-богатых, выше точность",[546,596,597,600,602,604],{},[567,598,599],{},"qwen3:8b",[567,601,574],{},[567,603,577],{},[567,605,606],{},"Альтернатива с похожими характеристиками",[177,608,609,610,268],{},"См. ",[195,611,612],{},"modelMeta.ts",[173,614,56],{"id":615},"настройки",[177,617,618,619,500],{},"Все настройки в ",[195,620,621],{},"aiStore.settings",[204,623,624,640],{},[207,625,626,281,629,281,632,281,635,281,637],{},[195,627,628],{},"model",[195,630,631],{},"baseUrl",[195,633,634],{},"think",[195,636,508],{},[195,638,639],{},"debug",[207,641,642,281,644,281,646],{},[195,643,477],{},[195,645,483],{},[195,647,530],{},[177,649,650],{},"Доступны через popover в шапке чата.",[173,652,654],{"id":653},"известные-ограничения","Известные ограничения",[204,656,657,687,712,725,734,761],{},[207,658,659,665,666,668,669,671,672,675,676,679,680,683,684,686],{},[210,660,661,662,664],{},"Multi-turn ",[195,663,280],{}," зависит от модели."," На ",[195,667,571],{}," сборка транзакции через уточнения (юзер: \"купил кофе\" → ассистент спрашивает сумму\u002Fкошелёк → вызывает ",[195,670,280],{},") работает примерно в 70% попыток. Модель иногда кладёт ответ не в то поле (например \"наличными\" в ",[195,673,674],{},"description"," вместо ",[195,677,678],{},"wallet",") или забывает ",[195,681,682],{},"type",". Для надёжного multi-turn - ",[195,685,599],{}," или давать все поля сразу.",[207,688,689,702,703,705,706,708,709,711],{},[210,690,691,692,281,694,281,696,698,699,701],{},"Chain-tools (",[195,693,298],{},[195,695,295],{},[195,697,292],{},") на ",[195,700,571],{}," в длинных сессиях"," - модель иногда отвечает текстом и просит id вместо ",[195,704,306],{}," → мутация. Это компенсировано client-side fallback'ом (",[195,707,520],{}," в ",[195,710,499],{},"), который напрямую исполняет мутацию и инжектирует синтетический tool_call.",[207,713,714,717,718,720,721,724],{},[210,715,716],{},"Галлюцинация \"я уже это сделал\""," может вернуться при большом ",[195,719,477],{},". Default ",[195,722,723],{},"compressToolsAfterTurns: 1"," сжимает старые результаты для предотвращения; выше 8-10 turns риск возвращается.",[207,726,727,730,731,733],{},[210,728,729],{},"Зависимость от локальной сети."," Если Ollama не запущена на ",[195,732,631],{},", чат не работает. Remote fallback отсутствует по дизайну - всё inference локально.",[207,735,736,741,742,745,746,749,750,753,754,756,757,760],{},[210,737,738,739],{},"Validation errors из ",[195,740,192],{}," приходят с ",[195,743,744],{},"state: 'done'"," (не ",[195,747,748],{},"error",") и ",[195,751,752],{},"{ error: \"...\" }"," в результате. ",[195,755,508],{}," распознаёт их через helper ",[195,758,759],{},"isTcFailed"," по JSON результата.",[207,762,763,766,767,770,771,774],{},[210,764,765],{},"Нет массовой перестановки категорий"," - ",[195,768,769],{},"useCategoriesStore"," не предоставляет ",[195,772,773],{},"saveCategoriesOrder",", AI не может менять порядок категорий.",[173,776,778],{"id":777},"добавление-нового-tool","Добавление нового tool",[502,780,781,791,800,807,813,819,825],{},[207,782,783,784,787,788],{},"Создать ",[195,785,786],{},"app\u002Fcomponents\u002Fai\u002Ftools\u002F\u003Cname>.ts"," с ",[195,789,790],{},"create*Tools()",[207,792,793,794,797,798],{},"Использовать ",[195,795,796],{},"toolDefinition({ description, inputSchema, name })"," из ",[195,799,192],{},[207,801,802,803,806],{},"Вернуть полную форму результата (с ",[195,804,805],{},"ok: true"," на успех)",[207,808,809,810],{},"Зарегистрировать в ",[195,811,812],{},"tools\u002Findex.ts",[207,814,815,816],{},"Добавить rich card в ",[195,817,818],{},"AiToolCallsList.richKind()",[207,820,821,822,824],{},"Обновить ",[195,823,413],{}," правилом",[207,826,827,828],{},"Добавить bench case в ",[195,829,830],{},"\u002Ftmp\u002Fai-bench.mjs",{"title":253,"searchDepth":832,"depth":832,"links":833},2,[834,835,836,837,845,846,847,848,849,850,851,852],{"id":175,"depth":832,"text":153},{"id":201,"depth":832,"text":202},{"id":243,"depth":832,"text":108},{"id":256,"depth":832,"text":257,"children":838},[839,841,842,843,844],{"id":272,"depth":840,"text":273},3,{"id":315,"depth":840,"text":316},{"id":349,"depth":840,"text":350},{"id":369,"depth":840,"text":370},{"id":386,"depth":840,"text":387},{"id":406,"depth":832,"text":407},{"id":463,"depth":832,"text":464},{"id":493,"depth":832,"text":494},{"id":524,"depth":832,"text":525},{"id":537,"depth":832,"text":538},{"id":615,"depth":832,"text":56},{"id":653,"depth":832,"text":654},{"id":777,"depth":832,"text":778},"Локальный AI ассистент для транзакций, кошельков, категорий и аналитики.","md",null,{},{"icon":166},{"title":163,"description":859},"Архитектура AI чата Finapp, tools, промпты, рекомендации моделей.","WO0ZW3lYAG9TUUEDNz4LLwXRR49IQYbVwoUlRAzvN3M",[862,855],{"title":158,"path":159,"stem":160,"description":863,"icon":161,"children":-1},"Добавляйте транзакции прямо из Telegram текстом или фото чека.",1782114342029]