@vezlo/assistant-server 2.11.0 → 2.12.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 +11 -1
- package/database-schema.sql +33 -7
- package/dist/src/bootstrap/initializeServices.d.ts +4 -0
- package/dist/src/bootstrap/initializeServices.d.ts.map +1 -1
- package/dist/src/bootstrap/initializeServices.js +13 -5
- package/dist/src/bootstrap/initializeServices.js.map +1 -1
- package/dist/src/config/defaultAISettings.d.ts +20 -0
- package/dist/src/config/defaultAISettings.d.ts.map +1 -0
- package/dist/src/config/defaultAISettings.js +52 -0
- package/dist/src/config/defaultAISettings.js.map +1 -0
- package/dist/src/controllers/AISettingsController.d.ts +22 -0
- package/dist/src/controllers/AISettingsController.d.ts.map +1 -0
- package/dist/src/controllers/AISettingsController.js +119 -0
- package/dist/src/controllers/AISettingsController.js.map +1 -0
- package/dist/src/controllers/ChatController.d.ts +3 -0
- package/dist/src/controllers/ChatController.d.ts.map +1 -1
- package/dist/src/controllers/ChatController.js +60 -4
- package/dist/src/controllers/ChatController.js.map +1 -1
- package/dist/src/controllers/DatabaseToolConfigController.d.ts.map +1 -1
- package/dist/src/controllers/DatabaseToolConfigController.js +61 -12
- package/dist/src/controllers/DatabaseToolConfigController.js.map +1 -1
- package/dist/src/migrations/011_create_database_tool_configs.d.ts.map +1 -1
- package/dist/src/migrations/011_create_database_tool_configs.js +11 -9
- package/dist/src/migrations/011_create_database_tool_configs.js.map +1 -1
- package/dist/src/migrations/012_create_ai_settings.d.ts +4 -0
- package/dist/src/migrations/012_create_ai_settings.d.ts.map +1 -0
- package/dist/src/migrations/012_create_ai_settings.js +36 -0
- package/dist/src/migrations/012_create_ai_settings.js.map +1 -0
- package/dist/src/server.js +130 -0
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/AIService.d.ts +7 -2
- package/dist/src/services/AIService.d.ts.map +1 -1
- package/dist/src/services/AIService.js +43 -66
- package/dist/src/services/AIService.js.map +1 -1
- package/dist/src/services/AISettingsService.d.ts +45 -0
- package/dist/src/services/AISettingsService.d.ts.map +1 -0
- package/dist/src/services/AISettingsService.js +162 -0
- package/dist/src/services/AISettingsService.js.map +1 -0
- package/dist/src/services/DatabaseToolConfigService.d.ts +19 -17
- package/dist/src/services/DatabaseToolConfigService.d.ts.map +1 -1
- package/dist/src/services/DatabaseToolConfigService.js +34 -25
- package/dist/src/services/DatabaseToolConfigService.js.map +1 -1
- package/dist/src/services/IntentService.d.ts +7 -2
- package/dist/src/services/IntentService.d.ts.map +1 -1
- package/dist/src/services/IntentService.js +51 -28
- package/dist/src/services/IntentService.js.map +1 -1
- package/dist/src/services/PromptService.d.ts +59 -0
- package/dist/src/services/PromptService.d.ts.map +1 -0
- package/dist/src/services/PromptService.js +199 -0
- package/dist/src/services/PromptService.js.map +1 -0
- package/dist/src/services/ResponseGenerationService.d.ts +13 -0
- package/dist/src/services/ResponseGenerationService.d.ts.map +1 -1
- package/dist/src/services/ResponseGenerationService.js +10 -2
- package/dist/src/services/ResponseGenerationService.js.map +1 -1
- package/dist/src/services/SetupService.d.ts.map +1 -1
- package/dist/src/services/SetupService.js +10 -0
- package/dist/src/services/SetupService.js.map +1 -1
- package/env.example +2 -0
- package/package.json +3 -1
- package/scripts/seed-ai-settings.js +120 -0
package/README.md
CHANGED
|
@@ -177,6 +177,9 @@ curl "http://localhost:3000/api/migrate?key=$MIGRATION_SECRET_KEY"
|
|
|
177
177
|
# Create default admin user and company (if not exists)
|
|
178
178
|
npm run seed-default
|
|
179
179
|
|
|
180
|
+
# Seed AI settings for existing companies (optional, auto-created for new companies)
|
|
181
|
+
npm run seed-ai-settings
|
|
182
|
+
|
|
180
183
|
# Generate API key for library integration
|
|
181
184
|
npm run generate-key
|
|
182
185
|
```
|
|
@@ -351,6 +354,13 @@ Creates default admin user and company.
|
|
|
351
354
|
vezlo-seed-default
|
|
352
355
|
```
|
|
353
356
|
|
|
357
|
+
### vezlo-seed-ai-settings
|
|
358
|
+
Seeds or updates AI settings for all existing companies with default values.
|
|
359
|
+
|
|
360
|
+
```bash
|
|
361
|
+
vezlo-seed-ai-settings
|
|
362
|
+
```
|
|
363
|
+
|
|
354
364
|
### vezlo-generate-key
|
|
355
365
|
Generates API key for the default admin's company. The API key is used by src-to-kb library.
|
|
356
366
|
|
|
@@ -738,4 +748,4 @@ This project is dual-licensed:
|
|
|
738
748
|
|
|
739
749
|
---
|
|
740
750
|
|
|
741
|
-
**Status**: ✅ Production Ready | **Version**: 2.
|
|
751
|
+
**Status**: ✅ Production Ready | **Version**: 2.12.0 | **Node.js**: 20+ | **TypeScript**: 5+
|
package/database-schema.sql
CHANGED
|
@@ -70,6 +70,10 @@ INSERT INTO knex_migrations (name, batch, migration_time)
|
|
|
70
70
|
SELECT '011_create_database_tool_configs.ts', 1, NOW()
|
|
71
71
|
WHERE NOT EXISTS (SELECT 1 FROM knex_migrations WHERE name = '011_create_database_tool_configs.ts');
|
|
72
72
|
|
|
73
|
+
INSERT INTO knex_migrations (name, batch, migration_time)
|
|
74
|
+
SELECT '012_create_ai_settings.ts', 1, NOW()
|
|
75
|
+
WHERE NOT EXISTS (SELECT 1 FROM knex_migrations WHERE name = '012_create_ai_settings.ts');
|
|
76
|
+
|
|
73
77
|
-- Set migration lock to unlocked (0 = unlocked, 1 = locked)
|
|
74
78
|
INSERT INTO knex_migrations_lock (index, is_locked)
|
|
75
79
|
VALUES (1, 0)
|
|
@@ -628,21 +632,24 @@ $$;
|
|
|
628
632
|
|
|
629
633
|
-- External database configurations
|
|
630
634
|
CREATE TABLE IF NOT EXISTS vezlo_database_tool_configs (
|
|
631
|
-
id
|
|
635
|
+
id BIGSERIAL PRIMARY KEY,
|
|
636
|
+
uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
|
|
632
637
|
company_id BIGINT NOT NULL REFERENCES vezlo_companies(id) ON DELETE CASCADE,
|
|
633
638
|
db_url_encrypted TEXT NOT NULL,
|
|
634
639
|
db_key_encrypted TEXT NOT NULL,
|
|
635
640
|
enabled BOOLEAN DEFAULT true,
|
|
636
|
-
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
637
|
-
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
641
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
642
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
638
643
|
);
|
|
639
644
|
|
|
640
645
|
CREATE INDEX IF NOT EXISTS idx_database_tool_configs_company_id ON vezlo_database_tool_configs(company_id);
|
|
646
|
+
CREATE INDEX IF NOT EXISTS idx_database_tool_configs_uuid ON vezlo_database_tool_configs(uuid);
|
|
641
647
|
|
|
642
648
|
-- Individual tool configurations
|
|
643
649
|
CREATE TABLE IF NOT EXISTS vezlo_database_tools (
|
|
644
|
-
id
|
|
645
|
-
|
|
650
|
+
id BIGSERIAL PRIMARY KEY,
|
|
651
|
+
uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
|
|
652
|
+
config_id BIGINT NOT NULL REFERENCES vezlo_database_tool_configs(id) ON DELETE CASCADE,
|
|
646
653
|
table_name TEXT NOT NULL,
|
|
647
654
|
tool_name TEXT NOT NULL,
|
|
648
655
|
tool_description TEXT,
|
|
@@ -654,10 +661,29 @@ CREATE TABLE IF NOT EXISTS vezlo_database_tools (
|
|
|
654
661
|
user_filter_column TEXT,
|
|
655
662
|
user_filter_type TEXT,
|
|
656
663
|
user_context_key TEXT,
|
|
657
|
-
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
658
|
-
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
664
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
665
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
659
666
|
UNIQUE(config_id, table_name)
|
|
660
667
|
);
|
|
661
668
|
|
|
662
669
|
CREATE INDEX IF NOT EXISTS idx_database_tools_config_id ON vezlo_database_tools(config_id);
|
|
670
|
+
CREATE INDEX IF NOT EXISTS idx_database_tools_uuid ON vezlo_database_tools(uuid);
|
|
663
671
|
CREATE INDEX IF NOT EXISTS idx_database_tools_enabled ON vezlo_database_tools(enabled);
|
|
672
|
+
|
|
673
|
+
-- ============================================================================
|
|
674
|
+
-- AI SETTINGS TABLE
|
|
675
|
+
-- ============================================================================
|
|
676
|
+
|
|
677
|
+
-- AI configuration settings per company
|
|
678
|
+
CREATE TABLE IF NOT EXISTS vezlo_ai_settings (
|
|
679
|
+
id BIGSERIAL PRIMARY KEY,
|
|
680
|
+
uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
|
|
681
|
+
company_id BIGINT NOT NULL REFERENCES vezlo_companies(id) ON DELETE CASCADE,
|
|
682
|
+
settings JSONB NOT NULL DEFAULT '{"model":"gpt-4o-mini","temperature":0.7,"max_tokens":1000,"top_k":null,"prompts":{"personality":"","response_guidelines":"","interaction_etiquette":"","scope_of_assistance":"","formatting_and_presentation":""}}',
|
|
683
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
684
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
685
|
+
UNIQUE(company_id)
|
|
686
|
+
);
|
|
687
|
+
|
|
688
|
+
CREATE INDEX IF NOT EXISTS idx_ai_settings_company_id ON vezlo_ai_settings(company_id);
|
|
689
|
+
CREATE INDEX IF NOT EXISTS idx_ai_settings_uuid ON vezlo_ai_settings(uuid);
|
|
@@ -16,6 +16,8 @@ import { SlackController } from '../controllers/SlackController';
|
|
|
16
16
|
import { ValidationService } from '../services/ValidationService';
|
|
17
17
|
import { DatabaseToolConfigService } from '../services/DatabaseToolConfigService';
|
|
18
18
|
import { DatabaseToolConfigController } from '../controllers/DatabaseToolConfigController';
|
|
19
|
+
import { AISettingsService } from '../services/AISettingsService';
|
|
20
|
+
import { AISettingsController } from '../controllers/AISettingsController';
|
|
19
21
|
export interface ServiceInitOptions {
|
|
20
22
|
supabase: SupabaseClient;
|
|
21
23
|
tablePrefix?: string;
|
|
@@ -36,6 +38,7 @@ export interface InitializedCoreServices {
|
|
|
36
38
|
validationService: ValidationService;
|
|
37
39
|
databaseToolService: any;
|
|
38
40
|
databaseToolConfigService: DatabaseToolConfigService;
|
|
41
|
+
aiSettingsService: AISettingsService;
|
|
39
42
|
};
|
|
40
43
|
controllers: {
|
|
41
44
|
chatController: ChatController;
|
|
@@ -45,6 +48,7 @@ export interface InitializedCoreServices {
|
|
|
45
48
|
companyController: CompanyController;
|
|
46
49
|
slackController: SlackController;
|
|
47
50
|
databaseToolConfigController: DatabaseToolConfigController;
|
|
51
|
+
aiSettingsController: AISettingsController;
|
|
48
52
|
};
|
|
49
53
|
config: {
|
|
50
54
|
chatHistoryLength: number;
|
|
@@ -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,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,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;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;
|
|
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,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,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;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,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;QAC7B,cAAc,EAAE,cAAc,CAAC;QAC/B,eAAe,EAAE,eAAe,CAAC;QACjC,YAAY,EAAE,YAAY,CAAC;QAC3B,iBAAiB,EAAE,iBAAiB,CAAC;QACrC,mBAAmB,EAAE,GAAG,CAAC;QACzB,yBAAyB,EAAE,yBAAyB,CAAC;QACrD,iBAAiB,EAAE,iBAAiB,CAAC;KACtC,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;QACnC,iBAAiB,EAAE,iBAAiB,CAAC;QACrC,eAAe,EAAE,eAAe,CAAC;QACjC,4BAA4B,EAAE,4BAA4B,CAAC;QAC3D,oBAAoB,EAAE,oBAAoB,CAAC;KAC5C,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,CAqJ3F"}
|
|
@@ -26,6 +26,8 @@ const ValidationService_1 = require("../services/ValidationService");
|
|
|
26
26
|
const DatabaseToolService_1 = require("../services/DatabaseToolService");
|
|
27
27
|
const DatabaseToolConfigService_1 = require("../services/DatabaseToolConfigService");
|
|
28
28
|
const DatabaseToolConfigController_1 = require("../controllers/DatabaseToolConfigController");
|
|
29
|
+
const AISettingsService_1 = require("../services/AISettingsService");
|
|
30
|
+
const AISettingsController_1 = require("../controllers/AISettingsController");
|
|
29
31
|
const DEFAULT_CHAT_HISTORY_LENGTH = 2;
|
|
30
32
|
const DEFAULT_CONVERSATION_TIMEOUT = 3600000; // 1 hour
|
|
31
33
|
function getChatHistoryLength() {
|
|
@@ -92,8 +94,7 @@ function initializeCoreServices(options) {
|
|
|
92
94
|
openaiApiKey: process.env.OPENAI_API_KEY,
|
|
93
95
|
model: aiModel,
|
|
94
96
|
assistantName: process.env.ASSISTANT_NAME,
|
|
95
|
-
organizationName: process.env.ORGANIZATION_NAME
|
|
96
|
-
databaseToolsEnabled: process.env.EXTERNAL_DB_ENABLED === 'true'
|
|
97
|
+
organizationName: process.env.ORGANIZATION_NAME
|
|
97
98
|
});
|
|
98
99
|
// Initialize realtime publisher if env vars are available
|
|
99
100
|
let realtimePublisher;
|
|
@@ -106,12 +107,17 @@ function initializeCoreServices(options) {
|
|
|
106
107
|
}
|
|
107
108
|
// Initialize Validation service
|
|
108
109
|
const validationService = new ValidationService_1.ValidationService(process.env.AI_VALIDATION_ENABLED === 'true');
|
|
110
|
+
// Initialize AI Settings service first (needed by ChatController)
|
|
111
|
+
const aiSettingsService = new AISettingsService_1.AISettingsService(supabase);
|
|
112
|
+
const aiSettingsController = new AISettingsController_1.AISettingsController(aiSettingsService);
|
|
113
|
+
logger_1.default.info('✅ AI Settings service initialized');
|
|
109
114
|
const chatController = new ChatController_1.ChatController(chatManager, storage, supabase, {
|
|
110
115
|
historyLength: resolvedHistoryLength,
|
|
111
116
|
intentService,
|
|
112
117
|
realtimePublisher,
|
|
113
118
|
validationService,
|
|
114
|
-
databaseToolService
|
|
119
|
+
databaseToolService,
|
|
120
|
+
aiSettingsService
|
|
115
121
|
});
|
|
116
122
|
const knowledgeController = new KnowledgeController_1.KnowledgeController(knowledgeBase, aiService, citationService);
|
|
117
123
|
const authController = new AuthController_1.AuthController(supabase);
|
|
@@ -136,7 +142,8 @@ function initializeCoreServices(options) {
|
|
|
136
142
|
slackService,
|
|
137
143
|
databaseToolService,
|
|
138
144
|
validationService,
|
|
139
|
-
databaseToolConfigService
|
|
145
|
+
databaseToolConfigService,
|
|
146
|
+
aiSettingsService
|
|
140
147
|
},
|
|
141
148
|
controllers: {
|
|
142
149
|
chatController,
|
|
@@ -145,7 +152,8 @@ function initializeCoreServices(options) {
|
|
|
145
152
|
apiKeyController,
|
|
146
153
|
companyController,
|
|
147
154
|
slackController,
|
|
148
|
-
databaseToolConfigController
|
|
155
|
+
databaseToolConfigController,
|
|
156
|
+
aiSettingsController
|
|
149
157
|
},
|
|
150
158
|
config: {
|
|
151
159
|
chatHistoryLength: resolvedHistoryLength
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initializeServices.js","sourceRoot":"","sources":["../../../src/bootstrap/initializeServices.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"initializeServices.js","sourceRoot":"","sources":["../../../src/bootstrap/initializeServices.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default AI Settings
|
|
3
|
+
* These values are seeded into the database for new companies
|
|
4
|
+
*/
|
|
5
|
+
export interface AIPrompts {
|
|
6
|
+
personality: string;
|
|
7
|
+
response_guidelines: string;
|
|
8
|
+
interaction_etiquette: string;
|
|
9
|
+
scope_of_assistance: string;
|
|
10
|
+
formatting_and_presentation: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AISettings {
|
|
13
|
+
model: string;
|
|
14
|
+
temperature: number;
|
|
15
|
+
max_tokens: number;
|
|
16
|
+
top_k: number | null;
|
|
17
|
+
prompts: AIPrompts;
|
|
18
|
+
}
|
|
19
|
+
export declare const DEFAULT_AI_SETTINGS: AISettings;
|
|
20
|
+
//# sourceMappingURL=defaultAISettings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultAISettings.d.ts","sourceRoot":"","sources":["../../../src/config/defaultAISettings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2BAA2B,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,eAAO,MAAM,mBAAmB,EAAE,UA+CjC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Default AI Settings
|
|
4
|
+
* These values are seeded into the database for new companies
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DEFAULT_AI_SETTINGS = void 0;
|
|
8
|
+
exports.DEFAULT_AI_SETTINGS = {
|
|
9
|
+
model: 'gpt-4o-mini',
|
|
10
|
+
temperature: 0.7,
|
|
11
|
+
max_tokens: 1000,
|
|
12
|
+
top_k: null,
|
|
13
|
+
prompts: {
|
|
14
|
+
personality: `You are a professional and helpful AI assistant focused on providing accurate, clear information.
|
|
15
|
+
|
|
16
|
+
- Balance expertise with approachability
|
|
17
|
+
- Be patient and ensure users feel heard
|
|
18
|
+
- Focus on practical solutions
|
|
19
|
+
- Be transparent about limitations`,
|
|
20
|
+
response_guidelines: `**Response Standards:**
|
|
21
|
+
- Provide clear, concise answers based on available information
|
|
22
|
+
- Use structured formatting when helpful
|
|
23
|
+
- Cite sources from knowledge base when applicable
|
|
24
|
+
- Avoid speculation or assumptions
|
|
25
|
+
- Acknowledge incomplete information and suggest next steps`,
|
|
26
|
+
interaction_etiquette: `**Communication Standards:**
|
|
27
|
+
- Be respectful and courteous
|
|
28
|
+
- Listen carefully before responding
|
|
29
|
+
- Use clear, jargon-free language unless technical terms are needed
|
|
30
|
+
- Show empathy when users express challenges
|
|
31
|
+
- Use a friendly, conversational tone`,
|
|
32
|
+
scope_of_assistance: `**You Can Help With:**
|
|
33
|
+
- Questions about products, services, and features
|
|
34
|
+
- Guidance on workflows and processes
|
|
35
|
+
- Troubleshooting common issues
|
|
36
|
+
- Directing to relevant documentation
|
|
37
|
+
|
|
38
|
+
**You Should NOT:**
|
|
39
|
+
- Make promises on behalf of the organization
|
|
40
|
+
- Share sensitive or confidential information
|
|
41
|
+
- Provide financial, legal, or medical advice
|
|
42
|
+
- Override established policies`,
|
|
43
|
+
formatting_and_presentation: `**Format Guidelines:**
|
|
44
|
+
- Use **headings (##)** for major sections
|
|
45
|
+
- Use **bullet points (-)** for lists
|
|
46
|
+
- Use **numbered lists (1., 2., 3.)** for steps
|
|
47
|
+
- Use **code blocks (\`\`\`)** for technical references
|
|
48
|
+
- Keep paragraphs short and scannable
|
|
49
|
+
- Use **bold** for key points`
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=defaultAISettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultAISettings.js","sourceRoot":"","sources":["../../../src/config/defaultAISettings.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAkBU,QAAA,mBAAmB,GAAe;IAC7C,KAAK,EAAE,aAAa;IACpB,WAAW,EAAE,GAAG;IAChB,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,IAAI;IACX,OAAO,EAAE;QACP,WAAW,EAAE;;;;;mCAKkB;QAE/B,mBAAmB,EAAE;;;;;4DAKmC;QAExD,qBAAqB,EAAE;;;;;sCAKW;QAElC,mBAAmB,EAAE;;;;;;;;;;gCAUO;QAE5B,2BAA2B,EAAE;;;;;;8BAMH;KAC3B;CACF,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Response } from 'express';
|
|
2
|
+
import { AuthenticatedRequest } from '../middleware/auth';
|
|
3
|
+
import { AISettingsService } from '../services/AISettingsService';
|
|
4
|
+
/**
|
|
5
|
+
* AISettingsController
|
|
6
|
+
* Protected controller for managing company-specific AI settings
|
|
7
|
+
*/
|
|
8
|
+
export declare class AISettingsController {
|
|
9
|
+
private aiSettingsService;
|
|
10
|
+
constructor(aiSettingsService: AISettingsService);
|
|
11
|
+
/**
|
|
12
|
+
* GET /api/companies/:companyUuid/ai-settings
|
|
13
|
+
* Get AI settings for a company
|
|
14
|
+
*/
|
|
15
|
+
getSettings(req: AuthenticatedRequest, res: Response): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* PUT /api/companies/:companyUuid/ai-settings
|
|
18
|
+
* Update AI settings for a company
|
|
19
|
+
*/
|
|
20
|
+
updateSettings(req: AuthenticatedRequest, res: Response): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=AISettingsController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AISettingsController.d.ts","sourceRoot":"","sources":["../../../src/controllers/AISettingsController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAIlE;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,iBAAiB,CAAoB;gBAEjC,iBAAiB,EAAE,iBAAiB;IAIhD;;;OAGG;IACG,WAAW,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC1E;;;OAGG;IACG,cAAc,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAuE9E"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AISettingsController = void 0;
|
|
7
|
+
const logger_1 = __importDefault(require("../config/logger"));
|
|
8
|
+
/**
|
|
9
|
+
* AISettingsController
|
|
10
|
+
* Protected controller for managing company-specific AI settings
|
|
11
|
+
*/
|
|
12
|
+
class AISettingsController {
|
|
13
|
+
constructor(aiSettingsService) {
|
|
14
|
+
this.aiSettingsService = aiSettingsService;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* GET /api/companies/:companyUuid/ai-settings
|
|
18
|
+
* Get AI settings for a company
|
|
19
|
+
*/
|
|
20
|
+
async getSettings(req, res) {
|
|
21
|
+
try {
|
|
22
|
+
const companyUuid = Array.isArray(req.params.companyUuid)
|
|
23
|
+
? req.params.companyUuid[0]
|
|
24
|
+
: req.params.companyUuid;
|
|
25
|
+
if (!companyUuid) {
|
|
26
|
+
res.status(400).json({ error: 'Company UUID is required' });
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Verify user has access to this company
|
|
30
|
+
if (req.profile?.companyUuid !== companyUuid) {
|
|
31
|
+
logger_1.default.warn(`Unauthorized access attempt to AI settings for company: ${companyUuid}`);
|
|
32
|
+
res.status(403).json({ error: 'Unauthorized access to this company\'s settings' });
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const settings = await this.aiSettingsService.getSettingsByCompanyUuid(companyUuid);
|
|
36
|
+
logger_1.default.info(`✅ AI settings retrieved for company: ${companyUuid}`);
|
|
37
|
+
res.json({
|
|
38
|
+
success: true,
|
|
39
|
+
settings
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
logger_1.default.error('Error getting AI settings:', error);
|
|
44
|
+
res.status(500).json({
|
|
45
|
+
error: 'Failed to get AI settings',
|
|
46
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* PUT /api/companies/:companyUuid/ai-settings
|
|
52
|
+
* Update AI settings for a company
|
|
53
|
+
*/
|
|
54
|
+
async updateSettings(req, res) {
|
|
55
|
+
try {
|
|
56
|
+
const companyUuid = Array.isArray(req.params.companyUuid)
|
|
57
|
+
? req.params.companyUuid[0]
|
|
58
|
+
: req.params.companyUuid;
|
|
59
|
+
if (!companyUuid) {
|
|
60
|
+
res.status(400).json({ error: 'Company UUID is required' });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Verify user has access to this company and is admin
|
|
64
|
+
if (req.profile?.companyUuid !== companyUuid) {
|
|
65
|
+
logger_1.default.warn(`Unauthorized access attempt to update AI settings for company: ${companyUuid}`);
|
|
66
|
+
res.status(403).json({ error: 'Unauthorized access to this company\'s settings' });
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (req.profile?.role !== 'admin') {
|
|
70
|
+
logger_1.default.warn(`Non-admin user attempted to update AI settings: ${req.user?.uuid}`);
|
|
71
|
+
res.status(403).json({ error: 'Only admins can update AI settings' });
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const settingsUpdate = req.body;
|
|
75
|
+
// Validate settings structure
|
|
76
|
+
if (settingsUpdate.temperature !== undefined) {
|
|
77
|
+
if (typeof settingsUpdate.temperature !== 'number' ||
|
|
78
|
+
settingsUpdate.temperature < 0 ||
|
|
79
|
+
settingsUpdate.temperature > 2) {
|
|
80
|
+
res.status(400).json({ error: 'Temperature must be a number between 0 and 2' });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (settingsUpdate.max_tokens !== undefined) {
|
|
85
|
+
if (typeof settingsUpdate.max_tokens !== 'number' ||
|
|
86
|
+
settingsUpdate.max_tokens < 1 ||
|
|
87
|
+
settingsUpdate.max_tokens > 16000) {
|
|
88
|
+
res.status(400).json({ error: 'Max tokens must be a number between 1 and 16000' });
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (settingsUpdate.model !== undefined) {
|
|
93
|
+
const allowedModels = ['gpt-4o-mini', 'gpt-4o', 'gpt-4-turbo', 'gpt-3.5-turbo'];
|
|
94
|
+
if (!allowedModels.includes(settingsUpdate.model)) {
|
|
95
|
+
res.status(400).json({
|
|
96
|
+
error: 'Invalid model',
|
|
97
|
+
allowedModels
|
|
98
|
+
});
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const updatedSettings = await this.aiSettingsService.updateSettings(companyUuid, settingsUpdate);
|
|
103
|
+
logger_1.default.info(`✅ AI settings updated for company: ${companyUuid} by user: ${req.user?.uuid}`);
|
|
104
|
+
res.json({
|
|
105
|
+
success: true,
|
|
106
|
+
settings: updatedSettings
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
logger_1.default.error('Error updating AI settings:', error);
|
|
111
|
+
res.status(500).json({
|
|
112
|
+
error: 'Failed to update AI settings',
|
|
113
|
+
message: error instanceof Error ? error.message : 'Unknown error'
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.AISettingsController = AISettingsController;
|
|
119
|
+
//# sourceMappingURL=AISettingsController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AISettingsController.js","sourceRoot":"","sources":["../../../src/controllers/AISettingsController.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { IntentService } from '../services/IntentService';
|
|
|
7
7
|
import { RealtimePublisher } from '../services/RealtimePublisher';
|
|
8
8
|
import { ValidationService } from '../services/ValidationService';
|
|
9
9
|
import { DatabaseToolService } from '../services/DatabaseToolService';
|
|
10
|
+
import { AISettingsService } from '../services/AISettingsService';
|
|
10
11
|
export declare class ChatController {
|
|
11
12
|
private chatManager;
|
|
12
13
|
private storage;
|
|
@@ -18,12 +19,14 @@ export declare class ChatController {
|
|
|
18
19
|
private responseStreamingService;
|
|
19
20
|
private validationService?;
|
|
20
21
|
private databaseToolService?;
|
|
22
|
+
private aiSettingsService?;
|
|
21
23
|
constructor(chatManager: ChatManager, storage: UnifiedStorage, supabase: SupabaseClient, options?: {
|
|
22
24
|
historyLength?: number;
|
|
23
25
|
intentService?: IntentService;
|
|
24
26
|
realtimePublisher?: RealtimePublisher;
|
|
25
27
|
validationService?: ValidationService;
|
|
26
28
|
databaseToolService?: DatabaseToolService;
|
|
29
|
+
aiSettingsService?: AISettingsService;
|
|
27
30
|
});
|
|
28
31
|
createConversation(req: AuthenticatedRequest, res: Response): Promise<void>;
|
|
29
32
|
createUserMessage(req: Request, res: Response): Promise<void>;
|
|
@@ -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,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatController.d.ts","sourceRoot":"","sources":["../../../src/controllers/ChatController.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@ class ChatController {
|
|
|
18
18
|
this.realtimePublisher = options.realtimePublisher;
|
|
19
19
|
this.validationService = options.validationService;
|
|
20
20
|
this.databaseToolService = options.databaseToolService;
|
|
21
|
+
this.aiSettingsService = options.aiSettingsService;
|
|
21
22
|
// Initialize services
|
|
22
23
|
const aiService = chatManager.aiService;
|
|
23
24
|
this.responseGenerationService = new ResponseGenerationService_1.ResponseGenerationService(this.intentService, aiService, this.chatHistoryLength, this.databaseToolService);
|
|
@@ -264,8 +265,59 @@ class ChatController {
|
|
|
264
265
|
}
|
|
265
266
|
// Set up Server-Sent Events (SSE) headers for streaming
|
|
266
267
|
this.responseStreamingService.setupSSEHeaders(res);
|
|
267
|
-
//
|
|
268
|
+
// Load and apply AI settings for this company before generating response
|
|
268
269
|
const companyId = conversation?.organizationId ? parseInt(String(conversation.organizationId), 10) : undefined;
|
|
270
|
+
// Try to get company UUID from profile or fetch from database using companyId
|
|
271
|
+
let companyUuid = req.profile?.companyUuid;
|
|
272
|
+
if (!companyUuid && companyId && this.aiSettingsService) {
|
|
273
|
+
// Fallback: fetch company UUID from database using companyId
|
|
274
|
+
try {
|
|
275
|
+
const { data: company } = await this.supabase
|
|
276
|
+
.from('vezlo_companies')
|
|
277
|
+
.select('uuid')
|
|
278
|
+
.eq('id', companyId)
|
|
279
|
+
.single();
|
|
280
|
+
if (company) {
|
|
281
|
+
companyUuid = company.uuid;
|
|
282
|
+
logger_1.default.info(`🔍 Fetched company UUID from database: ${companyUuid}`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
logger_1.default.warn('⚠️ Failed to fetch company UUID from database:', error);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (this.aiSettingsService && companyUuid) {
|
|
290
|
+
try {
|
|
291
|
+
logger_1.default.info(`🔍 Loading AI settings for company: ${companyUuid}`);
|
|
292
|
+
const aiSettings = await this.aiSettingsService.getSettingsByCompanyUuid(companyUuid);
|
|
293
|
+
logger_1.default.info(`📦 AI Settings loaded:`, {
|
|
294
|
+
model: aiSettings.model,
|
|
295
|
+
temperature: aiSettings.temperature,
|
|
296
|
+
max_tokens: aiSettings.max_tokens,
|
|
297
|
+
hasPrompts: !!aiSettings.prompts,
|
|
298
|
+
promptKeys: aiSettings.prompts ? Object.keys(aiSettings.prompts) : []
|
|
299
|
+
});
|
|
300
|
+
const aiService = this.responseGenerationService.getAIService();
|
|
301
|
+
if (aiService) {
|
|
302
|
+
aiService.setAISettings(aiSettings);
|
|
303
|
+
logger_1.default.info(`✅ AI settings applied to AIService for company: ${companyUuid}`);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
logger_1.default.warn('⚠️ AIService not available in ResponseGenerationService');
|
|
307
|
+
}
|
|
308
|
+
// Also set ALL AI settings prompts in ResponseGenerationService for intent classification
|
|
309
|
+
if (aiSettings.prompts) {
|
|
310
|
+
this.responseGenerationService.setAISettingsPrompts(aiSettings.prompts);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
logger_1.default.warn('⚠️ Failed to load AI settings, using defaults:', error);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
logger_1.default.warn(`⚠️ Cannot load AI settings: aiSettingsService=${!!this.aiSettingsService}, companyUuid=${companyUuid}, companyId=${companyId}`);
|
|
319
|
+
}
|
|
320
|
+
// Run intent classification to decide handling strategy (with dynamic tools)
|
|
269
321
|
const intentResult = await this.responseGenerationService.classifyIntent(userMessageContent, messages, companyId);
|
|
270
322
|
const intentResponse = this.responseGenerationService.handleIntentResult(intentResult, userMessageContent);
|
|
271
323
|
let accumulatedContent = '';
|
|
@@ -298,9 +350,13 @@ class ChatController {
|
|
|
298
350
|
if (!aiService) {
|
|
299
351
|
throw new Error('AI service not available');
|
|
300
352
|
}
|
|
353
|
+
// Get AI settings from the AI service (model, temperature)
|
|
354
|
+
const aiSettings = aiService.aiSettings;
|
|
355
|
+
const modelToUse = aiSettings?.model || process.env.AI_MODEL || 'gpt-4o-mini';
|
|
356
|
+
const temperature = aiSettings?.temperature ?? parseFloat(process.env.AI_TEMPERATURE || '0.7');
|
|
357
|
+
const maxTokens = parseInt(process.env.AI_MAX_TOKENS || '500', 10);
|
|
301
358
|
// Direct OpenAI call bypassing the restrictive system prompt
|
|
302
359
|
const openai = aiService.openai;
|
|
303
|
-
const modelToUse = process.env.AI_MODEL || 'gpt-4o-mini';
|
|
304
360
|
const completion = await openai.chat.completions.create({
|
|
305
361
|
model: modelToUse,
|
|
306
362
|
messages: [
|
|
@@ -318,8 +374,8 @@ ${JSON.stringify(toolResult.data || toolResult, null, 2)}
|
|
|
318
374
|
Provide a natural, friendly response to the user's question using this data.`
|
|
319
375
|
}
|
|
320
376
|
],
|
|
321
|
-
temperature
|
|
322
|
-
max_tokens:
|
|
377
|
+
temperature,
|
|
378
|
+
max_tokens: maxTokens
|
|
323
379
|
});
|
|
324
380
|
const formattedContent = completion.choices[0]?.message?.content || 'Here is your information.';
|
|
325
381
|
logger_1.default.info('📤 Streaming database tool response');
|