agentic-insights 0.1.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/README.md +44 -0
- package/dist/args.d.ts +11 -0
- package/dist/args.js +71 -0
- package/dist/args.js.map +1 -0
- package/dist/browser.d.ts +6 -0
- package/dist/browser.js +42 -0
- package/dist/browser.js.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/port.d.ts +2 -0
- package/dist/port.js +38 -0
- package/dist/port.js.map +1 -0
- package/dist/runtime/node_modules/@agentic-insights/shared/index.d.ts +159 -0
- package/dist/runtime/node_modules/@agentic-insights/shared/index.js +70 -0
- package/dist/runtime/node_modules/@agentic-insights/shared/index.js.map +1 -0
- package/dist/runtime/node_modules/@agentic-insights/shared/package.json +13 -0
- package/dist/runtime/server/aggregation.d.ts +5 -0
- package/dist/runtime/server/aggregation.js +90 -0
- package/dist/runtime/server/aggregation.js.map +1 -0
- package/dist/runtime/server/app.d.ts +10 -0
- package/dist/runtime/server/app.js +30 -0
- package/dist/runtime/server/app.js.map +1 -0
- package/dist/runtime/server/calibration.d.ts +16 -0
- package/dist/runtime/server/calibration.js +69 -0
- package/dist/runtime/server/calibration.js.map +1 -0
- package/dist/runtime/server/claude.d.ts +13 -0
- package/dist/runtime/server/claude.js +158 -0
- package/dist/runtime/server/claude.js.map +1 -0
- package/dist/runtime/server/discovery.d.ts +5 -0
- package/dist/runtime/server/discovery.js +43 -0
- package/dist/runtime/server/discovery.js.map +1 -0
- package/dist/runtime/server/generated/pricing-catalog.d.ts +2 -0
- package/dist/runtime/server/generated/pricing-catalog.js +17990 -0
- package/dist/runtime/server/generated/pricing-catalog.js.map +1 -0
- package/dist/runtime/server/index.d.ts +1 -0
- package/dist/runtime/server/index.js +14 -0
- package/dist/runtime/server/index.js.map +1 -0
- package/dist/runtime/server/parser.d.ts +10 -0
- package/dist/runtime/server/parser.js +292 -0
- package/dist/runtime/server/parser.js.map +1 -0
- package/dist/runtime/server/paths.d.ts +10 -0
- package/dist/runtime/server/paths.js +42 -0
- package/dist/runtime/server/paths.js.map +1 -0
- package/dist/runtime/server/pricing-catalog-transform.d.ts +39 -0
- package/dist/runtime/server/pricing-catalog-transform.js +82 -0
- package/dist/runtime/server/pricing-catalog-transform.js.map +1 -0
- package/dist/runtime/server/pricing.d.ts +18 -0
- package/dist/runtime/server/pricing.js +276 -0
- package/dist/runtime/server/pricing.js.map +1 -0
- package/dist/runtime/server/service.d.ts +37 -0
- package/dist/runtime/server/service.js +752 -0
- package/dist/runtime/server/service.js.map +1 -0
- package/dist/runtime/server/static.d.ts +2 -0
- package/dist/runtime/server/static.js +48 -0
- package/dist/runtime/server/static.js.map +1 -0
- package/dist/runtime/server/timezone.d.ts +15 -0
- package/dist/runtime/server/timezone.js +197 -0
- package/dist/runtime/server/timezone.js.map +1 -0
- package/dist/runtime/server/types.d.ts +62 -0
- package/dist/runtime/server/types.js +2 -0
- package/dist/runtime/server/types.js.map +1 -0
- package/dist/runtime/web/agent.svg +5 -0
- package/dist/runtime/web/assets/index-CUN_NMpB.css +1 -0
- package/dist/runtime/web/assets/index-DzpKJhbf.js +112 -0
- package/dist/runtime/web/favicon.svg +5 -0
- package/dist/runtime/web/index.html +17 -0
- package/package.json +38 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createApp } from "./app.js";
|
|
2
|
+
const port = Number(process.env.PORT ?? 3001);
|
|
3
|
+
const host = process.env.HOST ?? "127.0.0.1";
|
|
4
|
+
const app = createApp();
|
|
5
|
+
app
|
|
6
|
+
.listen({ port, host })
|
|
7
|
+
.then(() => {
|
|
8
|
+
console.log(`API listening on http://${host}:${port}`);
|
|
9
|
+
})
|
|
10
|
+
.catch((error) => {
|
|
11
|
+
console.error(error);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,CAAC;AAC7C,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;AAExB,GAAG;KACA,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;KACtB,IAAI,CAAC,GAAG,EAAE;IACT,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;AACzD,CAAC,CAAC;KACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PromptRecord, RawUsageEvent } from "./types.js";
|
|
2
|
+
interface TuiFallbackPoint {
|
|
3
|
+
ts: number;
|
|
4
|
+
total: number;
|
|
5
|
+
}
|
|
6
|
+
export type TuiFallbackMap = Map<string, TuiFallbackPoint[]>;
|
|
7
|
+
export declare function parseTuiFallback(logPath: string): TuiFallbackMap;
|
|
8
|
+
export declare function parseSessionFile(filePath: string, fallbackMap: TuiFallbackMap): RawUsageEvent[];
|
|
9
|
+
export declare function parseSessionPrompts(filePath: string): PromptRecord[];
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
function parseTimestamp(value) {
|
|
5
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
6
|
+
return value > 1_000_000_000 && value < 10_000_000_000 ? value * 1000 : value;
|
|
7
|
+
}
|
|
8
|
+
if (typeof value !== "string") {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
const parsed = Date.parse(value);
|
|
12
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
13
|
+
}
|
|
14
|
+
function filenameSessionId(filePath) {
|
|
15
|
+
const base = path.basename(filePath, ".jsonl");
|
|
16
|
+
const parts = base.split("-");
|
|
17
|
+
return parts.length >= 7 ? parts.slice(-5).join("-") : base;
|
|
18
|
+
}
|
|
19
|
+
function normalizeSource(source) {
|
|
20
|
+
if (typeof source === "string" && source.trim()) {
|
|
21
|
+
return source.toLowerCase();
|
|
22
|
+
}
|
|
23
|
+
if (source && typeof source === "object" && "subagent" in source) {
|
|
24
|
+
const subagent = source.subagent;
|
|
25
|
+
return typeof subagent === "string" && subagent ? `subagent:${subagent}` : "subagent";
|
|
26
|
+
}
|
|
27
|
+
return "unknown";
|
|
28
|
+
}
|
|
29
|
+
function toFiniteNumber(value) {
|
|
30
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
31
|
+
}
|
|
32
|
+
function nearestModel(models, ts) {
|
|
33
|
+
let activeModel = "unknown";
|
|
34
|
+
for (const model of models) {
|
|
35
|
+
if (model.ts <= ts) {
|
|
36
|
+
activeModel = model.model;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
return activeModel;
|
|
42
|
+
}
|
|
43
|
+
function makeEventId(parts) {
|
|
44
|
+
return crypto.createHash("sha1").update(parts.join("|")).digest("hex").slice(0, 16);
|
|
45
|
+
}
|
|
46
|
+
function makePromptId(parts) {
|
|
47
|
+
return crypto.createHash("sha1").update(parts.join("|")).digest("hex").slice(0, 16);
|
|
48
|
+
}
|
|
49
|
+
function normalizePromptText(value) {
|
|
50
|
+
if (typeof value === "string") {
|
|
51
|
+
const text = value.trim();
|
|
52
|
+
return text ? text : null;
|
|
53
|
+
}
|
|
54
|
+
if (!Array.isArray(value)) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
const text = value
|
|
58
|
+
.flatMap((item) => {
|
|
59
|
+
if (!item || typeof item !== "object") {
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
const record = item;
|
|
63
|
+
return record.type === "input_text" && typeof record.text === "string" ? [record.text] : [];
|
|
64
|
+
})
|
|
65
|
+
.join("\n")
|
|
66
|
+
.trim();
|
|
67
|
+
return text ? text : null;
|
|
68
|
+
}
|
|
69
|
+
function buildEventsFromTokenCounts(sessionId, provider, source, models, tokenEvents) {
|
|
70
|
+
const output = [];
|
|
71
|
+
let previous = {
|
|
72
|
+
total: 0,
|
|
73
|
+
input: 0,
|
|
74
|
+
output: 0,
|
|
75
|
+
cached: 0
|
|
76
|
+
};
|
|
77
|
+
for (const event of tokenEvents.sort((a, b) => a.ts - b.ts)) {
|
|
78
|
+
if (event.total === null || event.total === previous.total) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const deltaTotal = event.total - previous.total;
|
|
82
|
+
if (deltaTotal <= 0) {
|
|
83
|
+
previous = {
|
|
84
|
+
total: event.total,
|
|
85
|
+
input: event.totalInput ?? previous.input,
|
|
86
|
+
output: event.totalOutput ?? previous.output,
|
|
87
|
+
cached: event.totalCached ?? previous.cached
|
|
88
|
+
};
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const derivedInput = event.totalInput === null ? null : Math.max(0, event.totalInput - previous.input);
|
|
92
|
+
const derivedOutput = event.totalOutput === null ? null : Math.max(0, event.totalOutput - previous.output);
|
|
93
|
+
const derivedCached = event.totalCached === null ? null : Math.max(0, event.totalCached - previous.cached);
|
|
94
|
+
const inputTokens = event.lastInput ?? derivedInput;
|
|
95
|
+
const outputTokens = event.lastOutput ?? derivedOutput;
|
|
96
|
+
const cachedInputTokens = event.lastCached ?? derivedCached;
|
|
97
|
+
const splitSource = event.lastInput !== null && event.lastOutput !== null && event.lastCached !== null
|
|
98
|
+
? "last_usage"
|
|
99
|
+
: inputTokens !== null && outputTokens !== null && cachedInputTokens !== null
|
|
100
|
+
? "derived_totals"
|
|
101
|
+
: "missing";
|
|
102
|
+
const model = nearestModel(models, event.ts);
|
|
103
|
+
output.push({
|
|
104
|
+
id: makeEventId([
|
|
105
|
+
sessionId,
|
|
106
|
+
String(event.ts),
|
|
107
|
+
String(deltaTotal),
|
|
108
|
+
String(inputTokens),
|
|
109
|
+
String(outputTokens),
|
|
110
|
+
String(cachedInputTokens),
|
|
111
|
+
splitSource
|
|
112
|
+
]),
|
|
113
|
+
sessionId,
|
|
114
|
+
ts: event.ts,
|
|
115
|
+
provider,
|
|
116
|
+
model,
|
|
117
|
+
source,
|
|
118
|
+
totalTokens: deltaTotal,
|
|
119
|
+
inputTokens,
|
|
120
|
+
outputTokens,
|
|
121
|
+
cachedInputTokens,
|
|
122
|
+
splitSource,
|
|
123
|
+
transport: "session"
|
|
124
|
+
});
|
|
125
|
+
previous = {
|
|
126
|
+
total: event.total,
|
|
127
|
+
input: event.totalInput ?? previous.input,
|
|
128
|
+
output: event.totalOutput ?? previous.output,
|
|
129
|
+
cached: event.totalCached ?? previous.cached
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return output;
|
|
133
|
+
}
|
|
134
|
+
function buildEventsFromTuiFallback(sessionId, provider, source, models, fallbackPoints) {
|
|
135
|
+
const output = [];
|
|
136
|
+
let previousTotal = 0;
|
|
137
|
+
for (const point of fallbackPoints.sort((a, b) => a.ts - b.ts)) {
|
|
138
|
+
if (point.total === previousTotal) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const deltaTotal = point.total - previousTotal;
|
|
142
|
+
previousTotal = point.total;
|
|
143
|
+
if (deltaTotal <= 0) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
output.push({
|
|
147
|
+
id: makeEventId([sessionId, String(point.ts), String(deltaTotal), "tui_fallback"]),
|
|
148
|
+
sessionId,
|
|
149
|
+
ts: point.ts,
|
|
150
|
+
provider,
|
|
151
|
+
model: nearestModel(models, point.ts),
|
|
152
|
+
source,
|
|
153
|
+
totalTokens: deltaTotal,
|
|
154
|
+
inputTokens: null,
|
|
155
|
+
outputTokens: null,
|
|
156
|
+
cachedInputTokens: null,
|
|
157
|
+
splitSource: "missing",
|
|
158
|
+
transport: "tui_fallback"
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return output;
|
|
162
|
+
}
|
|
163
|
+
export function parseTuiFallback(logPath) {
|
|
164
|
+
const map = new Map();
|
|
165
|
+
if (!fs.existsSync(logPath)) {
|
|
166
|
+
return map;
|
|
167
|
+
}
|
|
168
|
+
const regex = /^(\S+)\s+.*thread_id=([^\s]+).*total_usage_tokens=(\d+)/;
|
|
169
|
+
const lines = fs.readFileSync(logPath, "utf8").split(/\r?\n/);
|
|
170
|
+
for (const line of lines) {
|
|
171
|
+
const match = line.match(regex);
|
|
172
|
+
if (!match) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const [, rawTs, sessionId, rawTotal] = match;
|
|
176
|
+
if (!rawTs || !sessionId || !rawTotal) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const ts = parseTimestamp(rawTs);
|
|
180
|
+
const total = Number.parseInt(rawTotal, 10);
|
|
181
|
+
if (ts === null || !Number.isFinite(total)) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
const existing = map.get(sessionId) ?? [];
|
|
185
|
+
existing.push({ ts, total });
|
|
186
|
+
map.set(sessionId, existing);
|
|
187
|
+
}
|
|
188
|
+
for (const value of map.values()) {
|
|
189
|
+
value.sort((a, b) => a.ts - b.ts);
|
|
190
|
+
}
|
|
191
|
+
return map;
|
|
192
|
+
}
|
|
193
|
+
export function parseSessionFile(filePath, fallbackMap) {
|
|
194
|
+
const models = [];
|
|
195
|
+
const tokenEvents = [];
|
|
196
|
+
const lines = fs.readFileSync(filePath, "utf8").split(/\r?\n/).filter(Boolean);
|
|
197
|
+
let sessionId = filenameSessionId(filePath);
|
|
198
|
+
let provider = "unknown";
|
|
199
|
+
let source = "unknown";
|
|
200
|
+
for (const line of lines) {
|
|
201
|
+
let row;
|
|
202
|
+
try {
|
|
203
|
+
row = JSON.parse(line);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
const ts = parseTimestamp(row.timestamp) ?? 0;
|
|
209
|
+
if (row.type === "session_meta" && row.payload) {
|
|
210
|
+
sessionId = typeof row.payload.id === "string" && row.payload.id ? row.payload.id : sessionId;
|
|
211
|
+
provider = typeof row.payload.model_provider === "string" ? row.payload.model_provider.toLowerCase() : provider;
|
|
212
|
+
source = normalizeSource(row.payload.source);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (row.type === "turn_context" && typeof row.payload?.model === "string") {
|
|
216
|
+
models.push({ ts, model: row.payload.model });
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (row.type === "event_msg" && row.payload?.type === "token_count") {
|
|
220
|
+
tokenEvents.push({
|
|
221
|
+
ts,
|
|
222
|
+
total: toFiniteNumber(row.payload.info?.total_token_usage?.total_tokens),
|
|
223
|
+
totalInput: toFiniteNumber(row.payload.info?.total_token_usage?.input_tokens),
|
|
224
|
+
totalOutput: toFiniteNumber(row.payload.info?.total_token_usage?.output_tokens),
|
|
225
|
+
totalCached: toFiniteNumber(row.payload.info?.total_token_usage?.cached_input_tokens),
|
|
226
|
+
lastInput: toFiniteNumber(row.payload.info?.last_token_usage?.input_tokens),
|
|
227
|
+
lastOutput: toFiniteNumber(row.payload.info?.last_token_usage?.output_tokens),
|
|
228
|
+
lastCached: toFiniteNumber(row.payload.info?.last_token_usage?.cached_input_tokens)
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
const usableSessionEvents = buildEventsFromTokenCounts(sessionId, provider, source, models, tokenEvents);
|
|
233
|
+
if (usableSessionEvents.length > 0) {
|
|
234
|
+
return usableSessionEvents;
|
|
235
|
+
}
|
|
236
|
+
return buildEventsFromTuiFallback(sessionId, provider, source, models, fallbackMap.get(sessionId) ?? []);
|
|
237
|
+
}
|
|
238
|
+
export function parseSessionPrompts(filePath) {
|
|
239
|
+
const lines = fs.readFileSync(filePath, "utf8").split(/\r?\n/).filter(Boolean);
|
|
240
|
+
let sessionId = filenameSessionId(filePath);
|
|
241
|
+
const responsePrompts = [];
|
|
242
|
+
const eventPrompts = [];
|
|
243
|
+
for (const line of lines) {
|
|
244
|
+
let row;
|
|
245
|
+
try {
|
|
246
|
+
row = JSON.parse(line);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
const ts = parseTimestamp(row.timestamp);
|
|
252
|
+
if (row.type === "session_meta" && typeof row.payload?.id === "string" && row.payload.id) {
|
|
253
|
+
sessionId = row.payload.id;
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
if (ts === null) {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
if (row.type === "event_msg" && row.payload?.type === "user_message") {
|
|
260
|
+
const text = normalizePromptText(row.payload.message);
|
|
261
|
+
if (!text) {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
eventPrompts.push({
|
|
265
|
+
id: makePromptId([sessionId, "event", String(ts), text]),
|
|
266
|
+
sessionId,
|
|
267
|
+
ts
|
|
268
|
+
});
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
271
|
+
if (row.type === "response_item" && row.payload?.type === "message" && row.payload.role === "user") {
|
|
272
|
+
const text = normalizePromptText(row.payload.content);
|
|
273
|
+
if (!text || text.startsWith("# AGENTS.md instructions for ") || text.startsWith("<environment_context>")) {
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
responsePrompts.push({
|
|
277
|
+
id: makePromptId([sessionId, "response", String(ts), text]),
|
|
278
|
+
sessionId,
|
|
279
|
+
ts
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
const prompts = eventPrompts.length > 0 ? eventPrompts : responsePrompts;
|
|
284
|
+
const deduped = new Map();
|
|
285
|
+
for (const prompt of prompts) {
|
|
286
|
+
if (!deduped.has(prompt.id)) {
|
|
287
|
+
deduped.set(prompt.id, prompt);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return [...deduped.values()].sort((a, b) => a.ts - b.ts);
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface CodexHomeConfig {
|
|
2
|
+
fromEnv: boolean;
|
|
3
|
+
path: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function getCodexHomeConfig(): CodexHomeConfig;
|
|
6
|
+
export declare function getDefaultCodexHome(): string;
|
|
7
|
+
export declare function getDefaultClaudeHome(): string;
|
|
8
|
+
export declare function getCacheDir(): string;
|
|
9
|
+
export declare function getTimeseriesCachePath(): string;
|
|
10
|
+
export declare function ensureDirSync(dirPath: string): void;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
export function getCodexHomeConfig() {
|
|
5
|
+
const configured = process.env.CODEX_HOME;
|
|
6
|
+
if (configured) {
|
|
7
|
+
return {
|
|
8
|
+
fromEnv: true,
|
|
9
|
+
path: path.resolve(configured)
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
fromEnv: false,
|
|
14
|
+
path: path.join(os.homedir(), ".codex")
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export function getDefaultCodexHome() {
|
|
18
|
+
return getCodexHomeConfig().path;
|
|
19
|
+
}
|
|
20
|
+
export function getDefaultClaudeHome() {
|
|
21
|
+
return path.join(os.homedir(), ".claude");
|
|
22
|
+
}
|
|
23
|
+
export function getCacheDir() {
|
|
24
|
+
const configured = process.env.AGENTIC_INSIGHTS_CACHE_DIR;
|
|
25
|
+
if (configured) {
|
|
26
|
+
return path.resolve(configured);
|
|
27
|
+
}
|
|
28
|
+
if (process.platform === "darwin") {
|
|
29
|
+
return path.join(os.homedir(), "Library", "Caches", "agentic-insights");
|
|
30
|
+
}
|
|
31
|
+
if (process.platform === "win32") {
|
|
32
|
+
return path.join(process.env.LOCALAPPDATA ?? path.join(os.homedir(), "AppData", "Local"), "agentic-insights");
|
|
33
|
+
}
|
|
34
|
+
return path.join(process.env.XDG_CACHE_HOME ?? path.join(os.homedir(), ".cache"), "agentic-insights");
|
|
35
|
+
}
|
|
36
|
+
export function getTimeseriesCachePath() {
|
|
37
|
+
return path.join(getCacheDir(), "timeseries.json");
|
|
38
|
+
}
|
|
39
|
+
export function ensureDirSync(dirPath) {
|
|
40
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,MAAM,UAAU,kBAAkB;IAChC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAC1C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,kBAAkB,EAAE,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAC1D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAChH,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,iBAAiB,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { PricingCatalogMetadata, PricingEntry } from "@agentic-insights/shared";
|
|
2
|
+
interface PortkeyPriceNode {
|
|
3
|
+
price?: number;
|
|
4
|
+
}
|
|
5
|
+
interface PortkeyPayAsYouGoPricing {
|
|
6
|
+
request_token?: PortkeyPriceNode;
|
|
7
|
+
request_text_token?: PortkeyPriceNode;
|
|
8
|
+
cache_read_input_token?: PortkeyPriceNode;
|
|
9
|
+
cache_read_text_input_token?: PortkeyPriceNode;
|
|
10
|
+
response_token?: PortkeyPriceNode;
|
|
11
|
+
response_text_token?: PortkeyPriceNode;
|
|
12
|
+
}
|
|
13
|
+
interface PortkeyPricingConfig {
|
|
14
|
+
pay_as_you_go?: PortkeyPayAsYouGoPricing;
|
|
15
|
+
}
|
|
16
|
+
export interface PortkeyPricingFile {
|
|
17
|
+
[model: string]: {
|
|
18
|
+
pricing_config?: PortkeyPricingConfig;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface PortkeyPricingFileIndexEntry {
|
|
22
|
+
name: string;
|
|
23
|
+
path: string;
|
|
24
|
+
download_url: string | null;
|
|
25
|
+
type: "file" | "dir";
|
|
26
|
+
}
|
|
27
|
+
export interface GeneratedPricingProviderSource {
|
|
28
|
+
provider: string;
|
|
29
|
+
fileName: string;
|
|
30
|
+
sourceUrl: string;
|
|
31
|
+
sourceLabel: string;
|
|
32
|
+
}
|
|
33
|
+
export interface GeneratedPricingCatalog {
|
|
34
|
+
metadata: PricingCatalogMetadata;
|
|
35
|
+
providerSources: GeneratedPricingProviderSource[];
|
|
36
|
+
entries: PricingEntry[];
|
|
37
|
+
}
|
|
38
|
+
export declare function transformPortkeyPricingCatalog(indexEntries: PortkeyPricingFileIndexEntry[], files: Map<string, PortkeyPricingFile>, generatedAt: string): GeneratedPricingCatalog;
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const PORTKEY_PRICE_SCALE = 10_000;
|
|
2
|
+
function dollarsPerTokenToPerMillion(value) {
|
|
3
|
+
return Number((value * PORTKEY_PRICE_SCALE).toFixed(6));
|
|
4
|
+
}
|
|
5
|
+
function getPrice(value) {
|
|
6
|
+
return typeof value?.price === "number" && Number.isFinite(value.price) ? value.price : 0;
|
|
7
|
+
}
|
|
8
|
+
function getProviderFromFileName(fileName) {
|
|
9
|
+
return fileName.replace(/\.json$/i, "").trim().toLowerCase();
|
|
10
|
+
}
|
|
11
|
+
function toPricingEntry(provider, model, sourceUrl, sourceLabel, pricingConfig) {
|
|
12
|
+
const payAsYouGo = pricingConfig?.pay_as_you_go;
|
|
13
|
+
if (!payAsYouGo || model === "default") {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const inputPrice = getPrice(payAsYouGo.request_text_token ?? payAsYouGo.request_token);
|
|
17
|
+
const cachedInputPrice = getPrice(payAsYouGo.cache_read_text_input_token ?? payAsYouGo.cache_read_input_token);
|
|
18
|
+
const outputPrice = getPrice(payAsYouGo.response_text_token ?? payAsYouGo.response_token);
|
|
19
|
+
const hasTextTokenPricing = "request_text_token" in payAsYouGo ||
|
|
20
|
+
"request_token" in payAsYouGo ||
|
|
21
|
+
"response_text_token" in payAsYouGo ||
|
|
22
|
+
"response_token" in payAsYouGo;
|
|
23
|
+
if (!hasTextTokenPricing) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
provider,
|
|
28
|
+
model,
|
|
29
|
+
inputUsdPerMillion: dollarsPerTokenToPerMillion(inputPrice),
|
|
30
|
+
cachedInputUsdPerMillion: dollarsPerTokenToPerMillion(cachedInputPrice),
|
|
31
|
+
outputUsdPerMillion: dollarsPerTokenToPerMillion(outputPrice),
|
|
32
|
+
sourceUrl,
|
|
33
|
+
sourceLabel
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function transformPortkeyPricingCatalog(indexEntries, files, generatedAt) {
|
|
37
|
+
const providerSources = [];
|
|
38
|
+
const entries = [];
|
|
39
|
+
for (const indexEntry of indexEntries) {
|
|
40
|
+
if (indexEntry.type !== "file" || !indexEntry.download_url || !indexEntry.name.endsWith(".json")) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const file = files.get(indexEntry.name);
|
|
44
|
+
if (!file) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const provider = getProviderFromFileName(indexEntry.name);
|
|
48
|
+
const sourceLabel = `Portkey pricing: ${indexEntry.name}`;
|
|
49
|
+
providerSources.push({
|
|
50
|
+
provider,
|
|
51
|
+
fileName: indexEntry.name,
|
|
52
|
+
sourceUrl: indexEntry.download_url,
|
|
53
|
+
sourceLabel
|
|
54
|
+
});
|
|
55
|
+
for (const [model, config] of Object.entries(file)) {
|
|
56
|
+
const entry = toPricingEntry(provider, model, indexEntry.download_url, sourceLabel, config.pricing_config);
|
|
57
|
+
if (entry) {
|
|
58
|
+
entries.push(entry);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
entries.sort((left, right) => {
|
|
63
|
+
if (left.provider !== right.provider) {
|
|
64
|
+
return left.provider.localeCompare(right.provider);
|
|
65
|
+
}
|
|
66
|
+
return left.model.localeCompare(right.model);
|
|
67
|
+
});
|
|
68
|
+
providerSources.sort((left, right) => left.provider.localeCompare(right.provider));
|
|
69
|
+
return {
|
|
70
|
+
metadata: {
|
|
71
|
+
generatedAt,
|
|
72
|
+
sourceRepoUrl: "https://github.com/Portkey-AI/models",
|
|
73
|
+
sourceDirectoryUrl: "https://github.com/Portkey-AI/models/tree/main/pricing",
|
|
74
|
+
licenseUrl: "https://raw.githubusercontent.com/Portkey-AI/models/main/LICENSE",
|
|
75
|
+
providerCount: providerSources.length,
|
|
76
|
+
modelCount: entries.length
|
|
77
|
+
},
|
|
78
|
+
providerSources,
|
|
79
|
+
entries
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=pricing-catalog-transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pricing-catalog-transform.js","sourceRoot":"","sources":["../../src/pricing-catalog-transform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type MethodologySourceLink, type MethodologyTabId, type PricingCatalogMetadata, type PricingEntry, type WaterRange } from "@agentic-insights/shared";
|
|
2
|
+
export declare const BENCHMARK_COEFFICIENTS: WaterRange;
|
|
3
|
+
export declare const PRICING_CATALOG_METADATA: PricingCatalogMetadata;
|
|
4
|
+
export declare function normalizeProvider(provider: string): string;
|
|
5
|
+
export declare function normalizeDisplayProvider(provider: string): string;
|
|
6
|
+
export declare function normalizeModel(provider: string, model: string): string;
|
|
7
|
+
export declare function canonicalizePricingIdentity(provider: string, model: string): {
|
|
8
|
+
provider: string;
|
|
9
|
+
model: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function canonicalizeDisplayIdentity(provider: string, model: string): {
|
|
12
|
+
provider: string;
|
|
13
|
+
model: string;
|
|
14
|
+
};
|
|
15
|
+
export declare const PRICING_TABLE: PricingEntry[];
|
|
16
|
+
export declare function getPricingEntry(provider: string, model: string): PricingEntry | null;
|
|
17
|
+
export declare function calculateEventCostUsd(pricing: PricingEntry, inputTokens: number, cachedInputTokens: number, outputTokens: number): number;
|
|
18
|
+
export declare function getMethodologySourcesByTab(providers: Iterable<string>): Record<MethodologyTabId, MethodologySourceLink[]>;
|