@relayplane/proxy 1.9.20 → 1.9.21
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/dist/agent-policy.d.ts +54 -0
- package/dist/agent-policy.d.ts.map +1 -0
- package/dist/agent-policy.js +183 -0
- package/dist/agent-policy.js.map +1 -0
- package/dist/cli.js +722 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/policy-analyzer.d.ts +41 -0
- package/dist/policy-analyzer.d.ts.map +1 -0
- package/dist/policy-analyzer.js +268 -0
- package/dist/policy-analyzer.js.map +1 -0
- package/dist/policy-suggestions.d.ts +31 -0
- package/dist/policy-suggestions.d.ts.map +1 -0
- package/dist/policy-suggestions.js +173 -0
- package/dist/policy-suggestions.js.map +1 -0
- package/dist/routing-log.d.ts +47 -0
- package/dist/routing-log.d.ts.map +1 -0
- package/dist/routing-log.js +141 -0
- package/dist/routing-log.js.map +1 -0
- package/dist/standalone-proxy.d.ts.map +1 -1
- package/dist/standalone-proxy.js +111 -0
- package/dist/standalone-proxy.js.map +1 -1
- package/dist/telemetryPinger.d.ts +2 -0
- package/dist/telemetryPinger.d.ts.map +1 -0
- package/dist/telemetryPinger.js +80 -0
- package/dist/telemetryPinger.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-Aware Routing Policy
|
|
3
|
+
*
|
|
4
|
+
* Manages loading, caching, and resolving routing policies from ~/.relayplane/policy.yaml.
|
|
5
|
+
* Policies allow per-agent and per-task model overrides.
|
|
6
|
+
*/
|
|
7
|
+
export interface TaskPolicy {
|
|
8
|
+
preferred: string;
|
|
9
|
+
neverDowngrade?: boolean;
|
|
10
|
+
escalateTo?: string;
|
|
11
|
+
escalateOn?: Array<'complexity_high' | 'rate_limit' | 'error'>;
|
|
12
|
+
}
|
|
13
|
+
export interface AgentPolicy {
|
|
14
|
+
fingerprint?: string;
|
|
15
|
+
preferred: string;
|
|
16
|
+
escalateTo?: string;
|
|
17
|
+
escalateOn?: Array<'complexity_high' | 'rate_limit' | 'error'>;
|
|
18
|
+
fallback?: string;
|
|
19
|
+
neverDowngrade?: boolean;
|
|
20
|
+
budgetPerDay?: number;
|
|
21
|
+
tasks?: Record<string, TaskPolicy>;
|
|
22
|
+
}
|
|
23
|
+
export interface RoutingPolicy {
|
|
24
|
+
version: number;
|
|
25
|
+
agents?: Record<string, AgentPolicy>;
|
|
26
|
+
tasks?: Record<string, TaskPolicy>;
|
|
27
|
+
}
|
|
28
|
+
export type ResolvedBy = 'agent_task_override' | 'task_rule' | 'agent_rule' | 'complexity_routing' | 'default_routing' | 'passthrough';
|
|
29
|
+
export interface PolicyResolution {
|
|
30
|
+
model: string;
|
|
31
|
+
resolvedBy: ResolvedBy;
|
|
32
|
+
neverDowngrade: boolean;
|
|
33
|
+
reason: string;
|
|
34
|
+
candidateModel?: string;
|
|
35
|
+
}
|
|
36
|
+
export declare const POLICY_FILE: string;
|
|
37
|
+
/** Reset cache — for testing only */
|
|
38
|
+
export declare function _resetPolicyCache(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Load routing policy from ~/.relayplane/policy.yaml with 5-second TTL cache.
|
|
41
|
+
* Returns empty policy { version: 1 } if file is missing or invalid.
|
|
42
|
+
*/
|
|
43
|
+
export declare function loadPolicy(): RoutingPolicy;
|
|
44
|
+
/**
|
|
45
|
+
* Resolve which model to use for a request, given the loaded policy.
|
|
46
|
+
*
|
|
47
|
+
* Resolution priority:
|
|
48
|
+
* 1. agent.tasks[taskType] override (agent_task_override)
|
|
49
|
+
* 2. policy.tasks[taskType] rule (task_rule)
|
|
50
|
+
* 3. agent-level rule (agent_rule)
|
|
51
|
+
* 4. pass-through: use candidateModel (complexity_routing)
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolvePolicy(policy: RoutingPolicy, agentFingerprint: string | undefined, agentName: string | undefined, taskType: string, complexity: 'simple' | 'moderate' | 'complex', candidateModel: string): PolicyResolution;
|
|
54
|
+
//# sourceMappingURL=agent-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-policy.d.ts","sourceRoot":"","sources":["../src/agent-policy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,YAAY,GAAG,OAAO,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,YAAY,GAAG,OAAO,CAAC,CAAC;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACpC;AAED,MAAM,MAAM,UAAU,GAClB,qBAAqB,GACrB,WAAW,GACX,YAAY,GACZ,oBAAoB,GACpB,iBAAiB,GACjB,aAAa,CAAC;AAElB,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,UAAU,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAKD,eAAO,MAAM,WAAW,QAAuC,CAAC;AAUhE,qCAAqC;AACrC,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,aAAa,CA6B1C;AAID;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,EAC7C,cAAc,EAAE,MAAM,GACrB,gBAAgB,CAoElB"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent-Aware Routing Policy
|
|
4
|
+
*
|
|
5
|
+
* Manages loading, caching, and resolving routing policies from ~/.relayplane/policy.yaml.
|
|
6
|
+
* Policies allow per-agent and per-task model overrides.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.POLICY_FILE = void 0;
|
|
43
|
+
exports._resetPolicyCache = _resetPolicyCache;
|
|
44
|
+
exports.loadPolicy = loadPolicy;
|
|
45
|
+
exports.resolvePolicy = resolvePolicy;
|
|
46
|
+
const fs = __importStar(require("node:fs"));
|
|
47
|
+
const path = __importStar(require("node:path"));
|
|
48
|
+
const os = __importStar(require("node:os"));
|
|
49
|
+
const js_yaml_1 = require("js-yaml");
|
|
50
|
+
// ─── File Loading ─────────────────────────────────────────────────────────────
|
|
51
|
+
const POLICY_DIR = path.join(os.homedir(), '.relayplane');
|
|
52
|
+
exports.POLICY_FILE = path.join(POLICY_DIR, 'policy.yaml');
|
|
53
|
+
const CACHE_TTL_MS = 5000;
|
|
54
|
+
let _cache = null;
|
|
55
|
+
/** Reset cache — for testing only */
|
|
56
|
+
function _resetPolicyCache() {
|
|
57
|
+
_cache = null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Load routing policy from ~/.relayplane/policy.yaml with 5-second TTL cache.
|
|
61
|
+
* Returns empty policy { version: 1 } if file is missing or invalid.
|
|
62
|
+
*/
|
|
63
|
+
function loadPolicy() {
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
if (_cache && now - _cache.loadedAt < CACHE_TTL_MS) {
|
|
66
|
+
return _cache.policy;
|
|
67
|
+
}
|
|
68
|
+
if (!fs.existsSync(exports.POLICY_FILE)) {
|
|
69
|
+
_cache = { policy: { version: 1 }, loadedAt: now };
|
|
70
|
+
return _cache.policy;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const raw = fs.readFileSync(exports.POLICY_FILE, 'utf-8');
|
|
74
|
+
const parsed = (0, js_yaml_1.load)(raw);
|
|
75
|
+
if (!parsed || typeof parsed !== 'object' || parsed.version !== 1) {
|
|
76
|
+
if (parsed && typeof parsed === 'object' && parsed.version !== 1) {
|
|
77
|
+
console.warn(`[RelayPlane] policy.yaml: unsupported version ${parsed.version}, expected 1`);
|
|
78
|
+
}
|
|
79
|
+
_cache = { policy: { version: 1 }, loadedAt: now };
|
|
80
|
+
return _cache.policy;
|
|
81
|
+
}
|
|
82
|
+
_cache = { policy: parsed, loadedAt: now };
|
|
83
|
+
return parsed;
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
87
|
+
console.warn(`[RelayPlane] policy.yaml parse error: ${msg}`);
|
|
88
|
+
_cache = { policy: { version: 1 }, loadedAt: now };
|
|
89
|
+
return { version: 1 };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// ─── Resolution ───────────────────────────────────────────────────────────────
|
|
93
|
+
/**
|
|
94
|
+
* Resolve which model to use for a request, given the loaded policy.
|
|
95
|
+
*
|
|
96
|
+
* Resolution priority:
|
|
97
|
+
* 1. agent.tasks[taskType] override (agent_task_override)
|
|
98
|
+
* 2. policy.tasks[taskType] rule (task_rule)
|
|
99
|
+
* 3. agent-level rule (agent_rule)
|
|
100
|
+
* 4. pass-through: use candidateModel (complexity_routing)
|
|
101
|
+
*/
|
|
102
|
+
function resolvePolicy(policy, agentFingerprint, agentName, taskType, complexity, candidateModel) {
|
|
103
|
+
const emptyPolicy = !policy.agents && !policy.tasks;
|
|
104
|
+
// Find matching agent entry
|
|
105
|
+
let matchedAgentName = null;
|
|
106
|
+
let matchedAgent = null;
|
|
107
|
+
if (policy.agents) {
|
|
108
|
+
for (const [name, agent] of Object.entries(policy.agents)) {
|
|
109
|
+
if (agent.fingerprint && agentFingerprint && agent.fingerprint === agentFingerprint) {
|
|
110
|
+
matchedAgentName = name;
|
|
111
|
+
matchedAgent = agent;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Match by name if fingerprint didn't match
|
|
116
|
+
if (!matchedAgent && agentName && policy.agents[agentName]) {
|
|
117
|
+
matchedAgentName = agentName;
|
|
118
|
+
matchedAgent = policy.agents[agentName];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// 1. Agent task override
|
|
122
|
+
if (matchedAgent && matchedAgent.tasks && matchedAgent.tasks[taskType]) {
|
|
123
|
+
const rule = matchedAgent.tasks[taskType];
|
|
124
|
+
const model = resolveEscalation(rule, complexity) ?? rule.preferred;
|
|
125
|
+
return {
|
|
126
|
+
model,
|
|
127
|
+
resolvedBy: 'agent_task_override',
|
|
128
|
+
neverDowngrade: rule.neverDowngrade === true,
|
|
129
|
+
reason: `Agent "${matchedAgentName}" task override for "${taskType}": ${model}`,
|
|
130
|
+
candidateModel,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// 2. Global task rule
|
|
134
|
+
if (policy.tasks && policy.tasks[taskType]) {
|
|
135
|
+
const rule = policy.tasks[taskType];
|
|
136
|
+
const model = resolveEscalation(rule, complexity) ?? rule.preferred;
|
|
137
|
+
return {
|
|
138
|
+
model,
|
|
139
|
+
resolvedBy: 'task_rule',
|
|
140
|
+
neverDowngrade: rule.neverDowngrade === true,
|
|
141
|
+
reason: `Task rule for "${taskType}": ${model}`,
|
|
142
|
+
candidateModel,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
// 3. Agent-level rule
|
|
146
|
+
if (matchedAgent) {
|
|
147
|
+
const model = resolveAgentEscalation(matchedAgent, complexity) ?? matchedAgent.preferred;
|
|
148
|
+
return {
|
|
149
|
+
model,
|
|
150
|
+
resolvedBy: 'agent_rule',
|
|
151
|
+
neverDowngrade: matchedAgent.neverDowngrade === true,
|
|
152
|
+
reason: `Agent rule for "${matchedAgentName}": ${model}`,
|
|
153
|
+
candidateModel,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
// 4. Pass-through
|
|
157
|
+
return {
|
|
158
|
+
model: candidateModel,
|
|
159
|
+
resolvedBy: emptyPolicy ? 'default_routing' : 'complexity_routing',
|
|
160
|
+
neverDowngrade: false,
|
|
161
|
+
reason: 'No policy rule matched; using complexity routing',
|
|
162
|
+
candidateModel,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function resolveEscalation(rule, complexity) {
|
|
166
|
+
if (rule.escalateTo &&
|
|
167
|
+
rule.escalateOn &&
|
|
168
|
+
rule.escalateOn.includes('complexity_high') &&
|
|
169
|
+
complexity === 'complex') {
|
|
170
|
+
return rule.escalateTo;
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
function resolveAgentEscalation(agent, complexity) {
|
|
175
|
+
if (agent.escalateTo &&
|
|
176
|
+
agent.escalateOn &&
|
|
177
|
+
agent.escalateOn.includes('complexity_high') &&
|
|
178
|
+
complexity === 'complex') {
|
|
179
|
+
return agent.escalateTo;
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=agent-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-policy.js","sourceRoot":"","sources":["../src/agent-policy.ts"],"names":[],"mappings":"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"}
|