@relayplane/proxy 0.1.10 → 0.2.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 +112 -298
- package/dist/brain-client.d.ts +87 -0
- package/dist/brain-client.d.ts.map +1 -0
- package/dist/brain-client.js +205 -0
- package/dist/brain-client.js.map +1 -0
- package/dist/cli.d.ts +35 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +262 -3115
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +80 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +208 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +17 -1131
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -3096
- package/dist/index.js.map +1 -1
- package/dist/standalone-proxy.d.ts +79 -0
- package/dist/standalone-proxy.d.ts.map +1 -0
- package/dist/standalone-proxy.js +2414 -0
- package/dist/standalone-proxy.js.map +1 -0
- package/dist/telemetry.d.ts +127 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +426 -0
- package/dist/telemetry.js.map +1 -0
- package/package.json +31 -51
- package/LICENSE +0 -21
- package/dist/cli.d.mts +0 -1
- package/dist/cli.mjs +0 -3134
- package/dist/cli.mjs.map +0 -1
- package/dist/index.d.mts +0 -1141
- package/dist/index.mjs +0 -3039
- package/dist/index.mjs.map +0 -1
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Brain API Client
|
|
4
|
+
*
|
|
5
|
+
* Calls the RelayPlane Brain API for intelligent routing decisions.
|
|
6
|
+
* Only used for Pro/Trial users with valid API keys.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.hasBrainAccess = hasBrainAccess;
|
|
45
|
+
exports.getApiKey = getApiKey;
|
|
46
|
+
exports.setApiKey = setApiKey;
|
|
47
|
+
exports.getRouteRecommendation = getRouteRecommendation;
|
|
48
|
+
exports.getBrainRouting = getBrainRouting;
|
|
49
|
+
exports.getProviderStatus = getProviderStatus;
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const config_js_1 = require("./config.js");
|
|
53
|
+
const telemetry_js_1 = require("./telemetry.js");
|
|
54
|
+
const BRAIN_API_URL = process.env.RELAYPLANE_API_URL || 'https://api.relayplane.com';
|
|
55
|
+
const BRAIN_TIMEOUT_MS = 5000; // 5 second timeout for Brain calls
|
|
56
|
+
/**
|
|
57
|
+
* Check if user has Brain access (Pro API key)
|
|
58
|
+
*/
|
|
59
|
+
function hasBrainAccess() {
|
|
60
|
+
if ((0, telemetry_js_1.isOfflineMode)())
|
|
61
|
+
return false;
|
|
62
|
+
const apiKey = getApiKey();
|
|
63
|
+
if (!apiKey)
|
|
64
|
+
return false;
|
|
65
|
+
// Pro keys start with 'rp_live_' or 'rp_trial_'
|
|
66
|
+
return apiKey.startsWith('rp_live_') || apiKey.startsWith('rp_trial_');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get configured API key
|
|
70
|
+
*/
|
|
71
|
+
function getApiKey() {
|
|
72
|
+
try {
|
|
73
|
+
const configPath = path.join((0, config_js_1.getConfigDir)(), 'config.json');
|
|
74
|
+
if (fs.existsSync(configPath)) {
|
|
75
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
76
|
+
return config.apiKey || null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
// Ignore config read errors
|
|
81
|
+
}
|
|
82
|
+
return process.env.RELAYPLANE_API_KEY || null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Set API key
|
|
86
|
+
*/
|
|
87
|
+
function setApiKey(apiKey) {
|
|
88
|
+
const configDir = (0, config_js_1.getConfigDir)();
|
|
89
|
+
if (!fs.existsSync(configDir)) {
|
|
90
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
91
|
+
}
|
|
92
|
+
const configPath = path.join(configDir, 'config.json');
|
|
93
|
+
let config = {};
|
|
94
|
+
try {
|
|
95
|
+
if (fs.existsSync(configPath)) {
|
|
96
|
+
config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
// Start fresh
|
|
101
|
+
}
|
|
102
|
+
config.apiKey = apiKey;
|
|
103
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get routing recommendation from Brain API
|
|
107
|
+
*
|
|
108
|
+
* Falls back to static routing if Brain is unavailable.
|
|
109
|
+
*/
|
|
110
|
+
async function getRouteRecommendation(request) {
|
|
111
|
+
if (!hasBrainAccess()) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
const apiKey = getApiKey();
|
|
115
|
+
if (!apiKey)
|
|
116
|
+
return null;
|
|
117
|
+
try {
|
|
118
|
+
const controller = new AbortController();
|
|
119
|
+
const timeout = setTimeout(() => controller.abort(), BRAIN_TIMEOUT_MS);
|
|
120
|
+
const response = await fetch(`${BRAIN_API_URL}/v1/route`, {
|
|
121
|
+
method: 'POST',
|
|
122
|
+
headers: {
|
|
123
|
+
'Content-Type': 'application/json',
|
|
124
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
125
|
+
},
|
|
126
|
+
body: JSON.stringify(request),
|
|
127
|
+
signal: controller.signal,
|
|
128
|
+
});
|
|
129
|
+
clearTimeout(timeout);
|
|
130
|
+
if (!response.ok) {
|
|
131
|
+
// Brain unavailable - fall back to static
|
|
132
|
+
console.warn(`[Brain] Route request failed: ${response.status}`);
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const result = await response.json();
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
140
|
+
console.warn('[Brain] Route request timed out');
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
console.warn('[Brain] Route request failed:', err);
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get routing recommendation for a request
|
|
150
|
+
*
|
|
151
|
+
* Analyzes the request and calls Brain API to get the optimal model.
|
|
152
|
+
*/
|
|
153
|
+
async function getBrainRouting(inputTokens, outputTokens, currentModel, hasTools = false, hasVision = false) {
|
|
154
|
+
// Infer task type
|
|
155
|
+
const taskType = (0, telemetry_js_1.inferTaskType)(inputTokens, outputTokens, currentModel, hasTools);
|
|
156
|
+
// Try Brain API
|
|
157
|
+
const brainResponse = await getRouteRecommendation({
|
|
158
|
+
taskType,
|
|
159
|
+
estimatedInputTokens: inputTokens,
|
|
160
|
+
estimatedOutputTokens: outputTokens,
|
|
161
|
+
requiresVision: hasVision,
|
|
162
|
+
requiresToolUse: hasTools,
|
|
163
|
+
currentModel,
|
|
164
|
+
});
|
|
165
|
+
if (brainResponse && brainResponse.success) {
|
|
166
|
+
return {
|
|
167
|
+
model: brainResponse.recommendedModel,
|
|
168
|
+
reason: brainResponse.explanation.reason,
|
|
169
|
+
isBrain: true,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// Fall back to static routing
|
|
173
|
+
return {
|
|
174
|
+
model: currentModel,
|
|
175
|
+
reason: 'Static routing (Brain unavailable)',
|
|
176
|
+
isBrain: false,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get provider status from Brain API
|
|
181
|
+
*/
|
|
182
|
+
async function getProviderStatus() {
|
|
183
|
+
if (!hasBrainAccess()) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const apiKey = getApiKey();
|
|
187
|
+
if (!apiKey)
|
|
188
|
+
return null;
|
|
189
|
+
try {
|
|
190
|
+
const response = await fetch(`${BRAIN_API_URL}/v1/status`, {
|
|
191
|
+
headers: {
|
|
192
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
if (!response.ok) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
const result = await response.json();
|
|
199
|
+
return result.providers || null;
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=brain-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-client.js","sourceRoot":"","sources":["../src/brain-client.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1 +1,36 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* RelayPlane Proxy CLI
|
|
4
|
+
*
|
|
5
|
+
* Intelligent AI model routing proxy server.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx @relayplane/proxy [command] [options]
|
|
9
|
+
* relayplane-proxy [command] [options]
|
|
10
|
+
*
|
|
11
|
+
* Commands:
|
|
12
|
+
* (default) Start the proxy server
|
|
13
|
+
* telemetry [on|off|status] Manage telemetry settings
|
|
14
|
+
* stats Show usage statistics
|
|
15
|
+
* config Show configuration
|
|
16
|
+
*
|
|
17
|
+
* Options:
|
|
18
|
+
* --port <number> Port to listen on (default: 3001)
|
|
19
|
+
* --host <string> Host to bind to (default: 127.0.0.1)
|
|
20
|
+
* --offline Disable all network calls except LLM endpoints
|
|
21
|
+
* --audit Show telemetry payloads before sending
|
|
22
|
+
* -v, --verbose Enable verbose logging
|
|
23
|
+
* -h, --help Show this help message
|
|
24
|
+
* --version Show version
|
|
25
|
+
*
|
|
26
|
+
* Environment Variables:
|
|
27
|
+
* ANTHROPIC_API_KEY Anthropic API key
|
|
28
|
+
* OPENAI_API_KEY OpenAI API key
|
|
29
|
+
* GEMINI_API_KEY Google Gemini API key
|
|
30
|
+
* XAI_API_KEY xAI/Grok API key
|
|
31
|
+
* MOONSHOT_API_KEY Moonshot API key
|
|
32
|
+
*
|
|
33
|
+
* @packageDocumentation
|
|
34
|
+
*/
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG"}
|