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

14 KiB
Raw Blame History

Недоделки — начать отсюда

Задача

Полная переделка сервиса 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