Files
gooseek/CONTINUE.md
home 328d968f3f Deploy: migrate k3s → Docker; search logic → master-agents-svc
- deploy/k3s удалён, deploy/docker добавлен (Caddyfile, docker-compose, searxng)
- chat-svc: agents/models/prompts удалены, использует llm-svc (LLMClient, EmbeddingClient)
- master-agents-svc: SearchOrchestrator, classifier, researcher, actions, widgets
- web-svc: ChatModelSelector, Optimization, Sources удалены; InputBarPlus; UnregisterSW
- geo-device-svc, localization-svc: Dockerfiles
- docs: 02-k3s-services-spec.md, RUNBOOK/TELEMETRY/WORKING удалены

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-23 22:14:00 +03:00

162 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Недоделки — начать отсюда
## Задача
Полная переделка сервиса 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 — оценка времени ~3090 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: выбор длительности (114 дней), 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