@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.
package/README.md CHANGED
@@ -9,8 +9,45 @@ The gateway now supports:
9
9
  - `generateObject()`
10
10
  - `streamObject()`
11
11
 
12
+ The gateway is policy-driven and ships with:
13
+
14
+ - a default router policy that scores targets using capabilities, latency, cost, and runtime health
15
+ - a default retry policy with retry classification, backoff, and target cooldowns
16
+ - an in-memory runtime store with per-target health, EWMA/p95 latency tracking, TTL pruning, and circuit states
17
+ - rich routing events through `onEvent`
18
+
12
19
  Tool loops continue to run on the selected target after routing, and streaming fallbacks are resolved before the first chunk is emitted.
13
20
 
21
+ ## Quick Example
22
+
23
+ ```ts
24
+ import { createGateway } from "@zhivex-ai/gateway";
25
+ import { createOpenAI } from "@zhivex-ai/openai";
26
+ import { createOllama } from "@zhivex-ai/ollama";
27
+
28
+ const gateway = createGateway({
29
+ adapters: {
30
+ openai: createOpenAI({ apiKey: process.env.OPENAI_API_KEY }),
31
+ ollama: createOllama()
32
+ },
33
+ onEvent(event) {
34
+ console.log(event.type);
35
+ }
36
+ });
37
+
38
+ const result = await gateway.generate({
39
+ primary: { provider: "openai", modelId: "gpt-4o-mini" },
40
+ fallbacks: [{ provider: "ollama", modelId: "llama3.2" }],
41
+ messages: [{ role: "user", content: "Summarize routing." }],
42
+ maxCostPer1kTokens: 1,
43
+ costStrategy: "strict",
44
+ latencyBudgetMs: 2_000
45
+ });
46
+
47
+ console.log(result.providerUsed);
48
+ console.log(result.routeDecision.policy);
49
+ ```
50
+
14
51
  ## Install
15
52
 
16
53
  ```bash
@@ -0,0 +1,19 @@
1
+ import type { GatewayAttempt, GatewayEvent, GatewayModelTarget, GatewayRequest, GatewayRetryPolicy, GatewayRuntimeStore, GatewayRouteDecision } from "./types.js";
2
+ export interface ExecuteRoutedOperationOptions<TResult> {
3
+ request: GatewayRequest;
4
+ routeDecision: GatewayRouteDecision;
5
+ retryPolicy: GatewayRetryPolicy;
6
+ runtimeStore: GatewayRuntimeStore;
7
+ getAttemptTimeoutMs: (target: GatewayModelTarget) => number;
8
+ onAttempt?: (attempt: GatewayAttempt) => void | Promise<void>;
9
+ onEvent?: (event: GatewayEvent) => void | Promise<void>;
10
+ now?: () => number;
11
+ operation: (target: GatewayModelTarget) => Promise<TResult>;
12
+ }
13
+ export interface ExecuteRoutedOperationResult<TResult> {
14
+ attempts: GatewayAttempt[];
15
+ target: GatewayModelTarget;
16
+ result: TResult;
17
+ }
18
+ export declare const executeRoutedOperation: <TResult>(options: ExecuteRoutedOperationOptions<TResult>) => Promise<ExecuteRoutedOperationResult<TResult>>;
19
+ //# sourceMappingURL=attempts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempts.d.ts","sourceRoot":"","sources":["../src/attempts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EAEZ,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAqFpB,MAAM,WAAW,6BAA6B,CAAC,OAAO;IACpD,OAAO,EAAE,cAAc,CAAC;IACxB,aAAa,EAAE,oBAAoB,CAAC;IACpC,WAAW,EAAE,kBAAkB,CAAC;IAChC,YAAY,EAAE,mBAAmB,CAAC;IAClC,mBAAmB,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,MAAM,CAAC;IAC5D,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,4BAA4B,CAAC,OAAO;IACnD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;CACjB;AAiCD,eAAO,MAAM,sBAAsB,GAAU,OAAO,EAClD,SAAS,6BAA6B,CAAC,OAAO,CAAC,KAC9C,OAAO,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAyJ/C,CAAC"}
@@ -0,0 +1,221 @@
1
+ import { GatewayError } from "./types.js";
2
+ import { createGatewayRuntimeState, gatewayTargetKey, updateRuntimeLatency } from "./runtime-state.js";
3
+ const withTimeout = async (promise, timeoutMs) => new Promise((resolve, reject) => {
4
+ const timer = setTimeout(() => reject(new GatewayError(`Provider timed out after ${timeoutMs}ms.`, true)), timeoutMs);
5
+ promise
6
+ .then((value) => {
7
+ clearTimeout(timer);
8
+ resolve(value);
9
+ })
10
+ .catch((error) => {
11
+ clearTimeout(timer);
12
+ reject(error);
13
+ });
14
+ });
15
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
16
+ const updateSuccessState = async (runtimeStore, target, latencyMs, now) => runtimeStore.update(gatewayTargetKey(target), (current) => {
17
+ const state = current ?? createGatewayRuntimeState(target, {}, now);
18
+ const requestCount = state.requestCount + 1;
19
+ return {
20
+ ...state,
21
+ requestCount,
22
+ successCount: state.successCount + 1,
23
+ consecutiveFailures: 0,
24
+ consecutiveRetryableFailures: 0,
25
+ consecutiveErrorClass: undefined,
26
+ ...updateRuntimeLatency(state, latencyMs, {
27
+ ewmaAlpha: 0.35,
28
+ latencySampleSize: 20
29
+ }),
30
+ cooldownUntil: undefined,
31
+ circuitState: state.circuitState === "half-open" ? "closed" : state.circuitState,
32
+ lastErrorMessage: undefined,
33
+ lastErrorClass: undefined
34
+ };
35
+ });
36
+ const updateFailureState = async (runtimeStore, target, latencyMs, errorMessage, errorClass, retryable, cooldownMs, now) => runtimeStore.update(gatewayTargetKey(target), (current) => {
37
+ const state = current ?? createGatewayRuntimeState(target, {}, now);
38
+ const requestCount = state.requestCount + 1;
39
+ const cooldownUntil = cooldownMs > 0 ? now + cooldownMs : state.cooldownUntil;
40
+ return {
41
+ ...state,
42
+ requestCount,
43
+ failureCount: state.failureCount + 1,
44
+ retryableFailureCount: state.retryableFailureCount + Number(retryable),
45
+ nonRetryableFailureCount: state.nonRetryableFailureCount + Number(!retryable),
46
+ consecutiveFailures: state.consecutiveFailures + 1,
47
+ consecutiveRetryableFailures: retryable ? state.consecutiveRetryableFailures + 1 : 0,
48
+ consecutiveErrorClass: errorClass,
49
+ ...updateRuntimeLatency(state, latencyMs, {
50
+ ewmaAlpha: 0.35,
51
+ latencySampleSize: 20
52
+ }),
53
+ lastErrorMessage: errorMessage,
54
+ lastErrorClass: errorClass,
55
+ errorCounts: {
56
+ ...state.errorCounts,
57
+ [errorClass]: (state.errorCounts[errorClass] ?? 0) + 1
58
+ },
59
+ cooldownUntil,
60
+ circuitState: cooldownMs > 0 ? "open" : state.circuitState === "half-open" ? "open" : state.circuitState
61
+ };
62
+ });
63
+ const emitEvent = async (onEvent, event) => {
64
+ await onEvent?.(event);
65
+ };
66
+ const skipToAttempt = (target, targetRank, skipReason) => ({
67
+ provider: target.provider,
68
+ modelId: target.modelId,
69
+ ok: false,
70
+ latencyMs: 0,
71
+ retry: 0,
72
+ targetRank,
73
+ skipReason,
74
+ errorMessage: skipReason === "capabilities"
75
+ ? "Skipped because model capabilities do not satisfy the request."
76
+ : skipReason === "cost"
77
+ ? "Skipped because provider cost exceeds the configured budget."
78
+ : skipReason === "cooldown"
79
+ ? "Skipped because target is cooling down after repeated failures."
80
+ : skipReason === "latency-budget"
81
+ ? "Skipped because observed latency exceeds the configured budget."
82
+ : "Skipped because no adapter is registered for the target."
83
+ });
84
+ export const executeRoutedOperation = async (options) => {
85
+ const attempts = [];
86
+ const currentTime = options.now ?? Date.now;
87
+ for (const [targetRank, candidate] of options.routeDecision.evaluatedTargets.entries()) {
88
+ if (!candidate.available) {
89
+ const skipped = skipToAttempt(candidate.target, targetRank, candidate.skipReason);
90
+ attempts.push(skipped);
91
+ await emitEvent(options.onEvent, {
92
+ type: "target-skipped",
93
+ request: options.request,
94
+ target: candidate.target,
95
+ targetRank,
96
+ timestamp: currentTime(),
97
+ reason: candidate.skipReason
98
+ });
99
+ continue;
100
+ }
101
+ const target = candidate.target;
102
+ for (let retry = 0;; retry += 1) {
103
+ const attemptStartedAt = currentTime();
104
+ const startedAttempt = {
105
+ provider: target.provider,
106
+ modelId: target.modelId,
107
+ ok: true,
108
+ latencyMs: 0,
109
+ retry,
110
+ targetRank
111
+ };
112
+ await options.onAttempt?.(startedAttempt);
113
+ await emitEvent(options.onEvent, {
114
+ type: "attempt-started",
115
+ request: options.request,
116
+ target,
117
+ retry,
118
+ targetRank,
119
+ timestamp: attemptStartedAt
120
+ });
121
+ try {
122
+ const result = await withTimeout(options.operation(target), options.getAttemptTimeoutMs(target));
123
+ const latencyMs = currentTime() - attemptStartedAt;
124
+ attempts.push({
125
+ provider: target.provider,
126
+ modelId: target.modelId,
127
+ ok: true,
128
+ latencyMs,
129
+ retry,
130
+ targetRank
131
+ });
132
+ await updateSuccessState(options.runtimeStore, target, latencyMs, currentTime());
133
+ await emitEvent(options.onEvent, {
134
+ type: "attempt-succeeded",
135
+ request: options.request,
136
+ target,
137
+ retry,
138
+ targetRank,
139
+ timestamp: currentTime(),
140
+ latencyMs
141
+ });
142
+ return {
143
+ attempts,
144
+ target,
145
+ result
146
+ };
147
+ }
148
+ catch (error) {
149
+ const normalized = options.retryPolicy.classifyError(error);
150
+ const context = {
151
+ request: options.request,
152
+ target,
153
+ state: candidate.state,
154
+ retry,
155
+ targetRank,
156
+ error: normalized
157
+ };
158
+ const latencyMs = currentTime() - attemptStartedAt;
159
+ const cooldownMs = options.retryPolicy.getCooldownMs(context);
160
+ const nextState = await updateFailureState(options.runtimeStore, target, latencyMs, normalized.message, normalized.errorClass, normalized.retryable, cooldownMs, currentTime());
161
+ const failedAttempt = {
162
+ provider: target.provider,
163
+ modelId: target.modelId,
164
+ ok: false,
165
+ latencyMs,
166
+ retry,
167
+ targetRank,
168
+ errorMessage: normalized.message,
169
+ retryable: normalized.retryable
170
+ };
171
+ attempts.push(failedAttempt);
172
+ await options.onAttempt?.(failedAttempt);
173
+ await emitEvent(options.onEvent, {
174
+ type: "attempt-failed",
175
+ request: options.request,
176
+ target,
177
+ retry,
178
+ targetRank,
179
+ timestamp: currentTime(),
180
+ latencyMs,
181
+ errorMessage: normalized.message,
182
+ retryable: normalized.retryable,
183
+ errorClass: normalized.errorClass
184
+ });
185
+ if (cooldownMs > 0 && nextState.cooldownUntil) {
186
+ await emitEvent(options.onEvent, {
187
+ type: "target-cooled-down",
188
+ request: options.request,
189
+ target,
190
+ timestamp: currentTime(),
191
+ cooldownUntil: nextState.cooldownUntil
192
+ });
193
+ }
194
+ if (!options.retryPolicy.shouldRetry({ ...context, state: nextState })) {
195
+ break;
196
+ }
197
+ const delayMs = options.retryPolicy.getBackoffMs({ ...context, state: nextState });
198
+ await emitEvent(options.onEvent, {
199
+ type: "attempt-retried",
200
+ request: options.request,
201
+ target,
202
+ retry,
203
+ targetRank,
204
+ timestamp: currentTime(),
205
+ delayMs
206
+ });
207
+ await sleep(delayMs);
208
+ }
209
+ }
210
+ }
211
+ const finalError = attempts.at(-1)?.errorMessage ?? "All gateway attempts failed.";
212
+ await emitEvent(options.onEvent, {
213
+ type: "route-failed",
214
+ request: options.request,
215
+ timestamp: currentTime(),
216
+ attempts,
217
+ errorMessage: finalError
218
+ });
219
+ throw new GatewayError(finalError, false);
220
+ };
221
+ //# sourceMappingURL=attempts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempts.js","sourceRoot":"","sources":["../src/attempts.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAEvG,MAAM,WAAW,GAAG,KAAK,EAAK,OAAmB,EAAE,SAAiB,EAAE,EAAE,CACtE,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IACjC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,4BAA4B,SAAS,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACtH,OAAO;SACJ,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACd,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEL,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEhF,MAAM,kBAAkB,GAAG,KAAK,EAC9B,YAAiC,EACjC,MAA0B,EAC1B,SAAiB,EACjB,GAAW,EACyB,EAAE,CACtC,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE;IACxD,MAAM,KAAK,GAAG,OAAO,IAAI,yBAAyB,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;IAC5C,OAAO;QACL,GAAG,KAAK;QACR,YAAY;QACZ,YAAY,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC;QACpC,mBAAmB,EAAE,CAAC;QACtB,4BAA4B,EAAE,CAAC;QAC/B,qBAAqB,EAAE,SAAS;QAChC,GAAG,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE;YACxC,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,EAAE;SACtB,CAAC;QACF,aAAa,EAAE,SAAS;QACxB,YAAY,EAAE,KAAK,CAAC,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY;QAChF,gBAAgB,EAAE,SAAS;QAC3B,cAAc,EAAE,SAAS;KAC1B,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,MAAM,kBAAkB,GAAG,KAAK,EAC9B,YAAiC,EACjC,MAA0B,EAC1B,SAAiB,EACjB,YAAoB,EACpB,UAA6B,EAC7B,SAAkB,EAClB,UAAkB,EAClB,GAAW,EACyB,EAAE,CACtC,YAAY,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE;IACxD,MAAM,KAAK,GAAG,OAAO,IAAI,yBAAyB,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IAC9E,OAAO;QACL,GAAG,KAAK;QACR,YAAY;QACZ,YAAY,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC;QACpC,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,GAAG,MAAM,CAAC,SAAS,CAAC;QACtE,wBAAwB,EAAE,KAAK,CAAC,wBAAwB,GAAG,MAAM,CAAC,CAAC,SAAS,CAAC;QAC7E,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,GAAG,CAAC;QAClD,4BAA4B,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,4BAA4B,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,qBAAqB,EAAE,UAAU;QACjC,GAAG,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE;YACxC,SAAS,EAAE,IAAI;YACf,iBAAiB,EAAE,EAAE;SACtB,CAAC;QACF,gBAAgB,EAAE,YAAY;QAC9B,cAAc,EAAE,UAAU;QAC1B,WAAW,EAAE;YACX,GAAG,KAAK,CAAC,WAAW;YACpB,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;SACvD;QACD,aAAa;QACb,YAAY,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY;KACzG,CAAC;AACJ,CAAC,CAAC,CAAC;AAoBL,MAAM,SAAS,GAAG,KAAK,EACrB,OAA0D,EAC1D,KAAmB,EACnB,EAAE;IACF,MAAM,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CACpB,MAA0B,EAC1B,UAAkB,EAClB,UAAwC,EACxB,EAAE,CAAC,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;IACzB,OAAO,EAAE,MAAM,CAAC,OAAO;IACvB,EAAE,EAAE,KAAK;IACT,SAAS,EAAE,CAAC;IACZ,KAAK,EAAE,CAAC;IACR,UAAU;IACV,UAAU;IACV,YAAY,EACV,UAAU,KAAK,cAAc;QAC3B,CAAC,CAAC,gEAAgE;QAClE,CAAC,CAAC,UAAU,KAAK,MAAM;YACrB,CAAC,CAAC,8DAA8D;YAChE,CAAC,CAAC,UAAU,KAAK,UAAU;gBACzB,CAAC,CAAC,iEAAiE;gBACnE,CAAC,CAAC,UAAU,KAAK,gBAAgB;oBAC/B,CAAC,CAAC,iEAAiE;oBACnE,CAAC,CAAC,0DAA0D;CACvE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EACzC,OAA+C,EACC,EAAE;IAClD,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAE5C,KAAK,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;QACvF,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;YAClF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;gBAC/B,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,UAAU;gBACV,SAAS,EAAE,WAAW,EAAE;gBACxB,MAAM,EAAE,SAAS,CAAC,UAAW;aAC9B,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAEhC,KAAK,IAAI,KAAK,GAAG,CAAC,GAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,gBAAgB,GAAG,WAAW,EAAE,CAAC;YACvC,MAAM,cAAc,GAAmB;gBACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,EAAE,EAAE,IAAI;gBACR,SAAS,EAAE,CAAC;gBACZ,KAAK;gBACL,UAAU;aACX,CAAC;YAEF,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,CAAC;YAC1C,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;gBAC/B,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM;gBACN,KAAK;gBACL,UAAU;gBACV,SAAS,EAAE,gBAAgB;aAC5B,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;gBACjG,MAAM,SAAS,GAAG,WAAW,EAAE,GAAG,gBAAgB,CAAC;gBACnD,QAAQ,CAAC,IAAI,CAAC;oBACZ,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,EAAE,EAAE,IAAI;oBACR,SAAS;oBACT,KAAK;oBACL,UAAU;iBACX,CAAC,CAAC;gBACH,MAAM,kBAAkB,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;gBACjF,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;oBAC/B,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,MAAM;oBACN,KAAK;oBACL,UAAU;oBACV,SAAS,EAAE,WAAW,EAAE;oBACxB,SAAS;iBACV,CAAC,CAAC;gBACH,OAAO;oBACL,QAAQ;oBACR,MAAM;oBACN,MAAM;iBACP,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC5D,MAAM,OAAO,GAAG;oBACd,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,MAAM;oBACN,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,KAAK;oBACL,UAAU;oBACV,KAAK,EAAE,UAAU;iBAClB,CAAC;gBACF,MAAM,SAAS,GAAG,WAAW,EAAE,GAAG,gBAAgB,CAAC;gBACnD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC9D,MAAM,SAAS,GAAG,MAAM,kBAAkB,CACxC,OAAO,CAAC,YAAY,EACpB,MAAM,EACN,SAAS,EACT,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,SAAS,EACpB,UAAU,EACV,WAAW,EAAE,CACd,CAAC;gBACF,MAAM,aAAa,GAAmB;oBACpC,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,EAAE,EAAE,KAAK;oBACT,SAAS;oBACT,KAAK;oBACL,UAAU;oBACV,YAAY,EAAE,UAAU,CAAC,OAAO;oBAChC,SAAS,EAAE,UAAU,CAAC,SAAS;iBAChC,CAAC;gBACF,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC7B,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,CAAC;gBACzC,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;oBAC/B,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,MAAM;oBACN,KAAK;oBACL,UAAU;oBACV,SAAS,EAAE,WAAW,EAAE;oBACxB,SAAS;oBACT,YAAY,EAAE,UAAU,CAAC,OAAO;oBAChC,SAAS,EAAE,UAAU,CAAC,SAAS;oBAC/B,UAAU,EAAE,UAAU,CAAC,UAAU;iBAClC,CAAC,CAAC;gBAEH,IAAI,UAAU,GAAG,CAAC,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;oBAC9C,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;wBAC/B,IAAI,EAAE,oBAAoB;wBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,MAAM;wBACN,SAAS,EAAE,WAAW,EAAE;wBACxB,aAAa,EAAE,SAAS,CAAC,aAAa;qBACvC,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;oBACvE,MAAM;gBACR,CAAC;gBAED,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBACnF,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;oBAC/B,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,MAAM;oBACN,KAAK;oBACL,UAAU;oBACV,SAAS,EAAE,WAAW,EAAE;oBACxB,OAAO;iBACR,CAAC,CAAC;gBACH,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,IAAI,8BAA8B,CAAC;IACnF,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE;QAC/B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,WAAW,EAAE;QACxB,QAAQ;QACR,YAAY,EAAE,UAAU;KACzB,CAAC,CAAC;IACH,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC,CAAC"}
package/dist/compat.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import type { ModelMessage } from "@zhivex-ai/core";
2
- import type { GatewayMessage, GatewayModelTarget, GatewayProviderId, GatewayResponse } from "./types.js";
2
+ import type { GatewayMessage, GatewayProviderId } from "./types.js";
3
3
  export declare const supportsVisionInput: (provider: GatewayProviderId, modelId: string) => boolean;
4
4
  export declare const stripImagesForUnsupportedModel: (messages: GatewayMessage[], provider: GatewayProviderId, modelId: string) => GatewayMessage[];
5
5
  export declare const gatewayMessagesToModelMessages: (messages: GatewayMessage[], systemPrompt?: string) => ModelMessage[];
6
- export declare const createRouteDecision: (mode: GatewayResponse["routeDecision"]["mode"], intent: GatewayResponse["routeDecision"]["intent"], orderedTargets: GatewayModelTarget[]) => GatewayResponse["routeDecision"];
7
6
  //# sourceMappingURL=compat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../src/compat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,mBAAmB,GAAI,UAAU,iBAAiB,EAAE,SAAS,MAAM,KAAG,OAYlF,CAAC;AAEF,eAAO,MAAM,8BAA8B,GACzC,UAAU,cAAc,EAAE,EAC1B,UAAU,iBAAiB,EAC3B,SAAS,MAAM,KACd,cAAc,EAMhB,CAAC;AAEF,eAAO,MAAM,8BAA8B,GACzC,UAAU,cAAc,EAAE,EAC1B,eAAe,MAAM,KACpB,YAAY,EAyBd,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,MAAM,eAAe,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,EAC9C,QAAQ,eAAe,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,EAClD,gBAAgB,kBAAkB,EAAE,KACnC,eAAe,CAAC,eAAe,CAKhC,CAAC"}
1
+ {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../src/compat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,mBAAmB,GAAI,UAAU,iBAAiB,EAAE,SAAS,MAAM,KAAG,OAYlF,CAAC;AAEF,eAAO,MAAM,8BAA8B,GACzC,UAAU,cAAc,EAAE,EAC1B,UAAU,iBAAiB,EAC3B,SAAS,MAAM,KACd,cAAc,EAMhB,CAAC;AAEF,eAAO,MAAM,8BAA8B,GACzC,UAAU,cAAc,EAAE,EAC1B,eAAe,MAAM,KACpB,YAAY,EAyBd,CAAC"}
package/dist/compat.js CHANGED
@@ -37,10 +37,4 @@ export const gatewayMessagesToModelMessages = (messages, systemPrompt) => {
37
37
  }
38
38
  return mappedMessages;
39
39
  };
40
- export const createRouteDecision = (mode, intent, orderedTargets) => ({
41
- mode,
42
- intent,
43
- orderedTargets,
44
- reason: `Ordered by ${mode} mode with ${intent} intent.`
45
- });
46
40
  //# sourceMappingURL=compat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compat.js","sourceRoot":"","sources":["../src/compat.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAA2B,EAAE,OAAe,EAAW,EAAE;IAC3F,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,QAA0B,EAC1B,QAA2B,EAC3B,OAAe,EACG,EAAE;IACpB,IAAI,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACpG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,QAA0B,EAC1B,YAAqB,EACL,EAAE;IAClB,MAAM,cAAc,GAAmB,EAAE,CAAC;IAE1C,IAAI,YAAY,EAAE,CAAC;QACjB,cAAc,CAAC,IAAI,CAAC;YAClB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,cAAc,CAAC,IAAI,CAAC;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE;gBACvC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACzC,IAAI,EAAE,OAAgB;oBACtB,KAAK,EAAE,KAAK,CAAC,OAAO;oBACpB,SAAS,EAAE,KAAK,CAAC,QAAQ;iBAC1B,CAAC,CAAC,IAAI,EAAE,CAAC;aACX;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,IAA8C,EAC9C,MAAkD,EAClD,cAAoC,EACF,EAAE,CAAC,CAAC;IACtC,IAAI;IACJ,MAAM;IACN,cAAc;IACd,MAAM,EAAE,cAAc,IAAI,cAAc,MAAM,UAAU;CACzD,CAAC,CAAC"}
1
+ {"version":3,"file":"compat.js","sourceRoot":"","sources":["../src/compat.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAA2B,EAAE,OAAe,EAAW,EAAE;IAC3F,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,QAA0B,EAC1B,QAA2B,EAC3B,OAAe,EACG,EAAE;IACpB,IAAI,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACpG,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,QAA0B,EAC1B,YAAqB,EACL,EAAE;IAClB,MAAM,cAAc,GAAmB,EAAE,CAAC;IAE1C,IAAI,YAAY,EAAE,CAAC;QACjB,cAAc,CAAC,IAAI,CAAC;YAClB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,cAAc,CAAC,IAAI,CAAC;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE;gBACL,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE;gBACvC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACzC,IAAI,EAAE,OAAgB;oBACtB,KAAK,EAAE,KAAK,CAAC,OAAO;oBACpB,SAAS,EAAE,KAAK,CAAC,QAAQ;iBAC1B,CAAC,CAAC,IAAI,EAAE,CAAC;aACX;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,10 @@
1
1
  import type { ZodTypeAny } from "zod";
2
- import { type GatewayConfig, type GatewayGenerateObjectRequest, type GatewayObjectResponse, type GatewayRequest, type GatewayResponse, type GatewayStreamObjectResult, type GatewayStreamTextResult } from "./types.js";
2
+ import type { GatewayConfig, GatewayGenerateObjectRequest, GatewayResolvedModel, GatewayObjectResponse, GatewayRequest, GatewayResponse, GatewayStreamObjectResult, GatewayStreamTextResult } from "./types.js";
3
+ export * from "./policies.js";
4
+ export * from "./runtime-state.js";
5
+ export * from "./types.js";
3
6
  export declare const createGateway: (config: GatewayConfig) => {
7
+ resolveModel(request: GatewayRequest): Promise<GatewayResolvedModel>;
4
8
  generate(request: GatewayRequest): Promise<GatewayResponse>;
5
9
  streamText(request: GatewayRequest): GatewayStreamTextResult;
6
10
  generateObject<TSchema extends ZodTypeAny>(request: GatewayGenerateObjectRequest<TSchema>): Promise<GatewayObjectResponse<TSchema>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAGtC,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,4BAA4B,EAEjC,KAAK,qBAAqB,EAE1B,KAAK,cAAc,EACnB,KAAK,eAAe,EAEpB,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAE7B,MAAM,YAAY,CAAC;AA0MpB,eAAO,MAAM,aAAa,GAAI,QAAQ,aAAa;sBAkOvB,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;wBAK7C,cAAc,GAAG,uBAAuB;mBAyCvC,OAAO,SAAS,UAAU,WACpC,4BAA4B,CAAC,OAAO,CAAC,GAC7C,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;iBAuB7B,OAAO,SAAS,UAAU,WAAW,4BAA4B,CAAC,OAAO,CAAC,GAAG,yBAAyB,CAAC,OAAO,CAAC;CA2D/H,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAMtC,OAAO,KAAK,EACV,aAAa,EAEb,4BAA4B,EAE5B,oBAAoB,EACpB,qBAAqB,EAErB,cAAc,EACd,eAAe,EAEf,yBAAyB,EACzB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAOpB,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAiI3B,eAAO,MAAM,aAAa,GAAI,QAAQ,aAAa;0BA4HnB,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC;sBAiClD,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;wBAK7C,cAAc,GAAG,uBAAuB;mBA4CvC,OAAO,SAAS,UAAU,WACpC,4BAA4B,CAAC,OAAO,CAAC,GAC7C,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;iBAyB7B,OAAO,SAAS,UAAU,WAAW,4BAA4B,CAAC,OAAO,CAAC,GAAG,yBAAyB,CAAC,OAAO,CAAC;CA+D/H,CAAC"}