@relayplane/proxy 0.2.0 → 1.1.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/README.md +221 -120
- package/dist/server.d.ts +8 -204
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +562 -1014
- package/dist/server.js.map +1 -1
- package/package.json +30 -29
- package/__tests__/server.test.ts +0 -512
- package/__tests__/telemetry.test.ts +0 -126
- package/dist/cli.d.ts +0 -36
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -304
- package/dist/cli.js.map +0 -1
- package/dist/config.d.ts +0 -80
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -208
- package/dist/config.js.map +0 -1
- package/dist/index.d.ts +0 -36
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -74
- package/dist/index.js.map +0 -1
- package/dist/streaming.d.ts +0 -80
- package/dist/streaming.d.ts.map +0 -1
- package/dist/streaming.js +0 -271
- package/dist/streaming.js.map +0 -1
- package/dist/telemetry.d.ts +0 -111
- package/dist/telemetry.d.ts.map +0 -1
- package/dist/telemetry.js +0 -315
- package/dist/telemetry.js.map +0 -1
- package/src/cli.ts +0 -341
- package/src/config.ts +0 -206
- package/src/index.ts +0 -82
- package/src/server.ts +0 -1328
- package/src/streaming.ts +0 -331
- package/src/telemetry.ts +0 -343
- package/tsconfig.json +0 -19
- package/vitest.config.ts +0 -21
package/dist/index.js
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* @relayplane/proxy
|
|
4
|
-
*
|
|
5
|
-
* RelayPlane Agent Ops Proxy Server
|
|
6
|
-
*
|
|
7
|
-
* Intelligent AI model routing with integrated observability via
|
|
8
|
-
* the Learning Ledger and auth enforcement via Auth Gate.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* import { createProxyServer } from '@relayplane/proxy';
|
|
13
|
-
*
|
|
14
|
-
* const server = createProxyServer({
|
|
15
|
-
* port: 3001,
|
|
16
|
-
* providers: {
|
|
17
|
-
* anthropic: { apiKey: process.env.ANTHROPIC_API_KEY! },
|
|
18
|
-
* openai: { apiKey: process.env.OPENAI_API_KEY! },
|
|
19
|
-
* },
|
|
20
|
-
* });
|
|
21
|
-
*
|
|
22
|
-
* await server.start();
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* @packageDocumentation
|
|
26
|
-
*/
|
|
27
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
-
exports.printTelemetryDisclosure = exports.getTelemetryPath = exports.clearTelemetry = exports.getTelemetryStats = exports.getLocalTelemetry = exports.clearAuditBuffer = exports.getAuditBuffer = exports.isOfflineMode = exports.setOfflineMode = exports.isAuditMode = exports.setAuditMode = exports.estimateCost = exports.inferTaskType = exports.recordTelemetry = exports.getConfigPath = exports.getConfigDir = exports.getApiKey = exports.setApiKey = exports.getDeviceId = exports.disableTelemetry = exports.enableTelemetry = exports.isTelemetryEnabled = exports.markFirstRunComplete = exports.isFirstRun = exports.updateConfig = exports.saveConfig = exports.loadConfig = exports.startProxy = exports.startKeepAlive = exports.aggregateStreamingResponse = exports.streamProviderResponse = exports.createSSEWriter = exports.SSEWriter = exports.createProxyServer = exports.ProxyServer = void 0;
|
|
29
|
-
// New Agent Ops proxy server (Phase 1)
|
|
30
|
-
var server_js_1 = require("./server.js");
|
|
31
|
-
Object.defineProperty(exports, "ProxyServer", { enumerable: true, get: function () { return server_js_1.ProxyServer; } });
|
|
32
|
-
Object.defineProperty(exports, "createProxyServer", { enumerable: true, get: function () { return server_js_1.createProxyServer; } });
|
|
33
|
-
// Streaming support (Phase 8)
|
|
34
|
-
var streaming_js_1 = require("./streaming.js");
|
|
35
|
-
Object.defineProperty(exports, "SSEWriter", { enumerable: true, get: function () { return streaming_js_1.SSEWriter; } });
|
|
36
|
-
Object.defineProperty(exports, "createSSEWriter", { enumerable: true, get: function () { return streaming_js_1.createSSEWriter; } });
|
|
37
|
-
Object.defineProperty(exports, "streamProviderResponse", { enumerable: true, get: function () { return streaming_js_1.streamProviderResponse; } });
|
|
38
|
-
Object.defineProperty(exports, "aggregateStreamingResponse", { enumerable: true, get: function () { return streaming_js_1.aggregateStreamingResponse; } });
|
|
39
|
-
Object.defineProperty(exports, "startKeepAlive", { enumerable: true, get: function () { return streaming_js_1.startKeepAlive; } });
|
|
40
|
-
// Legacy proxy functionality from openclaw
|
|
41
|
-
var openclaw_1 = require("@relayplane/openclaw");
|
|
42
|
-
Object.defineProperty(exports, "startProxy", { enumerable: true, get: function () { return openclaw_1.startProxy; } });
|
|
43
|
-
// Configuration
|
|
44
|
-
var config_js_1 = require("./config.js");
|
|
45
|
-
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_js_1.loadConfig; } });
|
|
46
|
-
Object.defineProperty(exports, "saveConfig", { enumerable: true, get: function () { return config_js_1.saveConfig; } });
|
|
47
|
-
Object.defineProperty(exports, "updateConfig", { enumerable: true, get: function () { return config_js_1.updateConfig; } });
|
|
48
|
-
Object.defineProperty(exports, "isFirstRun", { enumerable: true, get: function () { return config_js_1.isFirstRun; } });
|
|
49
|
-
Object.defineProperty(exports, "markFirstRunComplete", { enumerable: true, get: function () { return config_js_1.markFirstRunComplete; } });
|
|
50
|
-
Object.defineProperty(exports, "isTelemetryEnabled", { enumerable: true, get: function () { return config_js_1.isTelemetryEnabled; } });
|
|
51
|
-
Object.defineProperty(exports, "enableTelemetry", { enumerable: true, get: function () { return config_js_1.enableTelemetry; } });
|
|
52
|
-
Object.defineProperty(exports, "disableTelemetry", { enumerable: true, get: function () { return config_js_1.disableTelemetry; } });
|
|
53
|
-
Object.defineProperty(exports, "getDeviceId", { enumerable: true, get: function () { return config_js_1.getDeviceId; } });
|
|
54
|
-
Object.defineProperty(exports, "setApiKey", { enumerable: true, get: function () { return config_js_1.setApiKey; } });
|
|
55
|
-
Object.defineProperty(exports, "getApiKey", { enumerable: true, get: function () { return config_js_1.getApiKey; } });
|
|
56
|
-
Object.defineProperty(exports, "getConfigDir", { enumerable: true, get: function () { return config_js_1.getConfigDir; } });
|
|
57
|
-
Object.defineProperty(exports, "getConfigPath", { enumerable: true, get: function () { return config_js_1.getConfigPath; } });
|
|
58
|
-
// Telemetry
|
|
59
|
-
var telemetry_js_1 = require("./telemetry.js");
|
|
60
|
-
Object.defineProperty(exports, "recordTelemetry", { enumerable: true, get: function () { return telemetry_js_1.recordTelemetry; } });
|
|
61
|
-
Object.defineProperty(exports, "inferTaskType", { enumerable: true, get: function () { return telemetry_js_1.inferTaskType; } });
|
|
62
|
-
Object.defineProperty(exports, "estimateCost", { enumerable: true, get: function () { return telemetry_js_1.estimateCost; } });
|
|
63
|
-
Object.defineProperty(exports, "setAuditMode", { enumerable: true, get: function () { return telemetry_js_1.setAuditMode; } });
|
|
64
|
-
Object.defineProperty(exports, "isAuditMode", { enumerable: true, get: function () { return telemetry_js_1.isAuditMode; } });
|
|
65
|
-
Object.defineProperty(exports, "setOfflineMode", { enumerable: true, get: function () { return telemetry_js_1.setOfflineMode; } });
|
|
66
|
-
Object.defineProperty(exports, "isOfflineMode", { enumerable: true, get: function () { return telemetry_js_1.isOfflineMode; } });
|
|
67
|
-
Object.defineProperty(exports, "getAuditBuffer", { enumerable: true, get: function () { return telemetry_js_1.getAuditBuffer; } });
|
|
68
|
-
Object.defineProperty(exports, "clearAuditBuffer", { enumerable: true, get: function () { return telemetry_js_1.clearAuditBuffer; } });
|
|
69
|
-
Object.defineProperty(exports, "getLocalTelemetry", { enumerable: true, get: function () { return telemetry_js_1.getLocalTelemetry; } });
|
|
70
|
-
Object.defineProperty(exports, "getTelemetryStats", { enumerable: true, get: function () { return telemetry_js_1.getTelemetryStats; } });
|
|
71
|
-
Object.defineProperty(exports, "clearTelemetry", { enumerable: true, get: function () { return telemetry_js_1.clearTelemetry; } });
|
|
72
|
-
Object.defineProperty(exports, "getTelemetryPath", { enumerable: true, get: function () { return telemetry_js_1.getTelemetryPath; } });
|
|
73
|
-
Object.defineProperty(exports, "printTelemetryDisclosure", { enumerable: true, get: function () { return telemetry_js_1.printTelemetryDisclosure; } });
|
|
74
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;;;AAEH,uCAAuC;AACvC,yCAA6D;AAApD,wGAAA,WAAW,OAAA;AAAE,8GAAA,iBAAiB,OAAA;AAGvC,8BAA8B;AAC9B,+CAMwB;AALtB,yGAAA,SAAS,OAAA;AACT,+GAAA,eAAe,OAAA;AACf,sHAAA,sBAAsB,OAAA;AACtB,0HAAA,0BAA0B,OAAA;AAC1B,8GAAA,cAAc,OAAA;AAIhB,2CAA2C;AAC3C,iDAAoE;AAA3D,sGAAA,UAAU,OAAA;AAEnB,gBAAgB;AAChB,yCAcqB;AAbnB,uGAAA,UAAU,OAAA;AACV,uGAAA,UAAU,OAAA;AACV,yGAAA,YAAY,OAAA;AACZ,uGAAA,UAAU,OAAA;AACV,iHAAA,oBAAoB,OAAA;AACpB,+GAAA,kBAAkB,OAAA;AAClB,4GAAA,eAAe,OAAA;AACf,6GAAA,gBAAgB,OAAA;AAChB,wGAAA,WAAW,OAAA;AACX,sGAAA,SAAS,OAAA;AACT,sGAAA,SAAS,OAAA;AACT,yGAAA,YAAY,OAAA;AACZ,0GAAA,aAAa,OAAA;AAIf,YAAY;AACZ,+CAewB;AAdtB,+GAAA,eAAe,OAAA;AACf,6GAAA,aAAa,OAAA;AACb,4GAAA,YAAY,OAAA;AACZ,4GAAA,YAAY,OAAA;AACZ,2GAAA,WAAW,OAAA;AACX,8GAAA,cAAc,OAAA;AACd,6GAAA,aAAa,OAAA;AACb,8GAAA,cAAc,OAAA;AACd,gHAAA,gBAAgB,OAAA;AAChB,iHAAA,iBAAiB,OAAA;AACjB,iHAAA,iBAAiB,OAAA;AACjB,8GAAA,cAAc,OAAA;AACd,gHAAA,gBAAgB,OAAA;AAChB,wHAAA,wBAAwB,OAAA"}
|
package/dist/streaming.d.ts
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Streaming Support for RelayPlane Proxy
|
|
3
|
-
*
|
|
4
|
-
* Provides SSE (Server-Sent Events) streaming for LLM responses
|
|
5
|
-
* and real-time updates.
|
|
6
|
-
*
|
|
7
|
-
* @packageDocumentation
|
|
8
|
-
*/
|
|
9
|
-
import type { ServerResponse } from 'node:http';
|
|
10
|
-
/**
|
|
11
|
-
* SSE message structure
|
|
12
|
-
*/
|
|
13
|
-
export interface SSEMessage {
|
|
14
|
-
event?: string;
|
|
15
|
-
data: unknown;
|
|
16
|
-
id?: string;
|
|
17
|
-
retry?: number;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Stream writer for SSE responses
|
|
21
|
-
*/
|
|
22
|
-
export declare class SSEWriter {
|
|
23
|
-
private response;
|
|
24
|
-
private closed;
|
|
25
|
-
constructor(response: ServerResponse);
|
|
26
|
-
/**
|
|
27
|
-
* Write an SSE message
|
|
28
|
-
*/
|
|
29
|
-
write(message: SSEMessage): boolean;
|
|
30
|
-
/**
|
|
31
|
-
* Write a data-only message (convenience method)
|
|
32
|
-
*/
|
|
33
|
-
writeData(data: unknown): boolean;
|
|
34
|
-
/**
|
|
35
|
-
* Send a comment (keep-alive)
|
|
36
|
-
*/
|
|
37
|
-
comment(text: string): boolean;
|
|
38
|
-
/**
|
|
39
|
-
* Close the stream
|
|
40
|
-
*/
|
|
41
|
-
close(): void;
|
|
42
|
-
/**
|
|
43
|
-
* Check if stream is still open
|
|
44
|
-
*/
|
|
45
|
-
isOpen(): boolean;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Create an SSE writer
|
|
49
|
-
*/
|
|
50
|
-
export declare function createSSEWriter(response: ServerResponse): SSEWriter;
|
|
51
|
-
/**
|
|
52
|
-
* Stream a provider response to SSE
|
|
53
|
-
*/
|
|
54
|
-
export declare function streamProviderResponse(providerUrl: string, request: unknown, headers: Record<string, string>, writer: SSEWriter, callbacks?: {
|
|
55
|
-
onChunk?: (chunk: unknown) => void;
|
|
56
|
-
onComplete?: (fullResponse: unknown) => void;
|
|
57
|
-
onError?: (error: Error) => void;
|
|
58
|
-
}): Promise<{
|
|
59
|
-
success: boolean;
|
|
60
|
-
chunks: unknown[];
|
|
61
|
-
ttftMs?: number;
|
|
62
|
-
}>;
|
|
63
|
-
/**
|
|
64
|
-
* Aggregate streaming chunks into a complete response
|
|
65
|
-
*/
|
|
66
|
-
export declare function aggregateStreamingResponse(chunks: unknown[]): {
|
|
67
|
-
content: string;
|
|
68
|
-
usage?: {
|
|
69
|
-
prompt_tokens: number;
|
|
70
|
-
completion_tokens: number;
|
|
71
|
-
total_tokens: number;
|
|
72
|
-
};
|
|
73
|
-
model?: string;
|
|
74
|
-
finish_reason?: string;
|
|
75
|
-
};
|
|
76
|
-
/**
|
|
77
|
-
* Keep-alive ping for long-running streams
|
|
78
|
-
*/
|
|
79
|
-
export declare function startKeepAlive(writer: SSEWriter, intervalMs?: number): () => void;
|
|
80
|
-
//# sourceMappingURL=streaming.d.ts.map
|
package/dist/streaming.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,EAAE,cAAc;IAiBpC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO;IAsCnC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAIjC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAW9B;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;OAEG;IACH,MAAM,IAAI,OAAO;CAGlB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,CAEnE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,MAAM,EAAE,SAAS,EACjB,SAAS,CAAC,EAAE;IACV,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC,GACA,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyGnE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAmDA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,UAAU,SAAQ,GACjB,MAAM,IAAI,CAUZ"}
|
package/dist/streaming.js
DELETED
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Streaming Support for RelayPlane Proxy
|
|
4
|
-
*
|
|
5
|
-
* Provides SSE (Server-Sent Events) streaming for LLM responses
|
|
6
|
-
* and real-time updates.
|
|
7
|
-
*
|
|
8
|
-
* @packageDocumentation
|
|
9
|
-
*/
|
|
10
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.SSEWriter = void 0;
|
|
12
|
-
exports.createSSEWriter = createSSEWriter;
|
|
13
|
-
exports.streamProviderResponse = streamProviderResponse;
|
|
14
|
-
exports.aggregateStreamingResponse = aggregateStreamingResponse;
|
|
15
|
-
exports.startKeepAlive = startKeepAlive;
|
|
16
|
-
/**
|
|
17
|
-
* Stream writer for SSE responses
|
|
18
|
-
*/
|
|
19
|
-
class SSEWriter {
|
|
20
|
-
response;
|
|
21
|
-
closed = false;
|
|
22
|
-
constructor(response) {
|
|
23
|
-
this.response = response;
|
|
24
|
-
// Set SSE headers
|
|
25
|
-
response.writeHead(200, {
|
|
26
|
-
'Content-Type': 'text/event-stream',
|
|
27
|
-
'Cache-Control': 'no-cache',
|
|
28
|
-
'Connection': 'keep-alive',
|
|
29
|
-
'Access-Control-Allow-Origin': '*',
|
|
30
|
-
});
|
|
31
|
-
// Handle client disconnect
|
|
32
|
-
response.on('close', () => {
|
|
33
|
-
this.closed = true;
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Write an SSE message
|
|
38
|
-
*/
|
|
39
|
-
write(message) {
|
|
40
|
-
if (this.closed)
|
|
41
|
-
return false;
|
|
42
|
-
const lines = [];
|
|
43
|
-
if (message.event) {
|
|
44
|
-
lines.push(`event: ${message.event}`);
|
|
45
|
-
}
|
|
46
|
-
if (message.id) {
|
|
47
|
-
lines.push(`id: ${message.id}`);
|
|
48
|
-
}
|
|
49
|
-
if (message.retry !== undefined) {
|
|
50
|
-
lines.push(`retry: ${message.retry}`);
|
|
51
|
-
}
|
|
52
|
-
// Data can be multi-line, each line needs data: prefix
|
|
53
|
-
const dataStr = typeof message.data === 'string'
|
|
54
|
-
? message.data
|
|
55
|
-
: JSON.stringify(message.data);
|
|
56
|
-
for (const line of dataStr.split('\n')) {
|
|
57
|
-
lines.push(`data: ${line}`);
|
|
58
|
-
}
|
|
59
|
-
lines.push(''); // Empty line to end message
|
|
60
|
-
lines.push('');
|
|
61
|
-
try {
|
|
62
|
-
this.response.write(lines.join('\n'));
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
this.closed = true;
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Write a data-only message (convenience method)
|
|
72
|
-
*/
|
|
73
|
-
writeData(data) {
|
|
74
|
-
return this.write({ data });
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Send a comment (keep-alive)
|
|
78
|
-
*/
|
|
79
|
-
comment(text) {
|
|
80
|
-
if (this.closed)
|
|
81
|
-
return false;
|
|
82
|
-
try {
|
|
83
|
-
this.response.write(`: ${text}\n\n`);
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
catch {
|
|
87
|
-
this.closed = true;
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Close the stream
|
|
93
|
-
*/
|
|
94
|
-
close() {
|
|
95
|
-
if (!this.closed) {
|
|
96
|
-
this.write({ data: '[DONE]' });
|
|
97
|
-
this.response.end();
|
|
98
|
-
this.closed = true;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* Check if stream is still open
|
|
103
|
-
*/
|
|
104
|
-
isOpen() {
|
|
105
|
-
return !this.closed;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
exports.SSEWriter = SSEWriter;
|
|
109
|
-
/**
|
|
110
|
-
* Create an SSE writer
|
|
111
|
-
*/
|
|
112
|
-
function createSSEWriter(response) {
|
|
113
|
-
return new SSEWriter(response);
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Stream a provider response to SSE
|
|
117
|
-
*/
|
|
118
|
-
async function streamProviderResponse(providerUrl, request, headers, writer, callbacks) {
|
|
119
|
-
const chunks = [];
|
|
120
|
-
let ttftMs;
|
|
121
|
-
const startTime = Date.now();
|
|
122
|
-
try {
|
|
123
|
-
const response = await fetch(providerUrl, {
|
|
124
|
-
method: 'POST',
|
|
125
|
-
headers: {
|
|
126
|
-
...headers,
|
|
127
|
-
'Accept': 'text/event-stream',
|
|
128
|
-
},
|
|
129
|
-
body: JSON.stringify(request),
|
|
130
|
-
});
|
|
131
|
-
if (!response.ok) {
|
|
132
|
-
const error = new Error(`Provider returned ${response.status}`);
|
|
133
|
-
callbacks?.onError?.(error);
|
|
134
|
-
writer.write({
|
|
135
|
-
event: 'error',
|
|
136
|
-
data: { error: { message: error.message, status: response.status } },
|
|
137
|
-
});
|
|
138
|
-
writer.close();
|
|
139
|
-
return { success: false, chunks };
|
|
140
|
-
}
|
|
141
|
-
if (!response.body) {
|
|
142
|
-
const error = new Error('No response body');
|
|
143
|
-
callbacks?.onError?.(error);
|
|
144
|
-
writer.close();
|
|
145
|
-
return { success: false, chunks };
|
|
146
|
-
}
|
|
147
|
-
const reader = response.body.getReader();
|
|
148
|
-
const decoder = new TextDecoder();
|
|
149
|
-
let buffer = '';
|
|
150
|
-
while (true) {
|
|
151
|
-
const { done, value } = await reader.read();
|
|
152
|
-
if (done)
|
|
153
|
-
break;
|
|
154
|
-
if (ttftMs === undefined) {
|
|
155
|
-
ttftMs = Date.now() - startTime;
|
|
156
|
-
}
|
|
157
|
-
buffer += decoder.decode(value, { stream: true });
|
|
158
|
-
// Parse SSE events from buffer
|
|
159
|
-
const lines = buffer.split('\n');
|
|
160
|
-
buffer = lines.pop() ?? ''; // Keep incomplete line in buffer
|
|
161
|
-
for (const line of lines) {
|
|
162
|
-
if (line.startsWith('data: ')) {
|
|
163
|
-
const data = line.slice(6);
|
|
164
|
-
if (data === '[DONE]') {
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
try {
|
|
168
|
-
const parsed = JSON.parse(data);
|
|
169
|
-
chunks.push(parsed);
|
|
170
|
-
callbacks?.onChunk?.(parsed);
|
|
171
|
-
// Forward to client
|
|
172
|
-
if (!writer.write({ data: parsed })) {
|
|
173
|
-
// Client disconnected
|
|
174
|
-
return { success: false, chunks, ttftMs };
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
catch {
|
|
178
|
-
// Invalid JSON, skip
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
// Process any remaining buffer
|
|
184
|
-
if (buffer.startsWith('data: ')) {
|
|
185
|
-
const data = buffer.slice(6);
|
|
186
|
-
if (data && data !== '[DONE]') {
|
|
187
|
-
try {
|
|
188
|
-
const parsed = JSON.parse(data);
|
|
189
|
-
chunks.push(parsed);
|
|
190
|
-
callbacks?.onChunk?.(parsed);
|
|
191
|
-
writer.write({ data: parsed });
|
|
192
|
-
}
|
|
193
|
-
catch {
|
|
194
|
-
// Invalid JSON
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
callbacks?.onComplete?.(chunks);
|
|
199
|
-
writer.close();
|
|
200
|
-
return { success: true, chunks, ttftMs };
|
|
201
|
-
}
|
|
202
|
-
catch (error) {
|
|
203
|
-
callbacks?.onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
204
|
-
writer.write({
|
|
205
|
-
event: 'error',
|
|
206
|
-
data: { error: { message: error instanceof Error ? error.message : 'Stream error' } },
|
|
207
|
-
});
|
|
208
|
-
writer.close();
|
|
209
|
-
return { success: false, chunks, ttftMs };
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Aggregate streaming chunks into a complete response
|
|
214
|
-
*/
|
|
215
|
-
function aggregateStreamingResponse(chunks) {
|
|
216
|
-
let content = '';
|
|
217
|
-
let usage;
|
|
218
|
-
let model;
|
|
219
|
-
let finish_reason;
|
|
220
|
-
for (const chunk of chunks) {
|
|
221
|
-
if (typeof chunk !== 'object' || chunk === null)
|
|
222
|
-
continue;
|
|
223
|
-
const c = chunk;
|
|
224
|
-
// Extract model
|
|
225
|
-
if (c.model && typeof c.model === 'string') {
|
|
226
|
-
model = c.model;
|
|
227
|
-
}
|
|
228
|
-
// Extract content from choices
|
|
229
|
-
if (Array.isArray(c.choices) && c.choices.length > 0) {
|
|
230
|
-
const choice = c.choices[0];
|
|
231
|
-
// Delta content (streaming)
|
|
232
|
-
if (choice.delta && typeof choice.delta === 'object') {
|
|
233
|
-
const delta = choice.delta;
|
|
234
|
-
if (typeof delta.content === 'string') {
|
|
235
|
-
content += delta.content;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
// Finish reason
|
|
239
|
-
if (choice.finish_reason && typeof choice.finish_reason === 'string') {
|
|
240
|
-
finish_reason = choice.finish_reason;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
// Extract usage (usually in last chunk)
|
|
244
|
-
if (c.usage && typeof c.usage === 'object') {
|
|
245
|
-
const u = c.usage;
|
|
246
|
-
if (typeof u.prompt_tokens === 'number' &&
|
|
247
|
-
typeof u.completion_tokens === 'number') {
|
|
248
|
-
usage = {
|
|
249
|
-
prompt_tokens: u.prompt_tokens,
|
|
250
|
-
completion_tokens: u.completion_tokens,
|
|
251
|
-
total_tokens: u.total_tokens ?? u.prompt_tokens + u.completion_tokens,
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
return { content, usage, model, finish_reason };
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Keep-alive ping for long-running streams
|
|
260
|
-
*/
|
|
261
|
-
function startKeepAlive(writer, intervalMs = 15000) {
|
|
262
|
-
const timer = setInterval(() => {
|
|
263
|
-
if (!writer.isOpen()) {
|
|
264
|
-
clearInterval(timer);
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
writer.comment('ping');
|
|
268
|
-
}, intervalMs);
|
|
269
|
-
return () => clearInterval(timer);
|
|
270
|
-
}
|
|
271
|
-
//# sourceMappingURL=streaming.js.map
|
package/dist/streaming.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"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"}
|
package/dist/telemetry.d.ts
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RelayPlane Proxy Telemetry
|
|
3
|
-
*
|
|
4
|
-
* Anonymized telemetry collection for improving model routing.
|
|
5
|
-
*
|
|
6
|
-
* What we collect (exact schema):
|
|
7
|
-
* - device_id: anonymous random ID
|
|
8
|
-
* - task_type: inferred from token patterns, NOT prompt content
|
|
9
|
-
* - model: which model was used
|
|
10
|
-
* - tokens_in/out: token counts
|
|
11
|
-
* - latency_ms: response time
|
|
12
|
-
* - success: whether request succeeded
|
|
13
|
-
* - cost_usd: estimated cost
|
|
14
|
-
*
|
|
15
|
-
* What we NEVER collect:
|
|
16
|
-
* - Prompts or responses
|
|
17
|
-
* - File paths or contents
|
|
18
|
-
* - Anything that could identify you or your project
|
|
19
|
-
*
|
|
20
|
-
* @packageDocumentation
|
|
21
|
-
*/
|
|
22
|
-
/**
|
|
23
|
-
* Telemetry event schema (matches PITCH-v2.md)
|
|
24
|
-
*/
|
|
25
|
-
export interface TelemetryEvent {
|
|
26
|
-
/** Anonymous device ID */
|
|
27
|
-
device_id: string;
|
|
28
|
-
/** Inferred task type (from token patterns, NOT prompt content) */
|
|
29
|
-
task_type: string;
|
|
30
|
-
/** Model used */
|
|
31
|
-
model: string;
|
|
32
|
-
/** Input tokens */
|
|
33
|
-
tokens_in: number;
|
|
34
|
-
/** Output tokens */
|
|
35
|
-
tokens_out: number;
|
|
36
|
-
/** Request latency in milliseconds */
|
|
37
|
-
latency_ms: number;
|
|
38
|
-
/** Whether request succeeded */
|
|
39
|
-
success: boolean;
|
|
40
|
-
/** Estimated cost in USD */
|
|
41
|
-
cost_usd: number;
|
|
42
|
-
/** Timestamp */
|
|
43
|
-
timestamp: string;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Task type inference based on token patterns
|
|
47
|
-
* This infers task type from request characteristics, NOT from prompt content
|
|
48
|
-
*/
|
|
49
|
-
export declare function inferTaskType(inputTokens: number, outputTokens: number, model: string, hasTools?: boolean): string;
|
|
50
|
-
export declare function estimateCost(model: string, inputTokens: number, outputTokens: number): number;
|
|
51
|
-
/**
|
|
52
|
-
* Set audit mode - shows telemetry payload before sending
|
|
53
|
-
*/
|
|
54
|
-
export declare function setAuditMode(enabled: boolean): void;
|
|
55
|
-
/**
|
|
56
|
-
* Check if audit mode is enabled
|
|
57
|
-
*/
|
|
58
|
-
export declare function isAuditMode(): boolean;
|
|
59
|
-
/**
|
|
60
|
-
* Set offline mode - disables all network calls except LLM
|
|
61
|
-
*/
|
|
62
|
-
export declare function setOfflineMode(enabled: boolean): void;
|
|
63
|
-
/**
|
|
64
|
-
* Check if offline mode is enabled
|
|
65
|
-
*/
|
|
66
|
-
export declare function isOfflineMode(): boolean;
|
|
67
|
-
/**
|
|
68
|
-
* Get pending audit events
|
|
69
|
-
*/
|
|
70
|
-
export declare function getAuditBuffer(): TelemetryEvent[];
|
|
71
|
-
/**
|
|
72
|
-
* Clear audit buffer
|
|
73
|
-
*/
|
|
74
|
-
export declare function clearAuditBuffer(): void;
|
|
75
|
-
/**
|
|
76
|
-
* Record a telemetry event
|
|
77
|
-
*/
|
|
78
|
-
export declare function recordTelemetry(event: Omit<TelemetryEvent, 'device_id' | 'timestamp'>): void;
|
|
79
|
-
/**
|
|
80
|
-
* Get local telemetry data
|
|
81
|
-
*/
|
|
82
|
-
export declare function getLocalTelemetry(): TelemetryEvent[];
|
|
83
|
-
/**
|
|
84
|
-
* Get telemetry stats summary
|
|
85
|
-
*/
|
|
86
|
-
export declare function getTelemetryStats(): {
|
|
87
|
-
totalEvents: number;
|
|
88
|
-
totalCost: number;
|
|
89
|
-
byModel: Record<string, {
|
|
90
|
-
count: number;
|
|
91
|
-
cost: number;
|
|
92
|
-
}>;
|
|
93
|
-
byTaskType: Record<string, {
|
|
94
|
-
count: number;
|
|
95
|
-
cost: number;
|
|
96
|
-
}>;
|
|
97
|
-
successRate: number;
|
|
98
|
-
};
|
|
99
|
-
/**
|
|
100
|
-
* Clear all local telemetry data
|
|
101
|
-
*/
|
|
102
|
-
export declare function clearTelemetry(): void;
|
|
103
|
-
/**
|
|
104
|
-
* Get telemetry file path
|
|
105
|
-
*/
|
|
106
|
-
export declare function getTelemetryPath(): string;
|
|
107
|
-
/**
|
|
108
|
-
* Print telemetry disclosure message
|
|
109
|
-
*/
|
|
110
|
-
export declare function printTelemetryDisclosure(): void;
|
|
111
|
-
//# sourceMappingURL=telemetry.d.ts.map
|
package/dist/telemetry.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAElB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAElB,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IAEd,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAElB,oBAAoB;IACpB,UAAU,EAAE,MAAM,CAAC;IAEnB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IAEnB,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAC;IAEjB,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAEjB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAYD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,OAAe,GACxB,MAAM,CAiCR;AA4BD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAK7F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEnD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAErD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,cAAc,EAAE,CAEjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,IAAI,CAmC5F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,EAAE,CAcpD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5D,WAAW,EAAE,MAAM,CAAC;CACrB,CAgCA;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAQrC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CA8B/C"}
|