@oas-tools/oas-telemetry 0.7.1 → 0.8.0-alpha.1
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/.env.example +17 -3
- package/README.md +1 -2
- package/dist/cjs/config/bootConfig.cjs +16 -14
- package/dist/cjs/config/config.cjs +120 -125
- package/dist/cjs/config/config.types.cjs +1 -4
- package/dist/cjs/docs/openapi.yaml +158 -4
- package/dist/cjs/index.cjs +27 -30
- package/dist/cjs/routesManager.cjs +62 -70
- package/dist/cjs/telemetry/custom-implementations/exporters/DiskLogExporter.cjs +121 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/DiskMetricExporter.cjs +101 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/DiskTraceExporter.cjs +103 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.cjs +194 -190
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +147 -99
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +143 -116
- package/dist/cjs/telemetry/custom-implementations/exporters/MultiMetricExporter.cjs +57 -0
- package/dist/cjs/telemetry/custom-implementations/instrumentations/logsInstrumentation.cjs +92 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Chunk.cjs +159 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Series.cjs +168 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.cjs +392 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/types.cjs +2 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/utils.cjs +77 -0
- package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.cjs +65 -63
- package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.cjs +63 -62
- package/dist/cjs/telemetry/custom-implementations/utils/circular.cjs +47 -47
- package/dist/cjs/telemetry/custom-implementations/wrappers.cjs +209 -138
- package/dist/cjs/telemetry/initializeTelemetry.cjs +35 -91
- package/dist/cjs/telemetry/persistence/DiskImporter.cjs +85 -0
- package/dist/cjs/telemetry/persistence/DiskUtils.cjs +61 -0
- package/dist/cjs/telemetry/persistence/DiskWriter.cjs +66 -0
- package/dist/cjs/telemetry/telemetryConfigurator.cjs +139 -72
- package/dist/cjs/telemetry/telemetryRegistry.cjs +45 -31
- package/dist/cjs/tlm-ai/agent.cjs +49 -64
- package/dist/cjs/tlm-ai/aiController.cjs +54 -76
- package/dist/cjs/tlm-ai/aiRoutes.cjs +17 -20
- package/dist/cjs/tlm-ai/aiService.cjs +91 -95
- package/dist/cjs/tlm-ai/tools.cjs +177 -174
- package/dist/cjs/tlm-auth/authController.cjs +80 -123
- package/dist/cjs/tlm-auth/authMiddleware.cjs +25 -30
- package/dist/cjs/tlm-auth/authRoutes.cjs +11 -14
- package/dist/cjs/tlm-log/logController.cjs +135 -116
- package/dist/cjs/tlm-log/logRoutes.cjs +19 -20
- package/dist/cjs/tlm-log/logService.cjs +29 -0
- package/dist/cjs/tlm-metric/metricsController.cjs +154 -122
- package/dist/cjs/tlm-metric/metricsRoutes.cjs +22 -20
- package/dist/cjs/tlm-metric/metricsService.cjs +26 -0
- package/dist/cjs/tlm-plugin/pluginController.cjs +128 -140
- package/dist/cjs/tlm-plugin/pluginProcess.cjs +89 -94
- package/dist/cjs/tlm-plugin/pluginRoutes.cjs +11 -14
- package/dist/cjs/tlm-plugin/pluginService.cjs +73 -74
- package/dist/cjs/tlm-trace/traceController.cjs +140 -123
- package/dist/cjs/tlm-trace/traceRoutes.cjs +19 -20
- package/dist/cjs/tlm-trace/traceService.cjs +29 -0
- package/dist/cjs/tlm-ui/uiRoutes.cjs +63 -32
- package/dist/cjs/tlm-util/utilController.cjs +68 -70
- package/dist/cjs/tlm-util/utilRoutes.cjs +51 -63
- package/dist/cjs/types/index.cjs +2 -5
- package/dist/cjs/utils/logger.cjs +38 -43
- package/dist/cjs/utils/regexUtils.cjs +22 -22
- package/dist/esm/config/bootConfig.js +5 -2
- package/dist/esm/config/config.js +9 -2
- package/dist/esm/docs/openapi.yaml +158 -4
- package/dist/esm/index.js +9 -8
- package/dist/esm/routesManager.js +6 -10
- package/dist/esm/telemetry/custom-implementations/exporters/DiskLogExporter.js +114 -0
- package/dist/esm/telemetry/custom-implementations/exporters/DiskMetricExporter.js +94 -0
- package/dist/esm/telemetry/custom-implementations/exporters/DiskTraceExporter.js +96 -0
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js +38 -7
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js +107 -48
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +60 -29
- package/dist/esm/telemetry/custom-implementations/exporters/MultiMetricExporter.js +53 -0
- package/dist/esm/telemetry/custom-implementations/instrumentations/logsInstrumentation.js +85 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Chunk.js +155 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Series.js +164 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.js +385 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/types.js +1 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/utils.js +74 -0
- package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.js +2 -1
- package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.js +1 -1
- package/dist/esm/telemetry/custom-implementations/wrappers.js +77 -6
- package/dist/esm/telemetry/initializeTelemetry.js +27 -69
- package/dist/esm/telemetry/persistence/DiskImporter.js +78 -0
- package/dist/esm/telemetry/persistence/DiskUtils.js +51 -0
- package/dist/esm/telemetry/persistence/DiskWriter.js +59 -0
- package/dist/esm/telemetry/telemetryConfigurator.js +110 -39
- package/dist/esm/telemetry/telemetryRegistry.js +12 -1
- package/dist/esm/tlm-ai/agent.js +5 -3
- package/dist/esm/tlm-ai/aiController.js +3 -3
- package/dist/esm/tlm-ai/aiService.js +6 -2
- package/dist/esm/tlm-ai/tools.js +5 -9
- package/dist/esm/tlm-auth/authController.js +3 -2
- package/dist/esm/tlm-log/logController.js +62 -18
- package/dist/esm/tlm-log/logRoutes.js +3 -1
- package/dist/esm/tlm-log/logService.js +25 -0
- package/dist/esm/tlm-metric/metricsController.js +116 -50
- package/dist/esm/tlm-metric/metricsRoutes.js +8 -3
- package/dist/esm/tlm-metric/metricsService.js +22 -0
- package/dist/esm/tlm-plugin/pluginController.js +6 -11
- package/dist/esm/tlm-plugin/pluginService.js +2 -4
- package/dist/esm/tlm-trace/traceController.js +87 -36
- package/dist/esm/tlm-trace/traceRoutes.js +3 -1
- package/dist/esm/tlm-trace/traceService.js +25 -0
- package/dist/esm/tlm-ui/uiRoutes.js +5 -5
- package/dist/esm/tlm-util/utilController.js +3 -9
- package/dist/esm/tlm-util/utilRoutes.js +2 -2
- package/dist/types/config/bootConfig.d.ts +3 -0
- package/dist/types/config/config.d.ts +48 -7
- package/dist/types/config/config.types.d.ts +7 -0
- package/dist/types/index.d.ts +2 -3
- package/dist/types/telemetry/custom-implementations/exporters/DiskLogExporter.d.ts +24 -0
- package/dist/types/telemetry/custom-implementations/exporters/DiskMetricExporter.d.ts +23 -0
- package/dist/types/telemetry/custom-implementations/exporters/DiskTraceExporter.d.ts +23 -0
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts +3 -1
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts +56 -15
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts +8 -4
- package/dist/types/telemetry/custom-implementations/exporters/MultiMetricExporter.d.ts +9 -0
- package/dist/types/telemetry/custom-implementations/instrumentations/logsInstrumentation.d.ts +23 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/Chunk.d.ts +49 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/Series.d.ts +67 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.d.ts +69 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/types.d.ts +68 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/utils.d.ts +21 -0
- package/dist/types/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.d.ts +2 -2
- package/dist/types/telemetry/custom-implementations/wrappers.d.ts +2 -1
- package/dist/types/telemetry/persistence/DiskImporter.d.ts +17 -0
- package/dist/types/telemetry/persistence/DiskUtils.d.ts +11 -0
- package/dist/types/telemetry/persistence/DiskWriter.d.ts +21 -0
- package/dist/types/telemetry/telemetryConfigurator.d.ts +1 -1
- package/dist/types/telemetry/telemetryRegistry.d.ts +8 -0
- package/dist/types/tlm-ai/agent.d.ts +1 -1
- package/dist/types/tlm-ai/aiService.d.ts +1 -1
- package/dist/types/tlm-log/logController.d.ts +2 -0
- package/dist/types/tlm-log/logService.d.ts +4 -0
- package/dist/types/tlm-metric/metricsController.d.ts +11 -2
- package/dist/types/tlm-metric/metricsService.d.ts +6 -0
- package/dist/types/tlm-trace/traceController.d.ts +9 -7
- package/dist/types/tlm-trace/traceService.d.ts +4 -0
- package/dist/types/types/index.d.ts +2 -2
- package/dist/ui/assets/{ApiDocsPage-C_VVPPHa.js → ApiDocsPage-DTCgVbW2.js} +2 -2
- package/dist/ui/assets/CollapsibleCard-lWgfsaAn.js +1 -0
- package/dist/ui/assets/DevToolsPage-DEhf8CBy.js +1 -0
- package/dist/ui/assets/LandingPage-CfEHCDxY.js +6 -0
- package/dist/ui/assets/LogsPage-DFDKRuGH.js +1 -0
- package/dist/ui/assets/{NotFoundPage-B3quk3P1.js → NotFoundPage-DCy0DcV7.js} +1 -1
- package/dist/ui/assets/PluginCreatePage-BawZ5_-h.js +50 -0
- package/dist/ui/assets/PluginPage-D3FmgU7d.js +27 -0
- package/dist/ui/assets/TraceSpansPage-D0_L45Rb.js +6 -0
- package/dist/ui/assets/VirtualizedListPanel-q605n9He.js +16 -0
- package/dist/ui/assets/alert-DBAFshSi.js +1133 -0
- package/dist/ui/assets/badge-DGNBtnxU.js +1 -0
- package/dist/ui/assets/{chevron-down-CPsvsmqj.js → chevron-down-CFEqYzGC.js} +1 -1
- package/dist/ui/assets/{chevron-up-Df9jMo1X.js → chevron-up-lDnFwAJq.js} +1 -1
- package/dist/ui/assets/{circle-alert-DOPQPvU8.js → circle-alert-BpYUuRs7.js} +1 -1
- package/dist/ui/assets/dialog-1dRyI6SC.js +15 -0
- package/dist/ui/assets/index-C7RfU6hR.js +1 -0
- package/dist/ui/assets/index-C9dDYIpd.js +305 -0
- package/dist/ui/assets/index-D6f1KjWV.css +1 -0
- package/dist/ui/assets/info-CuJQWoBU.js +6 -0
- package/dist/ui/assets/{input-Dzvg_ZEZ.js → input-BLXaar0X.js} +1 -1
- package/dist/ui/assets/label-DfAcltsl.js +1 -0
- package/dist/ui/assets/{loader-circle-CrvlRy5o.js → loader-circle-B7oLyPsi.js} +1 -1
- package/dist/ui/assets/{loginPage-qa4V-B70.js → loginPage-DswZvOJ-.js} +1 -1
- package/dist/ui/assets/metrics-page-BhtXrfUW.js +31 -0
- package/dist/ui/assets/metrics-page-D1GxaB_c.css +1 -0
- package/dist/ui/assets/popover-IDker85U.js +11 -0
- package/dist/ui/assets/select-B8y5IidE.js +6 -0
- package/dist/ui/assets/separator-B6EzrxYY.js +6 -0
- package/dist/ui/assets/severityOptions-DtCsaAZK.js +11 -0
- package/dist/ui/assets/square-pen-D_oecB1x.js +6 -0
- package/dist/ui/assets/switch-Dqo0XkRD.js +1 -0
- package/dist/ui/assets/trace-DJq1miYa.js +1 -0
- package/dist/ui/assets/upload-prIohEdY.js +11 -0
- package/dist/ui/assets/{utilService-DNyqzwj0.js → utilService-C8TJKLqs.js} +1 -1
- package/dist/ui/assets/wand-sparkles-OgXuzsSx.js +6 -0
- package/dist/ui/index.html +2 -2
- package/package.json +44 -49
- package/dist/ui/assets/CollapsibleCard-B3KR_8mL.js +0 -1
- package/dist/ui/assets/DevToolsPage-OyZcDcmw.js +0 -1
- package/dist/ui/assets/LandingPage-CppFBA6K.js +0 -6
- package/dist/ui/assets/LogsPage-9Fq8GArS.js +0 -26
- package/dist/ui/assets/PluginCreatePage-X_aCH4t4.js +0 -50
- package/dist/ui/assets/PluginPage-DMDSihrZ.js +0 -27
- package/dist/ui/assets/alert-jQ9HCPIf.js +0 -1133
- package/dist/ui/assets/badge-CNq0-mH5.js +0 -1
- package/dist/ui/assets/card-DFAwwhN3.js +0 -1
- package/dist/ui/assets/index-BkD6DijD.js +0 -15
- package/dist/ui/assets/index-CERGVYZK.js +0 -292
- package/dist/ui/assets/index-CSIPf9qw.css +0 -1
- package/dist/ui/assets/label-DuVnkZ4q.js +0 -1
- package/dist/ui/assets/select-DhS8YUtJ.js +0 -1
- package/dist/ui/assets/separator-isK4chBP.js +0 -6
- package/dist/ui/assets/severityOptions-O38dSOfk.js +0 -11
- package/dist/ui/assets/switch-Z3mImG9n.js +0 -1
- package/dist/ui/assets/tabs-_77MUUQe.js +0 -16
- package/dist/ui/assets/upload-C1LT4Gkb.js +0 -16
|
@@ -0,0 +1,66 @@
|
|
|
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.DiskWriter = void 0;
|
|
7
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const DiskUtils_js_1 = require("./DiskUtils.cjs");
|
|
10
|
+
class DiskWriter {
|
|
11
|
+
directoryPath;
|
|
12
|
+
segmentPrefix;
|
|
13
|
+
maxSegmentBytes;
|
|
14
|
+
initialized = false;
|
|
15
|
+
currentSegmentIndex = 0;
|
|
16
|
+
currentSegmentPath = '';
|
|
17
|
+
currentSegmentSize = 0;
|
|
18
|
+
writeQueue = Promise.resolve();
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.directoryPath = path_1.default.resolve(options.directoryPath);
|
|
21
|
+
this.segmentPrefix = options.segmentPrefix || DiskUtils_js_1.DEFAULT_SEGMENT_PREFIX;
|
|
22
|
+
this.maxSegmentBytes = options.maxSegmentBytes || DiskUtils_js_1.DEFAULT_MAX_SEGMENT_BYTES;
|
|
23
|
+
}
|
|
24
|
+
async appendRecords(records) {
|
|
25
|
+
if (!records.length)
|
|
26
|
+
return;
|
|
27
|
+
const frame = (0, DiskUtils_js_1.encodeRecordBatchFrame)(records);
|
|
28
|
+
this.writeQueue = this.writeQueue.then(() => this.appendFrame(frame));
|
|
29
|
+
return this.writeQueue;
|
|
30
|
+
}
|
|
31
|
+
async flush() {
|
|
32
|
+
await this.writeQueue;
|
|
33
|
+
}
|
|
34
|
+
async ensureInitialized() {
|
|
35
|
+
if (this.initialized)
|
|
36
|
+
return;
|
|
37
|
+
await promises_1.default.mkdir(this.directoryPath, { recursive: true });
|
|
38
|
+
const segments = await (0, DiskUtils_js_1.listSegments)(this.directoryPath, this.segmentPrefix);
|
|
39
|
+
if (segments.length === 0) {
|
|
40
|
+
this.currentSegmentIndex = 0;
|
|
41
|
+
this.currentSegmentPath = path_1.default.join(this.directoryPath, (0, DiskUtils_js_1.getSegmentName)(this.currentSegmentIndex, this.segmentPrefix));
|
|
42
|
+
this.currentSegmentSize = 0;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const lastSegment = segments[segments.length - 1];
|
|
46
|
+
this.currentSegmentIndex = lastSegment.index;
|
|
47
|
+
this.currentSegmentPath = lastSegment.filePath;
|
|
48
|
+
this.currentSegmentSize = (await promises_1.default.stat(lastSegment.filePath)).size;
|
|
49
|
+
}
|
|
50
|
+
this.initialized = true;
|
|
51
|
+
}
|
|
52
|
+
async rotateSegment() {
|
|
53
|
+
this.currentSegmentIndex += 1;
|
|
54
|
+
this.currentSegmentPath = path_1.default.join(this.directoryPath, (0, DiskUtils_js_1.getSegmentName)(this.currentSegmentIndex, this.segmentPrefix));
|
|
55
|
+
this.currentSegmentSize = 0;
|
|
56
|
+
}
|
|
57
|
+
async appendFrame(frame) {
|
|
58
|
+
await this.ensureInitialized();
|
|
59
|
+
if (this.currentSegmentSize > 0 && this.currentSegmentSize + frame.length > this.maxSegmentBytes) {
|
|
60
|
+
await this.rotateSegment();
|
|
61
|
+
}
|
|
62
|
+
await promises_1.default.appendFile(this.currentSegmentPath, frame);
|
|
63
|
+
this.currentSegmentSize += frame.length;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.DiskWriter = DiskWriter;
|
|
@@ -1,81 +1,148 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.configureTelemetry = void 0;
|
|
7
|
-
var _sdkTraceNode = require("@opentelemetry/sdk-trace-node");
|
|
8
|
-
var _telemetryRegistry = require("./telemetryRegistry.cjs");
|
|
9
|
-
var _logger = _interopRequireDefault(require("../utils/logger.cjs"));
|
|
10
|
-
var _sdkLogs = require("@opentelemetry/sdk-logs");
|
|
11
|
-
var _sdkMetrics = require("@opentelemetry/sdk-metrics");
|
|
12
|
-
var _hostMetrics = require("@opentelemetry/host-metrics");
|
|
13
|
-
var _bootConfig = require("../config/bootConfig.cjs");
|
|
14
|
-
var _pluginService = require("../tlm-plugin/pluginService.cjs");
|
|
15
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
16
|
-
const configureTelemetry = oasTlmConfig => {
|
|
17
|
-
configurePlugins(oasTlmConfig);
|
|
18
|
-
configureTraces(oasTlmConfig);
|
|
19
|
-
configureMetrics(oasTlmConfig);
|
|
20
|
-
configureLogs(oasTlmConfig);
|
|
21
|
-
_logger.default.info("✅ Telemetry configured successfully. All exporters are ready");
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
22
4
|
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
6
|
exports.configureTelemetry = configureTelemetry;
|
|
7
|
+
const sdk_logs_1 = require("@opentelemetry/sdk-logs");
|
|
8
|
+
const sdk_metrics_1 = require("@opentelemetry/sdk-metrics");
|
|
9
|
+
const sdk_trace_node_1 = require("@opentelemetry/sdk-trace-node");
|
|
10
|
+
const logger_js_1 = __importDefault(require("../utils/logger.cjs"));
|
|
11
|
+
const telemetryRegistry_js_1 = require("./telemetryRegistry.cjs");
|
|
12
|
+
const sdk_node_1 = require("@opentelemetry/sdk-node");
|
|
13
|
+
const bootConfig_js_1 = require("../config/bootConfig.cjs");
|
|
14
|
+
const pluginService_js_1 = require("../tlm-plugin/pluginService.cjs");
|
|
15
|
+
const DiskTraceExporter_js_1 = require("./custom-implementations/exporters/DiskTraceExporter.cjs");
|
|
16
|
+
const DiskLogExporter_js_1 = require("./custom-implementations/exporters/DiskLogExporter.cjs");
|
|
17
|
+
const DiskMetricExporter_js_1 = require("./custom-implementations/exporters/DiskMetricExporter.cjs");
|
|
18
|
+
const MultiMetricExporter_js_1 = require("./custom-implementations/exporters/MultiMetricExporter.cjs");
|
|
19
|
+
const DiskImporter_js_1 = require("./persistence/DiskImporter.cjs");
|
|
20
|
+
const traceService_js_1 = require("../tlm-trace/traceService.cjs");
|
|
21
|
+
const logService_js_1 = require("../tlm-log/logService.cjs");
|
|
22
|
+
const metricsService_js_1 = require("../tlm-metric/metricsService.cjs");
|
|
23
|
+
function configureTelemetry(oasTlmConfig) {
|
|
24
|
+
logger_js_1.default.info("🚀 Configuring Telemetry...");
|
|
25
|
+
configureStorage(oasTlmConfig);
|
|
26
|
+
if (oasTlmConfig.instrumentations) {
|
|
27
|
+
telemetryRegistry_js_1.instrumentations.push(...oasTlmConfig.instrumentations);
|
|
28
|
+
}
|
|
29
|
+
configurePlugins(oasTlmConfig);
|
|
30
|
+
const mainTraceProcessor = configureTraces(oasTlmConfig);
|
|
31
|
+
const mainMetricReader = configureMetrics(oasTlmConfig);
|
|
32
|
+
const mainLogProcessor = configureLogs(oasTlmConfig);
|
|
33
|
+
const sdk = new sdk_node_1.NodeSDK({
|
|
34
|
+
instrumentations: telemetryRegistry_js_1.instrumentations,
|
|
35
|
+
resource: telemetryRegistry_js_1.oasTelemetryResource,
|
|
36
|
+
traceExporter: telemetryRegistry_js_1.inMemoryDbSpanExporter,
|
|
37
|
+
spanProcessors: [mainTraceProcessor, ...oasTlmConfig.traces.extraProcessors || []],
|
|
38
|
+
metricReaders: [mainMetricReader, ...(oasTlmConfig.metrics.extraReaders || [])],
|
|
39
|
+
logRecordProcessors: [mainLogProcessor, ...oasTlmConfig.logs.extraProcessors || []],
|
|
40
|
+
});
|
|
41
|
+
sdk.start();
|
|
42
|
+
logger_js_1.default.info("✅ Node SDK started with telemetry configuration");
|
|
43
|
+
if (oasTlmConfig.storage.path && oasTlmConfig.storage.loadFromStart) {
|
|
44
|
+
scheduleStartupImports(oasTlmConfig.storage.path);
|
|
45
|
+
}
|
|
46
|
+
else if (oasTlmConfig.storage.path && !oasTlmConfig.storage.loadFromStart) {
|
|
47
|
+
logger_js_1.default.info(`[DiskImporter] Startup import skipped by storage.loadFromStart=false. Path: ${oasTlmConfig.storage.path}`);
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
function configureStorage(oasTlmConfig) {
|
|
52
|
+
const path = oasTlmConfig.storage.path;
|
|
53
|
+
oasTlmConfig.storage.path = typeof path === 'string' && path.trim().length > 0
|
|
54
|
+
? path.trim()
|
|
55
|
+
: null;
|
|
56
|
+
}
|
|
24
57
|
function configurePlugins(oasTlmConfig) {
|
|
25
|
-
|
|
58
|
+
pluginService_js_1.pluginService.enabled = oasTlmConfig.plugins.enabled;
|
|
26
59
|
}
|
|
27
60
|
function configureTraces(oasTlmConfig) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
61
|
+
// TRACES CONFIGURATION
|
|
62
|
+
// [OT]Provider -> [OT]SpanProcessor(multiSpan) -> n Processors(eg mainProcessor, extra) -> 1 SpanExporter
|
|
63
|
+
telemetryRegistry_js_1.inMemoryDbSpanExporter.retentionTimeInSeconds = oasTlmConfig.traces.memoryExporter.retentionTimeSeconds;
|
|
64
|
+
telemetryRegistry_js_1.inMemoryDbSpanExporter.setEnabledValue(oasTlmConfig.traces.memoryExporter.enabled);
|
|
65
|
+
const mainExporter = telemetryRegistry_js_1.multiSpanExporter;
|
|
66
|
+
mainExporter.clearExporters();
|
|
67
|
+
let mainProcessor = new sdk_trace_node_1.BatchSpanProcessor(mainExporter);
|
|
68
|
+
if (bootConfig_js_1.bootEnvVariables.OASTLM_BOOT_ENV !== 'production') {
|
|
69
|
+
logger_js_1.default.info('Not in production, using SimpleSpanProcessor for traces');
|
|
70
|
+
mainProcessor = new sdk_trace_node_1.SimpleSpanProcessor(mainExporter);
|
|
71
|
+
}
|
|
72
|
+
mainExporter.addExporters(telemetryRegistry_js_1.inMemoryDbSpanExporter); // Main exporter have at least the in-memory exporter used by the traces controller
|
|
73
|
+
if (oasTlmConfig.storage.path) {
|
|
74
|
+
mainExporter.addExporters(new DiskTraceExporter_js_1.DiskTraceExporter({ directoryPath: oasTlmConfig.storage.path }));
|
|
75
|
+
logger_js_1.default.info(`[TraceDiskExporter] Enabled at: ${oasTlmConfig.storage.path}`);
|
|
76
|
+
}
|
|
77
|
+
mainExporter.addExporters(oasTlmConfig.traces.extraExporters);
|
|
78
|
+
return mainProcessor;
|
|
79
|
+
}
|
|
80
|
+
function configureMetrics(oasTlmConfig) {
|
|
81
|
+
// METRICS CONFIGURATION
|
|
82
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.setEnabledValue(oasTlmConfig.metrics.memoryExporter.enabled);
|
|
83
|
+
telemetryRegistry_js_1.inMemoryDbMetricExporter.retentionTimeInSeconds = oasTlmConfig.metrics.memoryExporter.retentionTimeSeconds;
|
|
84
|
+
const metricExporters = [telemetryRegistry_js_1.inMemoryDbMetricExporter];
|
|
85
|
+
if (oasTlmConfig.storage.path) {
|
|
86
|
+
metricExporters.push(new DiskMetricExporter_js_1.DiskMetricExporter({ directoryPath: oasTlmConfig.storage.path }));
|
|
87
|
+
logger_js_1.default.info(`[MetricDiskExporter] Enabled at: ${oasTlmConfig.storage.path}`);
|
|
88
|
+
}
|
|
89
|
+
const mainReader = new sdk_metrics_1.PeriodicExportingMetricReader({
|
|
90
|
+
exporter: new MultiMetricExporter_js_1.MultiMetricExporter(metricExporters),
|
|
91
|
+
exportIntervalMillis: oasTlmConfig.metrics.mainMetricReaderOptions.exportIntervalMillis,
|
|
92
|
+
metricProducers: oasTlmConfig.metrics.mainMetricReaderOptions.metricProducers
|
|
93
|
+
});
|
|
94
|
+
return mainReader;
|
|
43
95
|
}
|
|
44
96
|
function configureLogs(oasTlmConfig) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
97
|
+
// LOGS CONFIGURATION
|
|
98
|
+
// [OT]LoggerProvider -> [OT]LogRecordProcessor(multiLogProcessor) -> n Processors(eg mainProcessor, extra) -> 1 LogExporter
|
|
99
|
+
telemetryRegistry_js_1.inMemoryDbLogExporter.setEnabledValue(oasTlmConfig.logs.memoryExporter.enabled);
|
|
100
|
+
telemetryRegistry_js_1.inMemoryDbLogExporter.retentionTimeInSeconds = oasTlmConfig.logs.memoryExporter.retentionTimeSeconds;
|
|
101
|
+
const mainExporter = telemetryRegistry_js_1.multiLogExporter;
|
|
102
|
+
mainExporter.clearExporters();
|
|
103
|
+
let mainProcessor = new sdk_logs_1.BatchLogRecordProcessor(mainExporter);
|
|
104
|
+
if (bootConfig_js_1.bootEnvVariables.OASTLM_BOOT_ENV !== 'production') {
|
|
105
|
+
logger_js_1.default.info('Not in production, using SimpleLogRecordProcessor for logs');
|
|
106
|
+
mainProcessor = new sdk_logs_1.SimpleLogRecordProcessor(mainExporter);
|
|
107
|
+
}
|
|
108
|
+
mainExporter.addExporters(telemetryRegistry_js_1.inMemoryDbLogExporter); // Main exporter have at least the in-memory exporter used by the logs controller
|
|
109
|
+
if (oasTlmConfig.storage.path) {
|
|
110
|
+
mainExporter.addExporters(new DiskLogExporter_js_1.DiskLogExporter({ directoryPath: oasTlmConfig.storage.path }));
|
|
111
|
+
logger_js_1.default.info(`[LogDiskExporter] Enabled at: ${oasTlmConfig.storage.path}`);
|
|
112
|
+
}
|
|
113
|
+
mainExporter.addExporters(oasTlmConfig.logs.extraExporters);
|
|
114
|
+
return mainProcessor;
|
|
115
|
+
}
|
|
116
|
+
function scheduleStartupImports(storagePath) {
|
|
117
|
+
setTimeout(async () => {
|
|
118
|
+
try {
|
|
119
|
+
await runTimedImport('TraceDiskImport', storagePath, new DiskImporter_js_1.DiskImporter({ directoryPath: storagePath }), async (spans) => {
|
|
120
|
+
await (0, traceService_js_1.importTracesToMemory)(spans);
|
|
121
|
+
});
|
|
122
|
+
await runTimedImport('LogDiskImport', storagePath, new DiskImporter_js_1.DiskImporter({ directoryPath: storagePath, segmentPrefix: 'logs' }), async (logs) => {
|
|
123
|
+
await (0, logService_js_1.importLogsToMemory)(logs);
|
|
124
|
+
});
|
|
125
|
+
await runTimedImport('MetricDiskImport', storagePath, new DiskImporter_js_1.DiskImporter({ directoryPath: storagePath, segmentPrefix: 'metrics' }), async (scopeMetrics) => {
|
|
126
|
+
(0, metricsService_js_1.importMetricsToMemory)(scopeMetrics, { format: 'otel' });
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
logger_js_1.default.error(`[DiskImporter] Startup import sequence failed: ${error?.message || error}`);
|
|
131
|
+
}
|
|
132
|
+
}, 0);
|
|
133
|
+
}
|
|
134
|
+
async function runTimedImport(label, storagePath, importer, onBatch) {
|
|
135
|
+
const startedAt = Date.now();
|
|
136
|
+
logger_js_1.default.info(`[${label}] Startup import started. Path: ${storagePath}`);
|
|
137
|
+
try {
|
|
138
|
+
const result = await importer.import(onBatch);
|
|
139
|
+
logger_js_1.default.info(`[${label}] Startup import completed. Files: ${result.segmentFilesRead}, imported records: ${result.importedRecords}, failed frames: ${result.failedFrames}`);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
logger_js_1.default.error(`[${label}] Startup import failed: ${error?.message || error}`);
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
const elapsedMs = Date.now() - startedAt;
|
|
146
|
+
logger_js_1.default.info(`[${label}] Startup import finished in ${elapsedMs}ms`);
|
|
147
|
+
}
|
|
59
148
|
}
|
|
60
|
-
function configureMetrics(oasTlmConfig) {
|
|
61
|
-
// METRICS CONFIGURATION
|
|
62
|
-
// [CUSTOM]MeterProvider -> n [OTel]MetricReader -> (0-1) MetricExporter (only if push-based reader)
|
|
63
|
-
_telemetryRegistry.inMemoryDbMetricExporter.setEnabledValue(oasTlmConfig.metrics.memoryExporter.enabled);
|
|
64
|
-
_telemetryRegistry.inMemoryDbMetricExporter.retentionTimeInSeconds = oasTlmConfig.metrics.memoryExporter.retentionTimeSeconds;
|
|
65
|
-
const mainReader = new _sdkMetrics.PeriodicExportingMetricReader({
|
|
66
|
-
exporter: _telemetryRegistry.inMemoryDbMetricExporter,
|
|
67
|
-
exportIntervalMillis: oasTlmConfig.metrics.mainMetricReaderOptions.exportIntervalMillis,
|
|
68
|
-
metricProducers: oasTlmConfig.metrics.mainMetricReaderOptions.metricProducers
|
|
69
|
-
});
|
|
70
|
-
const meterProvider = new _sdkMetrics.MeterProvider({
|
|
71
|
-
resource: _telemetryRegistry.oasTelemetryResource,
|
|
72
|
-
readers: [mainReader, ...oasTlmConfig.metrics.extraReaders],
|
|
73
|
-
views: oasTlmConfig.metrics.extraViews || []
|
|
74
|
-
});
|
|
75
|
-
// TODO maybe hostMetrics are too much, consider using only a subset of them.
|
|
76
|
-
const hostMetrics = new _hostMetrics.HostMetrics({
|
|
77
|
-
meterProvider: meterProvider
|
|
78
|
-
});
|
|
79
|
-
// AFTER adding all readers, start the instrumentations
|
|
80
|
-
hostMetrics.start();
|
|
81
|
-
}
|
|
@@ -1,43 +1,57 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
exports.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.instrumentations = exports.inMemoryDbMetricExporter = exports.originalConsoleMethods = exports.dynamicMultiLogProcessor = exports.multiLogExporter = exports.inMemoryDbLogExporter = exports.dynamicMultiSpanProcessor = exports.multiSpanExporter = exports.inMemoryDbSpanExporter = exports.oasTelemetryResource = void 0;
|
|
4
|
+
exports.isBootInitialized = isBootInitialized;
|
|
5
|
+
exports.setBootInitialized = setBootInitialized;
|
|
6
|
+
exports.isTelemetryConfigured = isTelemetryConfigured;
|
|
7
|
+
exports.setTelemetryConfigured = setTelemetryConfigured;
|
|
8
|
+
exports.setTelemetryRouter = setTelemetryRouter;
|
|
9
|
+
exports.getTelemetryRouter = getTelemetryRouter;
|
|
10
|
+
const InMemoryDbSpanExporter_js_1 = require("./custom-implementations/exporters/InMemoryDbSpanExporter.cjs");
|
|
11
|
+
const wrappers_js_1 = require("./custom-implementations/wrappers.cjs");
|
|
12
|
+
const InMemoryDbLogExporter_js_1 = require("./custom-implementations/exporters/InMemoryDbLogExporter.cjs");
|
|
13
|
+
const InMemoryDbMetricExporter_js_1 = require("./custom-implementations/exporters/InMemoryDbMetricExporter.cjs");
|
|
14
|
+
const dynamicMultiSpanProcessor_js_1 = require("./custom-implementations/processors/dynamicMultiSpanProcessor.cjs");
|
|
15
|
+
const dynamicMultiLogProcessor_js_1 = require("./custom-implementations/processors/dynamicMultiLogProcessor.cjs");
|
|
16
|
+
const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
|
|
17
|
+
const resources_1 = require("@opentelemetry/resources");
|
|
18
|
+
const bootConfig_js_1 = require("../config/bootConfig.cjs");
|
|
16
19
|
// GLOBAL REGISTRY of telemetry components, used by SDKs and controllers.
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
let _bootInitialized = false;
|
|
21
|
+
let _telemetryConfigured = false;
|
|
22
|
+
let _router = undefined;
|
|
23
|
+
function isBootInitialized() { return _bootInitialized; }
|
|
24
|
+
function setBootInitialized(v) { _bootInitialized = v; }
|
|
25
|
+
function isTelemetryConfigured() { return _telemetryConfigured; }
|
|
26
|
+
function setTelemetryConfigured(v) { _telemetryConfigured = v; }
|
|
27
|
+
function setTelemetryRouter(router) { _router = router; }
|
|
28
|
+
function getTelemetryRouter() { return _router; }
|
|
29
|
+
exports.oasTelemetryResource = (0, resources_1.resourceFromAttributes)({
|
|
30
|
+
[semantic_conventions_1.ATTR_SERVICE_NAME]: bootConfig_js_1.bootEnvVariables.OASTLM_BOOT_SERVICE_NAME
|
|
19
31
|
});
|
|
20
32
|
// TRACES -------------------------------------------------------------------------------------
|
|
21
33
|
// This is the main exporter for oas-telemetry spans. (Used by the traces controller)
|
|
22
|
-
|
|
34
|
+
exports.inMemoryDbSpanExporter = new InMemoryDbSpanExporter_js_1.InMemoryDbSpanExporter();
|
|
23
35
|
// This allows to add more exporter in the future without changing the code
|
|
24
|
-
|
|
36
|
+
exports.multiSpanExporter = new wrappers_js_1.EnablerMultiSpanExporter();
|
|
25
37
|
// This allows the addition of more processors at runtime
|
|
26
|
-
|
|
38
|
+
exports.dynamicMultiSpanProcessor = new dynamicMultiSpanProcessor_js_1.DynamicMultiSpanProcessor();
|
|
27
39
|
// LOGS ----------------------------------------------------------------------------------------
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
//
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
40
|
+
exports.inMemoryDbLogExporter = new InMemoryDbLogExporter_js_1.InMemoryDbLogExporter();
|
|
41
|
+
exports.multiLogExporter = new wrappers_js_1.EnablerMultiLogExporter();
|
|
42
|
+
exports.dynamicMultiLogProcessor = new dynamicMultiLogProcessor_js_1.DynamicMultiLogRecordProcessor();
|
|
43
|
+
// For custom log instrumentation, and lib logging
|
|
44
|
+
exports.originalConsoleMethods = {
|
|
45
|
+
log: console.log,
|
|
46
|
+
warn: console.warn,
|
|
47
|
+
error: console.error,
|
|
48
|
+
info: console.info,
|
|
49
|
+
debug: console.debug,
|
|
38
50
|
};
|
|
39
51
|
// METRICS -------------------------------------------------------------------------------------
|
|
40
52
|
// Metrics follow a different pattern in OpenTelemetry
|
|
41
|
-
|
|
53
|
+
exports.inMemoryDbMetricExporter = new InMemoryDbMetricExporter_js_1.InMemoryDbMetricExporter();
|
|
42
54
|
// Readers and their exporters cannot be grouped together in a MultiReader or similar construct
|
|
43
|
-
// due to differences in aggregation temporality and aggregation selection.
|
|
55
|
+
// due to differences in aggregation temporality and aggregation selection.
|
|
56
|
+
// INSTRUMENTATIONS -----------------------------------------------------------------------
|
|
57
|
+
exports.instrumentations = [];
|
|
@@ -1,68 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
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
6
|
exports.agent = agent;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
function
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
async function agent(openai, messages, model = "gpt-3.5-turbo", extraPrompts = []) {
|
|
16
|
-
for (let i = 0; i < 5; i++) {
|
|
17
|
-
const modelResponse = await openai.chat.completions.create({
|
|
18
|
-
model,
|
|
19
|
-
messages,
|
|
20
|
-
tools: _tools.tools
|
|
21
|
-
});
|
|
22
|
-
const {
|
|
23
|
-
finish_reason,
|
|
24
|
-
message
|
|
25
|
-
} = modelResponse.choices[0];
|
|
26
|
-
if (finish_reason === "tool_calls" && message.tool_calls) {
|
|
27
|
-
_logger.default.debug("Tool calls detected:", message.tool_calls);
|
|
28
|
-
const results = [];
|
|
29
|
-
for (const toolCall of message.tool_calls) {
|
|
30
|
-
const functionName = toolCall.function.name;
|
|
31
|
-
const functionToCall = _tools.availableTools[functionName];
|
|
32
|
-
const functionArgs = JSON.parse(toolCall.function.arguments);
|
|
33
|
-
const functionArgsArr = Object.values(functionArgs);
|
|
34
|
-
// @ts-expect-error yes
|
|
35
|
-
// eslint-disable-next-line prefer-spread
|
|
36
|
-
const functionResponse = await functionToCall.apply(null, functionArgsArr);
|
|
37
|
-
results.push({
|
|
38
|
-
name: functionName,
|
|
39
|
-
response: functionResponse
|
|
7
|
+
const tools_js_1 = require("./tools.cjs");
|
|
8
|
+
const logger_js_1 = __importDefault(require("../utils/logger.cjs"));
|
|
9
|
+
async function agent(openai, messages, model = "gpt-3.5-turbo") {
|
|
10
|
+
for (let i = 0; i < 5; i++) {
|
|
11
|
+
const modelResponse = await openai.chat.completions.create({
|
|
12
|
+
model,
|
|
13
|
+
messages,
|
|
14
|
+
tools: tools_js_1.tools,
|
|
40
15
|
});
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
16
|
+
const { finish_reason, message } = modelResponse.choices[0];
|
|
17
|
+
if (finish_reason === "tool_calls" && message.tool_calls) {
|
|
18
|
+
logger_js_1.default.debug("Tool calls detected:", message.tool_calls);
|
|
19
|
+
const results = [];
|
|
20
|
+
for (const toolCall of message.tool_calls) {
|
|
21
|
+
// Type guard for tool_calls
|
|
22
|
+
if (toolCall.type !== 'function' || !toolCall.function)
|
|
23
|
+
continue;
|
|
24
|
+
const functionName = toolCall.function.name;
|
|
25
|
+
const functionToCall = tools_js_1.availableTools[functionName];
|
|
26
|
+
const functionArgs = JSON.parse(toolCall.function.arguments);
|
|
27
|
+
const functionArgsArr = Object.values(functionArgs);
|
|
28
|
+
// eslint-disable-next-line prefer-spread
|
|
29
|
+
const functionResponse = await functionToCall.apply(null, functionArgsArr);
|
|
30
|
+
results.push({
|
|
31
|
+
name: functionName,
|
|
32
|
+
response: functionResponse,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const resultMessage = results.map(({ name, response }, idx) => {
|
|
36
|
+
const toolCall = message.tool_calls?.[idx];
|
|
37
|
+
const params = toolCall && toolCall.type === 'function' && toolCall.function ? JSON.parse(toolCall.function.arguments) : {};
|
|
38
|
+
return `Tool "${name}" called with parameters:\n${JSON.stringify(params, null, 2)}\nResult:\n${JSON.stringify(response, null, 2)}`;
|
|
39
|
+
}).join("\n\n");
|
|
40
|
+
messages.push({
|
|
41
|
+
role: "function",
|
|
42
|
+
name: "multiple_tool_calls",
|
|
43
|
+
content: resultMessage,
|
|
44
|
+
timestamp: new Date().toISOString()
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
else if (finish_reason === "stop") {
|
|
48
|
+
messages.push({ ...message, timestamp: new Date().toISOString() });
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
61
51
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
role: "assistant",
|
|
65
|
-
content: "Maximum iterations reached without a suitable response. Try a more specific query.",
|
|
66
|
-
timestamp: new Date().toISOString()
|
|
67
|
-
});
|
|
68
|
-
}
|
|
52
|
+
messages.push({ role: "assistant", content: "Maximum iterations reached without a suitable response. Try a more specific query.", timestamp: new Date().toISOString() });
|
|
53
|
+
}
|