@zhivex-ai/gateway 0.3.0 → 0.3.1-next.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.
@@ -0,0 +1,210 @@
1
+ import { toCapabilityMismatch } from "./types.js";
2
+ import { getGatewayTargetHealthScore, isGatewayTargetCoolingDown } from "./runtime-state.js";
3
+ const resolveModelCost = (context, target) => context.providerCostsPer1kTokens?.[target.provider] ?? context.modelCatalog?.find(target.provider, target.modelId)?.costPer1kTokens;
4
+ const resolveLatencyPenalty = (context, target) => {
5
+ const state = context.runtimeStates.get(`${target.provider}:${target.modelId}`);
6
+ const stateLatency = state?.latencyEwmaMs ?? state?.latencyP95Ms ?? state?.avgLatencyMs ?? state?.lastLatencyMs;
7
+ const configuredBias = context.latencyBiasMs?.[target.provider] ?? 0;
8
+ const measured = stateLatency ?? 0;
9
+ return (measured + configuredBias) / 100;
10
+ };
11
+ const scoreHeuristics = (mode, intent, target) => {
12
+ const model = target.modelId.toLowerCase();
13
+ const speedScore = Number(model.includes("flash")) * 2 + Number(model.includes("mini")) + Number(model.includes("lite"));
14
+ const qualityScore = Number(model.includes("pro")) * 2 +
15
+ Number(model.includes("claude")) * 2 +
16
+ Number(model.includes("sonnet")) +
17
+ Number(model.includes("opus")) * 2;
18
+ const reasoningScore = Number(model.includes("claude")) * 2 +
19
+ Number(model.includes("sonnet")) +
20
+ Number(model.includes("gpt-5")) * 2 +
21
+ Number(model.includes("o1")) * 2 +
22
+ Number(model.includes("o3")) * 2 +
23
+ Number(model.includes("reason"));
24
+ if (mode === "speed") {
25
+ return speedScore + (target.provider === "ollama" ? 2 : 0);
26
+ }
27
+ if (mode === "quality") {
28
+ return qualityScore + (intent === "reasoning" ? reasoningScore : 0);
29
+ }
30
+ return speedScore + qualityScore + (intent === "reasoning" ? reasoningScore : 0) + (target.provider === "ollama" ? 1 : 0);
31
+ };
32
+ const scoreHealth = (evaluated) => getGatewayTargetHealthScore(evaluated.state);
33
+ const costPenalty = (cost, strategy, maxCostPer1kTokens) => {
34
+ if (cost == null || strategy === "ignore") {
35
+ return 0;
36
+ }
37
+ if (strategy === "prefer-cheaper") {
38
+ if (maxCostPer1kTokens != null && cost > maxCostPer1kTokens) {
39
+ return (cost - maxCostPer1kTokens) * 4;
40
+ }
41
+ return cost;
42
+ }
43
+ return cost;
44
+ };
45
+ const buildEvaluatedTarget = (context, target) => {
46
+ const adapter = context.adapters[target.provider];
47
+ const targetKey = `${target.provider}:${target.modelId}`;
48
+ const state = context.runtimeStates.get(targetKey);
49
+ const costStrategy = context.request.costStrategy ?? "strict";
50
+ const estimatedCostPer1kTokens = resolveModelCost(context, target);
51
+ if (!adapter) {
52
+ return {
53
+ target,
54
+ score: Number.NEGATIVE_INFINITY,
55
+ available: false,
56
+ estimatedCostPer1kTokens,
57
+ skipReason: "missing-adapter",
58
+ state
59
+ };
60
+ }
61
+ const model = context.requiredCapabilities.webSearch && adapter.groundedLanguageModel
62
+ ? adapter.groundedLanguageModel(target.modelId)
63
+ : adapter.languageModel(target.modelId);
64
+ const explicitMismatch = toCapabilityMismatch(model.capabilities, context.request.requiredCapabilities ?? {});
65
+ const hardMismatch = toCapabilityMismatch(model.capabilities, context.requiredCapabilities)
66
+ .filter((key) => !explicitMismatch.includes(key));
67
+ const degradedCapabilities = context.request.allowDegradedCapabilities ? explicitMismatch : [];
68
+ const missingCapabilities = context.request.allowDegradedCapabilities
69
+ ? hardMismatch
70
+ : [...explicitMismatch, ...hardMismatch];
71
+ if (missingCapabilities.length > 0) {
72
+ return {
73
+ target,
74
+ score: Number.NEGATIVE_INFINITY,
75
+ available: false,
76
+ estimatedCostPer1kTokens,
77
+ degradedCapabilities,
78
+ skipReason: "capabilities",
79
+ state
80
+ };
81
+ }
82
+ if (isGatewayTargetCoolingDown(state, context.now)) {
83
+ return {
84
+ target,
85
+ score: Number.NEGATIVE_INFINITY,
86
+ available: false,
87
+ estimatedCostPer1kTokens,
88
+ degradedCapabilities,
89
+ skipReason: "cooldown",
90
+ state
91
+ };
92
+ }
93
+ const observedLatency = state?.latencyP95Ms ?? state?.latencyEwmaMs ?? state?.avgLatencyMs;
94
+ if (context.request.latencyBudgetMs != null && observedLatency != null && observedLatency > context.request.latencyBudgetMs) {
95
+ return {
96
+ target,
97
+ score: Number.NEGATIVE_INFINITY,
98
+ available: false,
99
+ estimatedCostPer1kTokens,
100
+ degradedCapabilities,
101
+ skipReason: "latency-budget",
102
+ state
103
+ };
104
+ }
105
+ if (context.request.maxCostPer1kTokens != null &&
106
+ costStrategy === "strict" &&
107
+ estimatedCostPer1kTokens != null &&
108
+ estimatedCostPer1kTokens > context.request.maxCostPer1kTokens) {
109
+ return {
110
+ target,
111
+ score: Number.NEGATIVE_INFINITY,
112
+ available: false,
113
+ estimatedCostPer1kTokens,
114
+ degradedCapabilities,
115
+ skipReason: "cost",
116
+ state
117
+ };
118
+ }
119
+ const score = scoreHeuristics(context.request.routingMode ?? "balanced", context.request.taskIntent ?? "chat", target) +
120
+ (context.request.preferLocal && target.provider === "ollama" ? 3 : 0) +
121
+ scoreHealth({
122
+ target,
123
+ score: 0,
124
+ available: true,
125
+ estimatedCostPer1kTokens,
126
+ degradedCapabilities,
127
+ state
128
+ }) -
129
+ resolveLatencyPenalty(context, target) -
130
+ costPenalty(estimatedCostPer1kTokens, costStrategy, context.request.maxCostPer1kTokens) -
131
+ degradedCapabilities.length * 5;
132
+ return {
133
+ target,
134
+ score,
135
+ available: true,
136
+ estimatedCostPer1kTokens,
137
+ degradedCapabilities,
138
+ state
139
+ };
140
+ };
141
+ export const createDefaultRouterPolicy = () => ({
142
+ name: "default-router-policy",
143
+ plan(context) {
144
+ const evaluatedTargets = context.targets.map((target) => buildEvaluatedTarget(context, target));
145
+ const orderedTargets = [...evaluatedTargets]
146
+ .filter((candidate) => candidate.available)
147
+ .sort((left, right) => right.score - left.score)
148
+ .map((candidate) => candidate.target);
149
+ return {
150
+ mode: context.request.routingMode ?? "balanced",
151
+ intent: context.request.taskIntent ?? "chat",
152
+ policy: "default-router-policy",
153
+ orderedTargets,
154
+ evaluatedTargets,
155
+ reason: "Ordered by default router policy using capabilities, runtime health, latency, and cost."
156
+ };
157
+ }
158
+ });
159
+ const classifyErrorClass = (message) => {
160
+ if (["timed out", "timeout"].some((token) => message.includes(token))) {
161
+ return "timeout";
162
+ }
163
+ if (["429", "rate", "overloaded"].some((token) => message.includes(token))) {
164
+ return "rate-limit";
165
+ }
166
+ if (["connect", "econnrefused", "enotfound", "socket"].some((token) => message.includes(token))) {
167
+ return "connectivity";
168
+ }
169
+ if (["validation", "unsupported", "invalid"].some((token) => message.includes(token))) {
170
+ return "validation";
171
+ }
172
+ if (["500", "502", "503", "504", "provider"].some((token) => message.includes(token))) {
173
+ return "provider";
174
+ }
175
+ return "unknown";
176
+ };
177
+ export const createDefaultRetryPolicy = (options = {}) => ({
178
+ name: "default-retry-policy",
179
+ classifyError(error) {
180
+ if (error instanceof Error) {
181
+ const normalized = error.message.toLowerCase();
182
+ const errorClass = classifyErrorClass(normalized);
183
+ return {
184
+ message: error.message,
185
+ retryable: errorClass === "timeout" || errorClass === "rate-limit" || errorClass === "connectivity" || errorClass === "provider",
186
+ errorClass
187
+ };
188
+ }
189
+ return {
190
+ message: "Unknown gateway error.",
191
+ retryable: false,
192
+ errorClass: "unknown"
193
+ };
194
+ },
195
+ shouldRetry(context) {
196
+ const maxRetries = context.request.retryPolicy?.maxRetries ?? options.maxRetries ?? 2;
197
+ return context.error.retryable && context.retry < Math.max(0, maxRetries);
198
+ },
199
+ getBackoffMs(context) {
200
+ const base = context.request.retryPolicy?.backoffMs ?? options.backoffMs ?? 200;
201
+ return base * (context.retry + 1);
202
+ },
203
+ getCooldownMs(context) {
204
+ const threshold = context.request.retryPolicy?.cooldownAfterRetryableFailures ?? options.cooldownAfterRetryableFailures ?? 3;
205
+ const duration = context.request.retryPolicy?.cooldownMs ?? options.cooldownMs ?? 30_000;
206
+ const nextRetryableFailures = (context.state?.consecutiveRetryableFailures ?? 0) + Number(context.error.retryable);
207
+ return context.error.retryable && nextRetryableFailures >= threshold ? duration : 0;
208
+ }
209
+ });
210
+ //# sourceMappingURL=policies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.js","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { GatewayErrorClass, GatewayModelTarget, GatewayRuntimeStore, GatewayTargetRuntimeState } from "./types.js";
2
+ export interface InMemoryGatewayRuntimeStoreOptions {
3
+ now?: () => number;
4
+ ttlMs?: number;
5
+ maxTargets?: number;
6
+ ewmaAlpha?: number;
7
+ latencySampleSize?: number;
8
+ }
9
+ export declare const gatewayTargetKey: (target: GatewayModelTarget) => string;
10
+ export declare const estimateLatencyP95: (recentLatenciesMs: number[]) => number | undefined;
11
+ export declare const computeLatencyEwma: (current: number | undefined, latencyMs: number, alpha: number) => number;
12
+ export declare const isGatewayTargetCoolingDown: (state: GatewayTargetRuntimeState | undefined, now: number) => boolean;
13
+ export declare const getGatewayTargetHealthScore: (state: GatewayTargetRuntimeState | undefined) => number;
14
+ export declare const refreshGatewayTargetRuntimeState: (state: GatewayTargetRuntimeState | undefined, now: number) => GatewayTargetRuntimeState | undefined;
15
+ export declare const createGatewayRuntimeState: (target: GatewayModelTarget, overrides?: Partial<GatewayTargetRuntimeState>, now?: number) => GatewayTargetRuntimeState;
16
+ export declare const incrementErrorClass: (errorCounts: Partial<Record<GatewayErrorClass, number>>, errorClass: GatewayErrorClass) => {
17
+ timeout?: number | undefined;
18
+ "rate-limit"?: number | undefined;
19
+ connectivity?: number | undefined;
20
+ provider?: number | undefined;
21
+ validation?: number | undefined;
22
+ unknown?: number | undefined;
23
+ };
24
+ export declare const updateRuntimeLatency: (state: GatewayTargetRuntimeState, latencyMs: number, options: Pick<Required<InMemoryGatewayRuntimeStoreOptions>, "ewmaAlpha" | "latencySampleSize">) => {
25
+ lastLatencyMs: number;
26
+ avgLatencyMs: number;
27
+ latencyEwmaMs: number;
28
+ latencyP95Ms: number | undefined;
29
+ recentLatenciesMs: number[];
30
+ };
31
+ export declare const createInMemoryGatewayRuntimeStore: (options?: InMemoryGatewayRuntimeStoreOptions) => GatewayRuntimeStore;
32
+ //# sourceMappingURL=runtime-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,kCAAkC;IACjD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAID,eAAO,MAAM,gBAAgB,GAAI,QAAQ,kBAAkB,WAA2C,CAAC;AAEvG,eAAO,MAAM,kBAAkB,GAAI,mBAAmB,MAAM,EAAE,uBAQ7D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,GAAG,SAAS,EAAE,WAAW,MAAM,EAAE,OAAO,MAAM,WACX,CAAC;AAEtF,eAAO,MAAM,0BAA0B,GAAI,OAAO,yBAAyB,GAAG,SAAS,EAAE,KAAK,MAAM,YACtB,CAAC;AAE/E,eAAO,MAAM,2BAA2B,GAAI,OAAO,yBAAyB,GAAG,SAAS,WAYvF,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAC3C,OAAO,yBAAyB,GAAG,SAAS,EAC5C,KAAK,MAAM,KACV,yBAAyB,GAAG,SAiB9B,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,QAAQ,kBAAkB,EAC1B,YAAW,OAAO,CAAC,yBAAyB,CAAM,EAClD,YAAgB,KACf,yBAiBD,CAAC;AAEH,eAAO,MAAM,mBAAmB,GAC9B,aAAa,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,EACvD,YAAY,iBAAiB;;;;;;;CAI7B,CAAC;AAEH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,yBAAyB,EAChC,WAAW,MAAM,EACjB,SAAS,IAAI,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,WAAW,GAAG,mBAAmB,CAAC;;;;;;CAa/F,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC5C,UAAS,kCAAuC,KAC/C,mBA0FF,CAAC"}
@@ -0,0 +1,158 @@
1
+ const defaultNow = () => Date.now();
2
+ export const gatewayTargetKey = (target) => `${target.provider}:${target.modelId}`;
3
+ export const estimateLatencyP95 = (recentLatenciesMs) => {
4
+ if (!recentLatenciesMs.length) {
5
+ return undefined;
6
+ }
7
+ const sorted = [...recentLatenciesMs].sort((left, right) => left - right);
8
+ const index = Math.max(0, Math.ceil(sorted.length * 0.95) - 1);
9
+ return sorted[index];
10
+ };
11
+ export const computeLatencyEwma = (current, latencyMs, alpha) => current == null ? latencyMs : Math.round(alpha * latencyMs + (1 - alpha) * current);
12
+ export const isGatewayTargetCoolingDown = (state, now) => !!state && state.circuitState === "open" && (state.cooldownUntil ?? 0) > now;
13
+ export const getGatewayTargetHealthScore = (state) => {
14
+ if (!state || state.requestCount === 0) {
15
+ return 0;
16
+ }
17
+ const timeoutPenalty = (state.errorCounts.timeout ?? 0) * 1.5;
18
+ const rateLimitPenalty = (state.errorCounts["rate-limit"] ?? 0) * 1.25;
19
+ const connectivityPenalty = (state.errorCounts.connectivity ?? 0) * 1.1;
20
+ const providerPenalty = (state.errorCounts.provider ?? 0) * 0.9;
21
+ const failureRatio = state.failureCount / state.requestCount;
22
+ const circuitPenalty = state.circuitState === "open" ? 8 : state.circuitState === "half-open" ? 3 : 0;
23
+ return -(failureRatio * 10 + state.consecutiveFailures + timeoutPenalty + rateLimitPenalty + connectivityPenalty + providerPenalty + circuitPenalty);
24
+ };
25
+ export const refreshGatewayTargetRuntimeState = (state, now) => {
26
+ if (!state) {
27
+ return undefined;
28
+ }
29
+ if (state.expiresAt != null && state.expiresAt <= now) {
30
+ return undefined;
31
+ }
32
+ if (state.circuitState === "open" && (state.cooldownUntil ?? 0) <= now) {
33
+ return {
34
+ ...state,
35
+ circuitState: "half-open"
36
+ };
37
+ }
38
+ return state;
39
+ };
40
+ export const createGatewayRuntimeState = (target, overrides = {}, now = Date.now()) => ({
41
+ targetKey: gatewayTargetKey(target),
42
+ provider: target.provider,
43
+ modelId: target.modelId,
44
+ circuitState: "closed",
45
+ requestCount: 0,
46
+ successCount: 0,
47
+ failureCount: 0,
48
+ retryableFailureCount: 0,
49
+ nonRetryableFailureCount: 0,
50
+ consecutiveFailures: 0,
51
+ consecutiveRetryableFailures: 0,
52
+ recentLatenciesMs: [],
53
+ errorCounts: {},
54
+ createdAt: now,
55
+ lastUpdatedAt: now,
56
+ ...overrides
57
+ });
58
+ export const incrementErrorClass = (errorCounts, errorClass) => ({
59
+ ...errorCounts,
60
+ [errorClass]: (errorCounts[errorClass] ?? 0) + 1
61
+ });
62
+ export const updateRuntimeLatency = (state, latencyMs, options) => {
63
+ const recentLatenciesMs = [...state.recentLatenciesMs, latencyMs].slice(-options.latencySampleSize);
64
+ return {
65
+ lastLatencyMs: latencyMs,
66
+ avgLatencyMs: state.avgLatencyMs == null
67
+ ? latencyMs
68
+ : Math.round((state.avgLatencyMs * state.requestCount + latencyMs) / (state.requestCount + 1)),
69
+ latencyEwmaMs: computeLatencyEwma(state.latencyEwmaMs, latencyMs, options.ewmaAlpha),
70
+ latencyP95Ms: estimateLatencyP95(recentLatenciesMs),
71
+ recentLatenciesMs
72
+ };
73
+ };
74
+ export const createInMemoryGatewayRuntimeStore = (options = {}) => {
75
+ const now = options.now ?? defaultNow;
76
+ const ttlMs = options.ttlMs ?? 5 * 60_000;
77
+ const maxTargets = options.maxTargets ?? 500;
78
+ const states = new Map();
79
+ const pruneExpired = () => {
80
+ const currentNow = now();
81
+ let removed = 0;
82
+ for (const [targetKey, state] of states.entries()) {
83
+ if (state.expiresAt != null && state.expiresAt <= currentNow) {
84
+ states.delete(targetKey);
85
+ removed += 1;
86
+ }
87
+ }
88
+ return removed;
89
+ };
90
+ const enforceCapacity = () => {
91
+ if (states.size <= maxTargets) {
92
+ return;
93
+ }
94
+ const candidates = [...states.values()].sort((left, right) => left.lastUpdatedAt - right.lastUpdatedAt);
95
+ while (states.size > maxTargets && candidates.length) {
96
+ const evicted = candidates.shift();
97
+ if (evicted) {
98
+ states.delete(evicted.targetKey);
99
+ }
100
+ }
101
+ };
102
+ const normalizeForRead = (targetKey) => {
103
+ const current = refreshGatewayTargetRuntimeState(states.get(targetKey), now());
104
+ if (!current) {
105
+ states.delete(targetKey);
106
+ return undefined;
107
+ }
108
+ if (current !== states.get(targetKey)) {
109
+ states.set(targetKey, current);
110
+ }
111
+ return current;
112
+ };
113
+ return {
114
+ get(targetKey) {
115
+ pruneExpired();
116
+ return normalizeForRead(targetKey);
117
+ },
118
+ set(targetKey, state) {
119
+ pruneExpired();
120
+ const timestamp = now();
121
+ states.set(targetKey, {
122
+ ...state,
123
+ expiresAt: ttlMs > 0 ? timestamp + ttlMs : undefined,
124
+ lastUpdatedAt: timestamp
125
+ });
126
+ enforceCapacity();
127
+ },
128
+ update(targetKey, updater) {
129
+ pruneExpired();
130
+ const timestamp = now();
131
+ const current = normalizeForRead(targetKey);
132
+ const next = updater(current);
133
+ states.set(targetKey, {
134
+ ...next,
135
+ expiresAt: ttlMs > 0 ? timestamp + ttlMs : undefined,
136
+ lastUpdatedAt: timestamp
137
+ });
138
+ enforceCapacity();
139
+ return states.get(targetKey);
140
+ },
141
+ list() {
142
+ pruneExpired();
143
+ return [...states.keys()]
144
+ .map((targetKey) => normalizeForRead(targetKey))
145
+ .filter((state) => !!state);
146
+ },
147
+ delete(targetKey) {
148
+ states.delete(targetKey);
149
+ },
150
+ clear() {
151
+ states.clear();
152
+ },
153
+ prune() {
154
+ return pruneExpired();
155
+ }
156
+ };
157
+ };
158
+ //# sourceMappingURL=runtime-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"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"}