@revenium/perplexity 1.0.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/LICENSE +21 -0
- package/README.md +367 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/models/Exception/ApiResponseError.d.ts +6 -0
- package/dist/models/Exception/ApiResponseError.d.ts.map +1 -0
- package/dist/models/Exception/ApiResponseError.js +13 -0
- package/dist/models/Exception/ApiResponseError.js.map +1 -0
- package/dist/models/Exception/ConfigurationError.d.ts +4 -0
- package/dist/models/Exception/ConfigurationError.d.ts.map +1 -0
- package/dist/models/Exception/ConfigurationError.js +11 -0
- package/dist/models/Exception/ConfigurationError.js.map +1 -0
- package/dist/models/Exception/MeteringError.d.ts +5 -0
- package/dist/models/Exception/MeteringError.d.ts.map +1 -0
- package/dist/models/Exception/MeteringError.js +12 -0
- package/dist/models/Exception/MeteringError.js.map +1 -0
- package/dist/models/Exception/MiddlewareActivationError.d.ts +4 -0
- package/dist/models/Exception/MiddlewareActivationError.d.ts.map +1 -0
- package/dist/models/Exception/MiddlewareActivationError.js +11 -0
- package/dist/models/Exception/MiddlewareActivationError.js.map +1 -0
- package/dist/models/Exception/StreamTrackingError.d.ts +4 -0
- package/dist/models/Exception/StreamTrackingError.d.ts.map +1 -0
- package/dist/models/Exception/StreamTrackingError.js +11 -0
- package/dist/models/Exception/StreamTrackingError.js.map +1 -0
- package/dist/models/Exception/TokenCountingError.d.ts +4 -0
- package/dist/models/Exception/TokenCountingError.d.ts.map +1 -0
- package/dist/models/Exception/TokenCountingError.js +11 -0
- package/dist/models/Exception/TokenCountingError.js.map +1 -0
- package/dist/models/Exception/index.d.ts +7 -0
- package/dist/models/Exception/index.d.ts.map +1 -0
- package/dist/models/Exception/index.js +23 -0
- package/dist/models/Exception/index.js.map +1 -0
- package/dist/models/Logger.d.ts +10 -0
- package/dist/models/Logger.d.ts.map +1 -0
- package/dist/models/Logger.js +36 -0
- package/dist/models/Logger.js.map +1 -0
- package/dist/models/index.d.ts +3 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +19 -0
- package/dist/models/index.js.map +1 -0
- package/dist/perplexity-ai/client.d.ts +31 -0
- package/dist/perplexity-ai/client.d.ts.map +1 -0
- package/dist/perplexity-ai/client.js +75 -0
- package/dist/perplexity-ai/client.js.map +1 -0
- package/dist/perplexity-ai/index.d.ts +3 -0
- package/dist/perplexity-ai/index.d.ts.map +1 -0
- package/dist/perplexity-ai/index.js +19 -0
- package/dist/perplexity-ai/index.js.map +1 -0
- package/dist/perplexity-ai/middleware.d.ts +2 -0
- package/dist/perplexity-ai/middleware.d.ts.map +1 -0
- package/dist/perplexity-ai/middleware.js +163 -0
- package/dist/perplexity-ai/middleware.js.map +1 -0
- package/dist/types/context.d.ts +9 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +3 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +28 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/metering.d.ts +28 -0
- package/dist/types/metering.d.ts.map +1 -0
- package/dist/types/metering.js +3 -0
- package/dist/types/metering.js.map +1 -0
- package/dist/types/modelInfo.d.ts +6 -0
- package/dist/types/modelInfo.d.ts.map +1 -0
- package/dist/types/modelInfo.js +3 -0
- package/dist/types/modelInfo.js.map +1 -0
- package/dist/types/operation.d.ts +5 -0
- package/dist/types/operation.d.ts.map +1 -0
- package/dist/types/operation.js +9 -0
- package/dist/types/operation.js.map +1 -0
- package/dist/types/perplexityConfig.d.ts +5 -0
- package/dist/types/perplexityConfig.d.ts.map +1 -0
- package/dist/types/perplexityConfig.js +3 -0
- package/dist/types/perplexityConfig.js.map +1 -0
- package/dist/types/provider.d.ts +4 -0
- package/dist/types/provider.d.ts.map +1 -0
- package/dist/types/provider.js +8 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/reveniumConfig.d.ts +6 -0
- package/dist/types/reveniumConfig.d.ts.map +1 -0
- package/dist/types/reveniumConfig.js +3 -0
- package/dist/types/reveniumConfig.js.map +1 -0
- package/dist/types/streamTracker.d.ts +9 -0
- package/dist/types/streamTracker.d.ts.map +1 -0
- package/dist/types/streamTracker.js +3 -0
- package/dist/types/streamTracker.js.map +1 -0
- package/dist/types/subscriber.d.ts +9 -0
- package/dist/types/subscriber.d.ts.map +1 -0
- package/dist/types/subscriber.js +3 -0
- package/dist/types/subscriber.js.map +1 -0
- package/dist/types/tokenCounts.d.ts +6 -0
- package/dist/types/tokenCounts.d.ts.map +1 -0
- package/dist/types/tokenCounts.js +3 -0
- package/dist/types/tokenCounts.js.map +1 -0
- package/dist/types/usageData.d.ts +16 -0
- package/dist/types/usageData.d.ts.map +1 -0
- package/dist/types/usageData.js +3 -0
- package/dist/types/usageData.js.map +1 -0
- package/dist/types/usageMetadata.d.ts +14 -0
- package/dist/types/usageMetadata.d.ts.map +1 -0
- package/dist/types/usageMetadata.js +3 -0
- package/dist/types/usageMetadata.js.map +1 -0
- package/dist/utils/activeMiddleware.d.ts +2 -0
- package/dist/utils/activeMiddleware.d.ts.map +1 -0
- package/dist/utils/activeMiddleware.js +24 -0
- package/dist/utils/activeMiddleware.js.map +1 -0
- package/dist/utils/askConsole.d.ts +2 -0
- package/dist/utils/askConsole.d.ts.map +1 -0
- package/dist/utils/askConsole.js +20 -0
- package/dist/utils/askConsole.js.map +1 -0
- package/dist/utils/calculateDurationMs.d.ts +2 -0
- package/dist/utils/calculateDurationMs.d.ts.map +1 -0
- package/dist/utils/calculateDurationMs.js +7 -0
- package/dist/utils/calculateDurationMs.js.map +1 -0
- package/dist/utils/constants/constants.d.ts +9 -0
- package/dist/utils/constants/constants.d.ts.map +1 -0
- package/dist/utils/constants/constants.js +19 -0
- package/dist/utils/constants/constants.js.map +1 -0
- package/dist/utils/constants/messages.d.ts +19 -0
- package/dist/utils/constants/messages.d.ts.map +1 -0
- package/dist/utils/constants/messages.js +22 -0
- package/dist/utils/constants/messages.js.map +1 -0
- package/dist/utils/createMeteringRequest.d.ts +3 -0
- package/dist/utils/createMeteringRequest.d.ts.map +1 -0
- package/dist/utils/createMeteringRequest.js +10 -0
- package/dist/utils/createMeteringRequest.js.map +1 -0
- package/dist/utils/createPerplexityMetadata.d.ts +3 -0
- package/dist/utils/createPerplexityMetadata.d.ts.map +1 -0
- package/dist/utils/createPerplexityMetadata.js +12 -0
- package/dist/utils/createPerplexityMetadata.js.map +1 -0
- package/dist/utils/extractModelName.d.ts +2 -0
- package/dist/utils/extractModelName.d.ts.map +1 -0
- package/dist/utils/extractModelName.js +15 -0
- package/dist/utils/extractModelName.js.map +1 -0
- package/dist/utils/extractPerplexityTokenCounts.d.ts +3 -0
- package/dist/utils/extractPerplexityTokenCounts.d.ts.map +1 -0
- package/dist/utils/extractPerplexityTokenCounts.js +17 -0
- package/dist/utils/extractPerplexityTokenCounts.js.map +1 -0
- package/dist/utils/extractStopReason.d.ts +2 -0
- package/dist/utils/extractStopReason.d.ts.map +1 -0
- package/dist/utils/extractStopReason.js +14 -0
- package/dist/utils/extractStopReason.js.map +1 -0
- package/dist/utils/extractUsageMetadata.d.ts +3 -0
- package/dist/utils/extractUsageMetadata.d.ts.map +1 -0
- package/dist/utils/extractUsageMetadata.js +15 -0
- package/dist/utils/extractUsageMetadata.js.map +1 -0
- package/dist/utils/formatTimestamp.d.ts +2 -0
- package/dist/utils/formatTimestamp.d.ts.map +1 -0
- package/dist/utils/formatTimestamp.js +7 -0
- package/dist/utils/formatTimestamp.js.map +1 -0
- package/dist/utils/generateTransactionId.d.ts +2 -0
- package/dist/utils/generateTransactionId.d.ts.map +1 -0
- package/dist/utils/generateTransactionId.js +8 -0
- package/dist/utils/generateTransactionId.js.map +1 -0
- package/dist/utils/getEnv.d.ts +4 -0
- package/dist/utils/getEnv.d.ts.map +1 -0
- package/dist/utils/getEnv.js +16 -0
- package/dist/utils/getEnv.js.map +1 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +29 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/safeExtract.d.ts +2 -0
- package/dist/utils/safeExtract.d.ts.map +1 -0
- package/dist/utils/safeExtract.js +22 -0
- package/dist/utils/safeExtract.js.map +1 -0
- package/dist/utils/sendMeteringData.d.ts +3 -0
- package/dist/utils/sendMeteringData.d.ts.map +1 -0
- package/dist/utils/sendMeteringData.js +35 -0
- package/dist/utils/sendMeteringData.js.map +1 -0
- package/dist/utils/verifyLogVerbose.d.ts +2 -0
- package/dist/utils/verifyLogVerbose.d.ts.map +1 -0
- package/dist/utils/verifyLogVerbose.js +10 -0
- package/dist/utils/verifyLogVerbose.js.map +1 -0
- package/examples/README.md +316 -0
- package/examples/basic-client-example.ts +36 -0
- package/examples/metadata-example.ts +92 -0
- package/examples/multiple-models-example.ts +65 -0
- package/examples/openai-client-example.ts +76 -0
- package/examples/perplexity_basic_example.ts +24 -0
- package/examples/perplexity_middleware_example.ts +222 -0
- package/examples/run-all-examples.ts +118 -0
- package/examples/simple-test.ts +278 -0
- package/examples/streaming-example.ts +46 -0
- package/package.json +54 -0
- package/src/index.ts +38 -0
- package/src/models/Exception/ApiResponseError.ts +6 -0
- package/src/models/Exception/ConfigurationError.ts +6 -0
- package/src/models/Exception/MeteringError.ts +6 -0
- package/src/models/Exception/MiddlewareActivationError.ts +6 -0
- package/src/models/Exception/StreamTrackingError.ts +6 -0
- package/src/models/Exception/TokenCountingError.ts +6 -0
- package/src/models/Exception/index.ts +6 -0
- package/src/models/Logger.ts +38 -0
- package/src/models/index.ts +2 -0
- package/src/perplexity-ai/client.ts +97 -0
- package/src/perplexity-ai/index.ts +2 -0
- package/src/perplexity-ai/middleware.ts +259 -0
- package/src/types/context.ts +9 -0
- package/src/types/index.ts +11 -0
- package/src/types/metering.ts +28 -0
- package/src/types/modelInfo.ts +5 -0
- package/src/types/operation.ts +4 -0
- package/src/types/perplexityConfig.ts +4 -0
- package/src/types/provider.ts +3 -0
- package/src/types/reveniumConfig.ts +5 -0
- package/src/types/streamTracker.ts +9 -0
- package/src/types/subscriber.ts +8 -0
- package/src/types/tokenCounts.ts +5 -0
- package/src/types/usageData.ts +16 -0
- package/src/types/usageMetadata.ts +13 -0
- package/src/utils/activeMiddleware.ts +34 -0
- package/src/utils/askConsole.ts +15 -0
- package/src/utils/calculateDurationMs.ts +3 -0
- package/src/utils/constants/constants.ts +17 -0
- package/src/utils/constants/messages.ts +35 -0
- package/src/utils/createMeteringRequest.ts +16 -0
- package/src/utils/createPerplexityMetadata.ts +11 -0
- package/src/utils/extractModelName.ts +14 -0
- package/src/utils/extractPerplexityTokenCounts.ts +16 -0
- package/src/utils/extractStopReason.ts +13 -0
- package/src/utils/extractUsageMetadata.ts +15 -0
- package/src/utils/formatTimestamp.ts +3 -0
- package/src/utils/generateTransactionId.ts +5 -0
- package/src/utils/getEnv.ts +16 -0
- package/src/utils/index.ts +12 -0
- package/src/utils/safeExtract.ts +18 -0
- package/src/utils/sendMeteringData.ts +46 -0
- package/src/utils/verifyLogVerbose.ts +7 -0
- package/tsconfig.json +23 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./activeMiddleware"), exports);
|
|
18
|
+
__exportStar(require("./calculateDurationMs"), exports);
|
|
19
|
+
__exportStar(require("./createMeteringRequest"), exports);
|
|
20
|
+
__exportStar(require("./createPerplexityMetadata"), exports);
|
|
21
|
+
__exportStar(require("./extractModelName"), exports);
|
|
22
|
+
__exportStar(require("./extractPerplexityTokenCounts"), exports);
|
|
23
|
+
__exportStar(require("./extractStopReason"), exports);
|
|
24
|
+
__exportStar(require("./extractUsageMetadata"), exports);
|
|
25
|
+
__exportStar(require("./formatTimestamp"), exports);
|
|
26
|
+
__exportStar(require("./generateTransactionId"), exports);
|
|
27
|
+
__exportStar(require("./safeExtract"), exports);
|
|
28
|
+
__exportStar(require("./sendMeteringData"), exports);
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,wDAAsC;AACtC,0DAAwC;AACxC,6DAA2C;AAC3C,qDAAmC;AACnC,iEAA+C;AAC/C,sDAAoC;AACpC,yDAAuC;AACvC,oDAAkC;AAClC,0DAAwC;AACxC,gDAA8B;AAC9B,qDAAmC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeExtract.d.ts","sourceRoot":"","sources":["../../src/utils/safeExtract.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAiBzE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.safeExtract = safeExtract;
|
|
4
|
+
function safeExtract(obj, path, defaultValue) {
|
|
5
|
+
try {
|
|
6
|
+
const keys = path.split(".");
|
|
7
|
+
let result = obj;
|
|
8
|
+
for (const key of keys) {
|
|
9
|
+
if (result && typeof result === "object" && key in result) {
|
|
10
|
+
result = result[key];
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
return defaultValue;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return result ?? defaultValue;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return defaultValue;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=safeExtract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safeExtract.js","sourceRoot":"","sources":["../../src/utils/safeExtract.ts"],"names":[],"mappings":";;AAAA,kCAiBC;AAjBD,SAAgB,WAAW,CAAI,GAAQ,EAAE,IAAY,EAAE,YAAe;IACpE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,MAAM,GAAG,GAAG,CAAC;QAEjB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;gBAC1D,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,OAAO,YAAY,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,IAAI,YAAY,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendMeteringData.d.ts","sourceRoot":"","sources":["../../src/utils/sendMeteringData.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAI3C,wBAAsB,gBAAgB,CACpC,eAAe,EAAE,eAAe,EAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAoCf"}
|
|
@@ -0,0 +1,35 @@
|
|
|
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.sendMeteringData = sendMeteringData;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const models_1 = require("../models");
|
|
9
|
+
const constants_1 = require("./constants/constants");
|
|
10
|
+
async function sendMeteringData(meteringRequest, apiKey, baseUrl) {
|
|
11
|
+
try {
|
|
12
|
+
const response = await axios_1.default.post(`${baseUrl}/v2/ai/completions`, meteringRequest, {
|
|
13
|
+
headers: {
|
|
14
|
+
"Content-Type": "application/json",
|
|
15
|
+
Accept: "application/json",
|
|
16
|
+
"x-api-key": apiKey,
|
|
17
|
+
},
|
|
18
|
+
timeout: constants_1.TIMEOUT_MS,
|
|
19
|
+
});
|
|
20
|
+
if (response.status !== constants_1.STATUS_CODE.SUCCESS &&
|
|
21
|
+
response.status !== constants_1.STATUS_CODE.CREATED) {
|
|
22
|
+
throw new models_1.MeteringError(`Failed to send metering data. Status: ${response.status}`, new Error(`HTTP ${response.status}`));
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
console.log("š [DEBUG] Metering data sent successfully");
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (error instanceof models_1.MeteringError) {
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
throw new models_1.MeteringError("Failed to send metering data to Revenium", error);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=sendMeteringData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendMeteringData.js","sourceRoot":"","sources":["../../src/utils/sendMeteringData.ts"],"names":[],"mappings":";;;;;AAKA,4CAwCC;AA7CD,kDAA0B;AAE1B,sCAA0C;AAC1C,qDAAgE;AAEzD,KAAK,UAAU,gBAAgB,CACpC,eAAgC,EAChC,MAAc,EACd,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAC/B,GAAG,OAAO,oBAAoB,EAC9B,eAAe,EACf;YACE,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;gBAC1B,WAAW,EAAE,MAAM;aACpB;YACD,OAAO,EAAE,sBAAU;SACpB,CACF,CAAC;QAEF,IACE,QAAQ,CAAC,MAAM,KAAK,uBAAW,CAAC,OAAO;YACvC,QAAQ,CAAC,MAAM,KAAK,uBAAW,CAAC,OAAO,EACvC,CAAC;YACD,MAAM,IAAI,sBAAa,CACrB,yCAAyC,QAAQ,CAAC,MAAM,EAAE,EAC1D,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC,CACrC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,sBAAa,EAAE,CAAC;YACnC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,IAAI,sBAAa,CACrB,0CAA0C,EAC1C,KAAc,CACf,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyLogVerbose.d.ts","sourceRoot":"","sources":["../../src/utils/verifyLogVerbose.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAIxE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifyLogVerbose = verifyLogVerbose;
|
|
4
|
+
const models_1 = require("../models");
|
|
5
|
+
function verifyLogVerbose(verbose, message) {
|
|
6
|
+
if (verbose) {
|
|
7
|
+
models_1.Logger.info(message);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=verifyLogVerbose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifyLogVerbose.js","sourceRoot":"","sources":["../../src/utils/verifyLogVerbose.ts"],"names":[],"mappings":";;AAEA,4CAIC;AAND,sCAAmC;AAEnC,SAAgB,gBAAgB,CAAC,OAAgB,EAAE,OAAe;IAChE,IAAI,OAAO,EAAE,CAAC;QACZ,eAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
# š Revenium Perplexity AI Middleware Examples
|
|
2
|
+
|
|
3
|
+
Examples that demonstrate seamless metadata integration with Perplexity AI using the published npm package.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### Install the package:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install revenium-middleware-perplexity-node
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Set up environment variables (create .env in your project):
|
|
14
|
+
|
|
15
|
+
```env
|
|
16
|
+
# Required for all examples
|
|
17
|
+
REVENIUM_METERING_API_KEY=hak_your_api_key
|
|
18
|
+
# REVENIUM_METERING_BASE_URL=https://api.revenium.io/meter/v2 # Optional: defaults to this URL
|
|
19
|
+
|
|
20
|
+
# Required for Perplexity AI
|
|
21
|
+
PERPLEXITY_API_KEY=pplx_your_perplexity_key
|
|
22
|
+
|
|
23
|
+
# Optional: Perplexity base URL (defaults to https://api.perplexity.ai)
|
|
24
|
+
PERPLEXITY_BASE_URL=https://api.perplexity.ai
|
|
25
|
+
|
|
26
|
+
# Optional: Enable verbose logging
|
|
27
|
+
REVENIUM_VERBOSE_STARTUP=true
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Copy and run any example:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Copy the example files to your project and run them
|
|
34
|
+
node basic-client-example.js # Basic Perplexity integration
|
|
35
|
+
node streaming-example.js # Streaming with metadata
|
|
36
|
+
node metadata-example.js # Advanced metadata tracking
|
|
37
|
+
node multiple-models-example.js # Multiple models usage
|
|
38
|
+
node openai-client-example.js # OpenAI client compatibility
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Development Setup (For Contributors)
|
|
42
|
+
|
|
43
|
+
If you're contributing to this repository:
|
|
44
|
+
|
|
45
|
+
### Clone and build:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
git clone https://github.com/revenium/revenium-middleware-perplexity-node.git
|
|
49
|
+
cd revenium-middleware-perplexity-node
|
|
50
|
+
npm install && npm run build
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Run examples from repository:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npx ts-node examples/basic-client-example.ts # Basic Perplexity integration
|
|
57
|
+
npx ts-node examples/streaming-example.ts # Streaming with metadata
|
|
58
|
+
npx ts-node examples/metadata-example.ts # Advanced metadata tracking
|
|
59
|
+
npx ts-node examples/multiple-models-example.ts # Multiple models usage
|
|
60
|
+
npx ts-node examples/openai-client-example.ts # OpenAI client compatibility
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Basic API Examples
|
|
64
|
+
|
|
65
|
+
### š basic-client-example.ts - Start here
|
|
66
|
+
|
|
67
|
+
Perplexity AI chat completions with automatic metadata tracking. Shows native TypeScript support without type casting.
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
// Chat with automatic tracking - no configuration needed!
|
|
71
|
+
const response = await client.createChatCompletion({
|
|
72
|
+
model: "sonar-pro",
|
|
73
|
+
messages: [{ role: "user", content: "Hello!" }],
|
|
74
|
+
// ⨠All metadata fields are optional!
|
|
75
|
+
usageMetadata: {
|
|
76
|
+
// User tracking (optional)
|
|
77
|
+
subscriberId: "user-123",
|
|
78
|
+
subscriberEmail: "user@acme-corp.com",
|
|
79
|
+
|
|
80
|
+
// Business context (optional)
|
|
81
|
+
organizationId: "acme-corp",
|
|
82
|
+
productId: "chat-app",
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### š streaming-example.ts
|
|
88
|
+
|
|
89
|
+
Streaming chat responses with automatic usage tracking when streams complete.
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
const stream = await client.createStreamingChatCompletion({
|
|
93
|
+
model: "sonar-pro",
|
|
94
|
+
messages: [{ role: "user", content: "Write a creative story about AI" }],
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
for await (const chunk of stream) {
|
|
98
|
+
const content = chunk.choices[0]?.delta?.content;
|
|
99
|
+
if (content) {
|
|
100
|
+
process.stdout.write(content);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Usage automatically tracked when stream completes
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### š metadata-example.ts
|
|
107
|
+
|
|
108
|
+
Advanced metadata tracking with multiple examples showing different use cases.
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
// Example 1: Basic metadata
|
|
112
|
+
const basicResponse = await client.createChatCompletion({
|
|
113
|
+
model: "sonar-pro",
|
|
114
|
+
messages: [{ role: "user", content: "Analyze this quarterly report" }],
|
|
115
|
+
usageMetadata: {
|
|
116
|
+
traceId: "conv-28a7e9d4",
|
|
117
|
+
taskType: "document-analysis",
|
|
118
|
+
subscriberEmail: "user@example.com",
|
|
119
|
+
organizationId: "acme-corp",
|
|
120
|
+
subscriptionId: "premium-plan",
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Example 2: Advanced metadata
|
|
125
|
+
const advancedResponse = await client.createChatCompletion({
|
|
126
|
+
model: "sonar-pro",
|
|
127
|
+
messages: [
|
|
128
|
+
{ role: "user", content: "What are the latest developments in AI?" },
|
|
129
|
+
],
|
|
130
|
+
usageMetadata: {
|
|
131
|
+
traceId: "conv-advanced-123",
|
|
132
|
+
taskType: "research",
|
|
133
|
+
subscriberId: "user-12345",
|
|
134
|
+
subscriberCredentialName: "api-key-1",
|
|
135
|
+
productId: "business-intelligence",
|
|
136
|
+
agent: "research-assistant-v2",
|
|
137
|
+
responseQualityScore: 0.95,
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### š¤ multiple-models-example.ts
|
|
143
|
+
|
|
144
|
+
Demonstrates usage across different Perplexity AI models.
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
const models = ["sonar-small", "sonar-medium", "sonar-pro"];
|
|
148
|
+
|
|
149
|
+
for (const model of models) {
|
|
150
|
+
const response = await client.createChatCompletion({
|
|
151
|
+
model,
|
|
152
|
+
messages: [{ role: "user", content: "Hello, how are you?" }],
|
|
153
|
+
usageMetadata: {
|
|
154
|
+
taskType: "model-testing",
|
|
155
|
+
model: model,
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
console.log(`${model}: ${response.choices[0].message.content}`);
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### š openai-client-example.ts
|
|
163
|
+
|
|
164
|
+
Shows compatibility with OpenAI client library for easy migration.
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
import { OpenAI } from "openai";
|
|
168
|
+
import "revenium-middleware-perplexity-node";
|
|
169
|
+
|
|
170
|
+
const client = new OpenAI({
|
|
171
|
+
apiKey: process.env.PERPLEXITY_API_KEY,
|
|
172
|
+
baseURL: "https://api.perplexity.ai",
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
const response = await client.chat.completions.create({
|
|
176
|
+
model: "sonar-pro",
|
|
177
|
+
messages: [{ role: "user", content: "Hello from OpenAI client!" }],
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### š§Ŗ simple-test.ts
|
|
182
|
+
|
|
183
|
+
Comprehensive test suite demonstrating all middleware capabilities.
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
// Tests various scenarios:
|
|
187
|
+
// - Basic chat completion
|
|
188
|
+
// - Streaming responses
|
|
189
|
+
// - Error handling
|
|
190
|
+
// - Metadata validation
|
|
191
|
+
// - Token counting
|
|
192
|
+
// - Request interception
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### šāāļø run-all-examples.ts
|
|
196
|
+
|
|
197
|
+
Executes all examples in sequence for comprehensive testing.
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
// Runs all examples in order:
|
|
201
|
+
// 1. Basic client
|
|
202
|
+
// 2. Streaming
|
|
203
|
+
// 3. Metadata
|
|
204
|
+
// 4. Multiple models
|
|
205
|
+
// 5. OpenAI client
|
|
206
|
+
// 6. Simple test
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Key Features Demonstrated
|
|
210
|
+
|
|
211
|
+
- ā
**Optional Metadata**: All Revenium metadata fields are optional - use what you need
|
|
212
|
+
- ā
**Automatic Tracking**: Revenium meters usage automatically for standard AI metadata
|
|
213
|
+
- ā
**Streaming Support**: Real-time tracking when streams complete
|
|
214
|
+
- ā
**Perplexity AI Support**: Native integration with Perplexity's API
|
|
215
|
+
- ā
**Multiple APIs**: Chat completions and streaming both supported
|
|
216
|
+
- ā
**TypeScript Support**: Full type safety with optional metadata fields
|
|
217
|
+
- ā
**Error Handling**: Graceful fallbacks when metering fails
|
|
218
|
+
- ā
**Background Processing**: Non-blocking usage tracking
|
|
219
|
+
|
|
220
|
+
## Running Examples
|
|
221
|
+
|
|
222
|
+
### Prerequisites:
|
|
223
|
+
|
|
224
|
+
- Node.js 16+
|
|
225
|
+
- Valid Revenium API key
|
|
226
|
+
- Valid Perplexity AI API key
|
|
227
|
+
|
|
228
|
+
### Run compiled JavaScript (after npm run build):
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
node dist/examples/basic-client-example.js
|
|
232
|
+
node dist/examples/streaming-example.js
|
|
233
|
+
node dist/examples/metadata-example.js
|
|
234
|
+
node dist/examples/multiple-models-example.js
|
|
235
|
+
node dist/examples/openai-client-example.js
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Run with TypeScript directly:
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
npx ts-node examples/basic-client-example.ts
|
|
242
|
+
npx ts-node examples/streaming-example.ts
|
|
243
|
+
npx ts-node examples/metadata-example.ts
|
|
244
|
+
npx ts-node examples/multiple-models-example.ts
|
|
245
|
+
npx ts-node examples/openai-client-example.ts
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Understanding the Magic
|
|
249
|
+
|
|
250
|
+
The middleware works by:
|
|
251
|
+
|
|
252
|
+
1. **Initialize**: `createPerplexityClient()` loads configuration automatically
|
|
253
|
+
2. **Seamless Integration**: Use Perplexity AI normally with optional `usageMetadata`
|
|
254
|
+
3. **Data Extraction**: Captures tokens, timing, model info, and metadata
|
|
255
|
+
4. **Background Tracking**: Sends data to Revenium without blocking your app
|
|
256
|
+
5. **Transparent Response**: Returns original Perplexity AI response unchanged
|
|
257
|
+
|
|
258
|
+
The result: Your existing Perplexity AI code works exactly the same, but now you get automatic usage tracking and rich analytics.
|
|
259
|
+
|
|
260
|
+
## Integration Tips
|
|
261
|
+
|
|
262
|
+
### Express.js
|
|
263
|
+
|
|
264
|
+
Load env vars first, create separate Perplexity module, use client instance everywhere.
|
|
265
|
+
|
|
266
|
+
### Next.js
|
|
267
|
+
|
|
268
|
+
Use global variables to prevent re-initialization, works with Pages/App Router.
|
|
269
|
+
|
|
270
|
+
### Serverless
|
|
271
|
+
|
|
272
|
+
Singleton pattern for cold starts, handle CORS for browsers.
|
|
273
|
+
|
|
274
|
+
### Docker
|
|
275
|
+
|
|
276
|
+
Validate env vars at startup, add health checks for orchestration.
|
|
277
|
+
|
|
278
|
+
For detailed framework integration patterns, see the main [README.md](../README.md) documentation.
|
|
279
|
+
|
|
280
|
+
## Troubleshooting
|
|
281
|
+
|
|
282
|
+
Having integration issues? Check the Troubleshooting Guide for:
|
|
283
|
+
|
|
284
|
+
- Common integration problems and solutions
|
|
285
|
+
- Debug logging and diagnostics
|
|
286
|
+
- Framework-specific troubleshooting tips
|
|
287
|
+
- Environment variable configuration
|
|
288
|
+
|
|
289
|
+
### Quick debug mode:
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
export REVENIUM_VERBOSE_STARTUP=true
|
|
293
|
+
npx ts-node examples/basic-client-example.ts
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Common Issues:
|
|
297
|
+
|
|
298
|
+
1. **Middleware not activating**: Ensure you're importing the package before creating client instances
|
|
299
|
+
2. **Environment variables**: Verify all required environment variables are set
|
|
300
|
+
3. **API keys**: Check that both Perplexity AI and Revenium API keys are valid
|
|
301
|
+
4. **TypeScript errors**: Ensure you have the latest TypeScript version
|
|
302
|
+
|
|
303
|
+
### Error Logs
|
|
304
|
+
|
|
305
|
+
The middleware provides detailed error logs when issues occur. Check your console output for specific error messages and refer to the main documentation for solutions.
|
|
306
|
+
|
|
307
|
+
## Next Steps
|
|
308
|
+
|
|
309
|
+
After running the examples:
|
|
310
|
+
|
|
311
|
+
1. **Customize metadata**: Adapt the metadata examples to your use case
|
|
312
|
+
2. **Integrate in your app**: Follow the integration patterns shown
|
|
313
|
+
3. **Monitor usage**: Check your Revenium dashboard for usage analytics
|
|
314
|
+
4. **Scale up**: Use the middleware across your entire application
|
|
315
|
+
|
|
316
|
+
For more information, visit the main [README.md](../README.md) or the [Revenium documentation](https://docs.revenium.io).
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { config } from "dotenv";
|
|
2
|
+
|
|
3
|
+
// Cargar variables de entorno ANTES de importar el middleware
|
|
4
|
+
config();
|
|
5
|
+
|
|
6
|
+
import { createPerplexityClient } from "../src/perplexity-ai";
|
|
7
|
+
|
|
8
|
+
async function basicExample() {
|
|
9
|
+
console.log("\nš¤ Perplexity AI - Basic Client Example");
|
|
10
|
+
console.log("=".repeat(50));
|
|
11
|
+
|
|
12
|
+
try {
|
|
13
|
+
// Create client instance
|
|
14
|
+
const client = createPerplexityClient();
|
|
15
|
+
|
|
16
|
+
// Make a simple chat completion
|
|
17
|
+
const response = await client.createChatCompletion({
|
|
18
|
+
model: "sonar-pro",
|
|
19
|
+
messages: [
|
|
20
|
+
{
|
|
21
|
+
role: "user",
|
|
22
|
+
content: "What is the meaning of life, the universe and everything?",
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
console.log("ā
Response received:");
|
|
28
|
+
console.log(response.choices[0].message.content);
|
|
29
|
+
console.log("\nš Token usage automatically tracked by middleware");
|
|
30
|
+
console.log("š Basic client example successful!");
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.error("ā Error:", error);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
basicExample().catch(console.error);
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { config } from "dotenv";
|
|
2
|
+
import { createPerplexityClient } from "../src/perplexity-ai";
|
|
3
|
+
|
|
4
|
+
config();
|
|
5
|
+
|
|
6
|
+
async function metadataExample() {
|
|
7
|
+
console.log("\nš Perplexity AI - Metadata Tracking Example");
|
|
8
|
+
console.log("=".repeat(50));
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
// Create client instance
|
|
12
|
+
const client = createPerplexityClient();
|
|
13
|
+
|
|
14
|
+
// Example 1: Basic metadata
|
|
15
|
+
console.log("\n1ļøā£ Basic metadata tracking:");
|
|
16
|
+
const basicResponse = await client.createChatCompletion({
|
|
17
|
+
model: "sonar-pro",
|
|
18
|
+
messages: [
|
|
19
|
+
{
|
|
20
|
+
role: "user",
|
|
21
|
+
content: "Analyze this quarterly report for key insights",
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
usageMetadata: {
|
|
25
|
+
traceId: "conv-28a7e9d4",
|
|
26
|
+
taskType: "document-analysis",
|
|
27
|
+
subscriberEmail: "user@example.com",
|
|
28
|
+
organizationId: "acme-corp",
|
|
29
|
+
subscriptionId: "premium-plan",
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
console.log("ā
Response:", basicResponse.choices[0]?.message?.content?.substring(0, 100) + "...");
|
|
34
|
+
|
|
35
|
+
// Example 2: Advanced metadata
|
|
36
|
+
console.log("\n2ļøā£ Advanced metadata tracking:");
|
|
37
|
+
const advancedResponse = await client.createChatCompletion({
|
|
38
|
+
model: "sonar-pro",
|
|
39
|
+
messages: [
|
|
40
|
+
{
|
|
41
|
+
role: "user",
|
|
42
|
+
content: "What are the latest developments in AI?",
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
usageMetadata: {
|
|
46
|
+
traceId: "conv-advanced-123",
|
|
47
|
+
taskType: "research",
|
|
48
|
+
subscriberId: "user-12345",
|
|
49
|
+
subscriberCredentialName: "api-key-1",
|
|
50
|
+
productId: "business-intelligence",
|
|
51
|
+
agent: "research-assistant-v2",
|
|
52
|
+
responseQualityScore: 0.95,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
console.log("ā
Response:", advancedResponse.choices[0]?.message?.content?.substring(0, 100) + "...");
|
|
57
|
+
|
|
58
|
+
// Example 3: Streaming with metadata
|
|
59
|
+
console.log("\n3ļøā£ Streaming with metadata:");
|
|
60
|
+
const stream = await client.createStreamingChatCompletion({
|
|
61
|
+
model: "sonar-pro",
|
|
62
|
+
messages: [
|
|
63
|
+
{
|
|
64
|
+
role: "user",
|
|
65
|
+
content: "Write a creative story about AI",
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
usageMetadata: {
|
|
69
|
+
traceId: "conv-streaming-456",
|
|
70
|
+
taskType: "creative-writing",
|
|
71
|
+
organizationId: "creative-studio",
|
|
72
|
+
agent: "story-generator",
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
console.log("š Streaming response with metadata:");
|
|
77
|
+
for await (const chunk of stream) {
|
|
78
|
+
const content = chunk.choices[0]?.delta?.content;
|
|
79
|
+
if (content) {
|
|
80
|
+
process.stdout.write(content);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
console.log("\n\nš All metadata examples completed successfully!");
|
|
85
|
+
console.log("š All usage tracked with custom metadata");
|
|
86
|
+
|
|
87
|
+
} catch (error) {
|
|
88
|
+
console.error("ā Error:", error);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
metadataExample().catch(console.error);
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { config } from "dotenv";
|
|
2
|
+
import { createPerplexityClient } from "../src/perplexity-ai";
|
|
3
|
+
|
|
4
|
+
config();
|
|
5
|
+
|
|
6
|
+
async function multipleModelsExample() {
|
|
7
|
+
console.log("\nš§ Perplexity AI - Multiple Models Example");
|
|
8
|
+
console.log("=".repeat(50));
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
// Create client instance
|
|
12
|
+
const client = createPerplexityClient();
|
|
13
|
+
|
|
14
|
+
// Test different prompts with the same model
|
|
15
|
+
const testCases = [
|
|
16
|
+
{
|
|
17
|
+
name: "sonar-pro (Quantum Computing)",
|
|
18
|
+
description: "Latest and most capable model",
|
|
19
|
+
prompt: "Explain quantum computing in simple terms",
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: "sonar-pro (AI Developments)",
|
|
23
|
+
description: "Latest and most capable model",
|
|
24
|
+
prompt: "What are the latest developments in AI?",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: "sonar-pro (Weather)",
|
|
28
|
+
description: "Latest and most capable model",
|
|
29
|
+
prompt: "What is the weather like today?",
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
for (const testCase of testCases) {
|
|
34
|
+
console.log(`\nš¤ Testing: ${testCase.name}`);
|
|
35
|
+
console.log(`š Description: ${testCase.description}`);
|
|
36
|
+
console.log("-".repeat(40));
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
const response = await client.createChatCompletion({
|
|
40
|
+
model: "sonar-pro",
|
|
41
|
+
messages: [
|
|
42
|
+
{
|
|
43
|
+
role: "user",
|
|
44
|
+
content: testCase.prompt,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
console.log("ā
Response:");
|
|
50
|
+
console.log(response.choices[0]?.message?.content?.substring(0, 200) + "...");
|
|
51
|
+
console.log("š Usage tracked by middleware");
|
|
52
|
+
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.log(`ā Error with ${testCase.name}:`, error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
console.log("\nš Multiple models example completed!");
|
|
59
|
+
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.error("ā Error:", error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
multipleModelsExample().catch(console.error);
|