@resolveio/server-lib 22.3.123 → 22.3.125

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.
Files changed (34) hide show
  1. package/collections/ai-run.collection.d.ts +3 -0
  2. package/collections/ai-run.collection.js +170 -0
  3. package/collections/ai-run.collection.js.map +1 -0
  4. package/managers/ai-run-evidence.manager.d.ts +36 -0
  5. package/managers/ai-run-evidence.manager.js +377 -0
  6. package/managers/ai-run-evidence.manager.js.map +1 -0
  7. package/managers/openai-usage-ledger.manager.d.ts +1 -0
  8. package/managers/openai-usage-ledger.manager.js +5 -56
  9. package/managers/openai-usage-ledger.manager.js.map +1 -1
  10. package/models/ai-run.model.d.ts +19 -0
  11. package/models/ai-run.model.js +4 -0
  12. package/models/ai-run.model.js.map +1 -0
  13. package/package.json +3 -1
  14. package/public_api.d.ts +7 -0
  15. package/public_api.js +7 -0
  16. package/public_api.js.map +1 -1
  17. package/util/ai-run-evidence-adapters.d.ts +33 -0
  18. package/util/ai-run-evidence-adapters.js +660 -0
  19. package/util/ai-run-evidence-adapters.js.map +1 -0
  20. package/util/ai-run-evidence-dashboard.d.ts +67 -0
  21. package/util/ai-run-evidence-dashboard.js +309 -0
  22. package/util/ai-run-evidence-dashboard.js.map +1 -0
  23. package/util/ai-run-evidence-eval.d.ts +86 -0
  24. package/util/ai-run-evidence-eval.js +854 -0
  25. package/util/ai-run-evidence-eval.js.map +1 -0
  26. package/util/ai-run-evidence.d.ts +212 -0
  27. package/util/ai-run-evidence.js +649 -0
  28. package/util/ai-run-evidence.js.map +1 -0
  29. package/util/ai-runner-qa-tools.d.ts +1 -0
  30. package/util/ai-runner-qa-tools.js +150 -16
  31. package/util/ai-runner-qa-tools.js.map +1 -1
  32. package/util/openai-usage-cost.d.ts +6 -0
  33. package/util/openai-usage-cost.js +92 -0
  34. package/util/openai-usage-cost.js.map +1 -0
@@ -0,0 +1,6 @@
1
+ export type OpenAIUsagePricingConfig = {
2
+ inputPer1k: number;
3
+ cachedInputPer1k?: number;
4
+ outputPer1k: number;
5
+ };
6
+ export declare const estimateOpenAIUsageCost: (model: string, inputTokens: number, outputTokens: number, cachedInputTokens?: number) => number;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.estimateOpenAIUsageCost = void 0;
15
+ var resolveio_server_app_1 = require("../resolveio-server-app");
16
+ var common_1 = require("./common");
17
+ var DEFAULT_OPENAI_MODEL_PRICING = {
18
+ 'gpt-5.5': { inputPer1k: 0.005, cachedInputPer1k: 0.0005, outputPer1k: 0.03 },
19
+ 'gpt-5.4': { inputPer1k: 0.0025, cachedInputPer1k: 0.00025, outputPer1k: 0.015 },
20
+ 'gpt-5.4-mini': { inputPer1k: 0.00075, cachedInputPer1k: 0.000075, outputPer1k: 0.0045 }
21
+ };
22
+ var toNumber = function (value) {
23
+ var parsed = Number(value);
24
+ return Number.isFinite(parsed) ? parsed : 0;
25
+ };
26
+ var normalizeModelKey = function (value) {
27
+ return String(value || '').trim().toLowerCase();
28
+ };
29
+ var parsePricingJson = function (raw) {
30
+ if (!raw) {
31
+ return {};
32
+ }
33
+ try {
34
+ var parsed_1 = JSON.parse(raw);
35
+ if (!parsed_1 || typeof parsed_1 !== 'object') {
36
+ return {};
37
+ }
38
+ var out_1 = {};
39
+ Object.keys(parsed_1).forEach(function (key) {
40
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
41
+ var entry = parsed_1[key] || {};
42
+ var inputPer1k = toNumber((_c = (_b = (_a = entry.inputPer1k) !== null && _a !== void 0 ? _a : entry.input) !== null && _b !== void 0 ? _b : entry.prompt) !== null && _c !== void 0 ? _c : 0);
43
+ var cachedInputPer1k = toNumber((_g = (_f = (_e = (_d = entry.cachedInputPer1k) !== null && _d !== void 0 ? _d : entry.cachedInput) !== null && _e !== void 0 ? _e : entry.cached) !== null && _f !== void 0 ? _f : entry.promptCached) !== null && _g !== void 0 ? _g : 0);
44
+ var outputPer1k = toNumber((_k = (_j = (_h = entry.outputPer1k) !== null && _h !== void 0 ? _h : entry.output) !== null && _j !== void 0 ? _j : entry.completion) !== null && _k !== void 0 ? _k : 0);
45
+ if (inputPer1k || cachedInputPer1k || outputPer1k) {
46
+ out_1[normalizeModelKey(key)] = { inputPer1k: inputPer1k, cachedInputPer1k: cachedInputPer1k, outputPer1k: outputPer1k };
47
+ }
48
+ });
49
+ return out_1;
50
+ }
51
+ catch (_a) {
52
+ return {};
53
+ }
54
+ };
55
+ var resolvePricingConfig = function () {
56
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
57
+ var config = resolveio_server_app_1.ResolveIOServer.getServerConfig() || {};
58
+ var rawJson = String((_b = (_a = config['OPENAI_MODEL_PRICING']) !== null && _a !== void 0 ? _a : process.env.OPENAI_MODEL_PRICING) !== null && _b !== void 0 ? _b : '').trim();
59
+ var defaultInput = toNumber((_d = (_c = config['OPENAI_COST_PER_1K_INPUT_TOKENS']) !== null && _c !== void 0 ? _c : process.env.OPENAI_COST_PER_1K_INPUT_TOKENS) !== null && _d !== void 0 ? _d : 0);
60
+ var defaultCachedInput = toNumber((_g = (_f = (_e = config['OPENAI_COST_PER_1K_CACHED_INPUT_TOKENS']) !== null && _e !== void 0 ? _e : process.env.OPENAI_COST_PER_1K_CACHED_INPUT_TOKENS) !== null && _f !== void 0 ? _f : process.env.OPENAI_COST_PER_1K_CACHED_TOKENS) !== null && _g !== void 0 ? _g : 0);
61
+ var defaultOutput = toNumber((_j = (_h = config['OPENAI_COST_PER_1K_OUTPUT_TOKENS']) !== null && _h !== void 0 ? _h : process.env.OPENAI_COST_PER_1K_OUTPUT_TOKENS) !== null && _j !== void 0 ? _j : 0);
62
+ return {
63
+ perModel: __assign(__assign({}, DEFAULT_OPENAI_MODEL_PRICING), parsePricingJson(rawJson)),
64
+ defaultPricing: { inputPer1k: defaultInput, cachedInputPer1k: defaultCachedInput, outputPer1k: defaultOutput }
65
+ };
66
+ };
67
+ var resolveModelPricing = function (model, perModel, defaultPricing) {
68
+ var normalizedModel = normalizeModelKey(model);
69
+ if (perModel[normalizedModel]) {
70
+ return perModel[normalizedModel];
71
+ }
72
+ var prefix = Object.keys(perModel)
73
+ .sort(function (a, b) { return b.length - a.length; })
74
+ .find(function (key) { return normalizedModel.startsWith("".concat(key, "-")); });
75
+ return prefix ? perModel[prefix] : defaultPricing;
76
+ };
77
+ var estimateOpenAIUsageCost = function (model, inputTokens, outputTokens, cachedInputTokens) {
78
+ if (cachedInputTokens === void 0) { cachedInputTokens = 0; }
79
+ var _a = resolvePricingConfig(), perModel = _a.perModel, defaultPricing = _a.defaultPricing;
80
+ var pricing = resolveModelPricing(model, perModel, defaultPricing);
81
+ if (!pricing.inputPer1k && !pricing.cachedInputPer1k && !pricing.outputPer1k) {
82
+ return 0;
83
+ }
84
+ var uncachedInputTokens = Math.max(0, toNumber(inputTokens) - toNumber(cachedInputTokens));
85
+ var inputCost = (uncachedInputTokens / 1000) * pricing.inputPer1k;
86
+ var cachedInputCost = (toNumber(cachedInputTokens) / 1000) * (pricing.cachedInputPer1k || 0);
87
+ var outputCost = (toNumber(outputTokens) / 1000) * pricing.outputPer1k;
88
+ return (0, common_1.round)(inputCost + cachedInputCost + outputCost, 6);
89
+ };
90
+ exports.estimateOpenAIUsageCost = estimateOpenAIUsageCost;
91
+
92
+ //# sourceMappingURL=openai-usage-cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/util/openai-usage-cost.ts"],"names":[],"mappings":"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","file":"openai-usage-cost.js","sourcesContent":["import { ResolveIOServer } from '../resolveio-server-app';\nimport { round } from './common';\n\nexport type OpenAIUsagePricingConfig = {\n\tinputPer1k: number;\n\tcachedInputPer1k?: number;\n\toutputPer1k: number;\n};\n\nconst DEFAULT_OPENAI_MODEL_PRICING: Record<string, OpenAIUsagePricingConfig> = {\n\t'gpt-5.5': { inputPer1k: 0.005, cachedInputPer1k: 0.0005, outputPer1k: 0.03 },\n\t'gpt-5.4': { inputPer1k: 0.0025, cachedInputPer1k: 0.00025, outputPer1k: 0.015 },\n\t'gpt-5.4-mini': { inputPer1k: 0.00075, cachedInputPer1k: 0.000075, outputPer1k: 0.0045 }\n};\n\nconst toNumber = (value: any): number => {\n\tconst parsed = Number(value);\n\treturn Number.isFinite(parsed) ? parsed : 0;\n};\n\nconst normalizeModelKey = (value: string): string => {\n\treturn String(value || '').trim().toLowerCase();\n};\n\nconst parsePricingJson = (raw: string): Record<string, OpenAIUsagePricingConfig> => {\n\tif (!raw) {\n\t\treturn {};\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(raw);\n\t\tif (!parsed || typeof parsed !== 'object') {\n\t\t\treturn {};\n\t\t}\n\t\tconst out: Record<string, OpenAIUsagePricingConfig> = {};\n\t\tObject.keys(parsed).forEach((key) => {\n\t\t\tconst entry = parsed[key] || {};\n\t\t\tconst inputPer1k = toNumber(entry.inputPer1k ?? entry.input ?? entry.prompt ?? 0);\n\t\t\tconst cachedInputPer1k = toNumber(entry.cachedInputPer1k ?? entry.cachedInput ?? entry.cached ?? entry.promptCached ?? 0);\n\t\t\tconst outputPer1k = toNumber(entry.outputPer1k ?? entry.output ?? entry.completion ?? 0);\n\t\t\tif (inputPer1k || cachedInputPer1k || outputPer1k) {\n\t\t\t\tout[normalizeModelKey(key)] = { inputPer1k, cachedInputPer1k, outputPer1k };\n\t\t\t}\n\t\t});\n\t\treturn out;\n\t}\n\tcatch {\n\t\treturn {};\n\t}\n};\n\nconst resolvePricingConfig = (): {\n\tperModel: Record<string, OpenAIUsagePricingConfig>;\n\tdefaultPricing: OpenAIUsagePricingConfig;\n} => {\n\tconst config = ResolveIOServer.getServerConfig() || {};\n\tconst rawJson = String(config['OPENAI_MODEL_PRICING'] ?? process.env.OPENAI_MODEL_PRICING ?? '').trim();\n\tconst defaultInput = toNumber(config['OPENAI_COST_PER_1K_INPUT_TOKENS'] ?? process.env.OPENAI_COST_PER_1K_INPUT_TOKENS ?? 0);\n\tconst defaultCachedInput = toNumber(\n\t\tconfig['OPENAI_COST_PER_1K_CACHED_INPUT_TOKENS']\n\t\t?? process.env.OPENAI_COST_PER_1K_CACHED_INPUT_TOKENS\n\t\t?? process.env.OPENAI_COST_PER_1K_CACHED_TOKENS\n\t\t?? 0\n\t);\n\tconst defaultOutput = toNumber(config['OPENAI_COST_PER_1K_OUTPUT_TOKENS'] ?? process.env.OPENAI_COST_PER_1K_OUTPUT_TOKENS ?? 0);\n\treturn {\n\t\tperModel: { ...DEFAULT_OPENAI_MODEL_PRICING, ...parsePricingJson(rawJson) },\n\t\tdefaultPricing: { inputPer1k: defaultInput, cachedInputPer1k: defaultCachedInput, outputPer1k: defaultOutput }\n\t};\n};\n\nconst resolveModelPricing = (\n\tmodel: string,\n\tperModel: Record<string, OpenAIUsagePricingConfig>,\n\tdefaultPricing: OpenAIUsagePricingConfig\n): OpenAIUsagePricingConfig => {\n\tconst normalizedModel = normalizeModelKey(model);\n\tif (perModel[normalizedModel]) {\n\t\treturn perModel[normalizedModel];\n\t}\n\tconst prefix = Object.keys(perModel)\n\t\t.sort((a, b) => b.length - a.length)\n\t\t.find((key) => normalizedModel.startsWith(`${key}-`));\n\treturn prefix ? perModel[prefix] : defaultPricing;\n};\n\nexport const estimateOpenAIUsageCost = (\n\tmodel: string,\n\tinputTokens: number,\n\toutputTokens: number,\n\tcachedInputTokens = 0\n): number => {\n\tconst { perModel, defaultPricing } = resolvePricingConfig();\n\tconst pricing = resolveModelPricing(model, perModel, defaultPricing);\n\tif (!pricing.inputPer1k && !pricing.cachedInputPer1k && !pricing.outputPer1k) {\n\t\treturn 0;\n\t}\n\tconst uncachedInputTokens = Math.max(0, toNumber(inputTokens) - toNumber(cachedInputTokens));\n\tconst inputCost = (uncachedInputTokens / 1000) * pricing.inputPer1k;\n\tconst cachedInputCost = (toNumber(cachedInputTokens) / 1000) * (pricing.cachedInputPer1k || 0);\n\tconst outputCost = (toNumber(outputTokens) / 1000) * pricing.outputPer1k;\n\treturn round(inputCost + cachedInputCost + outputCost, 6);\n};\n"]}