@vinhnt-sdk/llm 0.1.3
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/LICENSE +21 -0
- package/dist/adapter.d.ts +172 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +62 -0
- package/dist/adapter.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/model-caller.d.ts +83 -0
- package/dist/model-caller.d.ts.map +1 -0
- package/dist/model-caller.js +276 -0
- package/dist/model-caller.js.map +1 -0
- package/dist/registry.d.ts +84 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +143 -0
- package/dist/registry.js.map +1 -0
- package/dist/retry.d.ts +47 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +91 -0
- package/dist/retry.js.map +1 -0
- package/dist/token-meter.d.ts +67 -0
- package/dist/token-meter.d.ts.map +1 -0
- package/dist/token-meter.js +92 -0
- package/dist/token-meter.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-caller.js","sourceRoot":"","sources":["../src/model-caller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Adapter Registry — register, resolve, and swap providers.
|
|
3
|
+
*
|
|
4
|
+
* Providers register via `registerAdapter(providerNames, adapter)`.
|
|
5
|
+
* The registry validates all-or-nothing registration, prevents duplicates,
|
|
6
|
+
* and supports atomic swap for hot-reload.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { LlmRegistry } from "@vinhnt-sdk/llm";
|
|
11
|
+
*
|
|
12
|
+
* const registry = new LlmRegistry();
|
|
13
|
+
* registry.registerAdapter(["deepseek"], new DeepSeekAdapter());
|
|
14
|
+
* registry.registerAdapter(["openai", "azure"], new OpenAIAdapter());
|
|
15
|
+
*
|
|
16
|
+
* // Resolve by provider name
|
|
17
|
+
* const adapter = registry.getAdapter("deepseek");
|
|
18
|
+
*
|
|
19
|
+
* // Atomic swap (all-or-nothing)
|
|
20
|
+
* registry.registerAdapter(["deepseek"], new DeepSeekV2Adapter());
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import type { LlmAdapter, ProviderInfo, RetryPolicy } from "./adapter.js";
|
|
24
|
+
/** Handle returned by registerAdapter — controls the registration lifetime. */
|
|
25
|
+
export interface AdapterRegistrationHandle {
|
|
26
|
+
/** Release all routes registered by this call. */
|
|
27
|
+
dispose(): void;
|
|
28
|
+
/** Atomically replace the provider routes with a new adapter. */
|
|
29
|
+
replace(adapter: LlmAdapter): void;
|
|
30
|
+
}
|
|
31
|
+
/** Error thrown when adapter registration fails. */
|
|
32
|
+
export declare class AdapterRegistrationError extends Error {
|
|
33
|
+
readonly code: "DUPLICATE_ADAPTER" | "EMPTY_PROVIDERS" | "CONFLICT";
|
|
34
|
+
constructor(message: string, code: "DUPLICATE_ADAPTER" | "EMPTY_PROVIDERS" | "CONFLICT");
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Registry for LLM adapters — manages provider → adapter mapping.
|
|
38
|
+
*
|
|
39
|
+
* Registration rules:
|
|
40
|
+
* - All-or-nothing: if any provider name conflicts, nothing registers
|
|
41
|
+
* - One adapter per provider route
|
|
42
|
+
* - Non-empty provider names required
|
|
43
|
+
* - Atomic swap: replace() validates the full candidate set before mutating
|
|
44
|
+
*/
|
|
45
|
+
export declare class LlmRegistry {
|
|
46
|
+
/** provider name → { adapter, owner } */
|
|
47
|
+
private readonly adapters;
|
|
48
|
+
/** owner symbol → provider names (for dispose) */
|
|
49
|
+
private readonly owners;
|
|
50
|
+
/**
|
|
51
|
+
* Register an adapter for one or more provider names.
|
|
52
|
+
*
|
|
53
|
+
* @param providerNames - Provider names this adapter handles (e.g., `["openai", "azure"]`)
|
|
54
|
+
* @param adapter - The adapter implementation
|
|
55
|
+
* @returns A handle to control the registration lifetime
|
|
56
|
+
* @throws AdapterRegistrationError if any provider name conflicts
|
|
57
|
+
*/
|
|
58
|
+
registerAdapter(providerNames: readonly string[], adapter: LlmAdapter): AdapterRegistrationHandle;
|
|
59
|
+
/**
|
|
60
|
+
* Get an adapter by provider name.
|
|
61
|
+
* @returns The adapter, or undefined if not registered.
|
|
62
|
+
*/
|
|
63
|
+
getAdapter(provider: string): LlmAdapter | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Check if a provider is registered.
|
|
66
|
+
*/
|
|
67
|
+
hasProvider(provider: string): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Get metadata about all registered providers.
|
|
70
|
+
*/
|
|
71
|
+
listProviders(): readonly (ProviderInfo & {
|
|
72
|
+
readonly routes: readonly string[];
|
|
73
|
+
})[];
|
|
74
|
+
/**
|
|
75
|
+
* Get the retry policy for a provider.
|
|
76
|
+
* Falls back to the adapter's policy, then to the default.
|
|
77
|
+
*/
|
|
78
|
+
getRetryPolicy(provider: string): RetryPolicy | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* Clear all registrations.
|
|
81
|
+
*/
|
|
82
|
+
clear(): void;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAI1E,+EAA+E;AAC/E,MAAM,WAAW,yBAAyB;IACxC,kDAAkD;IAClD,OAAO,IAAI,IAAI,CAAC;IAChB,iEAAiE;IACjE,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;CACpC;AAID,oDAAoD;AACpD,qBAAa,wBAAyB,SAAQ,KAAK;aAG/B,IAAI,EAAE,mBAAmB,GAAG,iBAAiB,GAAG,UAAU;gBAD1E,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,mBAAmB,GAAG,iBAAiB,GAAG,UAAU;CAK7E;AAID;;;;;;;;GAQG;AACH,qBAAa,WAAW;IACtB,yCAAyC;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6D;IACtF,kDAAkD;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IAEtD;;;;;;;OAOG;IACH,eAAe,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,UAAU,GAAG,yBAAyB;IA2CjG;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIpD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACH,aAAa,IAAI,SAAS,CAAC,YAAY,GAAG;QAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC,EAAE;IAkBnF;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAKzD;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Adapter Registry — register, resolve, and swap providers.
|
|
3
|
+
*
|
|
4
|
+
* Providers register via `registerAdapter(providerNames, adapter)`.
|
|
5
|
+
* The registry validates all-or-nothing registration, prevents duplicates,
|
|
6
|
+
* and supports atomic swap for hot-reload.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { LlmRegistry } from "@vinhnt-sdk/llm";
|
|
11
|
+
*
|
|
12
|
+
* const registry = new LlmRegistry();
|
|
13
|
+
* registry.registerAdapter(["deepseek"], new DeepSeekAdapter());
|
|
14
|
+
* registry.registerAdapter(["openai", "azure"], new OpenAIAdapter());
|
|
15
|
+
*
|
|
16
|
+
* // Resolve by provider name
|
|
17
|
+
* const adapter = registry.getAdapter("deepseek");
|
|
18
|
+
*
|
|
19
|
+
* // Atomic swap (all-or-nothing)
|
|
20
|
+
* registry.registerAdapter(["deepseek"], new DeepSeekV2Adapter());
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
// ── Registration Errors ──
|
|
24
|
+
/** Error thrown when adapter registration fails. */
|
|
25
|
+
export class AdapterRegistrationError extends Error {
|
|
26
|
+
code;
|
|
27
|
+
constructor(message, code) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.code = code;
|
|
30
|
+
this.name = "AdapterRegistrationError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// ── Registry ──
|
|
34
|
+
/**
|
|
35
|
+
* Registry for LLM adapters — manages provider → adapter mapping.
|
|
36
|
+
*
|
|
37
|
+
* Registration rules:
|
|
38
|
+
* - All-or-nothing: if any provider name conflicts, nothing registers
|
|
39
|
+
* - One adapter per provider route
|
|
40
|
+
* - Non-empty provider names required
|
|
41
|
+
* - Atomic swap: replace() validates the full candidate set before mutating
|
|
42
|
+
*/
|
|
43
|
+
export class LlmRegistry {
|
|
44
|
+
/** provider name → { adapter, owner } */
|
|
45
|
+
adapters = new Map();
|
|
46
|
+
/** owner symbol → provider names (for dispose) */
|
|
47
|
+
owners = new Map();
|
|
48
|
+
/**
|
|
49
|
+
* Register an adapter for one or more provider names.
|
|
50
|
+
*
|
|
51
|
+
* @param providerNames - Provider names this adapter handles (e.g., `["openai", "azure"]`)
|
|
52
|
+
* @param adapter - The adapter implementation
|
|
53
|
+
* @returns A handle to control the registration lifetime
|
|
54
|
+
* @throws AdapterRegistrationError if any provider name conflicts
|
|
55
|
+
*/
|
|
56
|
+
registerAdapter(providerNames, adapter) {
|
|
57
|
+
if (providerNames.length === 0) {
|
|
58
|
+
throw new AdapterRegistrationError("At least one provider name is required", "EMPTY_PROVIDERS");
|
|
59
|
+
}
|
|
60
|
+
// Validate no conflicts
|
|
61
|
+
for (const name of providerNames) {
|
|
62
|
+
if (this.adapters.has(name)) {
|
|
63
|
+
const existing = this.adapters.get(name);
|
|
64
|
+
throw new AdapterRegistrationError(`Provider "${name}" is already registered by another adapter`, "DUPLICATE_ADAPTER");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Register
|
|
68
|
+
const owner = Symbol(`adapter:${providerNames.join(",")}`);
|
|
69
|
+
for (const name of providerNames) {
|
|
70
|
+
this.adapters.set(name, { adapter, owner });
|
|
71
|
+
}
|
|
72
|
+
this.owners.set(owner, [...providerNames]);
|
|
73
|
+
return {
|
|
74
|
+
dispose: () => {
|
|
75
|
+
const routes = this.owners.get(owner);
|
|
76
|
+
if (routes) {
|
|
77
|
+
for (const name of routes) {
|
|
78
|
+
this.adapters.delete(name);
|
|
79
|
+
}
|
|
80
|
+
this.owners.delete(owner);
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
replace: (newAdapter) => {
|
|
84
|
+
const routes = this.owners.get(owner);
|
|
85
|
+
if (!routes)
|
|
86
|
+
return;
|
|
87
|
+
for (const name of routes) {
|
|
88
|
+
this.adapters.set(name, { adapter: newAdapter, owner });
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get an adapter by provider name.
|
|
95
|
+
* @returns The adapter, or undefined if not registered.
|
|
96
|
+
*/
|
|
97
|
+
getAdapter(provider) {
|
|
98
|
+
return this.adapters.get(provider)?.adapter;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Check if a provider is registered.
|
|
102
|
+
*/
|
|
103
|
+
hasProvider(provider) {
|
|
104
|
+
return this.adapters.has(provider);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get metadata about all registered providers.
|
|
108
|
+
*/
|
|
109
|
+
listProviders() {
|
|
110
|
+
const seen = new Map();
|
|
111
|
+
for (const [name, { adapter }] of this.adapters) {
|
|
112
|
+
const existing = seen.get(adapter);
|
|
113
|
+
if (existing) {
|
|
114
|
+
existing.push(name);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
seen.set(adapter, [name]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const result = [];
|
|
121
|
+
for (const [adapter, routes] of seen) {
|
|
122
|
+
const info = adapter.providerInfo(routes[0]);
|
|
123
|
+
result.push({ ...info, routes });
|
|
124
|
+
}
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get the retry policy for a provider.
|
|
129
|
+
* Falls back to the adapter's policy, then to the default.
|
|
130
|
+
*/
|
|
131
|
+
getRetryPolicy(provider) {
|
|
132
|
+
const adapter = this.getAdapter(provider);
|
|
133
|
+
return adapter?.providerRetryPolicy(provider);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Clear all registrations.
|
|
137
|
+
*/
|
|
138
|
+
clear() {
|
|
139
|
+
this.adapters.clear();
|
|
140
|
+
this.owners.clear();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/retry.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Retry — provider-scoped retry with exponential backoff.
|
|
3
|
+
*
|
|
4
|
+
* Retry is a separate concern from the adapter. Each adapter captures
|
|
5
|
+
* its retry policy at registration. The retry plugin executes it at
|
|
6
|
+
* durable boundaries (agent step level, not inside the adapter call).
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { shouldRetry, calculateDelay } from "@vinhnt-sdk/llm";
|
|
11
|
+
*
|
|
12
|
+
* if (shouldRetry(error, policy, attempt)) {
|
|
13
|
+
* const delay = calculateDelay(attempt, policy, retryAfterHeader);
|
|
14
|
+
* await sleep(delay, signal);
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
import type { RetryPolicy } from "./adapter.js";
|
|
19
|
+
/**
|
|
20
|
+
* Determine whether a failure should be retried.
|
|
21
|
+
*
|
|
22
|
+
* @param error - The error that occurred
|
|
23
|
+
* @param policy - The provider's retry policy
|
|
24
|
+
* @param attempt - Current attempt number (0-based)
|
|
25
|
+
* @returns Whether to retry
|
|
26
|
+
*/
|
|
27
|
+
export declare function shouldRetry(error: {
|
|
28
|
+
readonly retryable?: boolean;
|
|
29
|
+
readonly statusCode?: number;
|
|
30
|
+
}, policy: RetryPolicy | undefined, attempt: number): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Calculate retry delay with exponential backoff + jitter.
|
|
33
|
+
*
|
|
34
|
+
* @param attempt - Current attempt number (0-based)
|
|
35
|
+
* @param policy - The provider's retry policy
|
|
36
|
+
* @param retryAfterMs - Optional Retry-After header value in ms
|
|
37
|
+
* @returns Delay in ms before the next attempt
|
|
38
|
+
*/
|
|
39
|
+
export declare function calculateDelay(attempt: number, policy: RetryPolicy | undefined, retryAfterMs?: number): number;
|
|
40
|
+
/**
|
|
41
|
+
* Sleep for a given duration, abortable via signal.
|
|
42
|
+
*
|
|
43
|
+
* @param ms - Duration in milliseconds
|
|
44
|
+
* @param signal - Optional abort signal
|
|
45
|
+
*/
|
|
46
|
+
export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
|
|
47
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAUhD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EACrE,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,GACd,OAAO,CAcT;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAaR;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrE"}
|
package/dist/retry.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Retry — provider-scoped retry with exponential backoff.
|
|
3
|
+
*
|
|
4
|
+
* Retry is a separate concern from the adapter. Each adapter captures
|
|
5
|
+
* its retry policy at registration. The retry plugin executes it at
|
|
6
|
+
* durable boundaries (agent step level, not inside the adapter call).
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { shouldRetry, calculateDelay } from "@vinhnt-sdk/llm";
|
|
11
|
+
*
|
|
12
|
+
* if (shouldRetry(error, policy, attempt)) {
|
|
13
|
+
* const delay = calculateDelay(attempt, policy, retryAfterHeader);
|
|
14
|
+
* await sleep(delay, signal);
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
/** Default retry configuration. */
|
|
19
|
+
const DEFAULT_MAX_RETRIES = 2;
|
|
20
|
+
const DEFAULT_BASE_DELAY_MS = 1000;
|
|
21
|
+
const DEFAULT_MAX_DELAY_MS = 30_000;
|
|
22
|
+
/** Default set of retryable HTTP status codes. */
|
|
23
|
+
const DEFAULT_RETRYABLE_STATUSES = new Set([408, 429, 500, 502, 503, 504]);
|
|
24
|
+
/**
|
|
25
|
+
* Determine whether a failure should be retried.
|
|
26
|
+
*
|
|
27
|
+
* @param error - The error that occurred
|
|
28
|
+
* @param policy - The provider's retry policy
|
|
29
|
+
* @param attempt - Current attempt number (0-based)
|
|
30
|
+
* @returns Whether to retry
|
|
31
|
+
*/
|
|
32
|
+
export function shouldRetry(error, policy, attempt) {
|
|
33
|
+
const maxRetries = policy?.maxRetries ?? DEFAULT_MAX_RETRIES;
|
|
34
|
+
if (attempt >= maxRetries)
|
|
35
|
+
return false;
|
|
36
|
+
// If error explicitly says not retryable, don't retry
|
|
37
|
+
if (error.retryable === false)
|
|
38
|
+
return false;
|
|
39
|
+
// Check status code
|
|
40
|
+
if (error.statusCode !== undefined) {
|
|
41
|
+
const retryableStatuses = policy?.retryableStatuses ?? [...DEFAULT_RETRYABLE_STATUSES];
|
|
42
|
+
if (!retryableStatuses.includes(error.statusCode))
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Calculate retry delay with exponential backoff + jitter.
|
|
49
|
+
*
|
|
50
|
+
* @param attempt - Current attempt number (0-based)
|
|
51
|
+
* @param policy - The provider's retry policy
|
|
52
|
+
* @param retryAfterMs - Optional Retry-After header value in ms
|
|
53
|
+
* @returns Delay in ms before the next attempt
|
|
54
|
+
*/
|
|
55
|
+
export function calculateDelay(attempt, policy, retryAfterMs) {
|
|
56
|
+
const baseDelay = policy?.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;
|
|
57
|
+
const maxDelay = policy?.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;
|
|
58
|
+
// Use Retry-After if provided
|
|
59
|
+
if (retryAfterMs !== undefined && retryAfterMs > 0) {
|
|
60
|
+
return Math.min(retryAfterMs, maxDelay);
|
|
61
|
+
}
|
|
62
|
+
// Exponential backoff with jitter
|
|
63
|
+
const exponentialDelay = baseDelay * Math.pow(2, attempt);
|
|
64
|
+
const jitter = exponentialDelay * 0.2 * Math.random();
|
|
65
|
+
return Math.min(exponentialDelay + jitter, maxDelay);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Sleep for a given duration, abortable via signal.
|
|
69
|
+
*
|
|
70
|
+
* @param ms - Duration in milliseconds
|
|
71
|
+
* @param signal - Optional abort signal
|
|
72
|
+
*/
|
|
73
|
+
export function sleep(ms, signal) {
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
if (signal?.aborted) {
|
|
76
|
+
reject(new DOMException("Aborted", "AbortError"));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const timer = setTimeout(resolve, ms);
|
|
80
|
+
const onAbort = () => {
|
|
81
|
+
clearTimeout(timer);
|
|
82
|
+
reject(new DOMException("Aborted", "AbortError"));
|
|
83
|
+
};
|
|
84
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
85
|
+
// Cleanup: if the timer fires first, remove the abort listener
|
|
86
|
+
void Promise.resolve().then(() => {
|
|
87
|
+
signal?.removeEventListener("abort", onAbort);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,mCAAmC;AACnC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAC9B,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAEpC,kDAAkD;AAClD,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAE3E;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CACzB,KAAqE,EACrE,MAA+B,EAC/B,OAAe;IAEf,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,mBAAmB,CAAC;IAC7D,IAAI,OAAO,IAAI,UAAU;QAAE,OAAO,KAAK,CAAC;IAExC,sDAAsD;IACtD,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAE5C,oBAAoB;IACpB,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,iBAAiB,GAAG,MAAM,EAAE,iBAAiB,IAAI,CAAC,GAAG,0BAA0B,CAAC,CAAC;QACvF,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;IAClE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,MAA+B,EAC/B,YAAqB;IAErB,MAAM,SAAS,GAAG,MAAM,EAAE,WAAW,IAAI,qBAAqB,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,EAAE,UAAU,IAAI,oBAAoB,CAAC;IAE5D,8BAA8B;IAC9B,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,kCAAkC;IAClC,MAAM,gBAAgB,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,gBAAgB,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACtD,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,EAAE,QAAQ,CAAC,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,MAAoB;IACpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC;QAEF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,+DAA+D;QAC/D,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC/B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Metering — estimate and track token usage.
|
|
3
|
+
*
|
|
4
|
+
* Provides heuristic token estimation and replay-aware measurement
|
|
5
|
+
* for tracking context pressure and usage across sessions.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { TokenMeter } from "@vinhnt-sdk/llm";
|
|
10
|
+
*
|
|
11
|
+
* const meter = new TokenMeter();
|
|
12
|
+
* const tokens = meter.estimateMessage({ role: "user", content: "Hello world" });
|
|
13
|
+
* // tokens ≈ 4 (2 words + overhead)
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
import type { ModelUsage } from "@vinhnt-sdk/schema";
|
|
17
|
+
/**
|
|
18
|
+
* Token meter — estimates token counts heuristically.
|
|
19
|
+
*
|
|
20
|
+
* Provider-specific tokenizers would be more accurate but would
|
|
21
|
+
* couple the meter to a specific provider. The heuristic is
|
|
22
|
+
* intentionally approximate for budget estimation.
|
|
23
|
+
*/
|
|
24
|
+
export declare class TokenMeter {
|
|
25
|
+
/**
|
|
26
|
+
* Heuristically estimate the token count for a message.
|
|
27
|
+
*
|
|
28
|
+
* @param message - The message to estimate
|
|
29
|
+
* @returns Estimated token count
|
|
30
|
+
*/
|
|
31
|
+
estimateMessage(message: {
|
|
32
|
+
readonly role: string;
|
|
33
|
+
readonly content: string | readonly unknown[];
|
|
34
|
+
}): number;
|
|
35
|
+
/**
|
|
36
|
+
* Estimate the token count for a full request.
|
|
37
|
+
*
|
|
38
|
+
* @param messages - The conversation messages
|
|
39
|
+
* @param tools - Optional tool definitions
|
|
40
|
+
* @returns Estimated total tokens
|
|
41
|
+
*/
|
|
42
|
+
estimateRequest(messages: readonly {
|
|
43
|
+
readonly role: string;
|
|
44
|
+
readonly content: string | readonly unknown[];
|
|
45
|
+
}[], tools?: readonly unknown[]): number;
|
|
46
|
+
/**
|
|
47
|
+
* Estimate tokens for a text string.
|
|
48
|
+
*/
|
|
49
|
+
estimateText(text: string): number;
|
|
50
|
+
/**
|
|
51
|
+
* Measure context pressure — how much of the context window is used.
|
|
52
|
+
*
|
|
53
|
+
* @param usage - The token usage from a model response
|
|
54
|
+
* @param contextLimit - The model's context window
|
|
55
|
+
* @returns Pressure ratio (0-1, where 1 = fully used)
|
|
56
|
+
*/
|
|
57
|
+
measurePressure(usage: ModelUsage, contextLimit: number): number;
|
|
58
|
+
/**
|
|
59
|
+
* Project next request token estimate based on current usage.
|
|
60
|
+
*
|
|
61
|
+
* @param currentUsage - Current request usage
|
|
62
|
+
* @param messageGrowth - Expected message growth (default: 0.1 = 10%)
|
|
63
|
+
* @returns Projected input tokens for next request
|
|
64
|
+
*/
|
|
65
|
+
projectNextRequest(currentUsage: ModelUsage, messageGrowth?: number): number;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=token-meter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-meter.d.ts","sourceRoot":"","sources":["../src/token-meter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAWrD;;;;;;GAMG;AACH,qBAAa,UAAU;IACrB;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,CAAA;KAAE,GAAG,MAAM;IAS1G;;;;;;OAMG;IACH,eAAe,CACb,QAAQ,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,CAAA;KAAE,EAAE,EAC7F,KAAK,CAAC,EAAE,SAAS,OAAO,EAAE,GACzB,MAAM;IAcT;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAIlC;;;;;;OAMG;IACH,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IAKhE;;;;;;OAMG;IACH,kBAAkB,CAAC,YAAY,EAAE,UAAU,EAAE,aAAa,SAAM,GAAG,MAAM;CAI1E"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Metering — estimate and track token usage.
|
|
3
|
+
*
|
|
4
|
+
* Provides heuristic token estimation and replay-aware measurement
|
|
5
|
+
* for tracking context pressure and usage across sessions.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { TokenMeter } from "@vinhnt-sdk/llm";
|
|
10
|
+
*
|
|
11
|
+
* const meter = new TokenMeter();
|
|
12
|
+
* const tokens = meter.estimateMessage({ role: "user", content: "Hello world" });
|
|
13
|
+
* // tokens ≈ 4 (2 words + overhead)
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
/** Fixed density: characters per token (heuristic). */
|
|
17
|
+
const CHARS_PER_TOKEN = 4;
|
|
18
|
+
/** Structural overhead per content block. */
|
|
19
|
+
const BLOCK_OVERHEAD = 4;
|
|
20
|
+
/** Structural overhead per message. */
|
|
21
|
+
const ROLE_OVERHEAD = 4;
|
|
22
|
+
/**
|
|
23
|
+
* Token meter — estimates token counts heuristically.
|
|
24
|
+
*
|
|
25
|
+
* Provider-specific tokenizers would be more accurate but would
|
|
26
|
+
* couple the meter to a specific provider. The heuristic is
|
|
27
|
+
* intentionally approximate for budget estimation.
|
|
28
|
+
*/
|
|
29
|
+
export class TokenMeter {
|
|
30
|
+
/**
|
|
31
|
+
* Heuristically estimate the token count for a message.
|
|
32
|
+
*
|
|
33
|
+
* @param message - The message to estimate
|
|
34
|
+
* @returns Estimated token count
|
|
35
|
+
*/
|
|
36
|
+
estimateMessage(message) {
|
|
37
|
+
const content = typeof message.content === "string"
|
|
38
|
+
? message.content
|
|
39
|
+
: JSON.stringify(message.content);
|
|
40
|
+
const contentTokens = Math.ceil(content.length / CHARS_PER_TOKEN);
|
|
41
|
+
return ROLE_OVERHEAD + contentTokens;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Estimate the token count for a full request.
|
|
45
|
+
*
|
|
46
|
+
* @param messages - The conversation messages
|
|
47
|
+
* @param tools - Optional tool definitions
|
|
48
|
+
* @returns Estimated total tokens
|
|
49
|
+
*/
|
|
50
|
+
estimateRequest(messages, tools) {
|
|
51
|
+
let total = 0;
|
|
52
|
+
for (const msg of messages) {
|
|
53
|
+
total += this.estimateMessage(msg);
|
|
54
|
+
}
|
|
55
|
+
if (tools) {
|
|
56
|
+
total += tools.length * BLOCK_OVERHEAD;
|
|
57
|
+
for (const tool of tools) {
|
|
58
|
+
total += Math.ceil(JSON.stringify(tool).length / CHARS_PER_TOKEN);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return total;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Estimate tokens for a text string.
|
|
65
|
+
*/
|
|
66
|
+
estimateText(text) {
|
|
67
|
+
return Math.ceil(text.length / CHARS_PER_TOKEN);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Measure context pressure — how much of the context window is used.
|
|
71
|
+
*
|
|
72
|
+
* @param usage - The token usage from a model response
|
|
73
|
+
* @param contextLimit - The model's context window
|
|
74
|
+
* @returns Pressure ratio (0-1, where 1 = fully used)
|
|
75
|
+
*/
|
|
76
|
+
measurePressure(usage, contextLimit) {
|
|
77
|
+
const input = usage.promptTokens ?? usage.inputTokens ?? 0;
|
|
78
|
+
return Math.min(1, input / contextLimit);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Project next request token estimate based on current usage.
|
|
82
|
+
*
|
|
83
|
+
* @param currentUsage - Current request usage
|
|
84
|
+
* @param messageGrowth - Expected message growth (default: 0.1 = 10%)
|
|
85
|
+
* @returns Projected input tokens for next request
|
|
86
|
+
*/
|
|
87
|
+
projectNextRequest(currentUsage, messageGrowth = 0.1) {
|
|
88
|
+
const current = currentUsage.promptTokens ?? currentUsage.inputTokens ?? 0;
|
|
89
|
+
return Math.ceil(current * (1 + messageGrowth));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=token-meter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-meter.js","sourceRoot":"","sources":["../src/token-meter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,uDAAuD;AACvD,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,6CAA6C;AAC7C,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,uCAAuC;AACvC,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB;;;;;;GAMG;AACH,MAAM,OAAO,UAAU;IACrB;;;;;OAKG;IACH,eAAe,CAAC,OAAiF;QAC/F,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;YACjD,CAAC,CAAC,OAAO,CAAC,OAAO;YACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEpC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;QAClE,OAAO,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED;;;;;;OAMG;IACH,eAAe,CACb,QAA6F,EAC7F,KAA0B;QAE1B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC;YACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;OAMG;IACH,eAAe,CAAC,KAAiB,EAAE,YAAoB;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;OAMG;IACH,kBAAkB,CAAC,YAAwB,EAAE,aAAa,GAAG,GAAG;QAC9D,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,IAAI,YAAY,CAAC,WAAW,IAAI,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IAClD,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vinhnt-sdk/llm",
|
|
3
|
+
"version": "0.1.3",
|
|
4
|
+
"description": "LLM capability seam — adapter abstraction, registry, retry, token metering",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./package.json": "./package.json"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"LICENSE",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=20"
|
|
24
|
+
},
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "https://github.com/vinhnt-develop/vinhnt-sdk.git",
|
|
28
|
+
"directory": "packages/llm"
|
|
29
|
+
},
|
|
30
|
+
"homepage": "https://github.com/vinhnt-develop/vinhnt-sdk/tree/main/packages/llm",
|
|
31
|
+
"bugs": {
|
|
32
|
+
"url": "https://github.com/vinhnt-develop/vinhnt-sdk/issues"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"vnt",
|
|
36
|
+
"llm",
|
|
37
|
+
"adapter",
|
|
38
|
+
"registry"
|
|
39
|
+
],
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@vinhnt-sdk/schema": "0.1.3",
|
|
45
|
+
"@vinhnt-sdk/config": "0.1.3",
|
|
46
|
+
"@vinhnt-sdk/tools": "0.1.3"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"typescript": "^5.8.0"
|
|
50
|
+
},
|
|
51
|
+
"license": "MIT",
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "tsc -b",
|
|
54
|
+
"typecheck": "tsc --noEmit",
|
|
55
|
+
"test": "vitest run",
|
|
56
|
+
"lint": "eslint .",
|
|
57
|
+
"clean": "node -e \"try{require('fs').rmSync('dist',{recursive:true,force:true})}catch(e){}\" && node -e \"try{require('fs').rmSync('tsconfig.tsbuildinfo',{force:true})}catch(e){}\""
|
|
58
|
+
}
|
|
59
|
+
}
|