@probeo/anymodel 0.2.0 → 0.3.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 +92 -6
- package/dist/batch/index.d.ts +4 -0
- package/dist/batch/index.d.ts.map +1 -0
- package/dist/batch/index.js +3 -0
- package/dist/batch/index.js.map +1 -0
- package/dist/batch/manager.d.ts +72 -0
- package/dist/batch/manager.d.ts.map +1 -0
- package/dist/batch/manager.js +328 -0
- package/dist/batch/manager.js.map +1 -0
- package/dist/batch/store.d.ts +54 -0
- package/dist/batch/store.d.ts.map +1 -0
- package/dist/batch/store.js +109 -0
- package/dist/batch/store.js.map +1 -0
- package/dist/cli.cjs +4 -28
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +28 -2110
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +42 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +181 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +120 -0
- package/dist/config.js.map +1 -0
- package/dist/index.cjs +4 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +14 -548
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -2089
- package/dist/index.js.map +1 -1
- package/dist/providers/adapter.d.ts +33 -0
- package/dist/providers/adapter.d.ts.map +1 -0
- package/dist/providers/adapter.js +2 -0
- package/dist/providers/adapter.js.map +1 -0
- package/dist/providers/anthropic-batch.d.ts +3 -0
- package/dist/providers/anthropic-batch.d.ts.map +1 -0
- package/dist/providers/anthropic-batch.js +228 -0
- package/dist/providers/anthropic-batch.js.map +1 -0
- package/dist/providers/anthropic.d.ts +3 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +358 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/custom.d.ts +8 -0
- package/dist/providers/custom.d.ts.map +1 -0
- package/dist/providers/custom.js +61 -0
- package/dist/providers/custom.js.map +1 -0
- package/dist/providers/google.d.ts +3 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +331 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +5 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-batch.d.ts +3 -0
- package/dist/providers/openai-batch.d.ts.map +1 -0
- package/dist/providers/openai-batch.js +208 -0
- package/dist/providers/openai-batch.js.map +1 -0
- package/dist/providers/openai.d.ts +3 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +221 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +10 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +27 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/router.d.ts +29 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +212 -0
- package/dist/router.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +149 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +283 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs-io.d.ts +40 -0
- package/dist/utils/fs-io.d.ts.map +1 -0
- package/dist/utils/fs-io.js +203 -0
- package/dist/utils/fs-io.js.map +1 -0
- package/dist/utils/generation-stats.d.ts +25 -0
- package/dist/utils/generation-stats.d.ts.map +1 -0
- package/dist/utils/generation-stats.js +46 -0
- package/dist/utils/generation-stats.js.map +1 -0
- package/dist/utils/id.d.ts +2 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +6 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/model-parser.d.ts +6 -0
- package/dist/utils/model-parser.d.ts.map +1 -0
- package/dist/utils/model-parser.js +21 -0
- package/dist/utils/model-parser.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +36 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +80 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry.d.ts +7 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +54 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/transforms.d.ts +7 -0
- package/dist/utils/transforms.d.ts.map +1 -0
- package/dist/utils/transforms.js +66 -0
- package/dist/utils/transforms.js.map +1 -0
- package/dist/utils/validate.d.ts +3 -0
- package/dist/utils/validate.d.ts.map +1 -0
- package/dist/utils/validate.js +31 -0
- package/dist/utils/validate.js.map +1 -0
- package/package.json +4 -1
package/dist/utils/id.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,UAAU,CAAC,SAAiB,KAAK;IAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACrD,OAAO,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-parser.d.ts","sourceRoot":"","sources":["../../src/utils/model-parser.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,WAAW,CAyB7F"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AnyModelError } from '../types.js';
|
|
2
|
+
export function parseModelString(model, aliases) {
|
|
3
|
+
// Check aliases first
|
|
4
|
+
if (aliases && model in aliases) {
|
|
5
|
+
model = aliases[model];
|
|
6
|
+
}
|
|
7
|
+
const slashIndex = model.indexOf('/');
|
|
8
|
+
if (slashIndex === -1) {
|
|
9
|
+
throw new AnyModelError(400, `Model must be in provider/model format or be a valid alias. Got: '${model}'`);
|
|
10
|
+
}
|
|
11
|
+
const provider = model.substring(0, slashIndex);
|
|
12
|
+
const modelId = model.substring(slashIndex + 1);
|
|
13
|
+
if (!provider) {
|
|
14
|
+
throw new AnyModelError(400, `Invalid model string: missing provider in '${model}'`);
|
|
15
|
+
}
|
|
16
|
+
if (!modelId) {
|
|
17
|
+
throw new AnyModelError(400, `Invalid model string: missing model ID in '${model}'`);
|
|
18
|
+
}
|
|
19
|
+
return { provider, model: modelId };
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=model-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-parser.js","sourceRoot":"","sources":["../../src/utils/model-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO5C,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,OAAgC;IAC9E,sBAAsB;IACtB,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;QAChC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,aAAa,CACrB,GAAG,EACH,qEAAqE,KAAK,GAAG,CAC9E,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAEhD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,8CAA8C,KAAK,GAAG,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,8CAA8C,KAAK,GAAG,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-provider rate limit tracker.
|
|
3
|
+
* Tracks rate limit state from provider response headers and 429 errors.
|
|
4
|
+
*/
|
|
5
|
+
export interface RateLimitState {
|
|
6
|
+
provider: string;
|
|
7
|
+
remaining: number | null;
|
|
8
|
+
resetAt: number | null;
|
|
9
|
+
retryAfter: number | null;
|
|
10
|
+
lastUpdated: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class RateLimitTracker {
|
|
13
|
+
private state;
|
|
14
|
+
/**
|
|
15
|
+
* Update rate limit state from response headers.
|
|
16
|
+
*/
|
|
17
|
+
updateFromHeaders(provider: string, headers: Record<string, string>): void;
|
|
18
|
+
/**
|
|
19
|
+
* Record a 429 for a provider.
|
|
20
|
+
*/
|
|
21
|
+
recordRateLimit(provider: string, retryAfterMs?: number): void;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a provider is currently rate-limited.
|
|
24
|
+
*/
|
|
25
|
+
isRateLimited(provider: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Get ms until rate limit resets for a provider.
|
|
28
|
+
*/
|
|
29
|
+
getWaitTime(provider: string): number;
|
|
30
|
+
/**
|
|
31
|
+
* Get state for a provider.
|
|
32
|
+
*/
|
|
33
|
+
getState(provider: string): RateLimitState | undefined;
|
|
34
|
+
private getOrCreate;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAqC;IAElD;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAuB1E;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAU9D;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAYxC;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQrC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAItD,OAAO,CAAC,WAAW;CAcpB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export class RateLimitTracker {
|
|
2
|
+
state = new Map();
|
|
3
|
+
/**
|
|
4
|
+
* Update rate limit state from response headers.
|
|
5
|
+
*/
|
|
6
|
+
updateFromHeaders(provider, headers) {
|
|
7
|
+
const state = this.getOrCreate(provider);
|
|
8
|
+
const remaining = headers['x-ratelimit-remaining'] || headers['x-ratelimit-remaining-requests'];
|
|
9
|
+
if (remaining !== undefined) {
|
|
10
|
+
state.remaining = parseInt(remaining, 10);
|
|
11
|
+
}
|
|
12
|
+
const reset = headers['x-ratelimit-reset'] || headers['x-ratelimit-reset-requests'];
|
|
13
|
+
if (reset !== undefined) {
|
|
14
|
+
// Could be epoch seconds or ISO date
|
|
15
|
+
const parsed = Number(reset);
|
|
16
|
+
state.resetAt = parsed > 1e12 ? parsed : parsed * 1000;
|
|
17
|
+
}
|
|
18
|
+
const retryAfter = headers['retry-after'];
|
|
19
|
+
if (retryAfter !== undefined) {
|
|
20
|
+
state.retryAfter = Number(retryAfter) * 1000;
|
|
21
|
+
}
|
|
22
|
+
state.lastUpdated = Date.now();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Record a 429 for a provider.
|
|
26
|
+
*/
|
|
27
|
+
recordRateLimit(provider, retryAfterMs) {
|
|
28
|
+
const state = this.getOrCreate(provider);
|
|
29
|
+
state.remaining = 0;
|
|
30
|
+
if (retryAfterMs) {
|
|
31
|
+
state.retryAfter = retryAfterMs;
|
|
32
|
+
state.resetAt = Date.now() + retryAfterMs;
|
|
33
|
+
}
|
|
34
|
+
state.lastUpdated = Date.now();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if a provider is currently rate-limited.
|
|
38
|
+
*/
|
|
39
|
+
isRateLimited(provider) {
|
|
40
|
+
const state = this.state.get(provider);
|
|
41
|
+
if (!state)
|
|
42
|
+
return false;
|
|
43
|
+
// Check remaining count
|
|
44
|
+
if (state.remaining === 0 && state.resetAt) {
|
|
45
|
+
return Date.now() < state.resetAt;
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get ms until rate limit resets for a provider.
|
|
51
|
+
*/
|
|
52
|
+
getWaitTime(provider) {
|
|
53
|
+
const state = this.state.get(provider);
|
|
54
|
+
if (!state?.resetAt)
|
|
55
|
+
return 0;
|
|
56
|
+
const wait = state.resetAt - Date.now();
|
|
57
|
+
return Math.max(0, wait);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get state for a provider.
|
|
61
|
+
*/
|
|
62
|
+
getState(provider) {
|
|
63
|
+
return this.state.get(provider);
|
|
64
|
+
}
|
|
65
|
+
getOrCreate(provider) {
|
|
66
|
+
let state = this.state.get(provider);
|
|
67
|
+
if (!state) {
|
|
68
|
+
state = {
|
|
69
|
+
provider,
|
|
70
|
+
remaining: null,
|
|
71
|
+
resetAt: null,
|
|
72
|
+
retryAfter: null,
|
|
73
|
+
lastUpdated: Date.now(),
|
|
74
|
+
};
|
|
75
|
+
this.state.set(provider, state);
|
|
76
|
+
}
|
|
77
|
+
return state;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAuCD,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAClC,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { AnyModelError } from '../types.js';
|
|
2
|
+
const DEFAULT_RETRY = {
|
|
3
|
+
maxRetries: 2,
|
|
4
|
+
baseDelay: 500,
|
|
5
|
+
maxDelay: 10000,
|
|
6
|
+
};
|
|
7
|
+
// Retryable status codes
|
|
8
|
+
const RETRYABLE_CODES = new Set([429, 502, 503, 529]);
|
|
9
|
+
function isRetryable(error) {
|
|
10
|
+
if (error instanceof AnyModelError) {
|
|
11
|
+
return RETRYABLE_CODES.has(error.code);
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
function getRetryAfter(error) {
|
|
16
|
+
if (error instanceof AnyModelError && error.metadata.raw) {
|
|
17
|
+
const raw = error.metadata.raw;
|
|
18
|
+
// Check for retry-after header value stored in metadata
|
|
19
|
+
if (raw?.retry_after)
|
|
20
|
+
return Number(raw.retry_after) * 1000;
|
|
21
|
+
if (raw?.headers?.['retry-after'])
|
|
22
|
+
return Number(raw.headers['retry-after']) * 1000;
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
function computeDelay(attempt, options, error) {
|
|
27
|
+
const retryAfter = getRetryAfter(error);
|
|
28
|
+
if (retryAfter && retryAfter > 0) {
|
|
29
|
+
return Math.min(retryAfter, options.maxDelay);
|
|
30
|
+
}
|
|
31
|
+
// Exponential backoff with jitter
|
|
32
|
+
const exponential = options.baseDelay * Math.pow(2, attempt);
|
|
33
|
+
const jitter = exponential * 0.2 * Math.random();
|
|
34
|
+
return Math.min(exponential + jitter, options.maxDelay);
|
|
35
|
+
}
|
|
36
|
+
export async function withRetry(fn, options = {}) {
|
|
37
|
+
const opts = { ...DEFAULT_RETRY, ...options };
|
|
38
|
+
let lastError;
|
|
39
|
+
for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
|
|
40
|
+
try {
|
|
41
|
+
return await fn();
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
lastError = error;
|
|
45
|
+
if (attempt >= opts.maxRetries || !isRetryable(error)) {
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
const delay = computeDelay(attempt, opts, error);
|
|
49
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
throw lastError;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQ5C,MAAM,aAAa,GAAiB;IAClC,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,GAAG;IACd,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF,yBAAyB;AACzB,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAEtD,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;QACnC,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,YAAY,aAAa,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAU,CAAC;QACtC,wDAAwD;QACxD,IAAI,GAAG,EAAE,WAAW;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;QAC5D,IAAI,GAAG,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC;IACtF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,OAAe,EAAE,OAAqB,EAAE,KAAc;IAC1E,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,UAAU,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IACD,kCAAkC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACjD,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,UAAiC,EAAE;IAEnC,MAAM,IAAI,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAC9C,IAAI,SAAkB,CAAC;IAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAElB,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtD,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Message } from '../types.js';
|
|
2
|
+
export declare function middleOut(messages: Message[], maxTokens: number): Message[];
|
|
3
|
+
/**
|
|
4
|
+
* Apply a named transform to the request messages.
|
|
5
|
+
*/
|
|
6
|
+
export declare function applyTransform(name: string, messages: Message[], contextLength: number): Message[];
|
|
7
|
+
//# sourceMappingURL=transforms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transforms.d.ts","sourceRoot":"","sources":["../../src/utils/transforms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAW3C,wBAAgB,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAoD3E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,aAAa,EAAE,MAAM,GACpB,OAAO,EAAE,CAKX"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middle-out transform: when messages exceed a token budget,
|
|
3
|
+
* remove messages from the middle of the conversation, preserving
|
|
4
|
+
* the system prompt (first) and most recent messages (last).
|
|
5
|
+
*
|
|
6
|
+
* This is a character-based approximation (4 chars ≈ 1 token).
|
|
7
|
+
*/
|
|
8
|
+
const CHARS_PER_TOKEN = 4;
|
|
9
|
+
export function middleOut(messages, maxTokens) {
|
|
10
|
+
if (messages.length <= 2)
|
|
11
|
+
return messages;
|
|
12
|
+
const maxChars = maxTokens * CHARS_PER_TOKEN;
|
|
13
|
+
// Calculate total content length
|
|
14
|
+
function messageLength(msg) {
|
|
15
|
+
const content = typeof msg.content === 'string'
|
|
16
|
+
? msg.content
|
|
17
|
+
: JSON.stringify(msg.content);
|
|
18
|
+
return content.length + 20; // overhead for role, etc.
|
|
19
|
+
}
|
|
20
|
+
const totalChars = messages.reduce((sum, m) => sum + messageLength(m), 0);
|
|
21
|
+
if (totalChars <= maxChars)
|
|
22
|
+
return messages;
|
|
23
|
+
// Separate system messages from conversation
|
|
24
|
+
const systemMessages = messages.filter(m => m.role === 'system');
|
|
25
|
+
const conversationMessages = messages.filter(m => m.role !== 'system');
|
|
26
|
+
if (conversationMessages.length <= 2)
|
|
27
|
+
return messages;
|
|
28
|
+
const systemChars = systemMessages.reduce((sum, m) => sum + messageLength(m), 0);
|
|
29
|
+
const budgetForConversation = maxChars - systemChars;
|
|
30
|
+
if (budgetForConversation <= 0)
|
|
31
|
+
return [...systemMessages, conversationMessages[conversationMessages.length - 1]];
|
|
32
|
+
// Keep messages from both ends, removing from the middle
|
|
33
|
+
const kept = [];
|
|
34
|
+
let usedChars = 0;
|
|
35
|
+
// Always keep the last few messages (recency is most important)
|
|
36
|
+
const tail = [];
|
|
37
|
+
let tailChars = 0;
|
|
38
|
+
for (let i = conversationMessages.length - 1; i >= 0; i--) {
|
|
39
|
+
const len = messageLength(conversationMessages[i]);
|
|
40
|
+
if (tailChars + len > budgetForConversation * 0.7)
|
|
41
|
+
break;
|
|
42
|
+
tail.unshift(conversationMessages[i]);
|
|
43
|
+
tailChars += len;
|
|
44
|
+
}
|
|
45
|
+
// Fill from the head with remaining budget
|
|
46
|
+
const headBudget = budgetForConversation - tailChars;
|
|
47
|
+
const headEnd = conversationMessages.length - tail.length;
|
|
48
|
+
for (let i = 0; i < headEnd; i++) {
|
|
49
|
+
const len = messageLength(conversationMessages[i]);
|
|
50
|
+
if (usedChars + len > headBudget)
|
|
51
|
+
break;
|
|
52
|
+
kept.push(conversationMessages[i]);
|
|
53
|
+
usedChars += len;
|
|
54
|
+
}
|
|
55
|
+
return [...systemMessages, ...kept, ...tail];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Apply a named transform to the request messages.
|
|
59
|
+
*/
|
|
60
|
+
export function applyTransform(name, messages, contextLength) {
|
|
61
|
+
if (name === 'middle-out') {
|
|
62
|
+
return middleOut(messages, contextLength);
|
|
63
|
+
}
|
|
64
|
+
return messages;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=transforms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transforms.js","sourceRoot":"","sources":["../../src/utils/transforms.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,UAAU,SAAS,CAAC,QAAmB,EAAE,SAAiB;IAC9D,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE1C,MAAM,QAAQ,GAAG,SAAS,GAAG,eAAe,CAAC;IAE7C,iCAAiC;IACjC,SAAS,aAAa,CAAC,GAAY;QACjC,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;YAC7C,CAAC,CAAC,GAAG,CAAC,OAAO;YACb,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,0BAA0B;IACxD,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,IAAI,UAAU,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE5C,6CAA6C;IAC7C,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACjE,MAAM,oBAAoB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAEvE,IAAI,oBAAoB,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEtD,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,MAAM,qBAAqB,GAAG,QAAQ,GAAG,WAAW,CAAC;IAErD,IAAI,qBAAqB,IAAI,CAAC;QAAE,OAAO,CAAC,GAAG,cAAc,EAAE,oBAAoB,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAElH,yDAAyD;IACzD,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,gEAAgE;IAChE,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1D,MAAM,GAAG,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,SAAS,GAAG,GAAG,GAAG,qBAAqB,GAAG,GAAG;YAAE,MAAM;QACzD,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,SAAS,IAAI,GAAG,CAAC;IACnB,CAAC;IAED,2CAA2C;IAC3C,MAAM,UAAU,GAAG,qBAAqB,GAAG,SAAS,CAAC;IACrD,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,SAAS,GAAG,GAAG,GAAG,UAAU;YAAE,MAAM;QACxC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,SAAS,IAAI,GAAG,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,GAAG,cAAc,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,QAAmB,EACnB,aAAqB;IAErB,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,wBAAgB,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAmCpE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { AnyModelError } from '../types.js';
|
|
2
|
+
export function validateRequest(request) {
|
|
3
|
+
if (!request.model && !request.models?.length) {
|
|
4
|
+
throw new AnyModelError(400, 'Missing required field: model');
|
|
5
|
+
}
|
|
6
|
+
if (!request.messages || !Array.isArray(request.messages) || request.messages.length === 0) {
|
|
7
|
+
throw new AnyModelError(400, 'Missing or empty required field: messages');
|
|
8
|
+
}
|
|
9
|
+
if (request.temperature !== undefined && (request.temperature < 0 || request.temperature > 2)) {
|
|
10
|
+
throw new AnyModelError(400, 'temperature must be between 0.0 and 2.0');
|
|
11
|
+
}
|
|
12
|
+
if (request.top_p !== undefined && (request.top_p < 0 || request.top_p > 1)) {
|
|
13
|
+
throw new AnyModelError(400, 'top_p must be between 0.0 and 1.0');
|
|
14
|
+
}
|
|
15
|
+
if (request.top_logprobs !== undefined && !request.logprobs) {
|
|
16
|
+
throw new AnyModelError(400, 'top_logprobs requires logprobs: true');
|
|
17
|
+
}
|
|
18
|
+
if (request.top_logprobs !== undefined && (request.top_logprobs < 0 || request.top_logprobs > 20)) {
|
|
19
|
+
throw new AnyModelError(400, 'top_logprobs must be between 0 and 20');
|
|
20
|
+
}
|
|
21
|
+
if (request.stop !== undefined) {
|
|
22
|
+
const stops = Array.isArray(request.stop) ? request.stop : [request.stop];
|
|
23
|
+
if (stops.length > 4) {
|
|
24
|
+
throw new AnyModelError(400, 'stop may have at most 4 sequences');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (request.models && request.models.length > 0 && request.route && request.route !== 'fallback') {
|
|
28
|
+
throw new AnyModelError(400, `Invalid route: '${request.route}'. Only 'fallback' is supported.`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/utils/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,UAAU,eAAe,CAAC,OAA8B;IAC5D,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAC9C,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,+BAA+B,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,2CAA2C,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;QAC9F,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,yCAAyC,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,mCAAmC,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5D,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,sCAAsC,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,IAAI,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC;QAClG,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,uCAAuC,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,mCAAmC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACjG,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE,mBAAmB,OAAO,CAAC,KAAK,kCAAkC,CAAC,CAAC;IACnG,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@probeo/anymodel",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "OpenRouter-compatible LLM router with unified batch support. Self-hosted, zero fees.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -53,5 +53,8 @@
|
|
|
53
53
|
"tsup": "^8.0.0",
|
|
54
54
|
"typescript": "^5.4.0",
|
|
55
55
|
"vitest": "^3.0.0"
|
|
56
|
+
},
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"p-queue": "^9.1.0"
|
|
56
59
|
}
|
|
57
60
|
}
|