AI-powered sales assistant frontend built with Svelte + Vite, based on the [sbbot] agent architecture prototype.
The UI covers all three core use-case flows — meeting preparation, live in-call advising, and post-meeting analysis — each driven by a dedicated AI agent.
Orchestrator / Router
├── Prep Agent — pre-meeting dossier & plan (US2, US3)
├── Live Advisor Agent — real-time advice during the call (US1)
└── Post-Meeting Agent — summary, action items & coaching (US4, US5)
Shared Memory (client context + meeting history) is accessible by all agents. The Tool Layer connects to CRM, ЕГРЮЛ, zakupki.gov.ru, GigaSearch, and AssemblyAI Streaming.
ready / loading / pending)get_client_card)search_news)search_procurement)/api/live-hints/ws)цена, возражение, конкурентtranscribe_file → parallel LLM calls → save_meetingget_competency_tips)The Post-Meeting and Live Advisor screens connect to DialogScribe — a self-hosted speech-to-text + LLM analysis backend (FastAPI, port 7860).
| Endpoint | Used by | Purpose |
|---|---|---|
GET /health |
AgentStatusBar |
Backend health polling (every 30 s) |
POST /api/auth/login |
src/lib/api.js |
Auto-login → JWT token |
WS /api/live-hints/ws |
LiveAdvisor |
Real-time mic audio → transcript + hints (WebSocket) |
POST /api/transcribe |
PostMeeting |
Upload audio/video → transcript + diarization |
POST /api/summary |
PostMeeting |
Generate structured meeting summary |
POST /api/insights |
PostMeeting |
Extract action items, decisions, insights |
POST /api/chat |
LiveAdvisor |
Fallback advisor tip endpoint |
DialogScribe requires a JWT Bearer token for all /api/* routes. The API client handles this transparently:
api.js posts VITE_DS_EMAIL / VITE_DS_PASSWORD to /api/auth/loginaccess_token is cached in memory for all subsequent requestsCredentials default to [email protected] / admin123 — matching the values set by docker-compose.fullstack.yaml.
DialogScribe's endpoints differ slightly from generic OpenAI conventions:
| Endpoint | Field sent | Field returned |
|---|---|---|
POST /api/transcribe |
diarization_mode: "simple" |
{text, segments, duration, language} |
POST /api/summary |
{text, template_key?} |
{summary_markdown, summary_html} |
POST /api/chat |
{text, messages: [{role,content}]} |
{answer} |
api.js normalises these into a consistent shape so components don't need to know the details.
Eliminates CORS entirely — nginx serves the frontend and proxies all /api/*, /health, /v1/* requests to DialogScribe on the internal Docker network.
Prerequisites: Docker Desktop, a Mistral API key.
# 1. Clone DialogScribe alongside this repo
git clone https://github.com/Timik232/DialogScribe ../DialogScribe
# 2. Set your Mistral key in docker-compose.fullstack.yaml
# (MISTRAL_API_KEY / LLM_API_KEY fields in the dialogscribe service)
# 3. Build and start both services
docker compose -f docker-compose.fullstack.yaml up --build
# → Frontend + API available at http://localhost:5173
The dialogscribe service exposes only port 7860 on the internal app-net network (not to the host), so the browser always talks to a single origin through nginx.
npm install
# Leave VITE_API_BASE_URL empty in .env — Vite proxy handles forwarding
echo "VITE_API_BASE_URL=" > .env
npm run dev
In this mode Vite dev server proxies all /api/*, /health, /v1/* requests (including WebSocket) to DialogScribe on localhost:7860. Start DialogScribe separately via docker compose -f docker-compose.dev.yaml up -d.
Both live components degrade gracefully when the backend is offline:
| Layer | Choice |
|---|---|
| Framework | Svelte 4 |
| Build tool | Vite 5 |
| Backend | DialogScribe (FastAPI + Mistral Voxtral) |
| Styling | Scoped CSS (dark theme, no external CSS lib) |
| Font | Inter (Google Fonts) |
| State | Svelte stores + component props |
git clone https://github.com/Timik232/DialogScribe ../DialogScribe
# edit docker-compose.fullstack.yaml → set MISTRAL_API_KEY / LLM_API_KEY
docker compose -f docker-compose.fullstack.yaml up --build
# → http://localhost:5173
npm install
cp .env.example .env
# set VITE_API_BASE_URL=http://localhost:7860 and start DialogScribe separately
npm run dev
# → http://localhost:5173
# Production build
npm run build
src/
├── main.js
├── App.svelte # Root shell + view router
├── lib/
│ └── api.js # DialogScribe API client (all endpoints)
└── components/
├── Sidebar.svelte # Navigation: Сегодня / В эфире / Итоги
├── AgentStatusBar.svelte # Agent status chips + DialogScribe health indicator
├── MeetingList.svelte # Today's schedule with Prep Agent status
├── ClientDossier.svelte # Client dossier: stats, pain points, news, competitors
├── LiveAdvisor.svelte # Live transcript + real-time tips via /api/chat
└── PostMeeting.svelte # File upload → transcribe → summary/insights pipeline
| Agent | Use Cases | UI Component |
|---|---|---|
| Prep Agent | US2, US3 | MeetingList + ClientDossier |
| Live Advisor Agent | US1 | LiveAdvisor |
| Post-Meeting Agent | US4, US5 | PostMeeting |
Per the architecture doc, this prototype intentionally excludes: