mirror of
https://github.com/kjanat/livedash-node.git
synced 2026-01-16 15:32:10 +01:00
- Reduce cognitive complexity in lib/api/handler.ts (23 → 15) - Reduce cognitive complexity in lib/config/provider.ts (38 → 15) - Fix TypeScript any type violations in multiple files - Remove unused variable in lib/batchSchedulerOptimized.ts - Add prettier-ignore comments to documentation with intentional syntax errors - Resolve Prettier/Biome formatting conflicts with targeted ignores - Create .prettierignore for build artifacts and dependencies All linting checks now pass and build completes successfully (47/47 pages).
220 lines
4.6 KiB
Markdown
220 lines
4.6 KiB
Markdown
# Scheduler Workflow Documentation
|
|
|
|
## Overview
|
|
|
|
The LiveDash system has two main schedulers that work together to fetch and process session data:
|
|
|
|
1. **Session Refresh Scheduler** - Fetches new sessions from CSV files
|
|
2. **Processing Scheduler** - Processes session transcripts with AI
|
|
|
|
## Current Status (as of latest check)
|
|
|
|
- **Total sessions**: 107
|
|
- **Processed sessions**: 0
|
|
- **Sessions with transcript**: 0
|
|
- **Ready for processing**: 0
|
|
|
|
## How the `processed` Field Works
|
|
|
|
The ProcessingScheduler picks up sessions where `processed` is **NOT** `true`, which includes:
|
|
|
|
- `processed = false`
|
|
- `processed = null`
|
|
|
|
**Query used:**
|
|
|
|
```javascript
|
|
{
|
|
processed: {
|
|
not: true;
|
|
}
|
|
} // Either false or null
|
|
```
|
|
|
|
## Complete Workflow
|
|
|
|
### Step 1: Session Refresh (CSV Fetching)
|
|
|
|
**What it does:**
|
|
|
|
- Fetches session data from company CSV URLs
|
|
- Creates session records in database with basic metadata
|
|
- Sets `transcriptContent = null` initially
|
|
- Sets `processed = null` initially
|
|
|
|
**Runs:** Every 30 minutes (cron: `*/30 * * * *`)
|
|
|
|
### Step 2: Transcript Fetching
|
|
|
|
**What it does:**
|
|
|
|
- Downloads full transcript content for sessions
|
|
- Updates `transcriptContent` field with actual conversation data
|
|
- Sessions remain `processed = null` until AI processing
|
|
|
|
**Runs:** As part of session refresh process
|
|
|
|
### Step 3: AI Processing
|
|
|
|
**What it does:**
|
|
|
|
- Finds sessions with transcript content where `processed != true`
|
|
- Sends transcripts to OpenAI for analysis
|
|
- Extracts: sentiment, category, questions, summary, etc.
|
|
- Updates session with processed data
|
|
- Sets `processed = true`
|
|
|
|
**Runs:** Every hour (cron: `0 * * * *`)
|
|
|
|
## Manual Trigger Commands
|
|
|
|
### Check Current Status
|
|
|
|
```bash
|
|
node scripts/manual-triggers.js status
|
|
```
|
|
|
|
### Trigger Session Refresh (Fetch new sessions from CSV)
|
|
|
|
```bash
|
|
node scripts/manual-triggers.js refresh
|
|
```
|
|
|
|
### Trigger AI Processing (Process unprocessed sessions)
|
|
|
|
```bash
|
|
node scripts/manual-triggers.js process
|
|
```
|
|
|
|
### Run Both Schedulers
|
|
|
|
```bash
|
|
node scripts/manual-triggers.js both
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### No Sessions Being Processed?
|
|
|
|
1. **Check if sessions have transcripts:**
|
|
|
|
```bash
|
|
node scripts/manual-triggers.js status
|
|
```
|
|
|
|
2. **If "Sessions with transcript" is 0:**
|
|
|
|
- Sessions exist but transcripts haven't been fetched yet
|
|
- Run session refresh: `node scripts/manual-triggers.js refresh`
|
|
|
|
3. **If "Ready for processing" is 0 but "Sessions with transcript" > 0:**
|
|
|
|
- All sessions with transcripts have already been processed
|
|
- Check if `OPENAI_API_KEY` is set in environment
|
|
|
|
### Common Issues
|
|
|
|
#### "No sessions found requiring processing"
|
|
|
|
- All sessions with transcripts have been processed (`processed = true`)
|
|
- Or no sessions have transcript content yet
|
|
|
|
#### "OPENAI_API_KEY environment variable is not set"
|
|
|
|
- Add OpenAI API key to `.env.development` file
|
|
- Restart the application
|
|
|
|
#### "Error fetching transcript: Unauthorized"
|
|
|
|
- CSV credentials are incorrect or expired
|
|
- Check company CSV username/password in database
|
|
|
|
## Database Field Mapping
|
|
|
|
### Before AI Processing
|
|
|
|
<!-- prettier-ignore -->
|
|
```javascript
|
|
{
|
|
id: "session-uuid",
|
|
transcriptContent: "full conversation text" | null,
|
|
processed: null,
|
|
sentimentCategory: null,
|
|
questions: null,
|
|
summary: null,
|
|
// ... other fields
|
|
}
|
|
```
|
|
|
|
### After AI Processing
|
|
|
|
<!-- prettier-ignore -->
|
|
```javascript
|
|
{
|
|
id: "session-uuid",
|
|
transcriptContent: "full conversation text",
|
|
processed: true,
|
|
sentimentCategory: "positive" | "neutral" | "negative",
|
|
questions: '["question 1", "question 2"]', // JSON string
|
|
summary: "Brief conversation summary",
|
|
language: "en", // ISO 639-1 code
|
|
messagesSent: 5,
|
|
sentiment: 0.8, // Float value (-1 to 1)
|
|
escalated: false,
|
|
forwardedHr: false,
|
|
category: "Schedule & Hours",
|
|
// ... other fields
|
|
}
|
|
```
|
|
|
|
## Scheduler Configuration
|
|
|
|
### Session Refresh Scheduler
|
|
|
|
- **File**: `lib/scheduler.js`
|
|
- **Frequency**: Every 30 minutes
|
|
- **Cron**: `*/30 * * * *`
|
|
|
|
### Processing Scheduler
|
|
|
|
- **File**: `lib/processingScheduler.js`
|
|
- **Frequency**: Every hour
|
|
- **Cron**: `0 * * * *`
|
|
- **Batch size**: 10 sessions per run
|
|
|
|
## Environment Variables Required
|
|
|
|
```bash
|
|
# Database
|
|
DATABASE_URL="postgresql://..."
|
|
|
|
# OpenAI (for processing)
|
|
OPENAI_API_KEY="sk-..."
|
|
|
|
# NextAuth
|
|
NEXTAUTH_SECRET="..."
|
|
NEXTAUTH_URL="http://localhost:3000"
|
|
```
|
|
|
|
## Next Steps for Testing
|
|
|
|
1. **Trigger session refresh** to fetch transcripts:
|
|
|
|
```bash
|
|
node scripts/manual-triggers.js refresh
|
|
```
|
|
|
|
2. **Check status** to see if transcripts were fetched:
|
|
|
|
```bash
|
|
node scripts/manual-triggers.js status
|
|
```
|
|
|
|
3. **Trigger processing** if transcripts are available:
|
|
|
|
```bash
|
|
node scripts/manual-triggers.js process
|
|
```
|
|
|
|
4. **View results** in the dashboard session details pages
|