@relayplane/proxy 1.9.30 → 1.9.31

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.
@@ -0,0 +1,17 @@
1
+ export interface ActivityRequest {
2
+ request_id: string;
3
+ timestamp: number;
4
+ input_tokens: number;
5
+ output_tokens: number;
6
+ stop_reason: string;
7
+ cost_usd: number;
8
+ }
9
+ export interface BgFgResult {
10
+ foreground_requests: number;
11
+ background_requests: number;
12
+ background_spend_pct: number;
13
+ background_request_pct: number;
14
+ signals: string[];
15
+ }
16
+ export declare function classifyActivity(requests: ActivityRequest[]): BgFgResult;
17
+ //# sourceMappingURL=background-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-detector.d.ts","sourceRoot":"","sources":["../src/background-detector.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAcD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,UAAU,CA8ExE"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.classifyActivity = classifyActivity;
4
+ const RAPID_BURST_GAP_MS = 2000;
5
+ const RAPID_BURST_MIN_TOKENS = 2000;
6
+ const MIDNIGHT_DENSITY_WINDOW_MS = 10 * 60 * 1000;
7
+ const MIDNIGHT_DENSITY_THRESHOLD = 5;
8
+ const LOOP_MIN_CONSECUTIVE = 5;
9
+ const LOOP_MIN_TOKENS = 2000;
10
+ function isPostMidnight(ts) {
11
+ const hour = new Date(ts).getUTCHours();
12
+ return hour >= 0 && hour < 5;
13
+ }
14
+ function classifyActivity(requests) {
15
+ if (requests.length === 0) {
16
+ return {
17
+ foreground_requests: 0,
18
+ background_requests: 0,
19
+ background_spend_pct: 0,
20
+ background_request_pct: 0,
21
+ signals: [],
22
+ };
23
+ }
24
+ const signals = new Set();
25
+ const bgFlags = new Array(requests.length).fill(false);
26
+ // H1: rapid inter-request burst (gap < 2s AND input_tokens > 2000)
27
+ for (let i = 1; i < requests.length; i++) {
28
+ const prev = requests[i - 1];
29
+ const cur = requests[i];
30
+ const gap = cur.timestamp - prev.timestamp;
31
+ if (gap < RAPID_BURST_GAP_MS && cur.input_tokens > RAPID_BURST_MIN_TOKENS) {
32
+ bgFlags[i] = true;
33
+ signals.add('rapid_burst');
34
+ }
35
+ }
36
+ // H2: post-midnight window + density > 5 req / 10 min
37
+ for (let i = 0; i < requests.length; i++) {
38
+ const anchor = requests[i];
39
+ if (!isPostMidnight(anchor.timestamp))
40
+ continue;
41
+ const windowEnd = anchor.timestamp + MIDNIGHT_DENSITY_WINDOW_MS;
42
+ const windowIndices = [];
43
+ for (let j = 0; j < requests.length; j++) {
44
+ const r = requests[j];
45
+ if (r.timestamp >= anchor.timestamp && r.timestamp <= windowEnd) {
46
+ windowIndices.push(j);
47
+ }
48
+ }
49
+ if (windowIndices.length > MIDNIGHT_DENSITY_THRESHOLD) {
50
+ for (const idx of windowIndices)
51
+ bgFlags[idx] = true;
52
+ signals.add('post_midnight_burst');
53
+ }
54
+ }
55
+ // H3: no stop_reason variation across >= 5 consecutive calls with input_tokens > 2000
56
+ let runStart = 0;
57
+ for (let i = 1; i <= requests.length; i++) {
58
+ const anchorReq = requests[runStart];
59
+ const ended = i === requests.length;
60
+ const diffReason = !ended && requests[i].stop_reason !== anchorReq.stop_reason;
61
+ if (ended || diffReason) {
62
+ const runLen = i - runStart;
63
+ if (runLen >= LOOP_MIN_CONSECUTIVE && anchorReq.input_tokens > LOOP_MIN_TOKENS) {
64
+ for (let k = runStart; k < i; k++)
65
+ bgFlags[k] = true;
66
+ signals.add('stop_reason_loop');
67
+ }
68
+ runStart = i;
69
+ }
70
+ }
71
+ let bgCount = 0;
72
+ let bgCost = 0;
73
+ let totalCost = 0;
74
+ for (let i = 0; i < requests.length; i++) {
75
+ const r = requests[i];
76
+ totalCost += r.cost_usd;
77
+ if (bgFlags[i]) {
78
+ bgCount++;
79
+ bgCost += r.cost_usd;
80
+ }
81
+ }
82
+ return {
83
+ foreground_requests: requests.length - bgCount,
84
+ background_requests: bgCount,
85
+ background_spend_pct: totalCost > 0 ? (bgCost / totalCost) * 100 : 0,
86
+ background_request_pct: (bgCount / requests.length) * 100,
87
+ signals: Array.from(signals),
88
+ };
89
+ }
90
+ //# sourceMappingURL=background-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-detector.js","sourceRoot":"","sources":["../src/background-detector.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@relayplane/proxy",
3
- "version": "1.9.30",
3
+ "version": "1.9.31",
4
4
  "description": "Open source cost intelligence proxy for AI agents. Cut LLM costs ~80% with smart model routing. Dashboard, policy engine, 11 providers. MIT licensed.",
5
5
  "homepage": "https://relayplane.com",
6
6
  "repository": {