briyah 1.0.6 → 1.0.8
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 +32 -22
- package/dist/server/src/ai/LLM/anthropic.service.js +19 -15
- package/dist/server/src/ai/LLM/base-ai.service.js +5 -4
- package/dist/server/src/ai/LLM/deepseek.service.js +11 -13
- package/dist/server/src/ai/LLM/fal.service.js +20 -24
- package/dist/server/src/ai/LLM/googleai.service.js +13 -15
- package/dist/server/src/ai/LLM/grok.service.js +12 -14
- package/dist/server/src/ai/LLM/mock.service.js +9 -11
- package/dist/server/src/ai/LLM/openai.service.js +18 -20
- package/dist/server/src/ai/LLM/together.service.js +14 -13
- package/dist/server/src/ai/LLM/vertexai.service.js +12 -14
- package/dist/server/src/ai/agent-store.service.js +12 -11
- package/dist/server/src/ai/artifact.service.js +7 -6
- package/dist/server/src/ai/attached-file.service.js +8 -7
- package/dist/server/src/ai/model_prices.d.ts +1 -2
- package/dist/server/src/ai/model_prices.js +15 -14
- package/dist/server/src/ai/published-agents.service.js +6 -5
- package/dist/server/src/app/balance.service.js +7 -6
- package/dist/server/src/app/stripe.controller.js +12 -11
- package/dist/server/src/app/stripe.service.js +20 -19
- package/dist/server/src/app/transaction.service.js +6 -5
- package/dist/server/src/app/user-service-manager.js +6 -5
- package/dist/server/src/app.controller.js +95 -94
- package/dist/server/src/app.service.js +31 -30
- package/dist/server/src/auth/auth.controller.js +21 -20
- package/dist/server/src/auth/jwt-auth.guard.js +4 -3
- package/dist/server/src/auth/rate-limit.service.d.ts +0 -1
- package/dist/server/src/auth/rate-limit.service.js +6 -7
- package/dist/server/src/auth/twilio.service.js +4 -3
- package/dist/server/src/auth/users.service.js +6 -5
- package/dist/server/src/common/logger.d.ts +21 -0
- package/dist/server/src/common/logger.js +83 -0
- package/dist/server/src/config/configuration.service.js +1 -1
- package/dist/server/src/room/artifact-store.service.d.ts +0 -1
- package/dist/server/src/room/artifact-store.service.js +16 -17
- package/dist/server/src/room/published-rooms.service.js +5 -3
- package/dist/server/src/room/room-store.service.js +17 -16
- package/dist/server/src/room/room.js +14 -13
- package/dist/server/src/sdk/briyah-config.d.ts +7 -0
- package/dist/server/src/sdk/briyah-config.js +2 -0
- package/dist/server/src/sdk/briyah.js +14 -5
- package/dist/server/src/sdk/index.d.ts +2 -1
- package/dist/server/src/story/story-progress.service.js +2 -1
- package/dist/server/src/story/story-store.service.js +28 -27
- package/dist/server/src/story/story.service.js +113 -112
- package/docs/.nojekyll +1 -0
- package/docs/assets/hierarchy.js +1 -0
- package/docs/assets/highlight.css +106 -0
- package/docs/assets/icons.js +18 -0
- package/docs/assets/icons.svg +1 -0
- package/docs/assets/main.js +60 -0
- package/docs/assets/navigation.js +1 -0
- package/docs/assets/search.js +1 -0
- package/docs/assets/style.css +1633 -0
- package/docs/classes/Agent.html +87 -0
- package/docs/classes/Briyah.html +64 -0
- package/docs/classes/BriyahConfigService.html +12 -0
- package/docs/classes/Room.html +119 -0
- package/docs/enums/MessageAction.html +13 -0
- package/docs/hierarchy.html +1 -0
- package/docs/index.html +136 -0
- package/docs/interfaces/AgentInfo.html +17 -0
- package/docs/interfaces/AgentMessagesResponse.html +5 -0
- package/docs/interfaces/AppService.html +680 -0
- package/docs/interfaces/ArtifactMetadata.html +8 -0
- package/docs/interfaces/AttachDocumentResponse.html +3 -0
- package/docs/interfaces/BriyahConfigOptions.html +16 -0
- package/docs/interfaces/ChapterInfo.html +3 -0
- package/docs/interfaces/Character.html +7 -0
- package/docs/interfaces/CreateAgentResponse.html +2 -0
- package/docs/interfaces/CreateRoomResponse.html +3 -0
- package/docs/interfaces/CreateStoryResponse.html +2 -0
- package/docs/interfaces/FileList.html +2 -0
- package/docs/interfaces/LoggingOptions.html +9 -0
- package/docs/interfaces/Message.html +6 -0
- package/docs/interfaces/ModelInfo.html +5 -0
- package/docs/interfaces/PreparedPromptResponse.html +3 -0
- package/docs/interfaces/ProcessTextResponse.html +7 -0
- package/docs/interfaces/PromptFile.html +3 -0
- package/docs/interfaces/PromptFileContent.html +3 -0
- package/docs/interfaces/PromptFilesResponse.html +2 -0
- package/docs/interfaces/PromptFolder.html +3 -0
- package/docs/interfaces/PromptFoldersResponse.html +2 -0
- package/docs/interfaces/RoomDetails.html +9 -0
- package/docs/interfaces/RoomInfo.html +5 -0
- package/docs/interfaces/RoomMessagesResponse.html +3 -0
- package/docs/interfaces/StoryIdea.html +5 -0
- package/docs/interfaces/StoryInfo.html +21 -0
- package/docs/interfaces/StoryState.html +9 -0
- package/docs/modules.html +1 -0
- package/docs/types/PromptScope.html +1 -0
- package/package.json +6 -3
- package/data/common/config/story_ideas.txt +0 -6
|
@@ -8,17 +8,15 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
12
|
exports.GrokAiService = void 0;
|
|
16
13
|
const common_1 = require("@nestjs/common");
|
|
17
14
|
const openai_1 = require("openai");
|
|
18
15
|
const openai_2 = require("openai");
|
|
19
16
|
const base_ai_service_1 = require("./base-ai.service");
|
|
20
|
-
const model_prices_1 =
|
|
17
|
+
const model_prices_1 = require("../model_prices");
|
|
21
18
|
const errors_1 = require("../../common/errors");
|
|
19
|
+
const logger_1 = require("../../common/logger");
|
|
22
20
|
let GrokAiService = class GrokAiService extends base_ai_service_1.BaseAiService {
|
|
23
21
|
openai;
|
|
24
22
|
constructor() {
|
|
@@ -26,7 +24,6 @@ let GrokAiService = class GrokAiService extends base_ai_service_1.BaseAiService
|
|
|
26
24
|
try {
|
|
27
25
|
const apiKey = process.env['XAI_API_KEY'];
|
|
28
26
|
if (!apiKey) {
|
|
29
|
-
console.warn('XAI_API_KEY environment variable not set. Grok service will not be available.');
|
|
30
27
|
this._isAvailable = false;
|
|
31
28
|
return;
|
|
32
29
|
}
|
|
@@ -37,9 +34,10 @@ let GrokAiService = class GrokAiService extends base_ai_service_1.BaseAiService
|
|
|
37
34
|
maxRetries: 3,
|
|
38
35
|
};
|
|
39
36
|
this.openai = new openai_1.OpenAI(options);
|
|
37
|
+
logger_1.logger.debug('Grok service initialized successfully');
|
|
40
38
|
}
|
|
41
39
|
catch (error) {
|
|
42
|
-
|
|
40
|
+
logger_1.logger.error('Error initializing Grok service:', error);
|
|
43
41
|
this._isAvailable = false;
|
|
44
42
|
}
|
|
45
43
|
}
|
|
@@ -96,10 +94,10 @@ let GrokAiService = class GrokAiService extends base_ai_service_1.BaseAiService
|
|
|
96
94
|
metadata.serviceMetadata?.resourceId) {
|
|
97
95
|
try {
|
|
98
96
|
await this.openai.files.delete(metadata.serviceMetadata.resourceId);
|
|
99
|
-
|
|
97
|
+
logger_1.logger.log(`Deleted Grok file ${metadata.serviceMetadata.resourceId} for agent ${agent.id}`);
|
|
100
98
|
}
|
|
101
99
|
catch (error) {
|
|
102
|
-
|
|
100
|
+
logger_1.logger.error(`Error deleting Grok file ${metadata.serviceMetadata.resourceId}:`, error);
|
|
103
101
|
}
|
|
104
102
|
}
|
|
105
103
|
}
|
|
@@ -198,7 +196,7 @@ let GrokAiService = class GrokAiService extends base_ai_service_1.BaseAiService
|
|
|
198
196
|
}
|
|
199
197
|
}
|
|
200
198
|
catch (error) {
|
|
201
|
-
|
|
199
|
+
logger_1.logger.error(error);
|
|
202
200
|
throw error;
|
|
203
201
|
}
|
|
204
202
|
if (saveResponse) {
|
|
@@ -229,12 +227,12 @@ let GrokAiService = class GrokAiService extends base_ai_service_1.BaseAiService
|
|
|
229
227
|
const cachedTokens = usage.prompt_tokens_details?.cached_tokens || 0;
|
|
230
228
|
const uncachedPromptTokens = totalPromptTokens - cachedTokens;
|
|
231
229
|
const completionTokens = usage.completion_tokens || 0;
|
|
232
|
-
let modelInfo = model_prices_1.
|
|
230
|
+
let modelInfo = (0, model_prices_1.getModelPrices)()[agent.modelName];
|
|
233
231
|
if (!modelInfo && !agent.modelName.startsWith('xai/')) {
|
|
234
|
-
modelInfo = model_prices_1.
|
|
232
|
+
modelInfo = (0, model_prices_1.getModelPrices)()[`xai/${agent.modelName}`];
|
|
235
233
|
}
|
|
236
234
|
if (!modelInfo) {
|
|
237
|
-
|
|
235
|
+
logger_1.logger.error(`No price info found for model ${agent.modelName} or xai/${agent.modelName}`);
|
|
238
236
|
return;
|
|
239
237
|
}
|
|
240
238
|
const uncachedCost = uncachedPromptTokens * modelInfo.input_cost_per_token;
|
|
@@ -247,9 +245,9 @@ let GrokAiService = class GrokAiService extends base_ai_service_1.BaseAiService
|
|
|
247
245
|
agent.totalOutputTokens += completionTokens;
|
|
248
246
|
agent.totalCost += cost;
|
|
249
247
|
agent.totalMarkup += markup;
|
|
250
|
-
|
|
248
|
+
logger_1.logger.log(`Cost for ${agent.agentName} message: ${cost} (markup: ${markup.toFixed(4)})`);
|
|
251
249
|
if (cachedTokens > 0) {
|
|
252
|
-
|
|
250
|
+
logger_1.logger.log(`Cache metrics for ${agent.agentName}: cached=${cachedTokens}, uncached=${uncachedPromptTokens}`);
|
|
253
251
|
}
|
|
254
252
|
if (agent.balanceService && cost > 0) {
|
|
255
253
|
agent.balanceService.decrementBalance(cost, markup);
|
|
@@ -41,15 +41,13 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
41
41
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
42
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
43
|
};
|
|
44
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
-
};
|
|
47
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
45
|
exports.MockAiService = void 0;
|
|
49
46
|
const common_1 = require("@nestjs/common");
|
|
50
47
|
const base_ai_service_1 = require("./base-ai.service");
|
|
51
48
|
const fs = __importStar(require("fs"));
|
|
52
|
-
const model_prices_1 =
|
|
49
|
+
const model_prices_1 = require("../model_prices");
|
|
50
|
+
const logger_1 = require("../../common/logger");
|
|
53
51
|
let MockAiService = class MockAiService extends base_ai_service_1.BaseAiService {
|
|
54
52
|
constructor() {
|
|
55
53
|
super();
|
|
@@ -72,7 +70,7 @@ let MockAiService = class MockAiService extends base_ai_service_1.BaseAiService
|
|
|
72
70
|
async preparedPrompt(agent, promptFileName, variables, saveResponse = true, _cacheConfig = null) {
|
|
73
71
|
const mockFile = this.findPromptFile(agent, promptFileName, '.mock');
|
|
74
72
|
if (!mockFile) {
|
|
75
|
-
|
|
73
|
+
logger_1.logger.warn(`Mock file '${promptFileName}.mock' not found for agent '${agent.agentName}'. Using generic response.`);
|
|
76
74
|
const preparedPrompt = this.getPreparedPrompt(agent, promptFileName, variables);
|
|
77
75
|
const jsonSchema = this.getPreparedSchema(agent, promptFileName);
|
|
78
76
|
return this.textPrompt(agent, preparedPrompt, jsonSchema, saveResponse);
|
|
@@ -91,7 +89,7 @@ let MockAiService = class MockAiService extends base_ai_service_1.BaseAiService
|
|
|
91
89
|
return parsedResponse;
|
|
92
90
|
}
|
|
93
91
|
catch (error) {
|
|
94
|
-
|
|
92
|
+
logger_1.logger.error(`Error parsing mock JSON response from ${mockFile}:`, error);
|
|
95
93
|
throw new Error(`Invalid JSON in mock file: ${mockFile}`);
|
|
96
94
|
}
|
|
97
95
|
}
|
|
@@ -125,7 +123,7 @@ let MockAiService = class MockAiService extends base_ai_service_1.BaseAiService
|
|
|
125
123
|
const mockFileBaseName = this.getMockFile(promptFileName, prompt, variables);
|
|
126
124
|
const mockFile = this.findPromptFile(agent, mockFileBaseName, '.mock');
|
|
127
125
|
if (!mockFile) {
|
|
128
|
-
|
|
126
|
+
logger_1.logger.warn(`Mock file '${mockFile}' not found for agent '${agent.agentName}'. Using generic response.`);
|
|
129
127
|
return this.textPrompt(agent, prompt || 'Mock prompt', null, saveResponse, cacheConfig);
|
|
130
128
|
}
|
|
131
129
|
const mockResponse = fs.readFileSync(mockFile).toString('utf8');
|
|
@@ -141,7 +139,7 @@ let MockAiService = class MockAiService extends base_ai_service_1.BaseAiService
|
|
|
141
139
|
return parsedResponse;
|
|
142
140
|
}
|
|
143
141
|
catch (error) {
|
|
144
|
-
|
|
142
|
+
logger_1.logger.error(`Error parsing mock JSON response from ${mockFile}:`, error);
|
|
145
143
|
throw new Error(`Invalid JSON in mock file: ${mockFile}`);
|
|
146
144
|
}
|
|
147
145
|
}
|
|
@@ -168,9 +166,9 @@ let MockAiService = class MockAiService extends base_ai_service_1.BaseAiService
|
|
|
168
166
|
async trackMockCosts(agent, prompt, response) {
|
|
169
167
|
const inputTokens = Math.max(100, Math.floor(prompt.length / 4));
|
|
170
168
|
const outputTokens = Math.max(50, Math.floor(response.length / 4));
|
|
171
|
-
const modelInfo = model_prices_1.
|
|
169
|
+
const modelInfo = (0, model_prices_1.getModelPrices)()['mock-fast-v1'];
|
|
172
170
|
if (!modelInfo) {
|
|
173
|
-
|
|
171
|
+
logger_1.logger.warn('Mock model pricing not found in model_prices.ts');
|
|
174
172
|
return;
|
|
175
173
|
}
|
|
176
174
|
const inputCost = inputTokens * modelInfo.input_cost_per_token;
|
|
@@ -181,7 +179,7 @@ let MockAiService = class MockAiService extends base_ai_service_1.BaseAiService
|
|
|
181
179
|
agent.totalInputTokens += inputTokens;
|
|
182
180
|
agent.totalOutputTokens += outputTokens;
|
|
183
181
|
agent.totalMarkup += markup;
|
|
184
|
-
|
|
182
|
+
logger_1.logger.log(`Cost for ${agent.agentName} message: ${totalCost} (markup: ${markup.toFixed(4)})`);
|
|
185
183
|
if (agent.balanceService) {
|
|
186
184
|
await agent.balanceService.decrementBalance(totalCost, markup);
|
|
187
185
|
}
|
|
@@ -8,17 +8,15 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
12
|
exports.OpenAiService = void 0;
|
|
16
13
|
const common_1 = require("@nestjs/common");
|
|
17
14
|
const openai_1 = require("openai");
|
|
18
15
|
const base_ai_service_1 = require("./base-ai.service");
|
|
19
16
|
const openai_2 = require("openai");
|
|
20
|
-
const model_prices_1 =
|
|
17
|
+
const model_prices_1 = require("../model_prices");
|
|
21
18
|
const errors_1 = require("../../common/errors");
|
|
19
|
+
const logger_1 = require("../../common/logger");
|
|
22
20
|
let OpenAiService = class OpenAiService extends base_ai_service_1.BaseAiService {
|
|
23
21
|
openai;
|
|
24
22
|
constructor() {
|
|
@@ -26,7 +24,6 @@ let OpenAiService = class OpenAiService extends base_ai_service_1.BaseAiService
|
|
|
26
24
|
try {
|
|
27
25
|
const apiKey = process.env['OPENAI_API_KEY'];
|
|
28
26
|
if (!apiKey) {
|
|
29
|
-
console.warn('OPENAI_API_KEY environment variable not set. OpenAI service will not be available.');
|
|
30
27
|
this._isAvailable = false;
|
|
31
28
|
return;
|
|
32
29
|
}
|
|
@@ -39,9 +36,10 @@ let OpenAiService = class OpenAiService extends base_ai_service_1.BaseAiService
|
|
|
39
36
|
options.organization = process.env.OPENAI_ORGANIZATION_ID;
|
|
40
37
|
}
|
|
41
38
|
this.openai = new openai_2.OpenAI(options);
|
|
39
|
+
logger_1.logger.debug('OpenAI service initialized successfully');
|
|
42
40
|
}
|
|
43
41
|
catch (error) {
|
|
44
|
-
|
|
42
|
+
logger_1.logger.error('Error initializing OpenAI service:', error);
|
|
45
43
|
this._isAvailable = false;
|
|
46
44
|
}
|
|
47
45
|
}
|
|
@@ -71,10 +69,10 @@ let OpenAiService = class OpenAiService extends base_ai_service_1.BaseAiService
|
|
|
71
69
|
if (agent.vectorStore) {
|
|
72
70
|
try {
|
|
73
71
|
await this.openai.vectorStores.delete(agent.vectorStore.id);
|
|
74
|
-
|
|
72
|
+
logger_1.logger.log(`Deleted vector store for agent ${agent.id}`);
|
|
75
73
|
}
|
|
76
74
|
catch (error) {
|
|
77
|
-
|
|
75
|
+
logger_1.logger.error(`Error deleting vector store for agent ${agent.id}:`, error);
|
|
78
76
|
}
|
|
79
77
|
}
|
|
80
78
|
for (const metadata of agent.attachedFiles) {
|
|
@@ -82,10 +80,10 @@ let OpenAiService = class OpenAiService extends base_ai_service_1.BaseAiService
|
|
|
82
80
|
metadata.serviceMetadata?.resourceId) {
|
|
83
81
|
try {
|
|
84
82
|
await this.openai.files.delete(metadata.serviceMetadata.resourceId);
|
|
85
|
-
|
|
83
|
+
logger_1.logger.log(`Deleted OpenAI file ${metadata.serviceMetadata.resourceId} for agent ${agent.id}`);
|
|
86
84
|
}
|
|
87
85
|
catch (error) {
|
|
88
|
-
|
|
86
|
+
logger_1.logger.error(`Error deleting OpenAI file ${metadata.serviceMetadata.resourceId}:`, error);
|
|
89
87
|
}
|
|
90
88
|
}
|
|
91
89
|
}
|
|
@@ -189,7 +187,7 @@ let OpenAiService = class OpenAiService extends base_ai_service_1.BaseAiService
|
|
|
189
187
|
}
|
|
190
188
|
}
|
|
191
189
|
catch (error) {
|
|
192
|
-
|
|
190
|
+
logger_1.logger.error(error);
|
|
193
191
|
throw error;
|
|
194
192
|
}
|
|
195
193
|
if (saveResponse) {
|
|
@@ -294,9 +292,9 @@ let OpenAiService = class OpenAiService extends base_ai_service_1.BaseAiService
|
|
|
294
292
|
const cachedTokens = usage.input_tokens_details?.cached_tokens || 0;
|
|
295
293
|
const uncachedInputTokens = totalInputTokens - cachedTokens;
|
|
296
294
|
const outputTokens = usage.output_tokens || 0;
|
|
297
|
-
const modelInfo = model_prices_1.
|
|
295
|
+
const modelInfo = (0, model_prices_1.getModelPrices)()[agent.modelName];
|
|
298
296
|
if (!modelInfo) {
|
|
299
|
-
|
|
297
|
+
logger_1.logger.error(`No price info found for model ${agent.modelName}`);
|
|
300
298
|
return;
|
|
301
299
|
}
|
|
302
300
|
const uncachedCost = uncachedInputTokens * modelInfo.input_cost_per_token;
|
|
@@ -309,18 +307,18 @@ let OpenAiService = class OpenAiService extends base_ai_service_1.BaseAiService
|
|
|
309
307
|
agent.totalOutputTokens += outputTokens;
|
|
310
308
|
agent.totalCost += cost;
|
|
311
309
|
agent.totalMarkup += markup;
|
|
312
|
-
|
|
310
|
+
logger_1.logger.log(`Cost for ${agent.agentName} message: ${cost} (markup: ${markup.toFixed(4)})`);
|
|
313
311
|
if (cachedTokens > 0) {
|
|
314
|
-
|
|
312
|
+
logger_1.logger.log(`Cache metrics for ${agent.agentName}: cached=${cachedTokens}, uncached=${uncachedInputTokens}`);
|
|
315
313
|
}
|
|
316
314
|
if (agent.balanceService && cost > 0) {
|
|
317
315
|
agent.balanceService.decrementBalance(cost, markup);
|
|
318
316
|
}
|
|
319
317
|
}
|
|
320
318
|
computeImageCost(agent, usage) {
|
|
321
|
-
const modelInfo = model_prices_1.
|
|
319
|
+
const modelInfo = (0, model_prices_1.getModelPrices)()[agent.modelName];
|
|
322
320
|
if (!modelInfo) {
|
|
323
|
-
|
|
321
|
+
logger_1.logger.error(`No price info found for model ${agent.modelName}`);
|
|
324
322
|
return;
|
|
325
323
|
}
|
|
326
324
|
const inputImageTokens = usage.input_tokens_details?.image_tokens || 0;
|
|
@@ -365,7 +363,7 @@ let OpenAiService = class OpenAiService extends base_ai_service_1.BaseAiService
|
|
|
365
363
|
const cost = inputCost + outputCost + markup;
|
|
366
364
|
agent.totalCost += cost;
|
|
367
365
|
agent.totalMarkup += markup;
|
|
368
|
-
|
|
366
|
+
logger_1.logger.log(`Cost for image generation: ${cost} (markup: ${markup.toFixed(4)})`);
|
|
369
367
|
if (agent.balanceService && cost > 0) {
|
|
370
368
|
agent.balanceService.decrementBalance(cost, markup);
|
|
371
369
|
}
|
|
@@ -408,8 +406,8 @@ let OpenAiService = class OpenAiService extends base_ai_service_1.BaseAiService
|
|
|
408
406
|
return { artifactId };
|
|
409
407
|
}
|
|
410
408
|
catch (error) {
|
|
411
|
-
|
|
412
|
-
|
|
409
|
+
logger_1.logger.error('Error generating image:', error);
|
|
410
|
+
logger_1.logger.log(prompt);
|
|
413
411
|
return { error };
|
|
414
412
|
}
|
|
415
413
|
}
|
|
@@ -16,8 +16,9 @@ exports.TogetherAiService = void 0;
|
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
17
|
const together_ai_1 = __importDefault(require("together-ai"));
|
|
18
18
|
const base_ai_service_1 = require("./base-ai.service");
|
|
19
|
-
const model_prices_1 =
|
|
19
|
+
const model_prices_1 = require("../model_prices");
|
|
20
20
|
const errors_1 = require("../../common/errors");
|
|
21
|
+
const logger_1 = require("../../common/logger");
|
|
21
22
|
let TogetherAiService = class TogetherAiService extends base_ai_service_1.BaseAiService {
|
|
22
23
|
togetherClient;
|
|
23
24
|
constructor() {
|
|
@@ -25,7 +26,6 @@ let TogetherAiService = class TogetherAiService extends base_ai_service_1.BaseAi
|
|
|
25
26
|
try {
|
|
26
27
|
const apiKey = process.env['TOGETHER_API_KEY'];
|
|
27
28
|
if (!apiKey) {
|
|
28
|
-
console.warn('TOGETHER_API_KEY environment variable not set. Together AI service will not be available.');
|
|
29
29
|
this._isAvailable = false;
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
@@ -34,9 +34,10 @@ let TogetherAiService = class TogetherAiService extends base_ai_service_1.BaseAi
|
|
|
34
34
|
timeout: 600000,
|
|
35
35
|
maxRetries: 3,
|
|
36
36
|
});
|
|
37
|
+
logger_1.logger.debug('TogetherAI service initialized successfully');
|
|
37
38
|
}
|
|
38
39
|
catch (error) {
|
|
39
|
-
|
|
40
|
+
logger_1.logger.error('Error initializing Together AI service:', error);
|
|
40
41
|
this._isAvailable = false;
|
|
41
42
|
}
|
|
42
43
|
}
|
|
@@ -142,7 +143,7 @@ let TogetherAiService = class TogetherAiService extends base_ai_service_1.BaseAi
|
|
|
142
143
|
}
|
|
143
144
|
}
|
|
144
145
|
catch (error) {
|
|
145
|
-
|
|
146
|
+
logger_1.logger.error('Error calling Together AI:', error);
|
|
146
147
|
throw error;
|
|
147
148
|
}
|
|
148
149
|
if (saveResponse) {
|
|
@@ -157,12 +158,12 @@ let TogetherAiService = class TogetherAiService extends base_ai_service_1.BaseAi
|
|
|
157
158
|
computeMessageCost(agent, usage) {
|
|
158
159
|
const promptTokens = usage.prompt_tokens || 0;
|
|
159
160
|
const completionTokens = usage.completion_tokens || 0;
|
|
160
|
-
let modelInfo = model_prices_1.
|
|
161
|
+
let modelInfo = (0, model_prices_1.getModelPrices)()[agent.modelName];
|
|
161
162
|
if (!modelInfo && !agent.modelName.startsWith('together_ai/')) {
|
|
162
|
-
modelInfo = model_prices_1.
|
|
163
|
+
modelInfo = (0, model_prices_1.getModelPrices)()[`together_ai/${agent.modelName}`];
|
|
163
164
|
}
|
|
164
165
|
if (!modelInfo) {
|
|
165
|
-
|
|
166
|
+
logger_1.logger.error(`No price info found for model ${agent.modelName} or together_ai/${agent.modelName}`);
|
|
166
167
|
return;
|
|
167
168
|
}
|
|
168
169
|
const inputCost = promptTokens * modelInfo.input_cost_per_token;
|
|
@@ -173,15 +174,15 @@ let TogetherAiService = class TogetherAiService extends base_ai_service_1.BaseAi
|
|
|
173
174
|
agent.totalOutputTokens += completionTokens;
|
|
174
175
|
agent.totalCost += cost;
|
|
175
176
|
agent.totalMarkup += markup;
|
|
176
|
-
|
|
177
|
+
logger_1.logger.log(`Cost for ${agent.agentName} message: ${cost} (markup: ${markup.toFixed(4)})`);
|
|
177
178
|
if (agent.balanceService && cost > 0) {
|
|
178
179
|
agent.balanceService.decrementBalance(cost, markup);
|
|
179
180
|
}
|
|
180
181
|
}
|
|
181
182
|
computeImageCost(agent, usage) {
|
|
182
|
-
const modelInfo = model_prices_1.
|
|
183
|
+
const modelInfo = (0, model_prices_1.getModelPrices)()[agent.modelName];
|
|
183
184
|
if (!modelInfo) {
|
|
184
|
-
|
|
185
|
+
logger_1.logger.error(`No price info found for model ${agent.modelName}`);
|
|
185
186
|
return;
|
|
186
187
|
}
|
|
187
188
|
const inputImageTokens = usage.input_tokens_details?.image_tokens || 0;
|
|
@@ -226,7 +227,7 @@ let TogetherAiService = class TogetherAiService extends base_ai_service_1.BaseAi
|
|
|
226
227
|
const cost = inputCost + outputCost + markup;
|
|
227
228
|
agent.totalCost += cost;
|
|
228
229
|
agent.totalMarkup += markup;
|
|
229
|
-
|
|
230
|
+
logger_1.logger.log(`Cost for image generation: ${cost} (markup: ${markup.toFixed(4)})`);
|
|
230
231
|
if (agent.balanceService && cost > 0) {
|
|
231
232
|
agent.balanceService.decrementBalance(cost, markup);
|
|
232
233
|
}
|
|
@@ -272,8 +273,8 @@ let TogetherAiService = class TogetherAiService extends base_ai_service_1.BaseAi
|
|
|
272
273
|
return { artifactId };
|
|
273
274
|
}
|
|
274
275
|
catch (error) {
|
|
275
|
-
|
|
276
|
-
|
|
276
|
+
logger_1.logger.error('Error generating image:', error.error?.message || error.message);
|
|
277
|
+
logger_1.logger.log(prompt);
|
|
277
278
|
return { error };
|
|
278
279
|
}
|
|
279
280
|
}
|
|
@@ -8,9 +8,6 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
12
|
exports.VertexAiService = void 0;
|
|
16
13
|
const common_1 = require("@nestjs/common");
|
|
@@ -18,15 +15,15 @@ const vertexai_1 = require("@google-cloud/vertexai");
|
|
|
18
15
|
const storage_1 = require("@google-cloud/storage");
|
|
19
16
|
const crypto_1 = require("crypto");
|
|
20
17
|
const base_ai_service_1 = require("./base-ai.service");
|
|
21
|
-
const model_prices_1 =
|
|
18
|
+
const model_prices_1 = require("../model_prices");
|
|
22
19
|
const errors_1 = require("../../common/errors");
|
|
20
|
+
const logger_1 = require("../../common/logger");
|
|
23
21
|
let VertexAiService = class VertexAiService extends base_ai_service_1.BaseAiService {
|
|
24
22
|
vertexAI = null;
|
|
25
23
|
constructor() {
|
|
26
24
|
super();
|
|
27
25
|
try {
|
|
28
26
|
if (!process.env.GOOGLE_PROJECT_ID || !process.env.GOOGLE_CLOUD_LOCATION) {
|
|
29
|
-
console.warn('GOOGLE_PROJECT_ID and GOOGLE_CLOUD_LOCATION environment variables are required for Vertex AI service. Service will not be available.');
|
|
30
27
|
this._isAvailable = false;
|
|
31
28
|
return;
|
|
32
29
|
}
|
|
@@ -34,9 +31,10 @@ let VertexAiService = class VertexAiService extends base_ai_service_1.BaseAiServ
|
|
|
34
31
|
project: process.env.GOOGLE_PROJECT_ID,
|
|
35
32
|
location: process.env.GOOGLE_CLOUD_LOCATION,
|
|
36
33
|
});
|
|
34
|
+
logger_1.logger.debug('Vertex AI service initialized successfully');
|
|
37
35
|
}
|
|
38
36
|
catch (error) {
|
|
39
|
-
|
|
37
|
+
logger_1.logger.error('Error initializing Vertex AI service:', error);
|
|
40
38
|
this._isAvailable = false;
|
|
41
39
|
}
|
|
42
40
|
}
|
|
@@ -92,7 +90,7 @@ let VertexAiService = class VertexAiService extends base_ai_service_1.BaseAiServ
|
|
|
92
90
|
await file.save(Buffer.from(fileContents), {
|
|
93
91
|
metadata: { contentType: 'application/octet-stream' },
|
|
94
92
|
});
|
|
95
|
-
|
|
93
|
+
logger_1.logger.log(`Successfully uploaded ${fileName} to ${bucketName}`);
|
|
96
94
|
return `gs://${bucketName}/${fileName}`;
|
|
97
95
|
}
|
|
98
96
|
addToConversationHistory(agent, message, fromSelf = false) {
|
|
@@ -189,7 +187,7 @@ let VertexAiService = class VertexAiService extends base_ai_service_1.BaseAiServ
|
|
|
189
187
|
resp = await generativeModel.generateContent({ contents: messages });
|
|
190
188
|
}
|
|
191
189
|
catch (error) {
|
|
192
|
-
|
|
190
|
+
logger_1.logger.error(error);
|
|
193
191
|
return error.message;
|
|
194
192
|
}
|
|
195
193
|
let responseText = resp.response.candidates[0].content.parts[0].text;
|
|
@@ -213,9 +211,9 @@ let VertexAiService = class VertexAiService extends base_ai_service_1.BaseAiServ
|
|
|
213
211
|
computeMessageCost(agent, usage) {
|
|
214
212
|
const inputTokens = usage.promptTokenCount || 0;
|
|
215
213
|
const outputTokens = usage.candidatesTokenCount || 0;
|
|
216
|
-
const modelInfo = model_prices_1.
|
|
214
|
+
const modelInfo = (0, model_prices_1.getModelPrices)()[agent.modelName];
|
|
217
215
|
if (!modelInfo) {
|
|
218
|
-
|
|
216
|
+
logger_1.logger.error(`No price info found for model ${agent.modelName}`);
|
|
219
217
|
return;
|
|
220
218
|
}
|
|
221
219
|
const inputCost = inputTokens * modelInfo.input_cost_per_token;
|
|
@@ -226,7 +224,7 @@ let VertexAiService = class VertexAiService extends base_ai_service_1.BaseAiServ
|
|
|
226
224
|
agent.totalOutputTokens += outputTokens;
|
|
227
225
|
agent.totalCost += cost;
|
|
228
226
|
agent.totalMarkup += markup;
|
|
229
|
-
|
|
227
|
+
logger_1.logger.log(`Cost for ${agent.agentName} message: ${cost} (markup: ${markup.toFixed(4)})`);
|
|
230
228
|
if (agent.balanceService && cost > 0) {
|
|
231
229
|
agent.balanceService.decrementBalance(cost, markup);
|
|
232
230
|
}
|
|
@@ -245,7 +243,7 @@ let VertexAiService = class VertexAiService extends base_ai_service_1.BaseAiServ
|
|
|
245
243
|
let gsUri;
|
|
246
244
|
if (existingMetadata?.serviceMetadata?.uri) {
|
|
247
245
|
gsUri = existingMetadata.serviceMetadata.uri;
|
|
248
|
-
|
|
246
|
+
logger_1.logger.log(`Using existing Google Cloud Storage file: ${gsUri}`);
|
|
249
247
|
}
|
|
250
248
|
else {
|
|
251
249
|
gsUri = await this.uploadFile(fileData);
|
|
@@ -306,11 +304,11 @@ let VertexAiService = class VertexAiService extends base_ai_service_1.BaseAiServ
|
|
|
306
304
|
const bucket = storage.bucket(bucketName);
|
|
307
305
|
const file = bucket.file(fileName);
|
|
308
306
|
await file.delete();
|
|
309
|
-
|
|
307
|
+
logger_1.logger.log(`Deleted Google Cloud Storage file ${uri} for agent ${agent.id}`);
|
|
310
308
|
}
|
|
311
309
|
}
|
|
312
310
|
catch (error) {
|
|
313
|
-
|
|
311
|
+
logger_1.logger.error(`Error deleting Google Cloud Storage file ${metadata.serviceMetadata.uri}:`, error);
|
|
314
312
|
}
|
|
315
313
|
}
|
|
316
314
|
}
|
|
@@ -53,6 +53,7 @@ const artifact_service_1 = require("./artifact.service");
|
|
|
53
53
|
const configuration_service_1 = require("../config/configuration.service");
|
|
54
54
|
const attached_file_service_1 = require("./attached-file.service");
|
|
55
55
|
const balance_service_1 = require("../app/balance.service");
|
|
56
|
+
const logger_1 = require("../common/logger");
|
|
56
57
|
let AgentStoreService = class AgentStoreService {
|
|
57
58
|
aiFactoryService;
|
|
58
59
|
configService;
|
|
@@ -103,7 +104,7 @@ let AgentStoreService = class AgentStoreService {
|
|
|
103
104
|
agent.aiService.finishAgent(agent);
|
|
104
105
|
}
|
|
105
106
|
catch (error) {
|
|
106
|
-
|
|
107
|
+
logger_1.logger.error(`Error finishing agent ${id}:`, error);
|
|
107
108
|
}
|
|
108
109
|
}
|
|
109
110
|
this.attachedFileService.deleteAllFiles(agent.id);
|
|
@@ -212,20 +213,20 @@ let AgentStoreService = class AgentStoreService {
|
|
|
212
213
|
await fs.promises.access(storageDir);
|
|
213
214
|
}
|
|
214
215
|
catch {
|
|
215
|
-
|
|
216
|
+
logger_1.logger.log(`Agent storage directory not found: ${storageDir}`);
|
|
216
217
|
await fs.promises.mkdir(storageDir, { recursive: true });
|
|
217
218
|
return;
|
|
218
219
|
}
|
|
219
220
|
const allFiles = await fs.promises.readdir(storageDir);
|
|
220
221
|
const files = allFiles.filter((file) => file.endsWith('.json'));
|
|
221
|
-
|
|
222
|
+
logger_1.logger.log(`Loading ${files.length} agents from ${storageDir}`);
|
|
222
223
|
for (const file of files) {
|
|
223
224
|
try {
|
|
224
225
|
const filePath = path.join(storageDir, file);
|
|
225
226
|
const fileContent = await fs.promises.readFile(filePath, 'utf-8');
|
|
226
227
|
const config = JSON.parse(fileContent);
|
|
227
228
|
if (this.agents.has(config.id)) {
|
|
228
|
-
|
|
229
|
+
logger_1.logger.log(`Agent ${config.agentName} (${config.id}) already loaded, skipping`);
|
|
229
230
|
continue;
|
|
230
231
|
}
|
|
231
232
|
const aiService = this.aiFactoryService.createAiService(config.serviceName);
|
|
@@ -264,21 +265,21 @@ let AgentStoreService = class AgentStoreService {
|
|
|
264
265
|
const fileData = this.attachedFileService.getFile(agent.id, metadata.fileId);
|
|
265
266
|
if (fileData && metadata.serviceMetadata && agent.fullContextFiles) {
|
|
266
267
|
metadata.serviceMetadata.fileData = Array.from(fileData);
|
|
267
|
-
|
|
268
|
+
logger_1.logger.log(`Restored fileData for ${metadata.fileName} (fullContextFiles=true)`);
|
|
268
269
|
}
|
|
269
270
|
}
|
|
270
271
|
if (config.attachedArtifacts && config.attachedArtifacts.length > 0) {
|
|
271
272
|
agent.attachedArtifacts = config.attachedArtifacts;
|
|
272
273
|
}
|
|
273
|
-
|
|
274
|
+
logger_1.logger.log(`Loaded agent: ${config.agentName} (${config.id}) with ${agent.history.length} history items`);
|
|
274
275
|
}
|
|
275
276
|
catch (error) {
|
|
276
|
-
|
|
277
|
+
logger_1.logger.error(`Error loading agent from file ${file}:`, error);
|
|
277
278
|
}
|
|
278
279
|
}
|
|
279
280
|
}
|
|
280
281
|
catch (error) {
|
|
281
|
-
|
|
282
|
+
logger_1.logger.error(`Error loading agents from directory ${storageDir}:`, error);
|
|
282
283
|
}
|
|
283
284
|
}
|
|
284
285
|
saveAgentToFile(agent, storageDir) {
|
|
@@ -331,7 +332,7 @@ let AgentStoreService = class AgentStoreService {
|
|
|
331
332
|
fs.writeFileSync(filePath, JSON.stringify(config, null, 2), 'utf-8');
|
|
332
333
|
}
|
|
333
334
|
catch (error) {
|
|
334
|
-
|
|
335
|
+
logger_1.logger.error(`Error saving agent ${agent.id} to file:`, error);
|
|
335
336
|
}
|
|
336
337
|
}
|
|
337
338
|
deleteAgentFile(agentId, storageDir) {
|
|
@@ -339,11 +340,11 @@ let AgentStoreService = class AgentStoreService {
|
|
|
339
340
|
const filePath = path.join(storageDir, `${agentId}.json`);
|
|
340
341
|
if (fs.existsSync(filePath)) {
|
|
341
342
|
fs.unlinkSync(filePath);
|
|
342
|
-
|
|
343
|
+
logger_1.logger.log(`Deleted agent file: ${filePath}`);
|
|
343
344
|
}
|
|
344
345
|
}
|
|
345
346
|
catch (error) {
|
|
346
|
-
|
|
347
|
+
logger_1.logger.error(`Error deleting agent file ${agentId}:`, error);
|
|
347
348
|
}
|
|
348
349
|
}
|
|
349
350
|
};
|
|
@@ -48,6 +48,7 @@ const fs = __importStar(require("fs"));
|
|
|
48
48
|
const path = __importStar(require("path"));
|
|
49
49
|
const crypto_1 = require("crypto");
|
|
50
50
|
const configuration_service_1 = require("../config/configuration.service");
|
|
51
|
+
const logger_1 = require("../common/logger");
|
|
51
52
|
let ArtifactService = class ArtifactService {
|
|
52
53
|
configService;
|
|
53
54
|
artifactsDir;
|
|
@@ -77,7 +78,7 @@ let ArtifactService = class ArtifactService {
|
|
|
77
78
|
return JSON.parse(content);
|
|
78
79
|
}
|
|
79
80
|
catch (error) {
|
|
80
|
-
|
|
81
|
+
logger_1.logger.error('Error loading artifact metadata:', error);
|
|
81
82
|
return {};
|
|
82
83
|
}
|
|
83
84
|
}
|
|
@@ -130,7 +131,7 @@ let ArtifactService = class ArtifactService {
|
|
|
130
131
|
}
|
|
131
132
|
}
|
|
132
133
|
catch (error) {
|
|
133
|
-
|
|
134
|
+
logger_1.logger.error(`Error reading artifact ${artifactId}:`, error);
|
|
134
135
|
return null;
|
|
135
136
|
}
|
|
136
137
|
}
|
|
@@ -157,7 +158,7 @@ let ArtifactService = class ArtifactService {
|
|
|
157
158
|
return true;
|
|
158
159
|
}
|
|
159
160
|
catch (error) {
|
|
160
|
-
|
|
161
|
+
logger_1.logger.error(`Error updating artifact ${artifactId}:`, error);
|
|
161
162
|
return false;
|
|
162
163
|
}
|
|
163
164
|
}
|
|
@@ -172,7 +173,7 @@ let ArtifactService = class ArtifactService {
|
|
|
172
173
|
return true;
|
|
173
174
|
}
|
|
174
175
|
catch (error) {
|
|
175
|
-
|
|
176
|
+
logger_1.logger.error(`Error renaming artifact ${artifactId}:`, error);
|
|
176
177
|
return false;
|
|
177
178
|
}
|
|
178
179
|
}
|
|
@@ -187,7 +188,7 @@ let ArtifactService = class ArtifactService {
|
|
|
187
188
|
return true;
|
|
188
189
|
}
|
|
189
190
|
catch (error) {
|
|
190
|
-
|
|
191
|
+
logger_1.logger.error(`Error updating artifact description ${artifactId}:`, error);
|
|
191
192
|
return false;
|
|
192
193
|
}
|
|
193
194
|
}
|
|
@@ -208,7 +209,7 @@ let ArtifactService = class ArtifactService {
|
|
|
208
209
|
return true;
|
|
209
210
|
}
|
|
210
211
|
catch (error) {
|
|
211
|
-
|
|
212
|
+
logger_1.logger.error(`Error deleting artifact ${artifactId}:`, error);
|
|
212
213
|
return false;
|
|
213
214
|
}
|
|
214
215
|
}
|