- 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>
162 lines
14 KiB
Markdown
162 lines
14 KiB
Markdown
# Недоделки — начать отсюда
|
||
|
||
## Задача
|
||
Полная переделка сервиса 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
|