@vezlo/assistant-server 2.2.2 โ 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -13
- package/database-schema.sql +172 -7
- package/dist/src/bootstrap/initializeServices.d.ts.map +1 -1
- package/dist/src/bootstrap/initializeServices.js +2 -0
- package/dist/src/bootstrap/initializeServices.js.map +1 -1
- package/dist/src/config/global.js +1 -1
- package/dist/src/config/global.js.map +1 -1
- package/dist/src/controllers/ChatController.d.ts +1 -0
- package/dist/src/controllers/ChatController.d.ts.map +1 -1
- package/dist/src/controllers/ChatController.js +26 -70
- package/dist/src/controllers/ChatController.js.map +1 -1
- package/dist/src/controllers/KnowledgeController.d.ts.map +1 -1
- package/dist/src/controllers/KnowledgeController.js +0 -4
- package/dist/src/controllers/KnowledgeController.js.map +1 -1
- package/dist/src/migrations/006_add_knowledge_chunks.d.ts +4 -0
- package/dist/src/migrations/006_add_knowledge_chunks.d.ts.map +1 -0
- package/dist/src/migrations/006_add_knowledge_chunks.js +245 -0
- package/dist/src/migrations/006_add_knowledge_chunks.js.map +1 -0
- package/dist/src/server.js +3 -0
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/AIService.d.ts.map +1 -1
- package/dist/src/services/AIService.js +1 -3
- package/dist/src/services/AIService.js.map +1 -1
- package/dist/src/services/IntentService.d.ts +2 -1
- package/dist/src/services/IntentService.d.ts.map +1 -1
- package/dist/src/services/IntentService.js +23 -4
- package/dist/src/services/IntentService.js.map +1 -1
- package/dist/src/services/KnowledgeBaseService.d.ts +20 -5
- package/dist/src/services/KnowledgeBaseService.d.ts.map +1 -1
- package/dist/src/services/KnowledgeBaseService.js +203 -137
- package/dist/src/services/KnowledgeBaseService.js.map +1 -1
- package/package.json +2 -2
- package/scripts/test-chunks-embeddings.js +190 -0
package/README.md
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
# Vezlo AI Assistant Server
|
|
2
2
|
|
|
3
|
-
๐ **Production-ready Node.js/TypeScript API server** for the Vezlo AI Assistant platform - Complete backend APIs with Docker deployment and database migrations.
|
|
3
|
+
๐ **Production-ready Node.js/TypeScript API server** for the Vezlo AI Assistant platform - Complete backend APIs with advanced RAG (chunk-based semantic search + adjacent retrieval), Docker deployment, and database migrations.
|
|
4
4
|
|
|
5
|
-
## ๐จ Breaking Change Notice
|
|
5
|
+
## ๐จ Breaking Change Notice
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
### v2.3.0 - Enhanced RAG System (Latest)
|
|
8
|
+
**New chunk-based architecture with adjacent retrieval for better code understanding.**
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
- **
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
10
|
+
- **Database Schema**: New `vezlo_knowledge_chunks` table and RPC functions
|
|
11
|
+
- **Embedding Model**: Upgraded to `text-embedding-3-large` (3072 dimensions)
|
|
12
|
+
- **Migration**: Automatic via `npm run migrate:latest` (migration 006)
|
|
13
|
+
- **Rollback**: Supported via `npm run migrate:rollback`
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
**Upgrade Steps:**
|
|
16
|
+
```bash
|
|
17
|
+
npm install @vezlo/assistant-server@latest
|
|
18
|
+
npm run migrate:latest
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### v2.0.0 - Multi-tenancy Support
|
|
22
|
+
**Introduced multi-tenancy with authentication. Existing data not auto-migrated.**
|
|
18
23
|
|
|
19
24
|
See [CHANGELOG.md](./CHANGELOG.md) for complete migration guide.
|
|
20
25
|
|
|
@@ -25,7 +30,7 @@ See [CHANGELOG.md](./CHANGELOG.md) for complete migration guide.
|
|
|
25
30
|
- **Backend APIs** - RESTful API endpoints for AI chat and knowledge management
|
|
26
31
|
- **Real-time Communication** - WebSocket support for live chat with Supabase Realtime broadcasting
|
|
27
32
|
- **Human Agent Handoff** - Agent join/leave workflows with realtime status updates and message synchronization
|
|
28
|
-
- **
|
|
33
|
+
- **Advanced RAG System** - Chunk-based semantic search with adjacent retrieval using OpenAI text-embedding-3-large (3072 dims) and pgvector
|
|
29
34
|
- **Conversation Management** - Persistent conversation history with agent support
|
|
30
35
|
- **Feedback System** - Message rating and improvement tracking
|
|
31
36
|
- **Database Migrations** - Knex.js migration system for schema management
|
|
@@ -308,7 +313,7 @@ RATE_LIMIT_MAX=100
|
|
|
308
313
|
ORGANIZATION_NAME=Vezlo
|
|
309
314
|
ASSISTANT_NAME=Vezlo Assistant
|
|
310
315
|
|
|
311
|
-
# OPTIONAL - Knowledge Base
|
|
316
|
+
# OPTIONAL - Knowledge Base (uses text-embedding-3-large, 3072 dims)
|
|
312
317
|
CHUNK_SIZE=1000
|
|
313
318
|
CHUNK_OVERLAP=200
|
|
314
319
|
```
|
package/database-schema.sql
CHANGED
|
@@ -42,6 +42,14 @@ INSERT INTO knex_migrations (name, batch, migration_time)
|
|
|
42
42
|
SELECT '004_add_vector_search_rpc.ts', 1, NOW()
|
|
43
43
|
WHERE NOT EXISTS (SELECT 1 FROM knex_migrations WHERE name = '004_add_vector_search_rpc.ts');
|
|
44
44
|
|
|
45
|
+
INSERT INTO knex_migrations (name, batch, migration_time)
|
|
46
|
+
SELECT '005_add_conversation_handoff_columns.ts', 1, NOW()
|
|
47
|
+
WHERE NOT EXISTS (SELECT 1 FROM knex_migrations WHERE name = '005_add_conversation_handoff_columns.ts');
|
|
48
|
+
|
|
49
|
+
INSERT INTO knex_migrations (name, batch, migration_time)
|
|
50
|
+
SELECT '006_add_knowledge_chunks.ts', 1, NOW()
|
|
51
|
+
WHERE NOT EXISTS (SELECT 1 FROM knex_migrations WHERE name = '006_add_knowledge_chunks.ts');
|
|
52
|
+
|
|
45
53
|
-- Set migration lock to unlocked (0 = unlocked, 1 = locked)
|
|
46
54
|
INSERT INTO knex_migrations_lock (index, is_locked)
|
|
47
55
|
VALUES (1, 0)
|
|
@@ -159,13 +167,36 @@ CREATE TABLE IF NOT EXISTS vezlo_knowledge_items (
|
|
|
159
167
|
file_size BIGINT, -- File size in bytes
|
|
160
168
|
file_type TEXT, -- MIME type for files
|
|
161
169
|
metadata JSONB DEFAULT '{}', -- Flexible metadata storage
|
|
162
|
-
embedding vector(1536), -- OpenAI embeddings for search
|
|
170
|
+
embedding vector(1536), -- OpenAI embeddings for search (legacy, not used with chunks)
|
|
163
171
|
processed_at TIMESTAMPTZ, -- When embedding was generated
|
|
164
172
|
created_by BIGINT NOT NULL,
|
|
165
173
|
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
166
174
|
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
167
175
|
);
|
|
168
176
|
|
|
177
|
+
-- ============================================================================
|
|
178
|
+
-- KNOWLEDGE CHUNKS TABLE (Migration 006)
|
|
179
|
+
-- ============================================================================
|
|
180
|
+
-- This table stores text chunks from knowledge items with their embeddings.
|
|
181
|
+
-- Each document can have multiple chunks for better semantic search on large content.
|
|
182
|
+
-- Uses text-embedding-3-large model which produces 3072-dimensional vectors.
|
|
183
|
+
|
|
184
|
+
CREATE TABLE IF NOT EXISTS vezlo_knowledge_chunks (
|
|
185
|
+
id BIGSERIAL PRIMARY KEY,
|
|
186
|
+
uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
|
|
187
|
+
document_id BIGINT NOT NULL REFERENCES vezlo_knowledge_items(id) ON DELETE CASCADE,
|
|
188
|
+
chunk_text TEXT NOT NULL,
|
|
189
|
+
chunk_index INTEGER NOT NULL,
|
|
190
|
+
start_char INTEGER,
|
|
191
|
+
end_char INTEGER,
|
|
192
|
+
token_count INTEGER,
|
|
193
|
+
embedding vector(3072), -- OpenAI text-embedding-3-large embeddings
|
|
194
|
+
metadata JSONB DEFAULT '{}',
|
|
195
|
+
processed_at TIMESTAMPTZ,
|
|
196
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
197
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
198
|
+
);
|
|
199
|
+
|
|
169
200
|
-- ============================================================================
|
|
170
201
|
-- ADD FOREIGN KEY CONSTRAINTS (Matching Migration 002)
|
|
171
202
|
-- These constraints use explicit names matching Knex migration naming convention
|
|
@@ -269,15 +300,38 @@ CREATE INDEX IF NOT EXISTS idx_vezlo_knowledge_type ON vezlo_knowledge_items(typ
|
|
|
269
300
|
CREATE INDEX IF NOT EXISTS idx_vezlo_knowledge_created_by ON vezlo_knowledge_items(created_by);
|
|
270
301
|
CREATE INDEX IF NOT EXISTS idx_vezlo_knowledge_created_at ON vezlo_knowledge_items(created_at DESC);
|
|
271
302
|
|
|
303
|
+
-- Knowledge chunks indexes (Migration 006)
|
|
304
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_chunks_uuid ON vezlo_knowledge_chunks(uuid);
|
|
305
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_chunks_document_id ON vezlo_knowledge_chunks(document_id);
|
|
306
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_chunks_chunk_index ON vezlo_knowledge_chunks(document_id, chunk_index);
|
|
307
|
+
|
|
272
308
|
-- Full-text search index for knowledge items
|
|
273
309
|
CREATE INDEX IF NOT EXISTS idx_vezlo_knowledge_search
|
|
274
310
|
ON vezlo_knowledge_items USING gin(to_tsvector('english', title || ' ' || COALESCE(description, '') || ' ' || COALESCE(content, '')));
|
|
275
311
|
|
|
276
|
-
-- Vector similarity index for semantic search (only for items with content)
|
|
312
|
+
-- Vector similarity index for semantic search (only for items with content - legacy)
|
|
277
313
|
CREATE INDEX IF NOT EXISTS idx_vezlo_knowledge_embedding
|
|
278
314
|
ON vezlo_knowledge_items USING ivfflat (embedding vector_cosine_ops)
|
|
279
315
|
WHERE embedding IS NOT NULL;
|
|
280
316
|
|
|
317
|
+
-- Vector similarity index for chunks (Migration 006)
|
|
318
|
+
-- HNSW index for 3072-dimensional vectors (text-embedding-3-large)
|
|
319
|
+
-- Note: May fail on older pgvector versions, vector search will use sequential scan
|
|
320
|
+
DO $$
|
|
321
|
+
BEGIN
|
|
322
|
+
BEGIN
|
|
323
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_chunks_embedding
|
|
324
|
+
ON vezlo_knowledge_chunks USING hnsw (embedding vector_cosine_ops)
|
|
325
|
+
WHERE embedding IS NOT NULL;
|
|
326
|
+
EXCEPTION WHEN OTHERS THEN
|
|
327
|
+
RAISE NOTICE 'HNSW index creation skipped: % (Vector search will use sequential scan)', SQLERRM;
|
|
328
|
+
END;
|
|
329
|
+
END $$;
|
|
330
|
+
|
|
331
|
+
-- GIN index for full-text keyword search on chunks (Migration 006)
|
|
332
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_chunks_chunk_text_gin
|
|
333
|
+
ON vezlo_knowledge_chunks USING gin (to_tsvector('english', chunk_text));
|
|
334
|
+
|
|
281
335
|
-- Sparse indexes for better performance
|
|
282
336
|
-- Note: idx_vezlo_knowledge_content was removed in migration 003
|
|
283
337
|
-- because btree indexes fail on large content (>2704 bytes).
|
|
@@ -299,6 +353,7 @@ ALTER TABLE vezlo_conversations ENABLE ROW LEVEL SECURITY;
|
|
|
299
353
|
ALTER TABLE vezlo_messages ENABLE ROW LEVEL SECURITY;
|
|
300
354
|
ALTER TABLE vezlo_message_feedback ENABLE ROW LEVEL SECURITY;
|
|
301
355
|
ALTER TABLE vezlo_knowledge_items ENABLE ROW LEVEL SECURITY;
|
|
356
|
+
ALTER TABLE vezlo_knowledge_chunks ENABLE ROW LEVEL SECURITY;
|
|
302
357
|
|
|
303
358
|
-- Policies for service role access (full access)
|
|
304
359
|
CREATE POLICY "Service role can access all users" ON vezlo_users
|
|
@@ -325,6 +380,9 @@ CREATE POLICY "Service role can access all feedback" ON vezlo_message_feedback
|
|
|
325
380
|
CREATE POLICY "Service role can access all knowledge items" ON vezlo_knowledge_items
|
|
326
381
|
FOR ALL USING (auth.role() = 'service_role');
|
|
327
382
|
|
|
383
|
+
CREATE POLICY "Service role can access all knowledge chunks" ON vezlo_knowledge_chunks
|
|
384
|
+
FOR ALL USING (auth.role() = 'service_role');
|
|
385
|
+
|
|
328
386
|
-- Example company-based policies (uncomment and modify as needed)
|
|
329
387
|
-- CREATE POLICY "Users can access their company conversations" ON vezlo_conversations
|
|
330
388
|
-- FOR ALL USING (company_id = auth.jwt() ->> 'company_id');
|
|
@@ -333,13 +391,120 @@ CREATE POLICY "Service role can access all knowledge items" ON vezlo_knowledge_i
|
|
|
333
391
|
-- FOR ALL USING (company_id = auth.jwt() ->> 'company_id');
|
|
334
392
|
|
|
335
393
|
-- ============================================================================
|
|
336
|
-
-- RPC
|
|
394
|
+
-- RPC FUNCTIONS FOR VECTOR SEARCH
|
|
337
395
|
-- ============================================================================
|
|
338
396
|
|
|
339
|
-
--
|
|
340
|
-
--
|
|
341
|
-
--
|
|
342
|
-
--
|
|
397
|
+
-- ============================================================================
|
|
398
|
+
-- INSERT RPC FUNCTION FOR CHUNKS (Migration 006)
|
|
399
|
+
-- ============================================================================
|
|
400
|
+
-- Ensures embeddings are stored as proper vector(3072) type
|
|
401
|
+
CREATE OR REPLACE FUNCTION vezlo_insert_knowledge_chunk(
|
|
402
|
+
p_document_id bigint,
|
|
403
|
+
p_chunk_text text,
|
|
404
|
+
p_chunk_index int,
|
|
405
|
+
p_start_char int,
|
|
406
|
+
p_end_char int,
|
|
407
|
+
p_token_count int,
|
|
408
|
+
p_embedding text,
|
|
409
|
+
p_processed_at timestamptz
|
|
410
|
+
)
|
|
411
|
+
RETURNS bigint
|
|
412
|
+
LANGUAGE plpgsql
|
|
413
|
+
AS $$
|
|
414
|
+
DECLARE
|
|
415
|
+
new_id bigint;
|
|
416
|
+
BEGIN
|
|
417
|
+
INSERT INTO vezlo_knowledge_chunks (
|
|
418
|
+
document_id,
|
|
419
|
+
chunk_text,
|
|
420
|
+
chunk_index,
|
|
421
|
+
start_char,
|
|
422
|
+
end_char,
|
|
423
|
+
token_count,
|
|
424
|
+
embedding,
|
|
425
|
+
processed_at,
|
|
426
|
+
metadata
|
|
427
|
+
) VALUES (
|
|
428
|
+
p_document_id,
|
|
429
|
+
p_chunk_text,
|
|
430
|
+
p_chunk_index,
|
|
431
|
+
p_start_char,
|
|
432
|
+
p_end_char,
|
|
433
|
+
p_token_count,
|
|
434
|
+
p_embedding::vector(3072),
|
|
435
|
+
p_processed_at,
|
|
436
|
+
'{}'::jsonb
|
|
437
|
+
)
|
|
438
|
+
RETURNING id INTO new_id;
|
|
439
|
+
|
|
440
|
+
RETURN new_id;
|
|
441
|
+
END;
|
|
442
|
+
$$;
|
|
443
|
+
|
|
444
|
+
-- ============================================================================
|
|
445
|
+
-- CHUNK-BASED VECTOR SEARCH RPC FUNCTION (Migration 006)
|
|
446
|
+
-- ============================================================================
|
|
447
|
+
-- Searches through chunks and joins back to parent documents for metadata.
|
|
448
|
+
-- Uses 3072-dimensional vectors for text-embedding-3-large.
|
|
449
|
+
CREATE OR REPLACE FUNCTION vezlo_match_knowledge_chunks(
|
|
450
|
+
query_embedding text,
|
|
451
|
+
match_threshold float DEFAULT 0.5,
|
|
452
|
+
match_count int DEFAULT 10,
|
|
453
|
+
filter_company_id bigint DEFAULT NULL
|
|
454
|
+
)
|
|
455
|
+
RETURNS TABLE (
|
|
456
|
+
chunk_id bigint,
|
|
457
|
+
chunk_uuid uuid,
|
|
458
|
+
document_id bigint,
|
|
459
|
+
document_uuid uuid,
|
|
460
|
+
chunk_text text,
|
|
461
|
+
chunk_index int,
|
|
462
|
+
start_char int,
|
|
463
|
+
end_char int,
|
|
464
|
+
token_count int,
|
|
465
|
+
document_title text,
|
|
466
|
+
document_description text,
|
|
467
|
+
document_type text,
|
|
468
|
+
document_metadata jsonb,
|
|
469
|
+
chunk_metadata jsonb,
|
|
470
|
+
company_id bigint,
|
|
471
|
+
similarity float
|
|
472
|
+
)
|
|
473
|
+
LANGUAGE plpgsql
|
|
474
|
+
AS $$
|
|
475
|
+
BEGIN
|
|
476
|
+
RETURN QUERY
|
|
477
|
+
SELECT
|
|
478
|
+
c.id AS chunk_id,
|
|
479
|
+
c.uuid AS chunk_uuid,
|
|
480
|
+
c.document_id,
|
|
481
|
+
ki.uuid AS document_uuid,
|
|
482
|
+
c.chunk_text,
|
|
483
|
+
c.chunk_index,
|
|
484
|
+
c.start_char,
|
|
485
|
+
c.end_char,
|
|
486
|
+
c.token_count,
|
|
487
|
+
ki.title AS document_title,
|
|
488
|
+
ki.description AS document_description,
|
|
489
|
+
ki.type AS document_type,
|
|
490
|
+
ki.metadata AS document_metadata,
|
|
491
|
+
c.metadata AS chunk_metadata,
|
|
492
|
+
ki.company_id,
|
|
493
|
+
1 - (c.embedding <=> query_embedding::vector(3072)) AS similarity
|
|
494
|
+
FROM vezlo_knowledge_chunks c
|
|
495
|
+
INNER JOIN vezlo_knowledge_items ki ON c.document_id = ki.id
|
|
496
|
+
WHERE c.embedding IS NOT NULL
|
|
497
|
+
AND (filter_company_id IS NULL OR ki.company_id = filter_company_id)
|
|
498
|
+
AND (1 - (c.embedding <=> query_embedding::vector(3072))) >= match_threshold
|
|
499
|
+
ORDER BY c.embedding <=> query_embedding::vector(3072)
|
|
500
|
+
LIMIT match_count;
|
|
501
|
+
END;
|
|
502
|
+
$$;
|
|
503
|
+
|
|
504
|
+
-- ============================================================================
|
|
505
|
+
-- LEGACY RPC FUNCTION (Pre-Migration 006)
|
|
506
|
+
-- ============================================================================
|
|
507
|
+
-- This function searches the parent table directly (legacy, not used with chunks)
|
|
343
508
|
CREATE OR REPLACE FUNCTION match_vezlo_knowledge(
|
|
344
509
|
query_embedding vector(1536),
|
|
345
510
|
match_threshold float DEFAULT 0.5,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initializeServices.d.ts","sourceRoot":"","sources":["../../../src/bootstrap/initializeServices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAInE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE;QACR,OAAO,EAAE,cAAc,CAAC;QACxB,aAAa,EAAE,oBAAoB,CAAC;QACpC,SAAS,EAAE,SAAS,CAAC;QACrB,WAAW,EAAE,WAAW,CAAC;QACzB,aAAa,EAAE,aAAa,CAAC;KAC9B,CAAC;IACF,WAAW,EAAE;QACX,cAAc,EAAE,cAAc,CAAC;QAC/B,mBAAmB,EAAE,mBAAmB,CAAC;QACzC,cAAc,EAAE,cAAc,CAAC;QAC/B,gBAAgB,EAAE,gBAAgB,CAAC;KACpC,CAAC;IACF,MAAM,EAAE;QACN,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAKD,wBAAgB,oBAAoB,IAAI,MAAM,CAa7C;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,uBAAuB,
|
|
1
|
+
{"version":3,"file":"initializeServices.d.ts","sourceRoot":"","sources":["../../../src/bootstrap/initializeServices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAInE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE;QACR,OAAO,EAAE,cAAc,CAAC;QACxB,aAAa,EAAE,oBAAoB,CAAC;QACpC,SAAS,EAAE,SAAS,CAAC;QACrB,WAAW,EAAE,WAAW,CAAC;QACzB,aAAa,EAAE,aAAa,CAAC;KAC9B,CAAC;IACF,WAAW,EAAE;QACX,cAAc,EAAE,cAAc,CAAC;QAC/B,mBAAmB,EAAE,mBAAmB,CAAC;QACzC,cAAc,EAAE,cAAc,CAAC;QAC/B,gBAAgB,EAAE,gBAAgB,CAAC;KACpC,CAAC;IACF,MAAM,EAAE;QACN,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAKD,wBAAgB,oBAAoB,IAAI,MAAM,CAa7C;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,uBAAuB,CA0G3F"}
|
|
@@ -42,6 +42,7 @@ function initializeCoreServices(options) {
|
|
|
42
42
|
supabase,
|
|
43
43
|
tableName: knowledgeTableName
|
|
44
44
|
});
|
|
45
|
+
// Initialize V2 service for adjacent chunk retrieval
|
|
45
46
|
// Read AI configuration from environment
|
|
46
47
|
// Use AI_MODEL for all OpenAI calls (intent classification + response generation)
|
|
47
48
|
const aiModel = process.env.AI_MODEL || 'gpt-4o-mini';
|
|
@@ -62,6 +63,7 @@ function initializeCoreServices(options) {
|
|
|
62
63
|
maxTokens: aiMaxTokens,
|
|
63
64
|
knowledgeBaseService: knowledgeBase
|
|
64
65
|
});
|
|
66
|
+
// Set V2 service for adjacent chunk retrieval
|
|
65
67
|
const chatManager = new ChatManager_1.ChatManager({
|
|
66
68
|
aiService,
|
|
67
69
|
storage,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initializeServices.js","sourceRoot":"","sources":["../../../src/bootstrap/initializeServices.ts"],"names":[],"mappings":";;;;;AA4CA,oDAaC;AAED,
|
|
1
|
+
{"version":3,"file":"initializeServices.js","sourceRoot":"","sources":["../../../src/bootstrap/initializeServices.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ exports.defaultConfig = {
|
|
|
30
30
|
api: {
|
|
31
31
|
prefix: '/api',
|
|
32
32
|
version: 'v1',
|
|
33
|
-
timeout:
|
|
33
|
+
timeout: 60000, // 60 seconds (matches Vercel Pro plan limit)
|
|
34
34
|
rateLimiting: {
|
|
35
35
|
windowMs: parseInt(process.env.RATE_LIMIT_WINDOW || '900000'), // Default 15 minutes
|
|
36
36
|
maxRequests: parseInt(process.env.RATE_LIMIT_MAX || '100') // per window
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global.js","sourceRoot":"","sources":["../../../src/config/global.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA2KH,wCAeC;AAxLD,mCAAgD;AAEhD,mCAAmC;AACnC,IAAA,eAAY,GAAE,CAAC;AA2Df,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC;SACtD,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SAC9B,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC;AAEF,wBAAwB;AACX,QAAA,aAAa,GAAiB;IACzC,GAAG,EAAE;QACH,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,qHAAqH;QAClI,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC;QAC1C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;KACnD;IACD,GAAG,EAAE;QACH,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"global.js","sourceRoot":"","sources":["../../../src/config/global.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,7 @@ export declare class ChatController {
|
|
|
30
30
|
submitFeedback(req: AuthenticatedRequest, res: Response): Promise<void>;
|
|
31
31
|
private classifyIntent;
|
|
32
32
|
private handleIntentResult;
|
|
33
|
+
private getFallbackResponse;
|
|
33
34
|
private respondWithAssistantMessage;
|
|
34
35
|
private saveAssistantMessage;
|
|
35
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatController.d.ts","sourceRoot":"","sources":["../../../src/controllers/ChatController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAA8B,MAAM,2BAA2B,CAAC;AAEtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,iBAAiB,CAAC,CAAoB;gBAG5C,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAC;QAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;KAAO;IAY1G,kBAAkB,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA4I3E,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAyF7D,gBAAgB,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatController.d.ts","sourceRoot":"","sources":["../../../src/controllers/ChatController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAA8B,MAAM,2BAA2B,CAAC;AAEtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,iBAAiB,CAAC,CAAoB;gBAG5C,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAC;QAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;KAAO;IAY1G,kBAAkB,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA4I3E,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAyF7D,gBAAgB,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAuHzE,eAAe,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDxE,uBAAuB,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA4DhF,gBAAgB,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAuGzE,iBAAiB,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAoG1E,gBAAgB,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAmGzE,oBAAoB,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA8D7E,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB9D,cAAc,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YAsD/D,cAAc;YAmBd,kBAAkB;IAqChC,OAAO,CAAC,mBAAmB;YAeb,2BAA2B;YA4B3B,oBAAoB;CA4EnC"}
|
|
@@ -264,8 +264,6 @@ class ChatController {
|
|
|
264
264
|
logger_1.default.info(`๐ Searching KB: query="${userMessageContent.substring(0, 50)}...", companyId=${companyId}`);
|
|
265
265
|
const searchResults = await aiService.knowledgeBaseService.search(userMessageContent, {
|
|
266
266
|
limit: 5,
|
|
267
|
-
threshold: 0.5, // Balanced precision/recall (0.5 is industry standard)
|
|
268
|
-
type: 'semantic', // Modern RAG best practice: semantic-only for better context
|
|
269
267
|
company_id: companyId
|
|
270
268
|
});
|
|
271
269
|
logger_1.default.info(`๐ Found knowledge base results: ${searchResults.length}`);
|
|
@@ -831,75 +829,33 @@ class ChatController {
|
|
|
831
829
|
return true;
|
|
832
830
|
}
|
|
833
831
|
logger_1.default.info(`๐งพ Intent result: ${result.intent}${result.needsGuardrail ? ' (guardrail triggered)' : ''}`);
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
// Get assistant name and organization from environment
|
|
845
|
-
const assistantName = process.env.ASSISTANT_NAME || 'AI Assistant';
|
|
846
|
-
const orgName = process.env.ORGANIZATION_NAME || 'Your Organization';
|
|
847
|
-
await this.respondWithAssistantMessage({
|
|
848
|
-
conversation,
|
|
849
|
-
conversationId,
|
|
850
|
-
parentMessageId: userMessage.id,
|
|
851
|
-
content: `I'm ${assistantName}, your AI assistant for ${orgName}. I help teams understand and work with the ${orgName} platform by answering questions about features, documentation, and technical details. How can I assist you today?`
|
|
852
|
-
}, res);
|
|
853
|
-
return true;
|
|
854
|
-
case 'clarification':
|
|
855
|
-
await this.respondWithAssistantMessage({
|
|
856
|
-
conversation,
|
|
857
|
-
conversationId,
|
|
858
|
-
parentMessageId: userMessage.id,
|
|
859
|
-
content: "I'm not sure I understood. Could you clarify what you need help with?"
|
|
860
|
-
}, res);
|
|
861
|
-
return true;
|
|
862
|
-
case 'guardrail':
|
|
863
|
-
await this.respondWithAssistantMessage({
|
|
864
|
-
conversation,
|
|
865
|
-
conversationId,
|
|
866
|
-
parentMessageId: userMessage.id,
|
|
867
|
-
content: `I can help with documentation or implementation guidance, but I can't share credentials or confidential configuration. Please contact your system administrator or support for access.`
|
|
868
|
-
}, res);
|
|
869
|
-
return true;
|
|
870
|
-
case 'human_support_email':
|
|
871
|
-
await this.respondWithAssistantMessage({
|
|
872
|
-
conversation,
|
|
873
|
-
conversationId,
|
|
874
|
-
parentMessageId: userMessage.id,
|
|
875
|
-
content: `Thanks for sharing your email. Our team will reach out soonโresponse times may vary depending on support volume.`
|
|
876
|
-
}, res);
|
|
877
|
-
logger_1.default.info('๐จ Recorded human support email from user.');
|
|
878
|
-
return true;
|
|
879
|
-
case 'human_support_request':
|
|
880
|
-
if (result.contactEmail) {
|
|
881
|
-
await this.respondWithAssistantMessage({
|
|
882
|
-
conversation,
|
|
883
|
-
conversationId,
|
|
884
|
-
parentMessageId: userMessage.id,
|
|
885
|
-
content: `Thanks for sharing your email. Our team will reach out soonโresponse times may vary depending on support volume.`
|
|
886
|
-
}, res);
|
|
887
|
-
logger_1.default.info('๐จ Human support request with email handled in a single step.');
|
|
888
|
-
}
|
|
889
|
-
else {
|
|
890
|
-
await this.respondWithAssistantMessage({
|
|
891
|
-
conversation,
|
|
892
|
-
conversationId,
|
|
893
|
-
parentMessageId: userMessage.id,
|
|
894
|
-
content: 'I can connect you with a human teammate. Please share your email address so we can follow up.'
|
|
895
|
-
}, res);
|
|
896
|
-
logger_1.default.info('๐ Human support requested; awaiting email from user.');
|
|
897
|
-
}
|
|
898
|
-
return true;
|
|
899
|
-
default:
|
|
900
|
-
logger_1.default.info('๐ Intent requires knowledge lookup; proceeding with RAG flow.');
|
|
901
|
-
return false;
|
|
832
|
+
// For non-knowledge intents, use LLM-generated response from intent classification
|
|
833
|
+
if (result.intent !== 'knowledge') {
|
|
834
|
+
const responseContent = result.response || this.getFallbackResponse(result.intent);
|
|
835
|
+
await this.respondWithAssistantMessage({
|
|
836
|
+
conversation,
|
|
837
|
+
conversationId,
|
|
838
|
+
parentMessageId: userMessage.id,
|
|
839
|
+
content: responseContent
|
|
840
|
+
}, res);
|
|
841
|
+
return true;
|
|
902
842
|
}
|
|
843
|
+
// Knowledge intent - proceed to RAG flow
|
|
844
|
+
logger_1.default.info('๐ Intent requires knowledge lookup; proceeding with RAG flow.');
|
|
845
|
+
return false;
|
|
846
|
+
}
|
|
847
|
+
getFallbackResponse(intent) {
|
|
848
|
+
// Fallback responses in case LLM doesn't generate one (shouldn't happen, but safety net)
|
|
849
|
+
const fallbacks = {
|
|
850
|
+
greeting: 'Hello! How can I help you today?',
|
|
851
|
+
acknowledgment: "You're welcome! Let me know if you need anything else.",
|
|
852
|
+
personality: `I'm ${process.env.ASSISTANT_NAME || 'AI Assistant'}, your AI assistant for ${process.env.ORGANIZATION_NAME || 'Your Organization'}.`,
|
|
853
|
+
clarification: "I'm not sure I understood. Could you clarify what you need help with?",
|
|
854
|
+
guardrail: "I can help with documentation or implementation guidance, but I can't share credentials or confidential configuration.",
|
|
855
|
+
human_support_request: "I'd be happy to connect you with our support team. Could you please provide your email address?",
|
|
856
|
+
human_support_email: "Thank you! Our support team will reach out to you shortly."
|
|
857
|
+
};
|
|
858
|
+
return fallbacks[intent] || "I'm here to help. What would you like to know?";
|
|
903
859
|
}
|
|
904
860
|
async respondWithAssistantMessage(payload, res) {
|
|
905
861
|
const assistantMessage = await this.saveAssistantMessage({
|