# Недоделки — начать отсюда ## Задача Полная переделка сервиса GooSeek по документации docs/architecture (сервисная архитектура СОА, аналог Perplexity.ai). ## Статус: миграция завершена ✅ ## 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) ## Сделано (текущая сессия — 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 ## Сделано (текущая сессия) - **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/ ## Сделано (текущая сессия) - **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) ## Сделано (последнее) - **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) ## Сделано (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 по умолчанию) ## 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 после ответа. ## 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) ## Контекст для продолжения - Порты: 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