@modelprofile.com/flexharness-models 9.1.0 → 9.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/dist_ts_models/index.d.ts +3 -2
- package/dist_ts_models/index.js +3 -2
- package/dist_ts_models/interfaces.d.ts +10 -6
- package/dist_ts_models/plugins.d.ts +8 -0
- package/dist_ts_models/plugins.js +10 -0
- package/dist_ts_models/smartai.cache.d.ts +3 -3
- package/dist_ts_models/smartai.cache.js +1 -1
- package/dist_ts_models/smartai.failures.d.ts +27 -0
- package/dist_ts_models/smartai.failures.js +80 -0
- package/dist_ts_models/smartai.limits.d.ts +3 -3
- package/dist_ts_models/smartai.limits.js +12 -3
- package/package.json +4 -3
- package/readme.md +14 -1
- package/ts_models/index.ts +3 -2
- package/ts_models/interfaces.ts +13 -6
- package/ts_models/plugins.ts +26 -0
- package/ts_models/readme.md +14 -1
- package/ts_models/smartai.cache.ts +16 -21
- package/ts_models/smartai.failures.ts +108 -0
- package/ts_models/smartai.limits.ts +17 -13
|
@@ -2,5 +2,6 @@ export * from './interfaces.js';
|
|
|
2
2
|
export * from './classes.modelregistry.js';
|
|
3
3
|
export * from './smartai.cache.js';
|
|
4
4
|
export * from './smartai.limits.js';
|
|
5
|
-
export
|
|
6
|
-
export
|
|
5
|
+
export * from './smartai.failures.js';
|
|
6
|
+
export { generateText, streamText, tool, jsonSchema } from './plugins.js';
|
|
7
|
+
export type { ModelMessage, ToolSet, StreamTextResult } from './plugins.js';
|
package/dist_ts_models/index.js
CHANGED
|
@@ -2,5 +2,6 @@ export * from './interfaces.js';
|
|
|
2
2
|
export * from './classes.modelregistry.js';
|
|
3
3
|
export * from './smartai.cache.js';
|
|
4
4
|
export * from './smartai.limits.js';
|
|
5
|
-
export
|
|
6
|
-
|
|
5
|
+
export * from './smartai.failures.js';
|
|
6
|
+
export { generateText, streamText, tool, jsonSchema } from './plugins.js';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19tb2RlbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUMifQ==
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import type * as plugins from './plugins.js';
|
|
2
2
|
export type TProvider = string;
|
|
3
|
-
export type TSmartAiLanguageModel = LanguageModelV3 | LanguageModelV4;
|
|
4
|
-
export type TSmartAiProviderOptions = Record<string, JSONObject>;
|
|
3
|
+
export type TSmartAiLanguageModel = plugins.LanguageModelV3 | plugins.LanguageModelV4;
|
|
4
|
+
export type TSmartAiProviderOptions = Record<string, plugins.JSONObject>;
|
|
5
5
|
export interface ISmartAiModelSetup {
|
|
6
6
|
model: TSmartAiLanguageModel;
|
|
7
7
|
providerOptions?: TSmartAiProviderOptions;
|
|
@@ -13,8 +13,12 @@ export interface ISmartAiOptions {
|
|
|
13
13
|
baseUrl?: string;
|
|
14
14
|
providerOptions?: TSmartAiProviderOptions;
|
|
15
15
|
}
|
|
16
|
-
|
|
16
|
+
/**
|
|
17
|
+
* A provider of language models. `TModel` states the model version its `getModel` returns, so a provider
|
|
18
|
+
* that always answers with a V4 model says so and its callers need no version check.
|
|
19
|
+
*/
|
|
20
|
+
export interface IModelProvider<TOptions extends ISmartAiOptions = ISmartAiOptions, TModel extends TSmartAiLanguageModel = TSmartAiLanguageModel> {
|
|
17
21
|
readonly id: string;
|
|
18
|
-
getModel(options: TOptions):
|
|
22
|
+
getModel(options: TOptions): TModel;
|
|
19
23
|
}
|
|
20
|
-
export type { JSONObject, LanguageModelV3, LanguageModelV3Prompt, LanguageModelV4, LanguageModelV4Prompt } from '
|
|
24
|
+
export type { JSONObject, LanguageModelV3, LanguageModelV3Prompt, LanguageModelV4, LanguageModelV4Prompt } from './plugins.js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { generateText, jsonSchema, RetryError, StreamProviderError, streamText, tool } from 'ai';
|
|
2
|
+
export { generateText, jsonSchema, RetryError, StreamProviderError, streamText, tool };
|
|
3
|
+
export type { ModelMessage, StreamTextResult, ToolSet } from 'ai';
|
|
4
|
+
import { APICallError } from '@ai-sdk/provider';
|
|
5
|
+
export { APICallError };
|
|
6
|
+
export type { JSONObject, JSONValue, LanguageModelV3, LanguageModelV3Prompt, LanguageModelV4, LanguageModelV4Middleware, LanguageModelV4Prompt, LanguageModelV4StreamPart, SharedV4Headers, } from '@ai-sdk/provider';
|
|
7
|
+
import { isAbortError, isProviderStreamError } from '@ai-sdk/provider-utils';
|
|
8
|
+
export { isAbortError, isProviderStreamError };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// ai-sdk core
|
|
2
|
+
import { generateText, jsonSchema, RetryError, StreamProviderError, streamText, tool } from 'ai';
|
|
3
|
+
export { generateText, jsonSchema, RetryError, StreamProviderError, streamText, tool };
|
|
4
|
+
// ai-sdk provider contracts
|
|
5
|
+
import { APICallError } from '@ai-sdk/provider';
|
|
6
|
+
export { APICallError };
|
|
7
|
+
// ai-sdk provider utilities
|
|
8
|
+
import { isAbortError, isProviderStreamError } from '@ai-sdk/provider-utils';
|
|
9
|
+
export { isAbortError, isProviderStreamError };
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX21vZGVscy9wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWM7QUFDZCxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQztBQUVqRyxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO0FBR3ZGLDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDO0FBYXhCLDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxDQUFDIn0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import type * as plugins from './plugins.js';
|
|
2
2
|
import type { TSmartAiProviderOptions } from './interfaces.js';
|
|
3
3
|
export type TSmartAiMessageCacheProvider = 'anthropic' | 'openrouter' | 'bedrock' | 'openaiCompatible' | 'copilot' | 'alibaba';
|
|
4
4
|
export type TSmartAiCacheRetention = 'ephemeral' | '1h' | 'in_memory' | '24h';
|
|
@@ -14,8 +14,8 @@ export type TSmartAiCacheSetting = boolean | 'auto' | ISmartAiCacheOptions;
|
|
|
14
14
|
export declare function mergeSmartAiProviderOptions(defaults?: TSmartAiProviderOptions, overrides?: TSmartAiProviderOptions): TSmartAiProviderOptions | undefined;
|
|
15
15
|
export declare function resolveSmartAiCacheProvider(provider?: string, modelId?: string): TSmartAiMessageCacheProvider | undefined;
|
|
16
16
|
export declare function getSmartAiMessageCacheProviderOptions(provider: TSmartAiMessageCacheProvider, options?: ISmartAiCacheOptions): TSmartAiProviderOptions;
|
|
17
|
-
export declare function applySmartAiPromptCaching(prompt: LanguageModelV4Prompt, options?: ISmartAiCacheOptions): LanguageModelV4Prompt;
|
|
18
|
-
export declare function createSmartAiCachingMiddleware(options?: ISmartAiCacheOptions): LanguageModelV4Middleware;
|
|
17
|
+
export declare function applySmartAiPromptCaching(prompt: plugins.LanguageModelV4Prompt, options?: ISmartAiCacheOptions): plugins.LanguageModelV4Prompt;
|
|
18
|
+
export declare function createSmartAiCachingMiddleware(options?: ISmartAiCacheOptions): plugins.LanguageModelV4Middleware;
|
|
19
19
|
export declare function getSmartAiCacheProviderOptions(input: {
|
|
20
20
|
provider?: string;
|
|
21
21
|
modelId?: string;
|
|
@@ -176,4 +176,4 @@ export function getSmartAiCacheProviderOptions(input) {
|
|
|
176
176
|
export function applySmartAiCacheProviderOptions(input) {
|
|
177
177
|
return mergeSmartAiProviderOptions(getSmartAiCacheProviderOptions(input), input.providerOptions);
|
|
178
178
|
}
|
|
179
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX21vZGVscy9zbWFydGFpLmNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXdCQSxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFFBQTRCLEVBQUUsU0FBOEI7SUFDckYsTUFBTSxNQUFNLEdBQXVCLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQztJQUVuRCxJQUFJLENBQUMsU0FBUztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBRTlCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxRQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztZQUM3RixTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUEwQixDQUFDO0lBQzNDLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEyQixDQUN6QyxRQUFrQyxFQUNsQyxTQUFtQztJQUVuQyxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hDLElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDaEMsT0FBTyxpQkFBaUIs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
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type IModelLimitInfo } from './smartai.limits.js';
|
|
2
|
+
/**
|
|
3
|
+
* `limit`: a usage or rate limit refused the call; `limit` describes it.
|
|
4
|
+
* `http`: the provider answered with an HTTP error status.
|
|
5
|
+
* `stream`: the provider reported an error inside a response stream that had already begun.
|
|
6
|
+
* `response`: the provider answered, but its response could not be read or processed.
|
|
7
|
+
* `network`: no response arrived because the connection failed.
|
|
8
|
+
* `aborted`: an abort signal ended the call, a timeout signal included.
|
|
9
|
+
* `unknown`: the failure is none of these.
|
|
10
|
+
*/
|
|
11
|
+
export type TModelFailureKind = 'limit' | 'http' | 'stream' | 'response' | 'network' | 'aborted' | 'unknown';
|
|
12
|
+
/** Why a model call failed, without provider response text, headers or credentials. */
|
|
13
|
+
export interface IModelFailureDescription {
|
|
14
|
+
kind: TModelFailureKind;
|
|
15
|
+
/** The HTTP status the provider answered with or, for a stream error, the status it states. */
|
|
16
|
+
status?: number;
|
|
17
|
+
/** The provider's machine-readable error code of a stream error, for example `server_error`. */
|
|
18
|
+
providerCode?: string;
|
|
19
|
+
/** The limit of a `limit` failure. */
|
|
20
|
+
limit?: Readonly<IModelLimitInfo>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Names why a model call failed, from the error a call threw or a stream reported. It follows
|
|
24
|
+
* `cause` and the last attempt of a retried call, so a wrapped failure is told by its own kind.
|
|
25
|
+
* The description holds only the kind, a status, a provider error code and a limit.
|
|
26
|
+
*/
|
|
27
|
+
export declare function describeModelFailure(error: unknown): IModelFailureDescription;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { isModelLimitError } from './smartai.limits.js';
|
|
3
|
+
/** How many causes are followed before a failure counts as unknown. */
|
|
4
|
+
const MAX_CAUSE_DEPTH = 8;
|
|
5
|
+
/** The longest provider code that is kept. */
|
|
6
|
+
const MAX_PROVIDER_CODE_LENGTH = 64;
|
|
7
|
+
/**
|
|
8
|
+
* The shapes providers name their errors in: snake_case words, optionally dotted
|
|
9
|
+
* (`insufficient_quota`, `invalid_request_error`), Google's status names (`RESOURCE_EXHAUSTED`)
|
|
10
|
+
* and numeric codes (`429`).
|
|
11
|
+
*/
|
|
12
|
+
const providerCodePattern = /^(?:[a-z][a-z0-9]*(?:[_.][a-z0-9]+)*|[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*|[0-9]{1,5})$/;
|
|
13
|
+
/** Prefixes of API keys, access tokens and JWTs. */
|
|
14
|
+
const credentialPrefixPattern = /^(?:(?:sk|pk|rk)[-_]|gh[opsur]_|github_pat_|glpat-|xox[a-z]-|eyj|akia|asia|aiza)/i;
|
|
15
|
+
/** The longest word of a provider code; longer runs are taken for secrets. */
|
|
16
|
+
const MAX_CODE_WORD_LENGTH = 20;
|
|
17
|
+
/** The shortest word that is taken for a secret when it mixes letters and digits. */
|
|
18
|
+
const MIN_MIXED_SECRET_WORD_LENGTH = 8;
|
|
19
|
+
/** A code word is short and, when it is long enough to hold a key, not a mix of letters and digits. */
|
|
20
|
+
function isCodeWord(word) {
|
|
21
|
+
if (word.length > MAX_CODE_WORD_LENGTH)
|
|
22
|
+
return false;
|
|
23
|
+
return word.length < MIN_MIXED_SECRET_WORD_LENGTH || !/[0-9]/.test(word) || !/[A-Za-z]/.test(word);
|
|
24
|
+
}
|
|
25
|
+
/** A provider code is kept only in a shape providers use and never when it looks like a credential. */
|
|
26
|
+
function isProviderCode(code) {
|
|
27
|
+
return code.length <= MAX_PROVIDER_CODE_LENGTH
|
|
28
|
+
&& providerCodePattern.test(code)
|
|
29
|
+
&& !credentialPrefixPattern.test(code)
|
|
30
|
+
&& code.split(/[_.]/).every(isCodeWord);
|
|
31
|
+
}
|
|
32
|
+
function readStatus(value) {
|
|
33
|
+
return typeof value === 'number' && Number.isInteger(value) && value >= 100 && value <= 599 ? value : undefined;
|
|
34
|
+
}
|
|
35
|
+
function readProviderCode(value) {
|
|
36
|
+
const code = typeof value === 'number' && Number.isSafeInteger(value) ? String(value) : value;
|
|
37
|
+
return typeof code === 'string' && isProviderCode(code) ? code : undefined;
|
|
38
|
+
}
|
|
39
|
+
function describeKnownFailure(error) {
|
|
40
|
+
if (isModelLimitError(error))
|
|
41
|
+
return { kind: 'limit', limit: error.limit };
|
|
42
|
+
if (plugins.isAbortError(error))
|
|
43
|
+
return { kind: 'aborted' };
|
|
44
|
+
if (plugins.StreamProviderError.isInstance(error) || plugins.isProviderStreamError(error)) {
|
|
45
|
+
const status = readStatus(error.statusCode);
|
|
46
|
+
const providerCode = readProviderCode(error.code);
|
|
47
|
+
return {
|
|
48
|
+
kind: 'stream',
|
|
49
|
+
...(status === undefined ? {} : { status }),
|
|
50
|
+
...(providerCode === undefined ? {} : { providerCode }),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (plugins.APICallError.isInstance(error)) {
|
|
54
|
+
const status = readStatus(error.statusCode);
|
|
55
|
+
if (status === undefined)
|
|
56
|
+
return { kind: 'network' };
|
|
57
|
+
return { kind: status >= 400 ? 'http' : 'response', status };
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Names why a model call failed, from the error a call threw or a stream reported. It follows
|
|
63
|
+
* `cause` and the last attempt of a retried call, so a wrapped failure is told by its own kind.
|
|
64
|
+
* The description holds only the kind, a status, a provider error code and a limit.
|
|
65
|
+
*/
|
|
66
|
+
export function describeModelFailure(error) {
|
|
67
|
+
const visited = new Set();
|
|
68
|
+
let current = error;
|
|
69
|
+
for (let depth = 0; depth <= MAX_CAUSE_DEPTH && current !== undefined && !visited.has(current); depth += 1) {
|
|
70
|
+
visited.add(current);
|
|
71
|
+
const description = describeKnownFailure(current);
|
|
72
|
+
if (description)
|
|
73
|
+
return description;
|
|
74
|
+
current = plugins.RetryError.isInstance(current)
|
|
75
|
+
? current.lastError
|
|
76
|
+
: current instanceof Error ? current.cause : undefined;
|
|
77
|
+
}
|
|
78
|
+
return { kind: 'unknown' };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5mYWlsdXJlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX21vZGVscy9zbWFydGFpLmZhaWx1cmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxxQkFBcUIsQ0FBQztBQXdCOUUsdUVBQXVFO0FBQ3ZFLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUUxQiw4Q0FBOEM7QUFDOUMsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLENBQUM7QUFFcEM7Ozs7R0FJRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsaUZBQWlGLENBQUM7QUFFOUcsb0RBQW9EO0FBQ3BELE1BQU0sdUJBQXVCLEdBQUcsbUZBQW1GLENBQUM7QUFFcEgsOEVBQThFO0FBQzlFLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBRWhDLHFGQUFxRjtBQUNyRixNQUFNLDRCQUE0QixHQUFHLENBQUMsQ0FBQztBQUV2Qyx1R0FBdUc7QUFDdkcsU0FBUyxVQUFVLENBQUMsSUFBWTtJQUM5QixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsb0JBQW9CO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDckQsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLDRCQUE0QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckcsQ0FBQztBQUVELHVHQUF1RztBQUN2RyxTQUFTLGNBQWMsQ0FBQyxJQUFZO0lBQ2xDLE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSx3QkFBd0I7V0FDekMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztXQUM5QixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7V0FDbkMsSUFBSSxDQUFDLEtBQUssQ0FB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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
2
|
/**
|
|
3
3
|
* `usage_limit`: the account's quota is spent until it resets, so no retry can succeed earlier.
|
|
4
4
|
* `rate_limit`: a short throttle that a retry after the advertised delay may pass.
|
|
@@ -27,7 +27,7 @@ export interface IModelCallFailure {
|
|
|
27
27
|
statusCode?: number;
|
|
28
28
|
/** Response headers with lower-case names. */
|
|
29
29
|
headers: Readonly<Record<string, string>>;
|
|
30
|
-
/** The parsed JSON error body, or the error frame of a failed stream. */
|
|
30
|
+
/** The parsed JSON error body, or the provider's error frame of a failed stream. */
|
|
31
31
|
body?: unknown;
|
|
32
32
|
}
|
|
33
33
|
/** Reads one provider's limit dialect; returns undefined for failures that are not limits. */
|
|
@@ -65,4 +65,4 @@ export declare function createModelLimitInfo(reported: IModelLimitInfo, observed
|
|
|
65
65
|
* Turns the failures a provider dialect recognizes as limits into ModelLimitError, keeping the
|
|
66
66
|
* original failure as its cause. Covers thrown call errors and error parts of a running stream.
|
|
67
67
|
*/
|
|
68
|
-
export declare function createModelLimitMiddleware(options: IModelLimitMiddlewareOptions): LanguageModelV4Middleware;
|
|
68
|
+
export declare function createModelLimitMiddleware(options: IModelLimitMiddlewareOptions): plugins.LanguageModelV4Middleware;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
2
|
/** Upper bound for the provider, plan and window names a limit carries. */
|
|
3
3
|
export const MODEL_LIMIT_TEXT_MAX_LENGTH = 128;
|
|
4
4
|
/** The latest instant a Date can represent, in epoch milliseconds. */
|
|
@@ -126,7 +126,7 @@ export function createModelLimitInfo(reported, observedAt) {
|
|
|
126
126
|
};
|
|
127
127
|
}
|
|
128
128
|
function describeFailure(error, streamHeaders, observedAt) {
|
|
129
|
-
if (APICallError.isInstance(error)) {
|
|
129
|
+
if (plugins.APICallError.isInstance(error)) {
|
|
130
130
|
return {
|
|
131
131
|
observedAt,
|
|
132
132
|
...(error.statusCode === undefined ? {} : { statusCode: error.statusCode }),
|
|
@@ -134,6 +134,15 @@ function describeFailure(error, streamHeaders, observedAt) {
|
|
|
134
134
|
body: parseJsonBody(error.responseBody) ?? error.data,
|
|
135
135
|
};
|
|
136
136
|
}
|
|
137
|
+
// an error part after output began carries the provider's frame in `data`, next to the status the provider states
|
|
138
|
+
if (plugins.isProviderStreamError(error)) {
|
|
139
|
+
return {
|
|
140
|
+
observedAt,
|
|
141
|
+
...(error.statusCode === undefined ? {} : { statusCode: error.statusCode }),
|
|
142
|
+
headers: lowerCaseHeaders(streamHeaders),
|
|
143
|
+
body: error.data,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
137
146
|
return { observedAt, headers: lowerCaseHeaders(streamHeaders), body: error };
|
|
138
147
|
}
|
|
139
148
|
function completeLimit(provider, classification, failure) {
|
|
@@ -182,4 +191,4 @@ export function createModelLimitMiddleware(options) {
|
|
|
182
191
|
},
|
|
183
192
|
};
|
|
184
193
|
}
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
194
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5saW1pdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19tb2RlbHMvc21hcnRhaS5saW1pdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUE2Q3hDLDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLENBQUM7QUFFL0Msc0VBQXNFO0FBQ3RFLE1BQU0saUJBQWlCLEdBQUcscUJBQXFCLENBQUM7QUFFaEQsTUFBTSxlQUFlLEdBQStCLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ2xGLE1BQU0sY0FBYyxHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUNsRCxNQUFNO0lBQ04sVUFBVTtJQUNWLFVBQVU7SUFDVixjQUFjO0lBQ2QsVUFBVTtJQUNWLFFBQVE7Q0FDVCxDQUFDLENBQUM7QUFDSCxNQUFNLGdCQUFnQixHQUFvQztJQUN4RCxXQUFXLEVBQUUsYUFBYTtJQUMxQixVQUFVLEVBQUUsWUFBWTtDQUN6QixDQUFDO0FBQ0YsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7QUFFakcsZ0ZBQWdGO0FBQ2hGLE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBYztJQUMzQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDekUsQ0FBQyxDQUFDLEtBQWdDO1FBQ2xDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQWM7SUFDakMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSwyQkFBMkIsQ0FBQztBQUN0RyxDQUFDO0FBRUQsU0FB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
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"author": "Task Venture Capital GmbH",
|
|
3
3
|
"license": "MIT",
|
|
4
4
|
"name": "@modelprofile.com/flexharness-models",
|
|
5
|
-
"version": "9.
|
|
5
|
+
"version": "9.3.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"description": "Provider-independent model contracts, prompt caching and explicit model registration.",
|
|
8
8
|
"main": "./dist_ts_models/index.js",
|
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"ai": "^7.0.
|
|
18
|
-
"@ai-sdk/provider": "^4.0.
|
|
17
|
+
"ai": "^7.0.107",
|
|
18
|
+
"@ai-sdk/provider": "^4.0.17",
|
|
19
|
+
"@ai-sdk/provider-utils": "^5.0.45",
|
|
19
20
|
"@types/json-schema": "7.0.15"
|
|
20
21
|
},
|
|
21
22
|
"engines": {
|
package/readme.md
CHANGED
|
@@ -19,11 +19,24 @@ for composition examples and the SmartAI/SmartAgent migration map.
|
|
|
19
19
|
(`IModelLimitInfo`) carries `kind`, `provider`, and when known `resetsAt` (epoch milliseconds),
|
|
20
20
|
`retryAfterMs`, `planType` and `window`. `createModelLimitMiddleware({ provider, classify })`
|
|
21
21
|
raises it for the failures a provider dialect recognizes, from thrown calls and from stream error
|
|
22
|
-
parts, keeping the provider failure as `cause`.
|
|
22
|
+
parts, keeping the provider failure as `cause`. For an AI SDK provider stream error the classifier
|
|
23
|
+
receives the provider's frame (`data`) as the body and the status the provider states for it. A classifier receives the failure's `observedAt` time for relative
|
|
23
24
|
reset delays; a delay or reset time outside the range a `Date` can represent is dropped from the
|
|
24
25
|
limit. `createModelLimitInfo`, `isModelLimitError`, `isModelLimitInfo`, `describeModelLimit`,
|
|
25
26
|
`readRetryAfterMs`, `readEpochSeconds` and `readJsonRecord` are exported for dialects and hosts.
|
|
26
27
|
|
|
28
|
+
`describeModelFailure(error)` returns an `IModelFailureDescription` that names why a model call
|
|
29
|
+
failed and never holds provider response text, headers or credentials. Its `kind`
|
|
30
|
+
(`TModelFailureKind`) is `limit` (with the `limit`), `http` (with the answer's `status`), `stream`
|
|
31
|
+
(an error reported after the response stream began, with the `status` and `providerCode` the
|
|
32
|
+
provider states), `response` (an answer that could not be processed, with its `status`),
|
|
33
|
+
`network` (no answer arrived), `aborted` (an abort or timeout signal) or `unknown`. A provider code
|
|
34
|
+
is kept only in a shape providers name errors in (snake_case words, optionally dotted, such as
|
|
35
|
+
`insufficient_quota`; upper-case status names such as `RESOURCE_EXHAUSTED`; numeric codes) of at
|
|
36
|
+
most 64 characters, and never when it looks like a credential: a key or token prefix such as `sk-`,
|
|
37
|
+
`sk_`, `pk_`, `ghp_` or `eyJ`, or a long run of letters and digits. The description follows `cause`
|
|
38
|
+
and the last attempt of a retried call.
|
|
39
|
+
|
|
27
40
|
## License and Legal Information
|
|
28
41
|
|
|
29
42
|
This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the repository license file.
|
package/ts_models/index.ts
CHANGED
|
@@ -2,5 +2,6 @@ export * from './interfaces.js';
|
|
|
2
2
|
export * from './classes.modelregistry.js';
|
|
3
3
|
export * from './smartai.cache.js';
|
|
4
4
|
export * from './smartai.limits.js';
|
|
5
|
-
export
|
|
6
|
-
export
|
|
5
|
+
export * from './smartai.failures.js';
|
|
6
|
+
export { generateText, streamText, tool, jsonSchema } from './plugins.js';
|
|
7
|
+
export type { ModelMessage, ToolSet, StreamTextResult } from './plugins.js';
|
package/ts_models/interfaces.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import type * as plugins from './plugins.js';
|
|
2
2
|
|
|
3
3
|
export type TProvider = string;
|
|
4
|
-
export type TSmartAiLanguageModel = LanguageModelV3 | LanguageModelV4;
|
|
5
|
-
export type TSmartAiProviderOptions = Record<string, JSONObject>;
|
|
4
|
+
export type TSmartAiLanguageModel = plugins.LanguageModelV3 | plugins.LanguageModelV4;
|
|
5
|
+
export type TSmartAiProviderOptions = Record<string, plugins.JSONObject>;
|
|
6
6
|
|
|
7
7
|
export interface ISmartAiModelSetup {
|
|
8
8
|
model: TSmartAiLanguageModel;
|
|
@@ -17,9 +17,16 @@ export interface ISmartAiOptions {
|
|
|
17
17
|
providerOptions?: TSmartAiProviderOptions;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
/**
|
|
21
|
+
* A provider of language models. `TModel` states the model version its `getModel` returns, so a provider
|
|
22
|
+
* that always answers with a V4 model says so and its callers need no version check.
|
|
23
|
+
*/
|
|
24
|
+
export interface IModelProvider<
|
|
25
|
+
TOptions extends ISmartAiOptions = ISmartAiOptions,
|
|
26
|
+
TModel extends TSmartAiLanguageModel = TSmartAiLanguageModel,
|
|
27
|
+
> {
|
|
21
28
|
readonly id: string;
|
|
22
|
-
getModel(options: TOptions):
|
|
29
|
+
getModel(options: TOptions): TModel;
|
|
23
30
|
}
|
|
24
31
|
|
|
25
|
-
export type { JSONObject, LanguageModelV3, LanguageModelV3Prompt, LanguageModelV4, LanguageModelV4Prompt } from '
|
|
32
|
+
export type { JSONObject, LanguageModelV3, LanguageModelV3Prompt, LanguageModelV4, LanguageModelV4Prompt } from './plugins.js';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// ai-sdk core
|
|
2
|
+
import { generateText, jsonSchema, RetryError, StreamProviderError, streamText, tool } from 'ai';
|
|
3
|
+
|
|
4
|
+
export { generateText, jsonSchema, RetryError, StreamProviderError, streamText, tool };
|
|
5
|
+
export type { ModelMessage, StreamTextResult, ToolSet } from 'ai';
|
|
6
|
+
|
|
7
|
+
// ai-sdk provider contracts
|
|
8
|
+
import { APICallError } from '@ai-sdk/provider';
|
|
9
|
+
|
|
10
|
+
export { APICallError };
|
|
11
|
+
export type {
|
|
12
|
+
JSONObject,
|
|
13
|
+
JSONValue,
|
|
14
|
+
LanguageModelV3,
|
|
15
|
+
LanguageModelV3Prompt,
|
|
16
|
+
LanguageModelV4,
|
|
17
|
+
LanguageModelV4Middleware,
|
|
18
|
+
LanguageModelV4Prompt,
|
|
19
|
+
LanguageModelV4StreamPart,
|
|
20
|
+
SharedV4Headers,
|
|
21
|
+
} from '@ai-sdk/provider';
|
|
22
|
+
|
|
23
|
+
// ai-sdk provider utilities
|
|
24
|
+
import { isAbortError, isProviderStreamError } from '@ai-sdk/provider-utils';
|
|
25
|
+
|
|
26
|
+
export { isAbortError, isProviderStreamError };
|
package/ts_models/readme.md
CHANGED
|
@@ -19,11 +19,24 @@ for composition examples and the SmartAI/SmartAgent migration map.
|
|
|
19
19
|
(`IModelLimitInfo`) carries `kind`, `provider`, and when known `resetsAt` (epoch milliseconds),
|
|
20
20
|
`retryAfterMs`, `planType` and `window`. `createModelLimitMiddleware({ provider, classify })`
|
|
21
21
|
raises it for the failures a provider dialect recognizes, from thrown calls and from stream error
|
|
22
|
-
parts, keeping the provider failure as `cause`.
|
|
22
|
+
parts, keeping the provider failure as `cause`. For an AI SDK provider stream error the classifier
|
|
23
|
+
receives the provider's frame (`data`) as the body and the status the provider states for it. A classifier receives the failure's `observedAt` time for relative
|
|
23
24
|
reset delays; a delay or reset time outside the range a `Date` can represent is dropped from the
|
|
24
25
|
limit. `createModelLimitInfo`, `isModelLimitError`, `isModelLimitInfo`, `describeModelLimit`,
|
|
25
26
|
`readRetryAfterMs`, `readEpochSeconds` and `readJsonRecord` are exported for dialects and hosts.
|
|
26
27
|
|
|
28
|
+
`describeModelFailure(error)` returns an `IModelFailureDescription` that names why a model call
|
|
29
|
+
failed and never holds provider response text, headers or credentials. Its `kind`
|
|
30
|
+
(`TModelFailureKind`) is `limit` (with the `limit`), `http` (with the answer's `status`), `stream`
|
|
31
|
+
(an error reported after the response stream began, with the `status` and `providerCode` the
|
|
32
|
+
provider states), `response` (an answer that could not be processed, with its `status`),
|
|
33
|
+
`network` (no answer arrived), `aborted` (an abort or timeout signal) or `unknown`. A provider code
|
|
34
|
+
is kept only in a shape providers name errors in (snake_case words, optionally dotted, such as
|
|
35
|
+
`insufficient_quota`; upper-case status names such as `RESOURCE_EXHAUSTED`; numeric codes) of at
|
|
36
|
+
most 64 characters, and never when it looks like a credential: a key or token prefix such as `sk-`,
|
|
37
|
+
`sk_`, `pk_`, `ghp_` or `eyJ`, or a long run of letters and digits. The description follows `cause`
|
|
38
|
+
and the last attempt of a retried call.
|
|
39
|
+
|
|
27
40
|
## License and Legal Information
|
|
28
41
|
|
|
29
42
|
This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the repository license file.
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import type
|
|
2
|
-
JSONObject,
|
|
3
|
-
JSONValue,
|
|
4
|
-
LanguageModelV4Middleware,
|
|
5
|
-
LanguageModelV4Prompt,
|
|
6
|
-
} from '@ai-sdk/provider';
|
|
1
|
+
import type * as plugins from './plugins.js';
|
|
7
2
|
import type { TSmartAiProviderOptions } from './interfaces.js';
|
|
8
3
|
|
|
9
4
|
export type TSmartAiMessageCacheProvider =
|
|
@@ -31,18 +26,18 @@ function isObject(input: unknown): input is Record<string, unknown> {
|
|
|
31
26
|
return typeof input === 'object' && input !== null && !Array.isArray(input);
|
|
32
27
|
}
|
|
33
28
|
|
|
34
|
-
function mergeJsonDefaults(defaults: JSONObject, overrides?: JSONObject): JSONObject {
|
|
35
|
-
const result: JSONObject = { ...defaults };
|
|
29
|
+
function mergeJsonDefaults(defaults: plugins.JSONObject, overrides?: plugins.JSONObject): plugins.JSONObject {
|
|
30
|
+
const result: plugins.JSONObject = { ...defaults };
|
|
36
31
|
|
|
37
32
|
if (!overrides) return result;
|
|
38
33
|
|
|
39
34
|
for (const [key, value] of Object.entries(overrides)) {
|
|
40
35
|
const existing = result[key];
|
|
41
36
|
if (isObject(existing) && isObject(value)) {
|
|
42
|
-
result[key] = mergeJsonDefaults(existing as JSONObject, value as JSONObject);
|
|
37
|
+
result[key] = mergeJsonDefaults(existing as plugins.JSONObject, value as plugins.JSONObject);
|
|
43
38
|
continue;
|
|
44
39
|
}
|
|
45
|
-
result[key] = value as JSONValue;
|
|
40
|
+
result[key] = value as plugins.JSONValue;
|
|
46
41
|
}
|
|
47
42
|
|
|
48
43
|
return result;
|
|
@@ -54,7 +49,7 @@ export function mergeSmartAiProviderOptions(
|
|
|
54
49
|
): TSmartAiProviderOptions | undefined {
|
|
55
50
|
if (!defaults) return overrides;
|
|
56
51
|
if (!overrides) return defaults;
|
|
57
|
-
return mergeJsonDefaults(defaults as JSONObject, overrides as JSONObject) as TSmartAiProviderOptions;
|
|
52
|
+
return mergeJsonDefaults(defaults as plugins.JSONObject, overrides as plugins.JSONObject) as TSmartAiProviderOptions;
|
|
58
53
|
}
|
|
59
54
|
|
|
60
55
|
function cacheOptionsFromSetting(cache: TSmartAiCacheSetting | undefined): ISmartAiCacheOptions | undefined {
|
|
@@ -84,12 +79,12 @@ export function getSmartAiMessageCacheProviderOptions(
|
|
|
84
79
|
provider: TSmartAiMessageCacheProvider,
|
|
85
80
|
options: ISmartAiCacheOptions = {},
|
|
86
81
|
): TSmartAiProviderOptions {
|
|
87
|
-
const anthropicCacheControl: JSONObject = {
|
|
82
|
+
const anthropicCacheControl: plugins.JSONObject = {
|
|
88
83
|
type: 'ephemeral',
|
|
89
84
|
...(options.retention === '1h' ? { ttl: '1h' } : {}),
|
|
90
85
|
};
|
|
91
86
|
|
|
92
|
-
const providerOptions: Record<TSmartAiMessageCacheProvider, JSONObject> = {
|
|
87
|
+
const providerOptions: Record<TSmartAiMessageCacheProvider, plugins.JSONObject> = {
|
|
93
88
|
anthropic: {
|
|
94
89
|
anthropic: {
|
|
95
90
|
cacheControl: anthropicCacheControl,
|
|
@@ -145,10 +140,10 @@ function isToolApprovalPart(part: unknown): boolean {
|
|
|
145
140
|
}
|
|
146
141
|
|
|
147
142
|
function applyCacheToMessage(
|
|
148
|
-
message: LanguageModelV4Prompt[number],
|
|
143
|
+
message: plugins.LanguageModelV4Prompt[number],
|
|
149
144
|
provider: TSmartAiMessageCacheProvider,
|
|
150
145
|
options: ISmartAiCacheOptions,
|
|
151
|
-
): LanguageModelV4Prompt[number] {
|
|
146
|
+
): plugins.LanguageModelV4Prompt[number] {
|
|
152
147
|
const providerOptions = getSmartAiMessageCacheProviderOptions(provider, options);
|
|
153
148
|
const content = message.content;
|
|
154
149
|
|
|
@@ -156,13 +151,13 @@ function applyCacheToMessage(
|
|
|
156
151
|
const lastIndex = content.length - 1;
|
|
157
152
|
const lastPart = content[lastIndex];
|
|
158
153
|
if (!isToolApprovalPart(lastPart)) {
|
|
159
|
-
const messageWithArrayContent = message as Extract<LanguageModelV4Prompt[number], { content: unknown[] }>;
|
|
154
|
+
const messageWithArrayContent = message as Extract<plugins.LanguageModelV4Prompt[number], { content: unknown[] }>;
|
|
160
155
|
return {
|
|
161
156
|
...messageWithArrayContent,
|
|
162
157
|
content: content.map((part, index) =>
|
|
163
158
|
index === lastIndex ? applyProviderOptionsDefaults(part, providerOptions) : part,
|
|
164
159
|
) as typeof messageWithArrayContent.content,
|
|
165
|
-
} as LanguageModelV4Prompt[number];
|
|
160
|
+
} as plugins.LanguageModelV4Prompt[number];
|
|
166
161
|
}
|
|
167
162
|
}
|
|
168
163
|
|
|
@@ -170,9 +165,9 @@ function applyCacheToMessage(
|
|
|
170
165
|
}
|
|
171
166
|
|
|
172
167
|
export function applySmartAiPromptCaching(
|
|
173
|
-
prompt: LanguageModelV4Prompt,
|
|
168
|
+
prompt: plugins.LanguageModelV4Prompt,
|
|
174
169
|
options: ISmartAiCacheOptions = {},
|
|
175
|
-
): LanguageModelV4Prompt {
|
|
170
|
+
): plugins.LanguageModelV4Prompt {
|
|
176
171
|
const provider = options.provider ?? 'anthropic';
|
|
177
172
|
const targetIndexes = new Set<number>();
|
|
178
173
|
const nonSystemIndexes: number[] = [];
|
|
@@ -196,10 +191,10 @@ export function applySmartAiPromptCaching(
|
|
|
196
191
|
|
|
197
192
|
return prompt.map((message, index) =>
|
|
198
193
|
targetIndexes.has(index) ? applyCacheToMessage(message, provider, options) : message,
|
|
199
|
-
) as LanguageModelV4Prompt;
|
|
194
|
+
) as plugins.LanguageModelV4Prompt;
|
|
200
195
|
}
|
|
201
196
|
|
|
202
|
-
export function createSmartAiCachingMiddleware(options: ISmartAiCacheOptions = {}): LanguageModelV4Middleware {
|
|
197
|
+
export function createSmartAiCachingMiddleware(options: ISmartAiCacheOptions = {}): plugins.LanguageModelV4Middleware {
|
|
203
198
|
return {
|
|
204
199
|
specificationVersion: 'v4',
|
|
205
200
|
transformParams: async ({ params }) => ({
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { isModelLimitError, type IModelLimitInfo } from './smartai.limits.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* `limit`: a usage or rate limit refused the call; `limit` describes it.
|
|
6
|
+
* `http`: the provider answered with an HTTP error status.
|
|
7
|
+
* `stream`: the provider reported an error inside a response stream that had already begun.
|
|
8
|
+
* `response`: the provider answered, but its response could not be read or processed.
|
|
9
|
+
* `network`: no response arrived because the connection failed.
|
|
10
|
+
* `aborted`: an abort signal ended the call, a timeout signal included.
|
|
11
|
+
* `unknown`: the failure is none of these.
|
|
12
|
+
*/
|
|
13
|
+
export type TModelFailureKind = 'limit' | 'http' | 'stream' | 'response' | 'network' | 'aborted' | 'unknown';
|
|
14
|
+
|
|
15
|
+
/** Why a model call failed, without provider response text, headers or credentials. */
|
|
16
|
+
export interface IModelFailureDescription {
|
|
17
|
+
kind: TModelFailureKind;
|
|
18
|
+
/** The HTTP status the provider answered with or, for a stream error, the status it states. */
|
|
19
|
+
status?: number;
|
|
20
|
+
/** The provider's machine-readable error code of a stream error, for example `server_error`. */
|
|
21
|
+
providerCode?: string;
|
|
22
|
+
/** The limit of a `limit` failure. */
|
|
23
|
+
limit?: Readonly<IModelLimitInfo>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** How many causes are followed before a failure counts as unknown. */
|
|
27
|
+
const MAX_CAUSE_DEPTH = 8;
|
|
28
|
+
|
|
29
|
+
/** The longest provider code that is kept. */
|
|
30
|
+
const MAX_PROVIDER_CODE_LENGTH = 64;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The shapes providers name their errors in: snake_case words, optionally dotted
|
|
34
|
+
* (`insufficient_quota`, `invalid_request_error`), Google's status names (`RESOURCE_EXHAUSTED`)
|
|
35
|
+
* and numeric codes (`429`).
|
|
36
|
+
*/
|
|
37
|
+
const providerCodePattern = /^(?:[a-z][a-z0-9]*(?:[_.][a-z0-9]+)*|[A-Z][A-Z0-9]*(?:_[A-Z0-9]+)*|[0-9]{1,5})$/;
|
|
38
|
+
|
|
39
|
+
/** Prefixes of API keys, access tokens and JWTs. */
|
|
40
|
+
const credentialPrefixPattern = /^(?:(?:sk|pk|rk)[-_]|gh[opsur]_|github_pat_|glpat-|xox[a-z]-|eyj|akia|asia|aiza)/i;
|
|
41
|
+
|
|
42
|
+
/** The longest word of a provider code; longer runs are taken for secrets. */
|
|
43
|
+
const MAX_CODE_WORD_LENGTH = 20;
|
|
44
|
+
|
|
45
|
+
/** The shortest word that is taken for a secret when it mixes letters and digits. */
|
|
46
|
+
const MIN_MIXED_SECRET_WORD_LENGTH = 8;
|
|
47
|
+
|
|
48
|
+
/** A code word is short and, when it is long enough to hold a key, not a mix of letters and digits. */
|
|
49
|
+
function isCodeWord(word: string): boolean {
|
|
50
|
+
if (word.length > MAX_CODE_WORD_LENGTH) return false;
|
|
51
|
+
return word.length < MIN_MIXED_SECRET_WORD_LENGTH || !/[0-9]/.test(word) || !/[A-Za-z]/.test(word);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** A provider code is kept only in a shape providers use and never when it looks like a credential. */
|
|
55
|
+
function isProviderCode(code: string): boolean {
|
|
56
|
+
return code.length <= MAX_PROVIDER_CODE_LENGTH
|
|
57
|
+
&& providerCodePattern.test(code)
|
|
58
|
+
&& !credentialPrefixPattern.test(code)
|
|
59
|
+
&& code.split(/[_.]/).every(isCodeWord);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function readStatus(value: number | undefined): number | undefined {
|
|
63
|
+
return typeof value === 'number' && Number.isInteger(value) && value >= 100 && value <= 599 ? value : undefined;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function readProviderCode(value: string | number | undefined): string | undefined {
|
|
67
|
+
const code = typeof value === 'number' && Number.isSafeInteger(value) ? String(value) : value;
|
|
68
|
+
return typeof code === 'string' && isProviderCode(code) ? code : undefined;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function describeKnownFailure(error: unknown): IModelFailureDescription | undefined {
|
|
72
|
+
if (isModelLimitError(error)) return { kind: 'limit', limit: error.limit };
|
|
73
|
+
if (plugins.isAbortError(error)) return { kind: 'aborted' };
|
|
74
|
+
if (plugins.StreamProviderError.isInstance(error) || plugins.isProviderStreamError(error)) {
|
|
75
|
+
const status = readStatus(error.statusCode);
|
|
76
|
+
const providerCode = readProviderCode(error.code);
|
|
77
|
+
return {
|
|
78
|
+
kind: 'stream',
|
|
79
|
+
...(status === undefined ? {} : { status }),
|
|
80
|
+
...(providerCode === undefined ? {} : { providerCode }),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (plugins.APICallError.isInstance(error)) {
|
|
84
|
+
const status = readStatus(error.statusCode);
|
|
85
|
+
if (status === undefined) return { kind: 'network' };
|
|
86
|
+
return { kind: status >= 400 ? 'http' : 'response', status };
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Names why a model call failed, from the error a call threw or a stream reported. It follows
|
|
93
|
+
* `cause` and the last attempt of a retried call, so a wrapped failure is told by its own kind.
|
|
94
|
+
* The description holds only the kind, a status, a provider error code and a limit.
|
|
95
|
+
*/
|
|
96
|
+
export function describeModelFailure(error: unknown): IModelFailureDescription {
|
|
97
|
+
const visited = new Set<unknown>();
|
|
98
|
+
let current = error;
|
|
99
|
+
for (let depth = 0; depth <= MAX_CAUSE_DEPTH && current !== undefined && !visited.has(current); depth += 1) {
|
|
100
|
+
visited.add(current);
|
|
101
|
+
const description = describeKnownFailure(current);
|
|
102
|
+
if (description) return description;
|
|
103
|
+
current = plugins.RetryError.isInstance(current)
|
|
104
|
+
? current.lastError
|
|
105
|
+
: current instanceof Error ? current.cause : undefined;
|
|
106
|
+
}
|
|
107
|
+
return { kind: 'unknown' };
|
|
108
|
+
}
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type {
|
|
3
|
-
LanguageModelV4Middleware,
|
|
4
|
-
LanguageModelV4StreamPart,
|
|
5
|
-
SharedV4Headers,
|
|
6
|
-
} from '@ai-sdk/provider';
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
7
2
|
|
|
8
3
|
/**
|
|
9
4
|
* `usage_limit`: the account's quota is spent until it resets, so no retry can succeed earlier.
|
|
@@ -36,7 +31,7 @@ export interface IModelCallFailure {
|
|
|
36
31
|
statusCode?: number;
|
|
37
32
|
/** Response headers with lower-case names. */
|
|
38
33
|
headers: Readonly<Record<string, string>>;
|
|
39
|
-
/** The parsed JSON error body, or the error frame of a failed stream. */
|
|
34
|
+
/** The parsed JSON error body, or the provider's error frame of a failed stream. */
|
|
40
35
|
body?: unknown;
|
|
41
36
|
}
|
|
42
37
|
|
|
@@ -150,7 +145,7 @@ export function readEpochSeconds(value: unknown): number | undefined {
|
|
|
150
145
|
: undefined;
|
|
151
146
|
}
|
|
152
147
|
|
|
153
|
-
function lowerCaseHeaders(headers: SharedV4Headers | undefined): Record<string, string> {
|
|
148
|
+
function lowerCaseHeaders(headers: plugins.SharedV4Headers | undefined): Record<string, string> {
|
|
154
149
|
const normalized: Record<string, string> = {};
|
|
155
150
|
for (const [name, value] of Object.entries(headers ?? {})) {
|
|
156
151
|
if (typeof value === 'string') normalized[name.toLowerCase()] = value;
|
|
@@ -188,10 +183,10 @@ export function createModelLimitInfo(reported: IModelLimitInfo, observedAt: numb
|
|
|
188
183
|
|
|
189
184
|
function describeFailure(
|
|
190
185
|
error: unknown,
|
|
191
|
-
streamHeaders: SharedV4Headers | undefined,
|
|
186
|
+
streamHeaders: plugins.SharedV4Headers | undefined,
|
|
192
187
|
observedAt: number,
|
|
193
188
|
): IModelCallFailure {
|
|
194
|
-
if (APICallError.isInstance(error)) {
|
|
189
|
+
if (plugins.APICallError.isInstance(error)) {
|
|
195
190
|
return {
|
|
196
191
|
observedAt,
|
|
197
192
|
...(error.statusCode === undefined ? {} : { statusCode: error.statusCode }),
|
|
@@ -199,6 +194,15 @@ function describeFailure(
|
|
|
199
194
|
body: parseJsonBody(error.responseBody) ?? error.data,
|
|
200
195
|
};
|
|
201
196
|
}
|
|
197
|
+
// an error part after output began carries the provider's frame in `data`, next to the status the provider states
|
|
198
|
+
if (plugins.isProviderStreamError(error)) {
|
|
199
|
+
return {
|
|
200
|
+
observedAt,
|
|
201
|
+
...(error.statusCode === undefined ? {} : { statusCode: error.statusCode }),
|
|
202
|
+
headers: lowerCaseHeaders(streamHeaders),
|
|
203
|
+
body: error.data,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
202
206
|
return { observedAt, headers: lowerCaseHeaders(streamHeaders), body: error };
|
|
203
207
|
}
|
|
204
208
|
|
|
@@ -218,8 +222,8 @@ function completeLimit(
|
|
|
218
222
|
* Turns the failures a provider dialect recognizes as limits into ModelLimitError, keeping the
|
|
219
223
|
* original failure as its cause. Covers thrown call errors and error parts of a running stream.
|
|
220
224
|
*/
|
|
221
|
-
export function createModelLimitMiddleware(options: IModelLimitMiddlewareOptions): LanguageModelV4Middleware {
|
|
222
|
-
const classifyError = (error: unknown, streamHeaders?: SharedV4Headers): unknown => {
|
|
225
|
+
export function createModelLimitMiddleware(options: IModelLimitMiddlewareOptions): plugins.LanguageModelV4Middleware {
|
|
226
|
+
const classifyError = (error: unknown, streamHeaders?: plugins.SharedV4Headers): unknown => {
|
|
223
227
|
if (isModelLimitError(error)) return error;
|
|
224
228
|
const failure = describeFailure(error, streamHeaders, Date.now());
|
|
225
229
|
const classification = options.classify(failure);
|
|
@@ -242,7 +246,7 @@ export function createModelLimitMiddleware(options: IModelLimitMiddlewareOptions
|
|
|
242
246
|
const headers = result.response?.headers;
|
|
243
247
|
return {
|
|
244
248
|
...result,
|
|
245
|
-
stream: result.stream.pipeThrough(new TransformStream<LanguageModelV4StreamPart, LanguageModelV4StreamPart>({
|
|
249
|
+
stream: result.stream.pipeThrough(new TransformStream<plugins.LanguageModelV4StreamPart, plugins.LanguageModelV4StreamPart>({
|
|
246
250
|
transform: (part, controller) => {
|
|
247
251
|
controller.enqueue(part.type === 'error' ? { ...part, error: classifyError(part.error, headers) } : part);
|
|
248
252
|
},
|