@modelprofile.com/flexharness-models 9.2.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.
@@ -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 { generateText, streamText, tool, jsonSchema } from 'ai';
6
- export type { ModelMessage, ToolSet, StreamTextResult } from 'ai';
5
+ export * from './smartai.failures.js';
6
+ export { generateText, streamText, tool, jsonSchema } from './plugins.js';
7
+ export type { ModelMessage, ToolSet, StreamTextResult } from './plugins.js';
@@ -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 { generateText, streamText, tool, jsonSchema } from 'ai';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19tb2RlbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDIn0=
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 { JSONObject, LanguageModelV3, LanguageModelV4 } from '@ai-sdk/provider';
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;
@@ -21,4 +21,4 @@ export interface IModelProvider<TOptions extends ISmartAiOptions = ISmartAiOptio
21
21
  readonly id: string;
22
22
  getModel(options: TOptions): TModel;
23
23
  }
24
- export type { JSONObject, LanguageModelV3, LanguageModelV3Prompt, LanguageModelV4, LanguageModelV4Prompt } from '@ai-sdk/provider';
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 { LanguageModelV4Middleware, LanguageModelV4Prompt } from '@ai-sdk/provider';
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX21vZGVscy9zbWFydGFpLmNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTZCQSxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFFBQW9CLEVBQUUsU0FBc0I7SUFDckUsTUFBTSxNQUFNLEdBQWUsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDO0lBRTNDLElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFFOUIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0IsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLFFBQXNCLEVBQUUsS0FBbUIsQ0FBQyxDQUFDO1lBQzdFLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQWtCLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsMkJBQTJCLENBQ3pDLFFBQWtDLEVBQ2xDLFNBQW1DO0lBRW5DLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDaEMsSUFBSSxDQUFDLFNBQVM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUNoQyxPQUFPLGlCQUFpQixD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
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX21vZGVscy9zbWFydGFpLmNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXdCQSxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFFBQTRCLEVBQUUsU0FBOEI7SUFDckYsTUFBTSxNQUFNLEdBQXVCLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQztJQUVuRCxJQUFJLENBQUMsU0FBUztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBRTlCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxRQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztZQUM3RixTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUEwQixDQUFDO0lBQzNDLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEyQixDQUN6QyxRQUFrQyxFQUNsQyxTQUFtQztJQUVuQyxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hDLElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDaEMsT0FBTyxpQkFBaUIsQ0FBQyxRQUE4QixFQUFFLFNBQStCLENBQTRCLENBQUM7QUFDdkgsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsS0FBdUM7SUFDdEUsSUFBSSxLQUFLLEtBQUssS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3RDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDekUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEyQixDQUFDLFFBQWlCLEVBQUUsT0FBZ0I7SUFDN0UsTUFBTSxhQUFhLEdBQUcsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNwRCxNQUFNLFVBQVUsR0FBRyxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO0lBRWhELElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFBRSxPQUFPLFlBQVksQ0FBQztJQUM5RCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDeEQsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3hELElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN4RCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztRQUM5RixPQUFPLGtCQUFrQixDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDNUQsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFFMUYsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELE1BQU0sVUFBVSxxQ0FBcUMsQ0FDbkQsUUFBc0MsRUFDdEMsVUFBZ0MsRUFBRTtJQUVsQyxNQUFNLHFCQUFxQixHQUF1QjtRQUNoRCxJQUFJLEVBQUUsV0FBVztRQUNqQixHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDckQsQ0FBQztJQUVGLE1BQU0sZUFBZSxHQUE2RDtRQUNoRixTQUFTLEVBQUU7WUFDVCxTQUFTLEVBQUU7Z0JBQ1QsWUFBWSxFQUFFLHFCQUFxQjthQUNwQztTQUNGO1FBQ0QsVUFBVSxFQUFFO1lBQ1YsVUFBVSxFQUFFO2dCQUNWLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7YUFDcEM7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQLE9BQU8sRUFBRTtnQkFDUCxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO2FBQ2hDO1NBQ0Y7UUFDRCxnQkFBZ0IsRUFBRTtZQUNoQixnQkFBZ0IsRUFBRTtnQkFDaEIsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTthQUNyQztTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsT0FBTyxFQUFFO2dCQUNQLHFCQUFxQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTthQUM3QztTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsT0FBTyxFQUFFO2dCQUNQLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7YUFDcEM7U0FDRjtLQUNGLENBQUM7SUFFRixPQUFPLGVBQWUsQ0FBQyxRQUFRLENBQTRCLENBQUM7QUFDOUQsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQUMsUUFBc0M7SUFDMUUsT0FBTyxRQUFRLEtBQUssV0FBVyxJQUFJLFFBQVEsS0FBSyxTQUFTLENBQUM7QUFDNUQsQ0FBQztBQUVELFNBQVMsNEJBQTRCLENBQ25DLElBQU8sRUFDUCxRQUFpQztJQUVqQyxPQUFPO1FBQ0wsR0FBRyxJQUFJO1FBQ1AsZUFBZSxFQUFFLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO0tBQzdFLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxJQUFhO0lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDbEMsT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLHVCQUF1QixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUM7QUFDekYsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQzFCLE9BQThDLEVBQzlDLFFBQXNDLEVBQ3RDLE9BQTZCO0lBRTdCLE1BQU0sZUFBZSxHQUFHLHFDQUFxQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBRWhDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUYsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDckMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sdUJBQXVCLEdBQUcsT0FBaUYsQ0FBQztZQUNsSCxPQUFPO2dCQUNMLEdBQUcsdUJBQXVCO2dCQUMxQixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUNuQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDdkM7YUFDSCxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FDdkMsTUFBcUMsRUFDckMsVUFBZ0MsRUFBRTtJQUVsQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQztJQUNqRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3hDLE1BQU0sZ0JBQWdCLEdBQWEsRUFBRSxDQUFDO0lBQ3RDLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztJQUVwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsSUFBSSxXQUFXLEdBQUcsQ0FBQztnQkFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFDLFdBQVcsRUFBRSxDQUFDO1lBQ2QsU0FBUztRQUNYLENBQUM7UUFDRCxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELEtBQUssTUFBTSxLQUFLLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBRTVDLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUNuQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ3BELENBQUM7QUFDckMsQ0FBQztBQUVELE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxVQUFnQyxFQUFFO0lBQy9FLE9BQU87UUFDTCxvQkFBb0IsRUFBRSxJQUFJO1FBQzFCLGVBQWUsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0QyxHQUFHLE1BQU07WUFDVCxNQUFNLEVBQUUseUJBQXlCLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7U0FDMUQsQ0FBQztLQUNILENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxRQUFpQjtJQUN6QyxNQUFNLGFBQWEsR0FBRyxRQUFRLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3BELE9BQU8sYUFBYSxLQUFLLFFBQVEsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN2SCxDQUFDO0FBRUQsTUFBTSxVQUFVLDhCQUE4QixDQUFDLEtBSzlDO0lBQ0MsTUFBTSxZQUFZLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFELElBQUksQ0FBQyxZQUFZO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFcEMsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDaEQsT0FBTztZQUNMLE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUUsS0FBSztnQkFDWixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsS0FBSyxLQUFLLElBQUksWUFBWSxDQUFDLFNBQVMsS0FBSyxXQUFXO29CQUM1RSxDQUFDLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFO29CQUNsRCxDQUFDLENBQUMsR0FBRzt3QkFDSCxDQUFDLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUU7d0JBQ3ZDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDVjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELE1BQU0sVUFBVSxnQ0FBZ0MsQ0FBQyxLQU1oRDtJQUNDLE9BQU8sMkJBQTJCLENBQ2hDLDhCQUE4QixDQUFDLEtBQUssQ0FBQyxFQUNyQyxLQUFLLENBQUMsZUFBZSxDQUN0QixDQUFDO0FBQ0osQ0FBQyJ9
@@ -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 type { LanguageModelV4Middleware } from '@ai-sdk/provider';
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 { APICallError } from '@ai-sdk/provider';
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhaS5saW1pdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19tb2RlbHMvc21hcnRhaS5saW1pdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBa0RoRCwyRUFBMkU7QUFDM0UsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxDQUFDO0FBRS9DLHNFQUFzRTtBQUN0RSxNQUFNLGlCQUFpQixHQUFHLHFCQUFxQixDQUFDO0FBRWhELE1BQU0sZUFBZSxHQUErQixDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNsRixNQUFNLGNBQWMsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDbEQsTUFBTTtJQUNOLFVBQVU7SUFDVixVQUFVO0lBQ1YsY0FBYztJQUNkLFVBQVU7SUFDVixRQUFRO0NBQ1QsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBb0M7SUFDeEQsV0FBVyxFQUFFLGFBQWE7SUFDMUIsVUFBVSxFQUFFLFlBQVk7Q0FDekIsQ0FBQztBQUNGLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0FBRWpHLGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQWM7SUFDM0MsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxLQUFnQztRQUNsQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFjO0lBQ2pDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksMkJBQTJCLENBQUM7QUFDdEcsQ0FBQztB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
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.2.0",
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.79",
18
- "@ai-sdk/provider": "^4.0.8",
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`. A classifier receives the failure's `observedAt` time for relative
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.
@@ -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 { generateText, streamText, tool, jsonSchema } from 'ai';
6
- export type { ModelMessage, ToolSet, StreamTextResult } from 'ai';
5
+ export * from './smartai.failures.js';
6
+ export { generateText, streamText, tool, jsonSchema } from './plugins.js';
7
+ export type { ModelMessage, ToolSet, StreamTextResult } from './plugins.js';
@@ -1,8 +1,8 @@
1
- import type { JSONObject, LanguageModelV3, LanguageModelV4 } from '@ai-sdk/provider';
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;
@@ -29,4 +29,4 @@ export interface IModelProvider<
29
29
  getModel(options: TOptions): TModel;
30
30
  }
31
31
 
32
- export type { JSONObject, LanguageModelV3, LanguageModelV3Prompt, LanguageModelV4, LanguageModelV4Prompt } from '@ai-sdk/provider';
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 };
@@ -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`. A classifier receives the failure's `observedAt` time for relative
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 { APICallError } from '@ai-sdk/provider';
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
  },