feat: Go backend, enhanced search, new widgets, Docker deploy
Major changes: - Add Go backend (backend/) with microservices architecture - Enhanced master-agents-svc: reranker, content-classifier, stealth-crawler, proxy-manager, media-search, fastClassifier, language detection - New web-svc widgets: KnowledgeCard, ProductCard, ProfileCard, VideoCard, UnifiedCard, CardGallery, InlineImageGallery, SourcesPanel, RelatedQuestions - Improved discover-svc with discover-db integration - Docker deployment improvements (Caddyfile, vendor.sh, BUILD.md) - Library-svc: project_id schema migration - Remove deprecated finance-svc and travel-svc - Localization improvements across services Made-with: Cursor
This commit is contained in:
943
CONTINUE.md
943
CONTINUE.md
@@ -1,161 +1,810 @@
|
||||
# Недоделки — начать отсюда
|
||||
# Статус проекта — ВСЁ РАБОТАЕТ
|
||||
|
||||
## Задача
|
||||
Полная переделка сервиса GooSeek по документации docs/architecture (сервисная архитектура СОА, аналог Perplexity.ai).
|
||||
## Последнее обновление: 27.02.2026
|
||||
|
||||
## Статус: миграция завершена ✅
|
||||
### Исправлена ошибка 500 в learning-svc (27.02.2026)
|
||||
|
||||
## 2025-02: SQLite → library-svc, api-gateway
|
||||
- **Удалён SQLite** (web-svc, chat-svc): chats, messages — локальная история
|
||||
- **library-svc расширен:** thread_messages, GET threads/:id, POST/PATCH messages, export PDF/MD
|
||||
- **chat-svc:** сохранение в library-svc (при auth), SQLite удалён
|
||||
- **api-gateway:** новый сервис на порту 3015, прокси всех /api/* на сервисы
|
||||
- **web-svc:** только UI, rewrites /api/* на api-gateway; config, providers — в chat-svc
|
||||
- **media-svc (порт 3016):** images + videos — LLM rephrase, SearXNG/search-svc; api-gateway проксирует /api/images, /api/videos
|
||||
- **suggestions-svc (порт 3017):** AI follow-up suggestions; api-gateway проксирует /api/suggestions
|
||||
- **master-agents-svc (порт 3018):** Master Agent — адаптируется к задаче, автоматически выбирает инструменты (web_search, scrape_url, calculator, get_stock_quote, image_search)
|
||||
**Проблема:** При создании урока `POST /api/v1/learning/lesson` возвращалась ошибка 500.
|
||||
|
||||
## Сделано (текущая сессия — web-svc только UI)
|
||||
- **web-svc:** удалены папки agents, models, prompts, uploads, utils, config (server) — остался только UI
|
||||
- **chat-svc:** GET/POST config, providers CRUD, models CRUD, POST /api/v1/uploads
|
||||
- **travel-svc:** POST /api/v1/weather (proxy Open-Meteo)
|
||||
- **api-gateway:** маршруты config, providers, uploads, weather
|
||||
- **web-svc:** rewrites config/providers/weather → gateway; uploads — тонкий proxy к chat-svc; layout fetch config с gateway
|
||||
**Причина:** `learning-svc` пытался использовать Timeweb JWT-токен (в переменной `OPENAI_API_KEY`) как ключ OpenAI API. Timeweb JWT имеет формат `eyJ...`, что не является валидным OpenAI ключом.
|
||||
|
||||
## Сделано (текущая сессия)
|
||||
- **chat-svc → memory-svc:** при mode balanced/quality + Authorization — fetch GET /api/v1/memory, инжект memoryContext в writer prompt
|
||||
- **Profile Personalize:** список AI Memory, Add (key+value), Delete; требует auth
|
||||
- **web-svc chat proxy:** передача Authorization в chat-svc
|
||||
- **useChat:** отправка Bearer token при запросе к /api/chat
|
||||
- **My Connectors:** projects-svc GET/POST/DELETE /api/v1/connectors, Proxy, Profile UI (Google Drive, Dropbox coming soon)
|
||||
- **Finance tabs:** Overview, Crypto, Gainers & Losers, Watchlist — finance-svc gainers/losers/crypto, localStorage watchlist
|
||||
- **finance/[ticker] Add to watchlist:** кнопка ★, localStorage gooseek_finance_watchlist
|
||||
- **Background Assistant (Max):** chat-svc POST/GET /api/v1/tasks (stub), web-svc proxy, ingress
|
||||
- **finance-svc price-context:** GET /api/v1/finance/price-context/:ticker — LLM-синтез причины движения (OPENAI_API_KEY), fallback news+quote
|
||||
- **Export thread:** GET /api/v1/library/threads/:id/export?format=pdf|md — web-svc route, данные из SQLite → create-svc
|
||||
- **Navbar Export:** при наличии chatId — использует thread export API
|
||||
- **create-svc POST /create:** table/dashboard — LLM генерация (gpt-4o-mini), image — 501
|
||||
- **Страница /finance/[ticker]:** блок Price movement context (summary или news)
|
||||
- **/metrics:** travel-svc, library-svc, memory-svc, create-svc — gooseek_up gauge; K3s Prometheus аннотации
|
||||
- **Finance heatmap:** страница /finance — блок S&P 500 Sector Heatmap, fetch /api/v1/finance/heatmap
|
||||
- **Finance-svc heatmap:** fetch с FMP api/v3/sector-performance при FMP_API_KEY
|
||||
- **Collections на /finance:** Popular Spaces for Finance Research — fetch /api/v1/collections?category=finance
|
||||
- **deploy/k3s/cache-worker.yaml:** CronJob finance (2m), discover (15m), travel (4h), activeDeadlineSeconds 300/600/1200
|
||||
- **finance-svc:** fetchWithRetry для FMP API (3 попытки, backoff 500/1000/1500 ms)
|
||||
- **docs/RUNBOOK.md:** Runbook оператора — health, Redis, cache-worker, типичные сбои, порты
|
||||
- **Pro/Deep Search:** AssistantSteps — оценка времени ~30–90 sec
|
||||
- **K3s Prometheus:** аннотации prometheus.io/scrape, port, path в chat, search, discover, finance
|
||||
- **CORS:** ALLOWED_ORIGINS в chat-svc, search-svc, discover-svc, finance-svc
|
||||
- **Медиа:** SearchImages, SearchVideos — timeout 15s, error + Retry
|
||||
- **Prometheus /metrics:** chat-svc, search-svc, discover-svc, finance-svc (gooseek_up gauge)
|
||||
- **UI/UX:** DataFetchError + Retry; timeout 15s + Retry для Discover, Finance, Travel
|
||||
- **File upload:** Cancel, timeout 300s, error handling в Attach и AttachSmall
|
||||
- **HPA:** travel-svc, memory-svc добавлены в hpa.yaml
|
||||
- **GuestWarningBanner:** предупреждение гостям, beforeunload, CTA «Save to account»
|
||||
- **Rate limit 429:** toast в useChat при 429
|
||||
- **/finance/predictions/[id]:** finance-svc stub API, страница (Polymarket coming soon)
|
||||
- **deploy/k3s/hpa.yaml:** HPA для chat, search, discover, finance, travel, memory; PDB для chat, search
|
||||
- **/spaces/templates:** projects-svc GET /api/v1/templates, страница, прокси, ingress
|
||||
- **Health/ready probes:** web-svc `/api/health`, `/api/ready`; chat-svc `/ready`; K3s chat-svc readinessProbe → `/ready`
|
||||
- **PWA:** @ducanh2912/next-pwa, Service worker (sw.js), offline fallback `/offline`, метаданные в layout, `next build --webpack`
|
||||
- **Исправлен TS:** finance/[ticker] quote.high/quote.low optional
|
||||
- **finance-svc:** GET /api/v1/finance/quote/:ticker (FMP quote)
|
||||
- **Страница /finance/[ticker]:** котировка, новости, SEC filings
|
||||
- **Страница /spaces:** список коллекций
|
||||
- **Страница /collections/[id]:** детали коллекции
|
||||
- **Sidebar:** Spaces, переводы nav.spaces
|
||||
- **Удалён deprecated /api/discover** — дублировал discover-svc
|
||||
- **Ghost** — опционально для Discover (topic=gooseek), см. docs
|
||||
- **deploy/k3s:** search-svc.yaml, notifications-svc.yaml, auth-svc.yaml
|
||||
- **Ingress:** /api/v1/search, /api/v1/notifications
|
||||
- **discover-svc:** GHOST_URL, GHOST_CONTENT_API_KEY (optional Secret)
|
||||
- **MIGRATION.md:** сборка образов search/auth/notifications
|
||||
**Решение:**
|
||||
|
||||
## Сделано (ранее)
|
||||
- Сервисы: discover, search, finance, travel, chat, memory, create, notifications, billing, auth, library, projects
|
||||
- web-svc: UI + прокси к сервисам
|
||||
- deploy/k3s: манифесты, ingress
|
||||
- apps/ удалён — всё в services/
|
||||
1. **backend/cmd/learning-svc/main.go** — изменена логика инициализации LLM клиента:
|
||||
- Приоритет 1: Timeweb Cloud AI (если `TIMEWEB_AGENT_ACCESS_ID` + `TIMEWEB_API_KEY` установлены)
|
||||
- Приоритет 2: Anthropic (только если ключ не JWT)
|
||||
- Приоритет 3: OpenAI (только если ключ не JWT)
|
||||
- Добавлена функция `isJWT()` для детекции JWT-токенов
|
||||
|
||||
## Сделано (текущая сессия)
|
||||
- **Patents page:** DataFetchError компонент вместо кастомного error div (консистентность с Discover, Finance, Travel)
|
||||
- **Model Council (Max):** параллельный запуск 3 моделей → синтез ответа
|
||||
- chat-svc: modelCouncil, councilModels в body; councilLlms → SearchAgent
|
||||
- SearchAgent: runCouncilWritersAndSynthesis — 3× generateText параллельно, synthesis prompt, stream синтеза
|
||||
- writer.ts: getSynthesisPrompt
|
||||
- web-svc: body schema, proxy, локальный agent с councilLlms
|
||||
- useChat: modelCouncil + councilModels из localStorage (fallback: chatModel × 3)
|
||||
- InputBarPlus: переключатель «Model Council» (Max)
|
||||
2. **backend/deploy/docker/docker-compose.yml** — добавлены env vars для learning-svc:
|
||||
- `TIMEWEB_API_BASE_URL`
|
||||
- `TIMEWEB_AGENT_ACCESS_ID`
|
||||
- `TIMEWEB_API_KEY`
|
||||
- `DEFAULT_LLM_MODEL`
|
||||
|
||||
## Сделано (последнее)
|
||||
- **Input bar «+»:** меню режимов, источников, Learn, Create
|
||||
- Кнопка «+» слева от Optimization — Popover с Mode (Quick/Pro/Deep), Sources (Web/Academic/Social), Step-by-step Learning, Create (подсказка)
|
||||
- InputBarPlus в EmptyChatMessageInput
|
||||
- **Inspiration Cards:** LLM в cache-worker (travel task)
|
||||
- Курируемые темы → gpt-4o-mini → title+summary для 4 карточек
|
||||
- Без OPENAI_API_KEY — fallback stub
|
||||
- Redis travel:inspiration TTL 6h
|
||||
- **create-svc image:** DALL·E 3 генерация изображений
|
||||
- type: 'image' — вызов OpenAI /v1/images/generations (dall-e-3, 1024x1024, standard, vivid)
|
||||
- Ответ: { type, url, b64?, format }
|
||||
- Proxy timeout 120s для image
|
||||
- **Step-by-step Learning:** learningMode в chat
|
||||
- Preferences: switch «Step-by-step Learning» — объяснять пошагово, разбивать сложные концепции
|
||||
- localStorage learningMode → body.learningMode → writer prompt block
|
||||
- chat-svc, web-svc: learningMode в config, SearchAgentConfig, getWriterPrompt
|
||||
- **Response preferences:** format, length, tone в chat
|
||||
- Preferences: Response format (paragraph/bullets/outline), length (short/medium/long), tone (neutral/professional/casual/concise)
|
||||
- localStorage → responsePrefs в body → writer prompt
|
||||
- chat-svc, web-svc: responsePrefs в config и getWriterPrompt
|
||||
- **travel-svc itinerary:** LLM-генерация маршрутов (gpt-4o-mini)
|
||||
- POST /api/v1/travel/itinerary { query, days? } — Redis travel:itinerary:{hash} TTL 4h
|
||||
- TravelStepper Route step: выбор длительности (1–14 дней), fetch itinerary, отображение по дням
|
||||
- **Answer Mode: Travel (и finance, academic, writing):** вертикали ответа в чате
|
||||
- chat-svc, web-svc: `answerMode` в body, SearchAgentConfig
|
||||
- writer: travel/finance-специфичные блоки в системном промпте
|
||||
- AnswerMode UI: селектор Standard | Travel | Finance | Academic | Writing | Focus
|
||||
- URL: `?answerMode=travel` — автовыбор при переходе с /travel (карточки destinations)
|
||||
- **Travel Stepper:** сохранение состояния между шагами (Поиск → Места → Маршрут → Отели → Билеты)
|
||||
- travel-svc: POST/GET `/api/v1/travel/stepper/state`, Redis `travel:stepper:{sessionId}` TTL 24h
|
||||
- TravelStepper компонент: модальное окно, шаги, persist в API + sessionStorage fallback
|
||||
- Кнопка «Plan a trip» на /travel
|
||||
- **NetworkPolicy:** `deploy/k3s/network-policies.yaml` — gooseek-allow-internal (inter-pod traffic)
|
||||
**Результат:**
|
||||
- `POST /api/v1/learning/lesson` → 200 (урок создаётся успешно)
|
||||
- learning-svc использует Timeweb Cloud AI как LLM провайдер
|
||||
|
||||
## Сделано (profile-svc)
|
||||
- **profile-svc (порт 3019):** личные данные и персонализация пользователя
|
||||
- PostgreSQL: user_profiles (userId, displayName, avatarUrl, timezone, locale, profileData, preferences, personalization)
|
||||
- GET/PATCH /api/v1/profile — требует Authorization Bearer
|
||||
- Profile page: редактирование displayName, загрузка из profile-svc
|
||||
- Settings: preferences и personalization сохраняются в profile-svc при auth (синхронизация между устройствами)
|
||||
- api-gateway: маршрут /api/v1/profile → profile-svc
|
||||
- deploy/k3s/profile-svc.yaml, deploy.config.yaml
|
||||
---
|
||||
|
||||
## llm-svc (порт 3020)
|
||||
- **llm-svc:** единый сервис провайдеров и генерации LLM — Ollama, OpenAI, Timeweb, Gemini и др.
|
||||
- API: GET/POST/PATCH/DELETE /api/v1/providers, GET/POST/DELETE /api/v1/providers/:id/models
|
||||
- **Генерация:** POST /api/v1/generate, POST /api/v1/generate/stream, POST /api/v1/generate/object, POST /api/v1/embeddings
|
||||
- GET /api/v1/providers/ui-config — UI-конфиг провайдеров для chat-svc
|
||||
- **chat-svc:** всегда использует llm-svc (LLM_SVC_URL обязателен). LlmClient, EmbeddingClient — HTTP-клиенты.
|
||||
- Папка models удалена из chat-svc — вся генерация через llm-svc.
|
||||
- api-gateway: /api/v1/providers → llm-svc
|
||||
- deploy: llm-svc.yaml, deploy.config.yaml (llm-svc: false по умолчанию)
|
||||
### Исправлены API ошибки 503/404 (27.02.2026)
|
||||
|
||||
## master-agents-svc как единый оркестратор (2025-02)
|
||||
- **master-agents-svc:** SearchOrchestrator — classify → widgets (weather, stock, calculation) → researcher (web_search, academic_search, social_search, scrape_url, done, __reasoning_preamble) → writer. POST /api/v1/agents/search (NDJSON stream).
|
||||
- **Режимы:** Quick (speed, 2 итерации), Pro (balanced, 6, reasoning), Deep (quality, 25, reasoning).
|
||||
- **Параллельные actions:** executeAll использует Promise.all для tool calls.
|
||||
- **Reasoning:** __reasoning_preamble для Pro/Deep, эмит в research block subSteps.
|
||||
- **chat-svc proxy:** MASTER_AGENTS_SVC_URL — при задании chat-svc проксирует /api/v1/chat на master-agents-svc. Model Council при прокси не поддерживается.
|
||||
- **Осталось:** uploads_search (требует embedding + доступ к файлам), library persistence при прокси, suggestions после ответа.
|
||||
**Проблема:** Frontend получал ошибки:
|
||||
- `api/v1/spaces` - 503 Service Unavailable
|
||||
- `api/v1/computer/tasks` - 404 Not Found
|
||||
- `api/v1/computer/execute` - 404 Not Found
|
||||
|
||||
## 2025-02: Search 502, Invalid provider id — исправлено
|
||||
- **SearXNG:** добавлен локальный контейнер в deploy/docker/docker-compose.yml (порт 8080)
|
||||
- **search-svc:** SEARXNG_URL=http://searxng:8080, headers X-Forwarded-For/X-Real-IP для bot detection
|
||||
- **deploy/docker/searxng/:** settings.yml (formats: json, limiter: false), limiter.toml (pass_ip)
|
||||
- **llm-svc:** маппинг providerId 'env' → env-timeweb/env-ollama при envOnlyMode
|
||||
- **useChat:** при envOnlyMode берёт реальный providerId из API (env-timeweb)
|
||||
**Причины:**
|
||||
1. `api-gateway` не имел переменных окружения для новых сервисов (THREAD_SVC_URL, COMPUTER_SVC_URL и др.)
|
||||
2. `computer-svc` падал при попытке использовать "anonymous" как UUID в PostgreSQL
|
||||
|
||||
**Решение:**
|
||||
|
||||
1. **docker-compose.yml** - добавлены env vars в api-gateway:
|
||||
- THREAD_SVC_URL=http://thread-svc:3027
|
||||
- COMPUTER_SVC_URL=http://computer-svc:3030
|
||||
- DISCOVER_SVC_URL=http://discover-svc:3002
|
||||
- FINANCE_HEATMAP_SVC_URL=http://finance-heatmap-svc:3033
|
||||
- LEARNING_SVC_URL=http://learning-svc:3034
|
||||
|
||||
2. **computer-svc/main.go** - исправлена обработка anonymous пользователей:
|
||||
- GET /tasks возвращает пустой список для anonymous
|
||||
- POST /execute возвращает 401 для anonymous
|
||||
|
||||
**Результат:**
|
||||
- `GET /api/v1/spaces` → 401 (требует auth, frontend обрабатывает)
|
||||
- `GET /api/v1/computer/tasks` → 200 (пустой список для anonymous)
|
||||
- `POST /api/v1/computer/execute` → 401 (требует auth)
|
||||
|
||||
---
|
||||
|
||||
### Исправлен баг с пустым ответом в Chat (27.02.2026)
|
||||
|
||||
**Проблема:** При отправке сообщения в UI приходил пустой ответ.
|
||||
|
||||
**Причина:** В `backend/cmd/api-gateway/main.go` функция `handleChat` использовала `defer resp.Body.Close()` до `SetBodyStreamWriter`. Поскольку `SetBodyStreamWriter` выполняется асинхронно, defer закрывал body сразу после return из функции, до того как данные успевали передаться клиенту.
|
||||
|
||||
**Решение:** Перенёс `resp.Body.Close()` внутрь callback `SetBodyStreamWriter`:
|
||||
```go
|
||||
c.Context().SetBodyStreamWriter(func(w *bufio.Writer) {
|
||||
defer resp.Body.Close() // <-- теперь здесь
|
||||
// ... streaming logic
|
||||
})
|
||||
```
|
||||
|
||||
**Файл:** `backend/cmd/api-gateway/main.go`
|
||||
|
||||
---
|
||||
|
||||
### Адаптивность и удаление модалок (27.02.2026)
|
||||
|
||||
**Задача:** Адаптировать под мобильные, убрать Dialog (модалки), сделать отдельные страницы.
|
||||
|
||||
**Сделано:**
|
||||
|
||||
1. **Мобильный Sidebar** (`layout.tsx`, `Sidebar.tsx`):
|
||||
- На мобильных (<768px) sidebar скрыт, есть гамбургер-меню
|
||||
- Появляется mobile header с кнопкой меню
|
||||
- Sidebar открывается как overlay с анимацией
|
||||
- Автозакрытие при навигации
|
||||
|
||||
2. **Удалены все Dialog/модальные окна:**
|
||||
- `spaces/page.tsx` — убран Dialog для создания/редактирования
|
||||
- `learning/page.tsx` — убран Dialog для создания урока
|
||||
|
||||
3. **Созданы отдельные страницы вместо модалок:**
|
||||
- `/spaces/new` — создание пространства
|
||||
- `/spaces/[id]/edit` — редактирование пространства
|
||||
- `/learning/new` — создание урока
|
||||
|
||||
4. **Адаптивность всех страниц:**
|
||||
- `/` — responsive grid для suggestions, адаптивные padding/размеры
|
||||
- `/discover` — горизонтальный скролл табов, адаптивные карточки
|
||||
- `/history` — адаптивные padding, видимые кнопки действий на мобильных
|
||||
- `/spaces` — адаптивные карточки, dropdown всегда видим на мобильных
|
||||
- `/finance` — адаптивный time range, компактные StockRow
|
||||
- `/learning` — адаптивные stats cards, уроки
|
||||
- `/settings` — компактные селекторы, toggle switches
|
||||
- `/computer` — мобильная панель задач, адаптивные примеры
|
||||
|
||||
5. **Общие улучшения:**
|
||||
- `h-[100dvh]` вместо `h-screen` для лучшей работы на iOS
|
||||
- Overflow-x-auto для табов с горизонтальной прокруткой
|
||||
- Адаптивные padding: `px-4 sm:px-6`, `py-6 sm:py-8`
|
||||
- Адаптивные размеры текста: `text-xl sm:text-2xl`
|
||||
- Видимость кнопок на мобильных (без hover-only)
|
||||
|
||||
---
|
||||
|
||||
### Редизайн WebUI в стиле Cursor IDE 2026 (27.02.2026)
|
||||
|
||||
**Задача:** Редизайн backend/webui в стиле Cursor IDE 2026 — современная тёмная тема с индиговыми акцентами.
|
||||
|
||||
**Сделано:**
|
||||
|
||||
1. **Глобальные стили** (`globals.css`):
|
||||
- Новая цветовая палитра: base/elevated/surface/overlay для фонов
|
||||
- Текст: primary/secondary/muted/faint (zinc-based)
|
||||
- Акценты: indigo (accent) + cyan (accent-secondary)
|
||||
- CSS переменные для всех цветов
|
||||
- JetBrains Mono для кода
|
||||
- Классы: .btn-primary, .btn-primary-solid, .btn-secondary, .btn-ghost, .btn-icon
|
||||
- .nav-item, .nav-item-active, .card, .card-interactive, .glass-card, .surface-card
|
||||
- .badge, .badge-accent, .badge-success, .badge-warning, .badge-error
|
||||
- Анимации: fade-in, fade-in-up, slide-in-right, slide-in-left, scale-in, glow-pulse
|
||||
|
||||
2. **Tailwind Config** (`tailwind.config.ts`):
|
||||
- Semantic colors: base, elevated, surface, overlay, primary, secondary, muted, faint
|
||||
- accent с оттенками: DEFAULT, hover, muted, subtle
|
||||
- border с оттенками: DEFAULT, hover, focus
|
||||
- success, warning, error с muted вариантами
|
||||
- Кастомные тени: glow-sm/md/lg, elevated, card, dropdown
|
||||
- Расширенные анимации
|
||||
|
||||
3. **Компоненты** (Cursor-style):
|
||||
- `Sidebar.tsx` — минималистичный с индиговыми акцентами, collapsible
|
||||
- `ChatInput.tsx` — современный инпут с glow эффектом, ArrowUp кнопка отправки
|
||||
- `ChatMessage.tsx` — чистый рендер, индиговые цитаты и код
|
||||
- `DiscoverCard.tsx` — карточки с цветными иконками
|
||||
|
||||
4. **Страницы** (все обновлены и адаптированы):
|
||||
- `/` — главная с suggestions grid
|
||||
- `/discover` — лента новостей
|
||||
- `/history` — история поиска
|
||||
- `/spaces` — пространства (+ /new, /[id]/edit)
|
||||
- `/finance` — котировки
|
||||
- `/learning` — уроки (+ /new)
|
||||
- `/settings` — настройки
|
||||
- `/computer` — Computer page
|
||||
|
||||
**Цветовая схема (Cursor IDE 2026):**
|
||||
- Background: base (#0a0a0c) → elevated (#121217) → surface (#1a1a1f)
|
||||
- Text: primary (#e9e9eb) → secondary (#a8a8af) → muted (#6b6b75) → faint (#4a4a54)
|
||||
- Accent: indigo (#818cf8) — основной акцент
|
||||
- Accent Secondary: cyan (#22d3ee) — дополнительный
|
||||
- Borders: #26262e → #32323d (hover)
|
||||
- Success: green (#22c55e)
|
||||
- Error: red (#ef4444)
|
||||
- Warning: amber (#f59e0b)
|
||||
|
||||
---
|
||||
|
||||
### Интеграция Frontend с Backend (27.02.2026)
|
||||
|
||||
**Задача:** Подключить backend к frontend в `backend/webui/`, убрать моковые данные.
|
||||
|
||||
**Сделано:**
|
||||
|
||||
1. **API Gateway обновлён** (`backend/cmd/api-gateway/main.go`):
|
||||
- Добавлен роутинг для threads, spaces, pages, share → thread-svc
|
||||
- Добавлен роутинг для discover → discover-svc
|
||||
- Добавлен роутинг для heatmap, movers, markets → finance-heatmap-svc
|
||||
- Добавлен роутинг для learning → learning-svc
|
||||
|
||||
2. **Config обновлён** (`backend/pkg/config/config.go`):
|
||||
- Добавлены FinanceHeatmapURL, LearningSvcURL
|
||||
|
||||
3. **Frontend Types** (`backend/webui/src/lib/types.ts`):
|
||||
- Добавлены Thread, ThreadMessage, ThreadSource
|
||||
- Добавлены FinanceStock, HeatmapData, HeatmapSector, TopMovers, FinanceMarket
|
||||
- Добавлены Lesson, LessonProgress, LessonStep, CodeExample, QuizQuestion, PracticeExercise
|
||||
|
||||
4. **Frontend API** (`backend/webui/src/lib/api.ts`):
|
||||
- `fetchThreads()`, `fetchThread()`, `createThread()`, `deleteThread()`, `shareThread()`
|
||||
- `fetchSpaces()`, `fetchSpace()`, `createSpace()`, `updateSpace()`, `deleteSpace()`
|
||||
- `fetchMarkets()`, `fetchHeatmap()`, `fetchTopMovers()`
|
||||
- `fetchLessons()`, `fetchLesson()`, `createLesson()`, `completeStep()`, `submitQuizAnswer()`, `deleteLesson()`
|
||||
- Добавлен `getAuthHeaders()` для JWT авторизации
|
||||
|
||||
5. **History Page** (`backend/webui/src/app/(main)/history/page.tsx`):
|
||||
- Загрузка из threads API
|
||||
- Удаление тредов
|
||||
- Шаринг тредов
|
||||
- Группировка по датам
|
||||
- Поиск
|
||||
|
||||
6. **Spaces Page** (`backend/webui/src/app/(main)/spaces/page.tsx`):
|
||||
- Загрузка из spaces API
|
||||
- Создание/редактирование/удаление пространств
|
||||
- Выбор focus mode
|
||||
- Кастомные AI инструкции
|
||||
|
||||
7. **Finance Page** (`backend/webui/src/app/(main)/finance/page.tsx`):
|
||||
- Загрузка рынков из API
|
||||
- Heatmap данные по секторам
|
||||
- Top movers (gainers/losers/most active)
|
||||
- Переключение timeRange (1d/1w/1m/3m/1y)
|
||||
|
||||
8. **Learning Page** (`backend/webui/src/app/(main)/learning/page.tsx`):
|
||||
- Загрузка уроков из API
|
||||
- Создание уроков с выбором сложности и режима
|
||||
- Отображение прогресса
|
||||
- Удаление уроков
|
||||
|
||||
---
|
||||
|
||||
### Новые функции (добавлено в этой сессии):
|
||||
|
||||
#### 0. WebUI — Интерфейс бэкенда (Perplexity-style)
|
||||
- **Папка**: `backend/webui/`
|
||||
- **Технологии**: Next.js 14, React 18, Tailwind CSS, TypeScript
|
||||
- **Цветовая схема**: Глубокий синий (#0a1929) + золотистые акценты (#d4a373)
|
||||
- **Порт**: 3000
|
||||
- **Страницы**:
|
||||
- `/` — Главная страница с чатом и подсказками
|
||||
- `/discover` — Лента новостей с AI-саммари
|
||||
- `/spaces` — Пространства (workspaces) для организации исследований
|
||||
- `/history` — История поисков
|
||||
- `/finance` — Котировки MOEX, крипто, валюты
|
||||
- `/learning` — Интерактивные курсы с AI-наставником
|
||||
- `/settings` — Настройки (тема, язык, приватность)
|
||||
- **Компоненты**:
|
||||
- `Sidebar` — Навигация с коллапсом
|
||||
- `ChatInput` — Ввод с режимами (speed/balanced/quality)
|
||||
- `ChatMessage` — Рендер markdown + citations
|
||||
- `Citation` — Hover preview источников
|
||||
- `DiscoverCard` — Карточки новостей (large/medium/small)
|
||||
- **Docker**: `backend/webui/Dockerfile`, добавлен в `docker-compose.yml`
|
||||
- **Запуск**: `cd backend/webui && npm run dev` или через Docker
|
||||
|
||||
#### 1. Computer с долгосрочными задачами (Perplexity-style)
|
||||
- **Файлы**: `backend/internal/computer/types.go`, `backend/internal/computer/computer.go`
|
||||
- **Duration Modes**: Short (30 мин), Medium (4 часа), Long (24 часа), Extended (7 дней), Unlimited (365 дней)
|
||||
- **Checkpoints**: автоматическое сохранение состояния для возобновления задач
|
||||
- **Heartbeat**: периодические уведомления о статусе
|
||||
- **Resource Limits**: контроль CPU, памяти, бюджета
|
||||
|
||||
#### 2. Browser Automation через Playwright
|
||||
- **Файлы**: `backend/internal/computer/browser/browser.go`, `backend/internal/computer/browser/server.go`
|
||||
- **Действия**: navigate, click, type, fill, screenshot, scroll, evaluate, PDF, extract text/HTML
|
||||
- **Session management**: пул сессий, автоочистка, управление viewport
|
||||
- **Сервис**: browser-svc (порт 3050)
|
||||
|
||||
#### 3. Персонализация Discover — "For You" feed
|
||||
- **Файлы**: `backend/internal/discover/personalization.go`, `backend/internal/db/user_interests_repo.go`
|
||||
- **User Interests**: topics, sources, keywords с decay-механизмом
|
||||
- **Feed Algorithm**: relevance scoring, diversity, recency, trending boost
|
||||
- **Blocking**: блокировка источников и тем
|
||||
- **Custom Categories**: пользовательские категории с ключевыми словами
|
||||
|
||||
#### 4. Labs Service — интерактивные отчёты
|
||||
- **Файлы**: `backend/internal/labs/types.go`, `backend/internal/labs/generator.go`, `backend/cmd/labs-svc/main.go`
|
||||
- **Визуализации**: bar/line/pie/donut charts, tables, stat cards, KPI, heatmap, timeline, comparison
|
||||
- **UI-элементы**: tabs, accordion, collapsible, stepper, code blocks, markdown
|
||||
- **API**: генерация отчётов, экспорт в HTML/JSON
|
||||
- **Сервис**: labs-svc (порт 3031)
|
||||
|
||||
#### 5. Finance Heatmaps
|
||||
- **Файлы**: `backend/internal/finance/heatmap.go`, `backend/cmd/finance-heatmap-svc/main.go`
|
||||
- **Markets**: S&P 500, NASDAQ, Dow Jones, MOEX, Crypto, Forex
|
||||
- **Views**: treemap, grid
|
||||
- **Data**: sectors, tickers, top movers (gainers/losers/most active)
|
||||
- **Colorscale**: красно-зелёная шкала по изменению цены
|
||||
- **Сервис**: finance-heatmap-svc (порт 3033)
|
||||
|
||||
#### 6. Step-by-step Learning Mode
|
||||
- **Файлы**: `backend/internal/learning/stepper.go`, `backend/cmd/learning-svc/main.go`
|
||||
- **Modes**: explain, guided, interactive, practice, quiz
|
||||
- **Difficulty**: beginner, intermediate, advanced, expert
|
||||
- **Content**: explanations, code, visualizations, quiz questions, practice exercises
|
||||
- **Progress tracking**: step completion, score, time spent
|
||||
- **Сервис**: learning-svc (порт 3034)
|
||||
|
||||
#### 7. Discover Daily Podcast Generation
|
||||
- **Файлы**: `backend/internal/podcast/generator.go`, `backend/cmd/podcast-svc/main.go`
|
||||
- **Types**: daily, weekly, topic_deep, breaking
|
||||
- **Script Generation**: intro, news segments, analysis, outro
|
||||
- **TTS Integration**: ElevenLabs API для генерации аудио
|
||||
- **RSS Feed**: автоматическая генерация RSS для подкаст-платформ
|
||||
- **Сервис**: podcast-svc (порт 3032)
|
||||
|
||||
### Все 21 сервис:
|
||||
- postgres, redis, searxng, crawl4ai (инфраструктура)
|
||||
- search-svc (3001) ✅
|
||||
- discover-svc (3002) ✅
|
||||
- chat-svc (3005) ✅
|
||||
- api-gateway (3015) ✅
|
||||
- agent-svc (3018) ✅
|
||||
- llm-svc (3020) ✅
|
||||
- scraper-svc (3021) ✅
|
||||
- collection-svc (3025) ✅
|
||||
- file-svc (3026) ✅
|
||||
- thread-svc (3027) ✅
|
||||
- computer-svc (3030) ✅
|
||||
- **browser-svc (3050) ✅ NEW**
|
||||
- **labs-svc (3031) ✅ NEW**
|
||||
- **podcast-svc (3032) ✅ NEW**
|
||||
- **finance-heatmap-svc (3033) ✅ NEW**
|
||||
- **learning-svc (3034) ✅ NEW**
|
||||
|
||||
---
|
||||
|
||||
## Задача (исходный запрос)
|
||||
Система виджетов в стиле Perplexity для российского рынка: карточки товаров/видео/профилей/промокодов, Knowledge Cards, улучшенные citations, sources panel, image/video gallery + интеграция с Яндекс, Рутуб, ВКонтакте.
|
||||
|
||||
## Сделано (ВСЁ ЗАВЕРШЕНО)
|
||||
|
||||
### 1. SearXNG — Российские engines
|
||||
- **Файл**: `deploy/docker/searxng/settings.yml`
|
||||
- Добавлены: yandex, yandex images, yandex videos, yandex news, yandex music
|
||||
- Добавлены: vk (через xpath), rutube (через json_engine), dzen
|
||||
- Добавлены: youtube, aliexpress
|
||||
|
||||
### 2. Типы данных виджетов (Backend)
|
||||
- **Файл**: `services/master-agents-svc/src/lib/types/widgets.ts`
|
||||
- ProductData, VideoData, ProfileData, PromoData
|
||||
- ImageData, KnowledgeCardData (comparison_table, charts, timeline, quote, definition)
|
||||
- SourceData, ClassifiedResult
|
||||
- Вспомогательные функции: formatPrice, formatViews, formatDuration, formatFollowers
|
||||
|
||||
### 3. Content Classifier (Backend)
|
||||
- **Файл**: `services/master-agents-svc/src/lib/content-classifier.ts`
|
||||
- Определение типа по URL паттернам (товары, видео, профили, промокоды)
|
||||
- Определение платформы (yandex, vk, rutube, ozon, wildberries и др.)
|
||||
- Классификация по ключевым словам в запросе
|
||||
- Функции: classifySearchResult, groupResultsByType, detectKnowledgeCardType
|
||||
|
||||
### 4. UI Компоненты (Frontend)
|
||||
|
||||
#### Улучшенный Citation
|
||||
- **Файл**: `services/web-svc/src/components/MessageRenderer/Citation.tsx`
|
||||
- Расширенный hover preview с заголовком, описанием, favicon
|
||||
- Иконки платформ (Яндекс, VK, Rutube, YouTube и др.)
|
||||
- Улучшенный дизайн badges
|
||||
|
||||
#### UnifiedCard (базовая карточка)
|
||||
- **Файл**: `services/web-svc/src/components/Widgets/UnifiedCard.tsx`
|
||||
- Универсальный компонент для всех типов карточек
|
||||
- Поддержка compact/horizontal режимов
|
||||
- Badges, meta, actions
|
||||
|
||||
#### ProductCard (товары)
|
||||
- **Файл**: `services/web-svc/src/components/Widgets/ProductCard.tsx`
|
||||
- Цена, скидка, старая цена
|
||||
- Рейтинг со звёздами, отзывы
|
||||
- Маркетплейс (Ozon, WB, AliExpress, Яндекс Маркет)
|
||||
- Наличие, доставка, badges
|
||||
|
||||
#### VideoCard (видео)
|
||||
- **Файл**: `services/web-svc/src/components/Widgets/VideoCard.tsx`
|
||||
- Thumbnail с длительностью
|
||||
- Автор, views, likes
|
||||
- Платформа (Rutube, VK, YouTube, Дзен)
|
||||
- Horizontal и compact режимы
|
||||
|
||||
#### ProfileCard (профили)
|
||||
- **Файл**: `services/web-svc/src/components/Widgets/ProfileCard.tsx`
|
||||
- Аватар, имя, username
|
||||
- Verified badge, online статус
|
||||
- Followers/following
|
||||
- Платформа (VK, Telegram, YouTube, Дзен)
|
||||
|
||||
#### PromoCard (промокоды)
|
||||
- **Файл**: `services/web-svc/src/components/Widgets/PromoCard.tsx`
|
||||
- Код с кнопкой копирования
|
||||
- Скидка, магазин, логотип
|
||||
- Срок действия, условия
|
||||
- Verified badge
|
||||
|
||||
#### CardGallery (карусель)
|
||||
- **Файл**: `services/web-svc/src/components/Widgets/CardGallery.tsx`
|
||||
- Горизонтальный скролл с навигацией
|
||||
- Поддержка всех типов карточек
|
||||
- Индикаторы, gradient fade
|
||||
|
||||
#### KnowledgeCard (Tako-style)
|
||||
- **Файл**: `services/web-svc/src/components/Widgets/KnowledgeCard.tsx`
|
||||
- Сравнительные таблицы
|
||||
- Bar chart, Pie chart
|
||||
- Stat cards с изменениями (+/-)
|
||||
- Timeline
|
||||
- Quote, Definition
|
||||
|
||||
#### InlineImageGallery
|
||||
- **Файл**: `services/web-svc/src/components/Widgets/InlineImageGallery.tsx`
|
||||
- Grid, carousel, masonry layouts
|
||||
- Lightbox с навигацией
|
||||
- Lazy loading, источники
|
||||
|
||||
#### VideoEmbed
|
||||
- **Файл**: `services/web-svc/src/components/Widgets/VideoEmbed.tsx`
|
||||
- Embed для YouTube, Rutube
|
||||
- Play preview для VK, Дзен
|
||||
- Метаданные: views, likes, автор
|
||||
|
||||
#### SourcesPanel
|
||||
- **Файл**: `services/web-svc/src/components/SourcesPanel.tsx`
|
||||
- Expand/collapse
|
||||
- Группировка по домену
|
||||
- Поиск по источникам
|
||||
- Favicon, snippets
|
||||
|
||||
#### RelatedQuestions
|
||||
- **Файл**: `services/web-svc/src/components/RelatedQuestions.tsx`
|
||||
- 3 стиля: inline, panel, chips
|
||||
- Expand/collapse
|
||||
- Иконки, анимации
|
||||
|
||||
### 5. Renderer обновлён
|
||||
- **Файл**: `services/web-svc/src/components/Widgets/Renderer.tsx`
|
||||
- Все новые типы виджетов: products, videos, profiles, promos
|
||||
- knowledge_card, image_gallery, video_embed
|
||||
- Одиночные карточки: product, video, profile, promo
|
||||
|
||||
### 6. Синхронный медиа-поиск (images/videos)
|
||||
- **Файл**: `services/master-agents-svc/src/lib/media-search.ts`
|
||||
- Создан модуль синхронного поиска через SearXNG (без LLM)
|
||||
- Функции `searchImages()`, `searchVideos()`, `searchMedia()`
|
||||
- Автодетект платформы видео (YouTube, Rutube, VK, Дзен)
|
||||
|
||||
### 7. Интеграция медиа в searchOrchestrator
|
||||
- **Файл**: `services/master-agents-svc/src/lib/agent/searchOrchestrator.ts`
|
||||
- Добавлен `mediaPromise` параллельно с `widgetPromise` и `searchPromise`
|
||||
- Эмит виджетов `image_gallery` (carousel) и `videos` (CardGallery)
|
||||
- Медиа загружается одновременно с research
|
||||
|
||||
### 8. Backend: Интеграция парсинга и эмиссии виджетов (ГОТОВО)
|
||||
- **Файл**: `services/master-agents-svc/src/lib/searxng.ts`
|
||||
- Расширены типы SearxngSearchResult (thumbnail, views, price, duration, author)
|
||||
- Добавлена функция categorizeResult для автоопределения типа контента
|
||||
|
||||
- **Файл**: `services/master-agents-svc/src/lib/agent/researcher.ts`
|
||||
- Интегрирован ContentClassifier
|
||||
- Классификация результатов по типам (products, videos, profiles, promos, images)
|
||||
- Автоматическая эмиссия WidgetBlock для каждого типа контента
|
||||
- Эвристика для KnowledgeCard (comparison_table, stat_card)
|
||||
|
||||
### 9. Frontend: Типы для Widget (ГОТОВО)
|
||||
- **Файл**: `services/web-svc/src/lib/types.ts`
|
||||
- Добавлен WidgetType union type со всеми типами виджетов
|
||||
- Типизированы params
|
||||
|
||||
- **Файл**: `services/web-svc/src/components/ChatWindow.tsx`
|
||||
- Расширен интерфейс Widget новыми типами
|
||||
|
||||
### 10. Улучшение ReasoningSteps (ГОТОВО)
|
||||
- **Файл**: `services/web-svc/src/components/AssistantSteps.tsx`
|
||||
- Progress bar с процентами
|
||||
- Таймер времени выполнения
|
||||
- CheckCircle2 при завершении
|
||||
- Loader2 spinner во время работы
|
||||
- Улучшенная визуализация состояний
|
||||
|
||||
## Осталось сделать
|
||||
|
||||
### Go Backend (НОВОЕ)
|
||||
Создан бэкенд на Go в `backend/` — альтернатива TypeScript сервисам для продакшена.
|
||||
|
||||
**Структура:**
|
||||
```
|
||||
backend/
|
||||
├── cmd/ # Точки входа (9 сервисов)
|
||||
│ ├── api-gateway/ # HTTP proxy + routing (port 3015)
|
||||
│ ├── chat-svc/ # Chat orchestration (port 3005)
|
||||
│ ├── agent-svc/ # AI Agent / Search Orchestrator (port 3018)
|
||||
│ ├── search-svc/ # SearXNG wrapper (port 3001)
|
||||
│ ├── llm-svc/ # LLM providers (port 3020)
|
||||
│ ├── scraper-svc/ # Web scraping (port 3021)
|
||||
│ ├── discover-svc/ # Perplexity Discover (port 3002)
|
||||
│ ├── collection-svc/ # Collections API (port 3025)
|
||||
│ └── file-svc/ # File upload & analysis (port 3026)
|
||||
├── internal/
|
||||
│ ├── agent/ # Orchestrator, Classifier, Researcher, DeepResearch, FocusModes
|
||||
│ ├── db/ # PostgreSQL repos (digest, article_summary, collection, file)
|
||||
│ ├── files/ # File analyzer (PDF, images)
|
||||
│ ├── llm/ # OpenAI, Anthropic, Gemini clients
|
||||
│ ├── search/ # SearXNG, Media, BM25 Reranker
|
||||
│ ├── session/ # Session manager + events
|
||||
│ ├── prompts/ # LLM prompts
|
||||
│ └── types/ # Blocks, Chunks, Widgets
|
||||
├── pkg/
|
||||
│ ├── config/ # Configuration
|
||||
│ ├── ndjson/ # NDJSON streaming
|
||||
│ ├── cache/ # Redis кэширование
|
||||
│ └── middleware/ # Auth, RateLimit, Logging, JWT
|
||||
└── deploy/
|
||||
├── docker/ # Dockerfiles + docker-compose
|
||||
└── k8s/ # Kubernetes manifests
|
||||
```
|
||||
|
||||
**Для запуска:**
|
||||
```bash
|
||||
cd backend
|
||||
make deps
|
||||
make build
|
||||
make dev # или docker-compose
|
||||
```
|
||||
|
||||
**Добавлено (Perplexity-style Article Summary):**
|
||||
- `fetchPreGeneratedDigest()` — проверка готового дайджеста из discover-svc
|
||||
- `preScrapeArticleURL()` — параллельный скрейпинг через Crawl4AI
|
||||
- Обработка `Summary: <url>` запросов как в Perplexity Discover
|
||||
- Writer prompt для article digest (структура, follow-up вопросы)
|
||||
- Researcher prompt для поиска related sources
|
||||
|
||||
**Добавлено (26.02.2026):**
|
||||
- `discover-svc` на Go (port 3002) — полный функционал Perplexity Discover
|
||||
- Redis кэширование article summaries (`pkg/cache/redis.go`)
|
||||
- Сохранение саммари в discover-svc после генерации из chat-svc
|
||||
- Article summary flow: chat-svc -> agent-svc -> discover-svc
|
||||
|
||||
**Добавлено (26.02.2026 - Perplexity Parity):**
|
||||
- PostgreSQL персистентность (`internal/db/`) — digests, article_summaries, collections, files
|
||||
- Redis-based rate limiting (`pkg/middleware/ratelimit_redis.go`)
|
||||
- JWT валидация токенов (`pkg/middleware/jwt.go`)
|
||||
- Focus Modes (`internal/agent/focus_modes.go`) — Academic, YouTube, Reddit, Code, News, Math, Finance
|
||||
- Deep Research (`internal/agent/deep_research.go`) — multi-agent, 30+ searches, insights synthesis
|
||||
- Collections service (`cmd/collection-svc/`) — saved research projects
|
||||
- File service (`cmd/file-svc/`) — PDF/image upload & analysis
|
||||
|
||||
**Добавлено (26.02.2026 - Full Perplexity Feature Parity):**
|
||||
- Thread service (`cmd/thread-svc/`) — Threads, Spaces, Memory, Pages (port 3027)
|
||||
- **Threads** — сохранение истории чатов, sharing по публичной ссылке
|
||||
- **Spaces** — workspaces с custom AI instructions, default focus mode
|
||||
- **Pages** — генерация статей из threads (`internal/pages/generator.go`)
|
||||
- **Memory** — персонализация (preferences, facts, instructions, interests)
|
||||
- Clarifying Questions — уточняющие вопросы перед Pro Search (Quality mode)
|
||||
- Related Questions — связанные вопросы после ответа
|
||||
- Enhanced Context — buildEnhancedContext() объединяет User Memory + Collection + Files
|
||||
- runDeepResearchMode() — интеграция Deep Research в orchestrator
|
||||
- DB repositories: `internal/db/thread_repo.go`, `space_repo.go`, `memory_repo.go`, `page_repo.go`
|
||||
|
||||
**TODO для Go бэкенда:**
|
||||
1. [ ] Тестирование интеграции с web-svc
|
||||
2. [x] Добавить Redis кэширование ответов
|
||||
3. [x] Добавить сохранение саммари в discover-svc после генерации
|
||||
4. [ ] Unit тесты
|
||||
5. [x] K8s манифесты для Go сервисов (`backend/deploy/k8s/`)
|
||||
6. [x] PostgreSQL персистентность
|
||||
7. [x] Focus Modes (Perplexity-style)
|
||||
8. [x] Deep Research (multi-agent)
|
||||
9. [x] Collections API
|
||||
10. [x] File Analysis (PDF, images)
|
||||
11. [x] Thread History (chat persistence)
|
||||
12. [x] Spaces (workspaces)
|
||||
13. [x] Pages (article generation)
|
||||
14. [x] Memory (personalization)
|
||||
15. [x] Clarifying Questions
|
||||
16. [x] Related Questions
|
||||
17. [x] Sharing (public links)
|
||||
18. [x] **GooSeek Computer** (Perplexity Computer аналог)
|
||||
|
||||
### GooSeek Computer — Perplexity Computer Clone (26.02.2026)
|
||||
|
||||
**Новый сервис:** `cmd/computer-svc/main.go` (port 3030)
|
||||
|
||||
Автономная платформа для долгосрочных задач — аналог Perplexity Computer.
|
||||
|
||||
**Архитектура:**
|
||||
```
|
||||
backend/internal/computer/
|
||||
├── types.go # ComputerTask, SubTask, Artifact, Schedule, Memory
|
||||
├── computer.go # Главный оркестратор + EventBus
|
||||
├── planner.go # AI планировщик задач
|
||||
├── router.go # Роутинг на нужную модель
|
||||
├── executor.go # Исполнение задач (research, code, deploy, report...)
|
||||
├── sandbox.go # Docker sandbox для исполнения кода
|
||||
├── scheduler.go # Планировщик (cron, interval, once, daily, weekly)
|
||||
├── memory.go # Персистентная память пользователя
|
||||
└── connectors/ # Внешние интеграции
|
||||
├── connector.go # Интерфейс коннектора
|
||||
├── email.go # SMTP отправка
|
||||
├── telegram.go # Telegram Bot API
|
||||
├── webhook.go # HTTP webhooks
|
||||
└── storage.go # S3/MinIO хранилище
|
||||
```
|
||||
|
||||
**Model Registry:** `internal/llm/registry.go`
|
||||
- Capabilities: reasoning, coding, search, creative, fast, long_context, vision, math
|
||||
- Роутинг задач на оптимальную модель (Claude для reasoning, Gemini для research, GPT для fast)
|
||||
|
||||
**DB Repositories:**
|
||||
- `internal/db/computer_task_repo.go` — задачи
|
||||
- `internal/db/computer_memory_repo.go` — память
|
||||
- `internal/db/computer_artifact_repo.go` — артефакты (код, отчёты, файлы)
|
||||
|
||||
**API Endpoints:**
|
||||
- `POST /api/v1/computer/execute` — запуск задачи
|
||||
- `GET /api/v1/computer/tasks` — список задач пользователя
|
||||
- `GET /api/v1/computer/tasks/:id` — статус задачи
|
||||
- `GET /api/v1/computer/tasks/:id/stream` — SSE стрим событий
|
||||
- `POST /api/v1/computer/tasks/:id/resume` — продолжить с user input
|
||||
- `DELETE /api/v1/computer/tasks/:id` — отмена
|
||||
- `GET /api/v1/computer/tasks/:id/artifacts` — артефакты
|
||||
- `GET /api/v1/computer/models` — доступные модели
|
||||
- `GET /api/v1/computer/connectors` — доступные интеграции
|
||||
- `POST /api/v1/computer/connectors/:id/execute` — выполнить action
|
||||
|
||||
**Типы задач:**
|
||||
- `research` — веб-исследование, сбор данных
|
||||
- `code` — генерация кода
|
||||
- `analysis` — анализ данных
|
||||
- `design` — проектирование архитектуры
|
||||
- `deploy` — запуск кода в sandbox
|
||||
- `report` — генерация отчётов
|
||||
- `communicate` — отправка email/telegram
|
||||
- `transform` — преобразование данных
|
||||
- `validate` — валидация результатов
|
||||
|
||||
**Планирование:**
|
||||
- `cron` — cron-выражения
|
||||
- `interval` — каждые N секунд
|
||||
- `once` — одноразовый запуск
|
||||
- `daily/hourly/weekly/monthly` — preset'ы
|
||||
|
||||
**Пример использования:**
|
||||
```json
|
||||
POST /api/v1/computer/execute
|
||||
{
|
||||
"userId": "user-123",
|
||||
"query": "Мониторь курс доллара каждый час и отправляй мне в Telegram если изменение > 1%",
|
||||
"options": {
|
||||
"async": true,
|
||||
"schedule": { "type": "hourly" }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Нет критичных задач - система работает стабильно.
|
||||
|
||||
### GooSeek Computer UI (27.02.2026)
|
||||
|
||||
**Задача:** Создать UI для Computer в стиле Perplexity Computer.
|
||||
|
||||
**Сделано:**
|
||||
|
||||
1. **Типы** (`backend/webui/src/lib/types.ts`):
|
||||
- ComputerTask, ComputerTaskStatus, DurationMode, TaskPriority
|
||||
- TaskPlan, SubTask, Artifact, Checkpoint
|
||||
- ComputerSchedule, ResourceLimits
|
||||
- ComputerTaskEvent, ComputerExecuteRequest
|
||||
- ComputerModel, ComputerConnector
|
||||
|
||||
2. **API функции** (`backend/webui/src/lib/api.ts`):
|
||||
- `executeComputerTask()` — запуск задачи
|
||||
- `fetchComputerTasks()` — список задач
|
||||
- `fetchComputerTask()` — статус задачи
|
||||
- `streamComputerTask()` — SSE стрим событий
|
||||
- `resumeComputerTask()` — продолжить с user input
|
||||
- `cancelComputerTask()` — отменить
|
||||
- `fetchComputerArtifacts()` — артефакты
|
||||
- `downloadArtifact()` — скачать артефакт
|
||||
- `fetchComputerModels()` — доступные модели
|
||||
- `fetchComputerConnectors()` — коннекторы
|
||||
- `executeConnectorAction()` — выполнить action
|
||||
|
||||
3. **UI страница** (`backend/webui/src/app/(main)/computer/page.tsx`):
|
||||
- Ввод задачи (textarea с placeholder)
|
||||
- Duration mode selector (short/medium/long/extended/unlimited)
|
||||
- Примеры задач (4 карточки)
|
||||
- Список задач (левая панель)
|
||||
- Детальный просмотр задачи:
|
||||
- Progress bar
|
||||
- Статус с иконками
|
||||
- Подзадачи с прогрессом
|
||||
- События (real-time log)
|
||||
- Артефакты с кнопкой скачивания
|
||||
- Расширенные настройки (коннекторы)
|
||||
|
||||
4. **Навигация** (`backend/webui/src/components/Sidebar.tsx`):
|
||||
- Добавлен Computer в раздел "Инструменты"
|
||||
- Иконка Cpu
|
||||
|
||||
### Оптимизация Speed Mode 2.0 (26.02.2026):
|
||||
|
||||
**Проблема:** Запросы обрабатывались >2 минут из-за 5 последовательных LLM вызовов.
|
||||
|
||||
**Решение — Fast Path для Speed Mode:**
|
||||
1. **Rule-based classifier** — без LLM вызова (`fastClassifier.ts`)
|
||||
2. **Direct SearXNG search** — без researcher loop (без LLM)
|
||||
3. **No scraping** — только сниппеты, без Crawl4AI
|
||||
4. **Parallel execution** — search + media + widgets одновременно
|
||||
5. **Single LLM call** — только Writer для финального ответа
|
||||
|
||||
**Новый файл:** `services/master-agents-svc/src/lib/agent/fastClassifier.ts`
|
||||
|
||||
**Изменённые файлы:**
|
||||
- `services/master-agents-svc/src/lib/agent/searchOrchestrator.ts` — добавлен `runSpeedMode()`
|
||||
- `services/master-agents-svc/src/lib/actions/scrape_url.ts` — отключен для speed mode
|
||||
|
||||
**Ожидаемое время ответа:**
|
||||
- Speed mode: 8-15 сек (было >2 мин)
|
||||
- Balanced mode: 20-40 сек
|
||||
- Quality mode: 60-120 сек
|
||||
|
||||
### Исправлено 26.02.2026:
|
||||
|
||||
1. **SearXNG падал** (ambiguous shortcut errors):
|
||||
- Файл: `deploy/docker/searxng/settings.yml`
|
||||
- Убраны дублирующие shortcuts для yandex engines (ya, yai, yav, yan, yam)
|
||||
- Убраны конфликтующие кастомные engines (vk, rutube, dzen, aliexpress)
|
||||
|
||||
2. **Ghost перезапускался каждые 2 минуты** (HTTP 503):
|
||||
- Файл: `deploy/docker/docker-compose.yml`
|
||||
- Исправлен healthcheck (wget --spider не следует за 301 redirect)
|
||||
- Увеличены start_period (90s), retries (5), interval (30s)
|
||||
|
||||
## Контекст для продолжения
|
||||
- Порты: discover 3002, search 3001, finance 3003, travel 3004, chat 3005, memory 3010, create 3011, notifications 3013, billing 3008, media 3016, suggestions 3017, master-agents 3018, profile 3019, llm 3020
|
||||
- Ghost: опционально → http://localhost:2369, админка /ghost, Content API Key в .env
|
||||
- Redis ключи: discover:{topic}, finance:summary, travel:trending, travel:stepper:{sessionId}, cache-worker
|
||||
|
||||
### Новые файлы (созданы):
|
||||
- `backend/cmd/computer-svc/main.go` — GooSeek Computer service (port 3030)
|
||||
- `backend/internal/computer/types.go` — Computer types (Task, SubTask, Artifact, etc.)
|
||||
- `backend/internal/computer/computer.go` — Main orchestrator + EventBus
|
||||
- `backend/internal/computer/planner.go` — AI task planner
|
||||
- `backend/internal/computer/router.go` — Model routing
|
||||
- `backend/internal/computer/executor.go` — Task execution
|
||||
- `backend/internal/computer/sandbox.go` — Docker sandbox manager
|
||||
- `backend/internal/computer/scheduler.go` — Cron/interval scheduler
|
||||
- `backend/internal/computer/memory.go` — Persistent user memory
|
||||
- `backend/internal/computer/connectors/connector.go` — Connector interface
|
||||
- `backend/internal/computer/connectors/email.go` — SMTP connector
|
||||
- `backend/internal/computer/connectors/telegram.go` — Telegram Bot connector
|
||||
- `backend/internal/computer/connectors/webhook.go` — HTTP webhook connector
|
||||
- `backend/internal/computer/connectors/storage.go` — S3/MinIO storage connector
|
||||
- `backend/internal/llm/registry.go` — Model registry with capabilities
|
||||
- `backend/internal/db/computer_task_repo.go` — Computer task repository
|
||||
- `backend/internal/db/computer_memory_repo.go` — Computer memory repository
|
||||
- `backend/internal/db/computer_artifact_repo.go` — Computer artifact repository
|
||||
- `backend/deploy/k8s/computer-svc.yaml` — K8s manifest for computer-svc
|
||||
- `backend/cmd/discover-svc/main.go` — Discover service на Go
|
||||
- `backend/cmd/collection-svc/main.go` — Collections service
|
||||
- `backend/cmd/file-svc/main.go` — File upload & analysis service
|
||||
- `backend/internal/db/postgres.go` — PostgreSQL connection + migrations
|
||||
- `backend/internal/db/digest_repo.go` — Digest repository
|
||||
- `backend/internal/db/article_summary_repo.go` — Article summary repository
|
||||
- `backend/internal/db/collection_repo.go` — Collection repository
|
||||
- `backend/internal/db/file_repo.go` — Uploaded file repository
|
||||
- `backend/internal/agent/focus_modes.go` — Perplexity Focus Modes
|
||||
- `backend/internal/agent/deep_research.go` — Deep Research multi-agent
|
||||
- `backend/internal/files/analyzer.go` — PDF/image analyzer
|
||||
- `backend/pkg/cache/redis.go` — Redis кэш клиент
|
||||
- `backend/pkg/middleware/ratelimit_redis.go` — Redis-based rate limiting
|
||||
- `backend/pkg/middleware/jwt.go` — JWT validation middleware
|
||||
- `backend/deploy/k8s/postgres.yaml` — PostgreSQL StatefulSet
|
||||
- `backend/deploy/k8s/collection-svc.yaml` — Collection service K8s
|
||||
- `backend/deploy/k8s/file-svc.yaml` — File service K8s
|
||||
- `backend/deploy/k8s/thread-svc.yaml` — Thread service K8s
|
||||
- `backend/cmd/thread-svc/main.go` — Thread/Spaces/Memory/Pages service
|
||||
- `backend/internal/db/thread_repo.go` — Thread repository
|
||||
- `backend/internal/db/space_repo.go` — Space repository
|
||||
- `backend/internal/db/memory_repo.go` — Memory repository
|
||||
- `backend/internal/db/page_repo.go` — Page repository
|
||||
- `backend/internal/pages/generator.go` — Page generator (Markdown/HTML export)
|
||||
- `services/master-agents-svc/src/lib/media-search.ts` — синхронный медиа-поиск
|
||||
- `services/media-svc/DEPRECATED.md` — пометка устаревшего сервиса
|
||||
- `services/master-agents-svc/src/lib/types/widgets.ts`
|
||||
- `services/master-agents-svc/src/lib/content-classifier.ts`
|
||||
- `services/web-svc/src/components/Widgets/UnifiedCard.tsx`
|
||||
- `services/web-svc/src/components/Widgets/ProductCard.tsx`
|
||||
- `services/web-svc/src/components/Widgets/VideoCard.tsx`
|
||||
- `services/web-svc/src/components/Widgets/ProfileCard.tsx`
|
||||
- `services/web-svc/src/components/Widgets/PromoCard.tsx`
|
||||
- `services/web-svc/src/components/Widgets/CardGallery.tsx`
|
||||
- `services/web-svc/src/components/Widgets/KnowledgeCard.tsx`
|
||||
- `services/web-svc/src/components/Widgets/InlineImageGallery.tsx`
|
||||
- `services/web-svc/src/components/Widgets/VideoEmbed.tsx`
|
||||
- `services/web-svc/src/components/SourcesPanel.tsx`
|
||||
- `services/web-svc/src/components/RelatedQuestions.tsx`
|
||||
|
||||
### Изменённые файлы:
|
||||
- `backend/internal/agent/orchestrator.go` — Clarifying/Related Questions, Deep Research mode, Enhanced Context
|
||||
- `backend/pkg/config/config.go` — ThreadSvcURL, ComputerSvcURL
|
||||
- `backend/go.mod` — добавлены minio-go, robfig/cron
|
||||
- `backend/Makefile` — добавлен computer-svc
|
||||
- `backend/deploy/docker/Dockerfile.all` — добавлен build computer-svc
|
||||
- `backend/deploy/k8s/kustomization.yaml` — добавлен computer-svc
|
||||
- `backend/Makefile` — thread-svc
|
||||
- `backend/deploy/docker/docker-compose.yml` — thread-svc
|
||||
- `backend/deploy/docker/Dockerfile.all` — thread-svc build
|
||||
- `backend/deploy/k8s/kustomization.yaml` — thread-svc
|
||||
- `backend/deploy/k8s/configmap.yaml` — THREAD_SVC_URL
|
||||
- `services/master-agents-svc/src/lib/agent/searchOrchestrator.ts` — интеграция медиа-поиска
|
||||
- `services/master-agents-svc/src/lib/searxng.ts` — расширенные типы и категоризация
|
||||
- `services/master-agents-svc/src/lib/agent/researcher.ts` — интеграция classifier + эмиссия виджетов
|
||||
- `deploy/docker/searxng/settings.yml` — российские engines
|
||||
- `services/web-svc/src/components/MessageRenderer/Citation.tsx` — enhanced hover
|
||||
- `services/web-svc/src/components/Widgets/Renderer.tsx` — новые типы виджетов
|
||||
- `services/web-svc/src/lib/types.ts` — WidgetType
|
||||
- `services/web-svc/src/components/ChatWindow.tsx` — Widget interface
|
||||
- `services/web-svc/src/components/AssistantSteps.tsx` — progress bar, timer, icons
|
||||
|
||||
Reference in New Issue
Block a user