- 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>
14 KiB
14 KiB
Недоделки — начать отсюда
Задача
Полная переделка сервиса 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)
- chat-svc, web-svc:
- Travel Stepper: сохранение состояния между шагами (Поиск → Места → Маршрут → Отели → Билеты)
- travel-svc: POST/GET
/api/v1/travel/stepper/state, Redistravel:stepper:{sessionId}TTL 24h - TravelStepper компонент: модальное окно, шаги, persist в API + sessionStorage fallback
- Кнопка «Plan a trip» на /travel
- travel-svc: POST/GET
- 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