--- ### πŸ“„ Π€Π°ΠΉΠ»: `TASKS.md` (Π­Ρ‚Π°ΠΏ 1: ΠŸΠΎΠ»Π½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€) ```markdown # Π—Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Writer IDE ## 🟒 Π­Ρ‚Π°ΠΏ 1: Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚, Layout ΠΈ Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ### Π—Π°Π΄Π°Ρ‡Π° 1.1: Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Frontend ΠΈ установка зависимостСй **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ Next.js прилоТСния ΠΈ установка всСх Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для Π­Ρ‚Π°ΠΏΠ° 1. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - Команда `npm run dev` Π² ΠΏΠ°ΠΏΠΊΠ΅ `frontend` запускаСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° `localhost:3000`. - Tailwind CSS Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‡Π΅Ρ€Π΅Π· класс `bg-red-500`). **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉ Next.js ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠ°ΠΏΠΊΠ΅ с TypeScript, Tailwind, App Router ΠΈ src-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠ΅ΠΉ. Π—Π°Ρ‚Π΅ΠΌ установи ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ зависимости: `@tiptap/react`, `@tiptap/starter-kit`, `@tiptap/extension-text-style`, `@tiptap/extension-color`, `@tiptap/extension-blockquote`, `@tiptap/extension-underline`, `zustand`, `lucide-react`, `axios`. УбСдись, Ρ‡Ρ‚ΠΎ `tailwind.config.ts` настроСн ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ." --- ### Π—Π°Π΄Π°Ρ‡Π° 1.2: Настройка Zustand Store (БостояниС прилоТСния) **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ глобального Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° для управлСния Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Π΅Π³ΠΎ содСрТимым ΠΈ состояниСм Π±ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΏΠ°Π½Π΅Π»Π΅ΠΉ. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - Π‘ΠΎΠ·Π΄Π°Π½ Ρ„Π°ΠΉΠ» `frontend/src/stores/appStore.ts`. - Store содСрТит: `activeDocumentId`, `documents` (массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с id, title, content), Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `setActiveDocument`, `updateDocumentContent`. **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ Zustand store Π² `src/stores/appStore.ts`. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈ интСрфСйс `Document` (id: string, title: string, content: string, type: 'scene' | 'chapter'). Π”ΠΎΠ±Π°Π²ΡŒ состояния для списка Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΊΡˆΠ΅Π½Ρ‹ для ΠΈΡ… обновлСния. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉ store ΠΎΠ΄Π½ΠΈΠΌ тСстовым Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ." --- ### Π—Π°Π΄Π°Ρ‡Π° 1.3: АрхитСктура Layout (Π’Ρ€Π΅Ρ…ΠΊΠΎΠ»ΠΎΠ½ΠΎΡ‡Π½Ρ‹ΠΉ интСрфСйс) **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ основного ΠΌΠ°ΠΊΠ΅Ρ‚Π° прилоТСния `src/app/layout.tsx` ΠΈ `src/app/page.tsx` с трСмя ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°ΠΌΠΈ. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - ЛСвая ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° (w-64): Π—Π°Π³Π»ΡƒΡˆΠΊΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° `FileExplorer`. - БрСдняя ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° (w-72): Π—Π°Π³Π»ΡƒΡˆΠΊΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° `StoryExplorer`. - ΠŸΡ€Π°Π²Π°Ρ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° (flex-1): ΠžΠ±Π»Π°ΡΡ‚ΡŒ для Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°. - Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ CSS Grid ΠΈΠ»ΠΈ Flexbox. ΠΠ΄Π°ΠΏΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ: Π½Π° экранах < 1024px Π±ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΏΠ°Π½Π΅Π»ΠΈ ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ (ΠΈΠ»ΠΈ ΡΠΆΠΈΠΌΠ°ΡŽΡ‚ΡΡ). **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹-Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ `FileExplorer.tsx` ΠΈ `StoryExplorer.tsx` Π² `src/components/sidebar/`. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉ основной Layout Π² `src/app/page.tsx`, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Flexbox ΠΈΠ»ΠΈ Grid для создания Ρ‚Ρ€Π΅Ρ… ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ с фиксированной ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ для сайдбаров ΠΈ `flex-1` для Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ области. ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈ Ρ‚Π΅ΠΌΠ½ΡƒΡŽ/ΡΠ²Π΅Ρ‚Π»ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ Ρ‡Π΅Ρ€Π΅Π· Tailwind." --- ### Π—Π°Π΄Π°Ρ‡Π° 1.4: Π―Π΄Ρ€ΠΎ Tiptap Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ форматирования. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `src/components/editor/Editor.tsx` ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ `useEditor` с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ: `StarterKit`, `TextStyle`, `Color`, `Underline`, `Blockquote`. - Π Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ привязан ΠΊ Zustand store (Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ `content` Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ сохраняСт измСнСния Ρ‡Π΅Ρ€Π΅Π· `onUpdate`). **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `Editor.tsx`. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ `@tiptap/react`. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ: StarterKit, TextStyle, Color, Underline, Blockquote. Настрой `onUpdate`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ тСкста вызывался экшСн `updateDocumentContent` ΠΈΠ· `appStore`. ΠžΠ±Π΅Ρ€Π½ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π² div с классами для красивого отобраТСния (max-w-3xl, mx-auto, prose)." --- ### Π—Π°Π΄Π°Ρ‡Π° 1.5: ПанСль инструмСнтов (Toolbar) для форматирования **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΈΠ»ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ инструмСнтов для управлСния стилями тСкста. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `src/components/editor/Toolbar.tsx`. - Кнопки для: Bold, Italic, Underline, Blockquote, Π²Ρ‹Π±ΠΎΡ€ Ρ†Π²Π΅Ρ‚Π° тСкста (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ стандартный `` для простоты). - Кнопки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ `editor.chain().focus().toggleBold().run()` ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈ. **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `Toolbar.tsx`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ экзСмпляр `editor` ΠΈΠ· Tiptap ΠΊΠ°ΠΊ пропс. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ форматирования с использованиСм Lucide React ΠΈΠΊΠΎΠ½ΠΎΠΊ. Π”ΠΎΠ±Π°Π²ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ подсвСтки Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ (Ρ‡Π΅Ρ€Π΅Π· `editor.isActive('bold')`). РазмСсти этот Toolbar Π½Π°Π΄ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ Editor." --- ### Π—Π°Π΄Π°Ρ‡Π° 1.6: Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Backend (FastAPI) **ОписаниС**: Базовая настройка Python-сСрвСра для обслуТивания frontend ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - Π€Π°ΠΉΠ» `backend/main.py` запускаСтся Ρ‡Π΅Ρ€Π΅Π· `uvicorn main:app --reload`. - НастроСн CORS middleware, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΠΉ запросы с `http://localhost:3000`. - Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚ `GET /api/health` Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ `{"status": "ok"}`. **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ FastAPI Π² `backend/main.py`. Π”ΠΎΠ±Π°Π²ΡŒ `CORSMiddleware` с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΌΠΈ источниками `http://localhost:3000`. Π‘ΠΎΠ·Π΄Π°ΠΉ простой Ρ€ΠΎΡƒΡ‚Π΅Ρ€ `/api/health`. Напиши ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠΎ запуску (созданиС venv, `pip install fastapi uvicorn pydantic`, запуск)." --- ### Π—Π°Π΄Π°Ρ‡Π° 1.7: Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Frontend ΠΈ Backend (Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅/Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ°) **ОписаниС**: БвязываниС Zustand store с Backend для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ сохранСния Π΄Π°Π½Π½Ρ‹Ρ… (ΠΏΠΎΠΊΠ° Π² памяти ΠΈΠ»ΠΈ простом JSON). **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ тСкста Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅, Ρ‡Π΅Ρ€Π΅Π· debounced-запрос (ΠΈΠ»ΠΈ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ "Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ") Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Π½Π° backend. - ΠŸΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ страницы frontend Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ список Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° с backend. **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ Π² `backend` простой in-memory список Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (ΠΈΠ»ΠΈ запись Π² `data.json`). Π”ΠΎΠ±Π°Π²ΡŒ эндпоинты `GET /api/documents` ΠΈ `POST /api/documents/{id}/content`. Π’ `frontend/src/lib/api.ts` создай Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для этих запросов. Обнови `appStore`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π» Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ." --- ## 🟑 Π­Ρ‚Π°ΠΏ 2: AI Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΈ Inline-дСйствия ### Π—Π°Π΄Π°Ρ‡Π° 2.1: Backend AI сСрвис (Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ€ΠΎΡƒΡ‚Π΅Ρ€ для LLM) **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сСрвиса Π½Π° backend для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с AI-модСлями (Ollama локально ΠΈ OpenRouter API). **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - Π‘ΠΎΠ·Π΄Π°Π½ Ρ„Π°ΠΉΠ» `backend/services/llm_router.py` - БСрвис ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π΄Π²Π° ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°: `ollama` ΠΈ `openrouter` - Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚ `POST /api/ai/generate` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΌΠΏΡ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сгСнСрированный тСкст - ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π²Ρ‹Π±ΠΎΡ€Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ запроса **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ сСрвис `backend/services/llm_router.py` с классом `LLMRouter`. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: > - `generate_ollama(prompt, model)` β€” Π²Ρ‹Π·ΠΎΠ² локальной Ollama Ρ‡Π΅Ρ€Π΅Π· `http://localhost:11434/api/generate` > - `generate_openrouter(prompt, model, api_key)` β€” Π²Ρ‹Π·ΠΎΠ² OpenRouter API > - `generate(prompt, provider, model, **kwargs)` β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ запрос > Π‘ΠΎΠ·Π΄Π°ΠΉ эндпоинт `POST /api/ai/generate` Π² `backend/routers/ai.py`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ JSON: `{prompt, provider, model, options}` ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ `{generated_text}`. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ `httpx` для async HTTP запросов. Π”ΠΎΠ±Π°Π²ΡŒ `httpx` Π² requirements.txt." --- ### Π—Π°Π΄Π°Ρ‡Π° 2.2: БистСма прСсСтов для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ **ОписаниС**: РСализация прСсСтов ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ (Creative Draft, Editor, Brainstorm) Π½Π° backend. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - Π‘ΠΎΠ·Π΄Π°Π½ Ρ„Π°ΠΉΠ» `backend/services/presets.py` - ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚Ρ€ΠΈ прСсСта с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ (temperature, top_p, frequency_penalty, presence_penalty) - Π­Π½Π΄ΠΏΠΎΠΈΠ½Ρ‚ `/api/ai/generate` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ `preset` ΠΈ примСняСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ настройки **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ `backend/services/presets.py` с трСмя прСсСтами: > - `CREATIVE_DRAFT`: temperature=0.85, top_p=0.92, frequency_penalty=0.3, presence_penalty=0.4 > - `EDITOR`: temperature=0.3, top_p=0.85, frequency_penalty=0.0, presence_penalty=0.0 > - `BRAINSTORM`: temperature=1.0, top_p=0.95, frequency_penalty=0.5, presence_penalty=0.6 > Обнови `llm_router.py`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ `generate` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π» ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ `preset` ΠΈ примСнял ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊ запросу. Обнови эндпоинт `/api/ai/generate` для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ прСсСтов." --- ### Π—Π°Π΄Π°Ρ‡Π° 2.3: Frontend API ΠΊΠ»ΠΈΠ΅Π½Ρ‚ для AI **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ API ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° frontend для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с AI эндпоинтами. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - Π‘ΠΎΠ·Π΄Π°Π½ Ρ„Π°ΠΉΠ» `frontend/src/lib/ai-api.ts` - Ѐункция `generateText(prompt, provider, model, preset)` Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сгСнСрированный тСкст - ВсС Ρ‚ΠΈΠΏΡ‹ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ (Π½ΠΈΠΊΠ°ΠΊΠΈΡ… `any`) **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ `frontend/src/lib/ai-api.ts` с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ: > ```typescript > interface GenerateRequest { > prompt: string; > provider: 'ollama' | 'openrouter'; > model: string; > preset: 'creative_draft' | 'editor' | 'brainstorm'; > options?: Record; > } > interface GenerateResponse { > generated_text: string; > } > ``` > Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `generateText(request: GenerateRequest): Promise`, которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ `POST /api/ai/generate` ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ `generated_text`. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ axios ΠΈΠ· `lib/api.ts`." --- ### Π—Π°Π΄Π°Ρ‡Π° 2.4: Inline AI мСню Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ (UI) **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ мСню ΠΏΡ€ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ тСкста Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ для Π²Ρ‹Π±ΠΎΡ€Π° AI дСйствий. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - Π‘ΠΎΠ·Π΄Π°Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `frontend/src/components/editor/AIMenu.tsx` - ΠŸΡ€ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ тСкста появляСтся ΠΊΠ½ΠΎΠΏΠΊΠ° "✨ AI" - ΠŸΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ открываСтся мСню с дСйствиями: "ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ", "Π Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ", "Π£ΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ", "Π‘Π²ΠΎΠΉ ΠΏΡ€ΠΎΠΌΠΏΡ‚" **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `AIMenu.tsx`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Tiptap BubbleMenu ΠΈΠ»ΠΈ FloatingMenu. ΠŸΡ€ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ тСкста ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΠΉ ΠΊΠ½ΠΎΠΏΠΊΡƒ с ΠΈΠΊΠΎΠ½ΠΊΠΎΠΉ `Sparkles` ΠΈΠ· lucide-react. ΠŸΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΠΉ dropdown с ΠΏΡƒΠ½ΠΊΡ‚Π°ΠΌΠΈ: 'ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ', 'Π Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ', 'Π£ΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ', 'Π‘Π²ΠΎΠΉ ΠΏΡ€ΠΎΠΌΠΏΡ‚...'. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡƒΠ½ΠΊΡ‚ ΠΏΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ callback `onAction(action: string, selectedText: string)`. Π‘Ρ‚ΠΈΠ»ΠΈΠ·ΡƒΠΉ мСню Π² Ρ‚Π΅ΠΌΠ½ΠΎΠΉ Ρ‚Π΅ΠΌΠ΅ (bg-gray-800, border-gray-700)." --- ### Π—Π°Π΄Π°Ρ‡Π° 2.5: Diff view для прСдпросмотра AI ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° для Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сравнСния ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ тСкста ΠΈ AI-прСдлоТСния. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - Π‘ΠΎΠ·Π΄Π°Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `frontend/src/components/editor/AIDiffView.tsx` - ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ тСкст слСва ΠΈ AI-тСкст справа - Π•ΡΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠΈ "ΠŸΡ€ΠΈΠ½ΡΡ‚ΡŒ" ΠΈ "ΠžΡ‚ΠΊΠ»ΠΎΠ½ΠΈΡ‚ΡŒ" - Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для сравнСния тСкста (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `diff` ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ) **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `AIDiffView.tsx`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ пропсы: `originalText: string`, `aiText: string`, `onAccept: () => void`, `onReject: () => void`. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΠΉ Π΄Π²Π° Π±Π»ΠΎΠΊΠ° тСкста (ΠΌΠΎΠΆΠ½ΠΎ просто Π΄Π²Π° div рядом ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ ΠΏΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΎΠΌ). Π”ΠΎΠ±Π°Π²ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠΈ 'βœ… ΠŸΡ€ΠΈΠ½ΡΡ‚ΡŒ' ΠΈ '❌ ΠžΡ‚ΠΊΠ»ΠΎΠ½ΠΈΡ‚ΡŒ' Π²Π²Π΅Ρ€Ρ…Ρƒ. Π‘Ρ‚ΠΈΠ»ΠΈΠ·ΡƒΠΉ: ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ тСкст с красноватым Ρ„ΠΎΠ½ΠΎΠΌ (bg-red-900/20), AI тСкст с Π·Π΅Π»Π΅Π½ΠΎΠ²Π°Ρ‚Ρ‹ΠΌ (bg-green-900/20). Кнопки: Accept β€” bg-green-600, Reject β€” bg-red-600." --- ### Π—Π°Π΄Π°Ρ‡Π° 2.6: Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ AI дСйствий с Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ **ОписаниС**: БвязываниС AIMenu, AIDiffView ΠΈ API ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° для ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ AI-рСдактирования. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ дСйствия Π² AIMenu вызываСтся API с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠΌΠΏΡ‚ΠΎΠΌ - Пока ΠΈΠ΄Π΅Ρ‚ гСнСрация, показываСтся спиннСр - ПослС получСния ΠΎΡ‚Π²Π΅Ρ‚Π° открываСтся AIDiffView - ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ "ΠŸΡ€ΠΈΠ½ΡΡ‚ΡŒ" Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ тСкст замСняСтся Π½Π° AI-тСкст - ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ "ΠžΡ‚ΠΊΠ»ΠΎΠ½ΠΈΡ‚ΡŒ" возвращаСтся ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ тСкст **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΠΉ AIMenu ΠΈ AIDiffView Π² Editor.tsx: > 1. Π”ΠΎΠ±Π°Π²ΡŒ состояниС: `selectedText`, `aiGeneratedText`, `showDiffView`, `isLoading` > 2. ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ дСйствия Π² AIMenu: > - Π‘ΠΎΡ…Ρ€Π°Π½ΠΈ `selectedText` ΠΈΠ· `editor.state.doc.textBetween(selection.from, selection.to)` > - Π‘Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠΉ ΠΏΡ€ΠΎΠΌΠΏΡ‚ Π² зависимости ΠΎΡ‚ дСйствия (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для 'ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ': 'ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈ этот тСкст, сдСлай Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΆΠΈΠ²Ρ‹ΠΌ ΠΈ ΠΊΠΈΠ½Π΅ΠΌΠ°Ρ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ‡Π½Ρ‹ΠΌ: [selectedText]') > - Π’Ρ‹Π·ΠΎΠ²ΠΈ `generateText` ΠΈΠ· `ai-api.ts` с прСсСтом `creative_draft` > - Установи `aiGeneratedText` ΠΈ `showDiffView = true` > 3. Π’ AIDiffView: > - `onAccept`: Π·Π°ΠΌΠ΅Π½ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ тСкст Ρ‡Π΅Ρ€Π΅Π· `editor.chain().focus().deleteRange(selection).insertContent(aiGeneratedText).run()` > - `onReject`: Π·Π°ΠΊΡ€ΠΎΠΉ diff view, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ мСняй > 4. ПокаТи спиннСр (ΠΈΠ· lucide-react: `Loader2` с Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠ΅ΠΉ `animate-spin`), ΠΏΠΎΠΊΠ° `isLoading = true`" --- ## 🟠 Π­Ρ‚Π°ΠΏ 3: ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚ ΠΈ Story Bible ### Π—Π°Π΄Π°Ρ‡Π° 3.1: Backend модСль ΠΈ API для Story Bible **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… для Story Bible (пСрсонаТи, Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ, события) ΠΈ API для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅ΠΉ. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - Π‘ΠΎΠ·Π΄Π°Π½Ρ‹ Pydantic ΠΌΠΎΠ΄Π΅Π»ΠΈ для сущностСй (Character, Location, Event, StoryThread) - Π‘ΠΎΠ·Π΄Π°Π½ эндпоинт `GET /api/projects/{id}/bible` для получСния Story Bible - Π‘ΠΎΠ·Π΄Π°Π½ эндпоинт `PUT /api/projects/{id}/bible` для обновлСния Story Bible - Π”Π°Π½Π½Ρ‹Π΅ хранятся Π² JSON Ρ„Π°ΠΉΠ»Π΅ Π½Π° дискС (локально) **РСкомСндуСмая модСль**: `qwen/qwen-2.5-coder-7b-instruct` (простая CRUD Π·Π°Π΄Π°Ρ‡Π°) **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ Pydantic ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² `backend/models/bible.py` для сущностСй: Character (id, name, description, traits, appearance), Location (id, name, description, atmosphere), Event (id, title, description, chapter), StoryThread (id, title, description, status). Π‘ΠΎΠ·Π΄Π°ΠΉ модСль StoryBible, которая содСрТит списки этих сущностСй. Π‘ΠΎΠ·Π΄Π°ΠΉ Ρ€ΠΎΡƒΡ‚Π΅Ρ€ `backend/routers/bible.py` с эндпоинтами для получСния ΠΈ обновлСния Story Bible. Π”Π°Π½Π½Ρ‹Π΅ Ρ…Ρ€Π°Π½ΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ `data/story_bible.json`. Π”ΠΎΠ±Π°Π²ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…." --- ### Π—Π°Π΄Π°Ρ‡Π° 3.2: Frontend UI для Story Bible (панСль) **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠ°Π½Π΅Π»ΠΈ для просмотра ΠΈ рСдактирования Story Bible. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - Π‘ΠΎΠ·Π΄Π°Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `StoryBiblePanel.tsx` с Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ: ΠŸΠ΅Ρ€ΡΠΎΠ½Π°ΠΆΠΈ, Π›ΠΎΠΊΠ°Ρ†ΠΈΠΈ, Бобытия, Π‘ΡŽΠΆΠ΅Ρ‚Π½Ρ‹Π΅ Π½ΠΈΡ‚ΠΈ - КаТдая Π²ΠΊΠ»Π°Π΄ΠΊΠ° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ список сущностСй с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ рСдактирования - Π•ΡΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠΈ "Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ" ΠΈ "Π£Π΄Π°Π»ΠΈΡ‚ΡŒ" для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сущности - ПанСль ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π° Π² layout (замСняСт ΠΈΠ»ΠΈ дополняСт StoryExplorer) **РСкомСндуСмая модСль**: `qwen/qwen-2.5-coder-7b-instruct` (UI ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚) **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `src/components/sidebar/StoryBiblePanel.tsx` с Π²ΠΊΠ»Π°Π΄ΠΊΠ°ΠΌΠΈ для пСрсонаТСй, Π»ΠΎΠΊΠ°Ρ†ΠΈΠΉ, событий ΠΈ ΡΡŽΠΆΠ΅Ρ‚Π½Ρ‹Ρ… Π½ΠΈΡ‚Π΅ΠΉ. КаТдая Π²ΠΊΠ»Π°Π΄ΠΊΠ° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ список ΠΊΠ°Ρ€Ρ‚ΠΎΡ‡Π΅ΠΊ сущностСй. ΠšΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ° содСрТит Π½Π°Π·Π²Π°Π½ΠΈΠ΅, ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ рСдактирования/удалСния. Π”ΠΎΠ±Π°Π²ΡŒ модальноС ΠΎΠΊΠ½ΠΎ для создания/рСдактирования сущности с полями, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΠΉ панСль Π² layout, Π·Π°ΠΌΠ΅Π½ΠΈΠ² Π·Π°Π³Π»ΡƒΡˆΠΊΡƒ StoryExplorer. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ Zustand store для управлСния состояниСм." --- ### Π—Π°Π΄Π°Ρ‡Π° 3.3: Настройки Π²Ρ‹Π±ΠΎΡ€Π° ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ для Ρ€Π°Π·Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ UI ΠΈ backend Π»ΠΎΠ³ΠΈΠΊΠΈ для Π²Ρ‹Π±ΠΎΡ€Π° ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΏΠΎΠ΄ Ρ€Π°Π·Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ (гСнСрация, фоновая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Π°Π½Π°Π»ΠΈΠ·). **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - Π‘ΠΎΠ·Π΄Π°Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `ModelSettings.tsx` с Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ для: - Π“Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ тСкста (основная модСль) - Π€ΠΎΠ½ΠΎΠ²ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ сущностСй) - Анализа тСкста (ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π»ΠΎΠ³ΠΈΠΊΠΈ) - Настройки ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² localStorage ΠΈΠ»ΠΈ backend - ΠŸΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ **РСкомСндуСмая модСль**: `qwen/qwen-2.5-coder-7b-instruct` (UI + интСграция) **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ `src/components/settings/ModelSettings.tsx` с dropdown для Π²Ρ‹Π±ΠΎΡ€Π° ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ для Ρ€Π°Π·Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡: 'Основная модСль для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ', 'МодСль для Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ', 'МодСль для Π°Π½Π°Π»ΠΈΠ·Π°'. Π—Π°Π³Ρ€ΡƒΠΆΠ°ΠΉ список доступных ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· `getAvailableModels()` ΠΈΠ· `ai-api.ts`. Бохраняй настройки Π² Zustand store. Обнови `ai-api.ts`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция `generateText` ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π»Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ `task_type` ΠΈ использовала ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ модСль ΠΈΠ· настроСк." --- ### Π—Π°Π΄Π°Ρ‡Π° 3.4: Π€ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ Π°Π³Π΅Π½Ρ‚ для извлСчСния сущностСй **ОписаниС**: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сСрвиса для автоматичСского извлСчСния пСрсонаТСй, Π»ΠΎΠΊΠ°Ρ†ΠΈΠΉ ΠΈ событий ΠΈΠ· тСкста Π³Π»Π°Π²Ρ‹. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - Π‘ΠΎΠ·Π΄Π°Π½ сСрвис `backend/services/entity_extractor.py` - БСрвис ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ тСкст Π³Π»Π°Π²Ρ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ JSON с ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ сущностями - Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠΌΠΏΡ‚ для структурированного Π²Ρ‹Π²ΠΎΠ΄Π° (JSON mode) - Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ с Story Bible (обновляСт ΠΈΠ»ΠΈ добавляСт Π½ΠΎΠ²Ρ‹Π΅ сущности) **РСкомСндуСмая модСль**: `qwen/qwen-2.5-coder-32b-instruct` (слоТный ΠΏΡ€ΠΎΠΌΠΏΡ‚-ΠΈΠ½ΠΆΠΈΠ½ΠΈΡ€ΠΈΠ½Π³) **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Π‘ΠΎΠ·Π΄Π°ΠΉ сСрвис `backend/services/entity_extractor.py` с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ `extract_entities(text, existing_bible)`. Ѐункция Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠΌΠΏΡ‚ для LLM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ ΠΈΠ· тСкста Π½ΠΎΠ²Ρ‹Ρ… пСрсонаТСй, Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ ΠΈ события Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON. ΠŸΡ€ΠΎΠΌΠΏΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π½Π΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ сущности ΠΈΠ· `existing_bible`. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ модСль для Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ· настроСк. ΠŸΡ€Π΅ΡΠ΅Ρ‚: `editor` (низкая Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π° для точности)." --- ### Π—Π°Π΄Π°Ρ‡Π° 3.5: АвтоматичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Story Bible ΠΏΡ€ΠΈ сохранСнии **ОписаниС**: Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ извлСчСния сущностСй с процСссом сохранСния Π³Π»Π°Π²Ρ‹. **ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ успСха**: - ΠŸΡ€ΠΈ сохранСнии Π³Π»Π°Π²Ρ‹ (автосохранСниС) вызываСтся Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ Π°Π³Π΅Π½Ρ‚ - АгСнт Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ тСкст ΠΈ обновляСт Story Bible - ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²ΠΈΠ΄ΠΈΡ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ "Story Bible ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π°" - Π•ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ автоматичСскоС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π² настройках **РСкомСндуСмая модСль**: `qwen/qwen-2.5-coder-32b-instruct` (интСграция) **Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ для AI-Π°Π³Π΅Π½Ρ‚Π°**: > "Обнови `Editor.tsx`, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ автосохранСнии (послС debounce) отправлял запрос Π½Π° backend для извлСчСния сущностСй. Π‘ΠΎΠ·Π΄Π°ΠΉ эндпоинт `POST /api/ai/extract-entities` Π² `backend/routers/ai.py`, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ тСкст Π³Π»Π°Π²Ρ‹ ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Story Bible, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ `entity_extractor`, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ Bible. На frontend добавь ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ 'АвтоматичСски ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Story Bible' Π² настройках. ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°ΠΉ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ (toast) ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ." --- ## πŸ”΄ Π­Ρ‚Π°ΠΏ 4: Экспорт ΠΈ ΠΏΠΎΠ»ΠΈΡ€ΠΎΠ²ΠΊΠ° *(Π‘ΡƒΠ΄Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ послС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π­Ρ‚Π°ΠΏΠ° 3)*