@yadimon/prio-llm-router 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/dist/index.cjs +20 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,6 +17,7 @@ The package keeps the routing logic intentionally small and predictable while re
|
|
|
17
17
|
- Separate provider config and model target config
|
|
18
18
|
- Optional source builders for source-centric setup and strict free policies
|
|
19
19
|
- Non-streaming text generation and optional streaming
|
|
20
|
+
- Optional debug mode that mirrors attempt hooks to the console
|
|
20
21
|
- Built-in support for `google`, `openrouter`, `groq`, `mistral`, `cohere`, `perplexity`, `xai`, `togetherai`, `openai`, `anthropic`, `deepseek`, and generic `openai-compatible`
|
|
21
22
|
- Strict TypeScript types
|
|
22
23
|
- Hook points for attempt-level logging and telemetry
|
|
@@ -107,6 +108,7 @@ const router = createLlmRouter({
|
|
|
107
108
|
tier: 'paid',
|
|
108
109
|
},
|
|
109
110
|
],
|
|
111
|
+
debug: true,
|
|
110
112
|
hooks: {
|
|
111
113
|
onAttemptFailure(attempt) {
|
|
112
114
|
console.warn('LLM attempt failed:', attempt);
|
|
@@ -123,6 +125,8 @@ console.log(result.target);
|
|
|
123
125
|
console.log(result.attempts);
|
|
124
126
|
```
|
|
125
127
|
|
|
128
|
+
With `debug: true`, the router writes `attempt:start`, `attempt:success`, and `attempt:failure` events to the console while still calling your custom hooks.
|
|
129
|
+
|
|
126
130
|
## Basic Mental Model
|
|
127
131
|
|
|
128
132
|
There are two separate layers:
|
|
@@ -303,6 +307,26 @@ Common model-level fields:
|
|
|
303
307
|
- `tier`
|
|
304
308
|
- `metadata`
|
|
305
309
|
|
|
310
|
+
## Debug Mode And Hooks
|
|
311
|
+
|
|
312
|
+
Use `debug: true` when you want the router to mirror attempt hooks to the console during development.
|
|
313
|
+
|
|
314
|
+
```ts
|
|
315
|
+
const router = createLlmRouter({
|
|
316
|
+
debug: true,
|
|
317
|
+
providers,
|
|
318
|
+
models,
|
|
319
|
+
});
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
That debug mode is intentionally small:
|
|
323
|
+
|
|
324
|
+
- `console.log('[prio-llm-router] attempt:start', attempt)`
|
|
325
|
+
- `console.log('[prio-llm-router] attempt:success', attempt)`
|
|
326
|
+
- `console.error('[prio-llm-router] attempt:failure', attempt)`
|
|
327
|
+
|
|
328
|
+
If you also pass `hooks`, both stay active. Debug mode does not replace custom telemetry.
|
|
329
|
+
|
|
306
330
|
## Supported Providers
|
|
307
331
|
|
|
308
332
|
- `google`
|
package/dist/index.cjs
CHANGED
|
@@ -437,7 +437,7 @@ var PrioLlmRouter = class {
|
|
|
437
437
|
);
|
|
438
438
|
}
|
|
439
439
|
this.defaultChain = normalized.defaultChain;
|
|
440
|
-
this.hooks = options.hooks;
|
|
440
|
+
this.hooks = createRouterHooks(options.hooks, options.debug === true);
|
|
441
441
|
this.executor = options.executor ?? (options.defaultProviderMaxRetries === void 0 ? createDefaultTextGenerationExecutor() : createDefaultTextGenerationExecutor({
|
|
442
442
|
defaultProviderMaxRetries: options.defaultProviderMaxRetries
|
|
443
443
|
}));
|
|
@@ -1061,6 +1061,25 @@ function delay(ms) {
|
|
|
1061
1061
|
setTimeout(resolve, ms);
|
|
1062
1062
|
});
|
|
1063
1063
|
}
|
|
1064
|
+
function createRouterHooks(hooks, debug) {
|
|
1065
|
+
if (!debug) {
|
|
1066
|
+
return hooks;
|
|
1067
|
+
}
|
|
1068
|
+
return {
|
|
1069
|
+
onAttemptStart: (attempt) => {
|
|
1070
|
+
console.log("[prio-llm-router] attempt:start", attempt);
|
|
1071
|
+
hooks?.onAttemptStart?.(attempt);
|
|
1072
|
+
},
|
|
1073
|
+
onAttemptSuccess: (attempt) => {
|
|
1074
|
+
console.log("[prio-llm-router] attempt:success", attempt);
|
|
1075
|
+
hooks?.onAttemptSuccess?.(attempt);
|
|
1076
|
+
},
|
|
1077
|
+
onAttemptFailure: (attempt) => {
|
|
1078
|
+
console.error("[prio-llm-router] attempt:failure", attempt);
|
|
1079
|
+
hooks?.onAttemptFailure?.(attempt);
|
|
1080
|
+
}
|
|
1081
|
+
};
|
|
1082
|
+
}
|
|
1064
1083
|
|
|
1065
1084
|
exports.AllModelsFailedError = AllModelsFailedError;
|
|
1066
1085
|
exports.PrioLlmRouter = PrioLlmRouter;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/provider-factory.ts","../src/source-builders.ts","../src/prio-llm-router.ts"],"names":["generateText","streamText","createAnthropic","createCohere","createDeepSeek","createGoogleGenerativeAI","createGroq","createMistral","createOpenAI","createOpenAICompatible","createOpenRouter","createPerplexity","createTogetherAI","createXai"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { AttemptRecord, SerializedError } from './types.js';\n\nexport class PrioLlmRouterError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\nexport class RouterConfigurationError extends PrioLlmRouterError {}\n\nexport class AllModelsFailedError extends PrioLlmRouterError {\n readonly attempts: AttemptRecord[];\n\n constructor(attempts: AttemptRecord[], cause?: unknown) {\n super(buildFailureMessage(attempts), { cause });\n this.attempts = attempts;\n }\n}\n\nexport function serializeError(error: unknown): SerializedError {\n if (error instanceof Error) {\n const maybeError = error as Error & {\n code?: string;\n statusCode?: number;\n status?: number;\n };\n\n const serialized: SerializedError = {\n name: error.name,\n message: error.message,\n };\n\n if (maybeError.code !== undefined) {\n serialized.code = maybeError.code;\n }\n\n const statusCode = maybeError.statusCode ?? maybeError.status;\n if (statusCode !== undefined) {\n serialized.statusCode = statusCode;\n }\n\n return serialized;\n }\n\n if (typeof error === 'string') {\n return {\n name: 'Error',\n message: error,\n };\n }\n\n return {\n name: 'UnknownError',\n message: 'Unknown router error',\n };\n}\n\nexport function isAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === 'AbortError' || error.name === 'TimeoutError';\n}\n\nfunction buildFailureMessage(attempts: AttemptRecord[]): string {\n const summary = attempts\n .map((attempt) => {\n const errorMessage = attempt.error?.message ?? 'Unknown error';\n return `${attempt.targetName} (${attempt.providerName}/${attempt.model}): ${errorMessage}`;\n })\n .join('; ');\n\n return summary\n ? `All configured model attempts failed. ${summary}`\n : 'All configured model attempts failed.';\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createCohere } from '@ai-sdk/cohere';\nimport { createDeepSeek } from '@ai-sdk/deepseek';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { createGroq } from '@ai-sdk/groq';\nimport { createMistral } from '@ai-sdk/mistral';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport { createPerplexity } from '@ai-sdk/perplexity';\nimport { createTogetherAI } from '@ai-sdk/togetherai';\nimport { createXai } from '@ai-sdk/xai';\nimport { generateText, streamText, type LanguageModel } from 'ai';\nimport { createOpenRouter } from '@openrouter/ai-sdk-provider';\n\nimport { RouterConfigurationError } from './errors.js';\nimport type {\n ExecuteStreamTextTargetResult,\n ExecuteTextTargetInput,\n ExecuteTextTargetResult,\n OpenRouterProviderConfig,\n ProviderConfig,\n TextGenerationExecutor,\n TokenUsage,\n} from './types.js';\n\ntype AiSdkGenerateTextOptions = Parameters<typeof generateText>[0];\ntype AiSdkStreamTextOptions = Parameters<typeof streamText>[0];\ntype ProviderHandle =\n | ((modelId: string) => LanguageModel)\n | {\n languageModel?: (modelId: string) => LanguageModel;\n chat?: (modelId: string) => LanguageModel;\n chatModel?: (modelId: string) => LanguageModel;\n };\n\nexport function createDefaultTextGenerationExecutor(options?: {\n defaultProviderMaxRetries?: number;\n}): TextGenerationExecutor {\n return new AiSdkTextGenerationExecutor(options?.defaultProviderMaxRetries ?? 0);\n}\n\nclass AiSdkTextGenerationExecutor implements TextGenerationExecutor {\n private readonly providerCache = new Map<string, ProviderHandle>();\n\n constructor(private readonly defaultProviderMaxRetries: number) {}\n\n async execute({\n provider,\n model,\n request,\n }: ExecuteTextTargetInput): Promise<ExecuteTextTargetResult> {\n const languageModel = this.getLanguageModel(provider, model.model);\n const call = buildBaseTextCallOptions({\n languageModel,\n request,\n defaultProviderMaxRetries: this.defaultProviderMaxRetries,\n }) as AiSdkGenerateTextOptions;\n\n const result = await generateText(call);\n\n const output: ExecuteTextTargetResult = {\n text: result.text,\n finishReason: result.finishReason ?? null,\n raw: result,\n };\n\n const usage = normalizeUsage(result.usage);\n if (usage) {\n output.usage = usage;\n }\n\n const warnings = normalizeWarnings(result.warnings);\n if (warnings) {\n output.warnings = warnings;\n }\n\n return output;\n }\n\n async stream({\n provider,\n model,\n request,\n }: ExecuteTextTargetInput): Promise<ExecuteStreamTextTargetResult> {\n await Promise.resolve();\n\n const languageModel = this.getLanguageModel(provider, model.model);\n\n const call = buildBaseTextCallOptions({\n languageModel,\n request,\n defaultProviderMaxRetries: this.defaultProviderMaxRetries,\n }) as AiSdkStreamTextOptions;\n\n const result = streamText(call);\n\n return {\n textStream: result.textStream,\n consumeStream: async () => {\n await result.consumeStream();\n },\n finishReason: Promise.resolve(result.finishReason).then(\n (value) => value ?? null,\n ),\n usage: Promise.resolve(result.totalUsage).then((value) =>\n normalizeUsage(value),\n ),\n warnings: Promise.resolve(result.warnings).then((value) =>\n normalizeWarnings(value),\n ),\n raw: result,\n };\n }\n\n private getLanguageModel(\n provider: ProviderConfig,\n modelId: string,\n ): LanguageModel {\n const handle =\n this.providerCache.get(provider.name) ?? createProviderHandle(provider);\n\n if (!this.providerCache.has(provider.name)) {\n this.providerCache.set(provider.name, handle);\n }\n\n return resolveLanguageModel(handle, modelId, provider.name);\n }\n}\n\nfunction buildBaseTextCallOptions({\n languageModel,\n request,\n defaultProviderMaxRetries,\n}: {\n languageModel: LanguageModel;\n request: ExecuteTextTargetInput['request'];\n defaultProviderMaxRetries: number;\n}): Record<string, unknown> {\n const call: AiSdkGenerateTextOptions = {\n model: languageModel,\n system: request.system,\n temperature: request.temperature,\n topP: request.topP,\n maxRetries: request.providerMaxRetries ?? defaultProviderMaxRetries,\n abortSignal: request.abortSignal,\n } as AiSdkGenerateTextOptions;\n\n if (request.maxOutputTokens !== undefined) {\n (\n call as AiSdkGenerateTextOptions & {\n maxOutputTokens?: number;\n }\n ).maxOutputTokens = request.maxOutputTokens;\n }\n\n if (request.stopSequences !== undefined) {\n (\n call as AiSdkGenerateTextOptions & {\n stopSequences?: string[];\n }\n ).stopSequences = request.stopSequences;\n }\n\n if ('prompt' in request) {\n (\n call as AiSdkGenerateTextOptions & {\n prompt?: string;\n }\n ).prompt = request.prompt;\n } else {\n (\n call as AiSdkGenerateTextOptions & {\n messages?: ExecuteTextTargetInput['request']['messages'];\n }\n ).messages = request.messages;\n }\n\n return call as Record<string, unknown>;\n}\n\nfunction createProviderHandle(provider: ProviderConfig): ProviderHandle {\n const apiKey = provider.auth.apiKey.trim();\n\n if (!apiKey) {\n throw new RouterConfigurationError(\n `Provider \"${provider.name}\" is missing an API key.`,\n );\n }\n\n switch (provider.type) {\n case 'anthropic': {\n const options: Parameters<typeof createAnthropic>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createAnthropic(options);\n }\n\n case 'cohere': {\n const options: Parameters<typeof createCohere>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createCohere(options);\n }\n\n case 'deepseek': {\n const options: Parameters<typeof createDeepSeek>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createDeepSeek(options);\n }\n\n case 'google': {\n const options: Parameters<typeof createGoogleGenerativeAI>[0] = {\n apiKey,\n };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createGoogleGenerativeAI(options);\n }\n\n case 'groq': {\n const options: Parameters<typeof createGroq>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createGroq(options);\n }\n\n case 'mistral': {\n const options: Parameters<typeof createMistral>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createMistral(options);\n }\n\n case 'openai': {\n const options: Parameters<typeof createOpenAI>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createOpenAI(options);\n }\n\n case 'openai-compatible': {\n const options: Parameters<typeof createOpenAICompatible>[0] = {\n name: provider.providerLabel ?? provider.name,\n apiKey,\n baseURL: provider.baseURL,\n };\n if (provider.headers) {\n options.headers = provider.headers;\n }\n if (provider.queryParams) {\n options.queryParams = provider.queryParams;\n }\n return createOpenAICompatible(options);\n }\n\n case 'openrouter': {\n const options: NonNullable<Parameters<typeof createOpenRouter>[0]> = {\n apiKey,\n };\n const headers = buildOpenRouterHeaders(provider);\n if (headers) {\n options.headers = headers;\n }\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n return createOpenRouter(options);\n }\n\n case 'perplexity': {\n const options: Parameters<typeof createPerplexity>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createPerplexity(options);\n }\n\n case 'togetherai': {\n const options: Parameters<typeof createTogetherAI>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createTogetherAI(options);\n }\n\n case 'xai': {\n const options: Parameters<typeof createXai>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createXai(options);\n }\n\n default: {\n const exhaustiveCheck: never = provider;\n throw new RouterConfigurationError(\n `Unsupported provider type: ${JSON.stringify(exhaustiveCheck)}`,\n );\n }\n }\n}\n\nfunction buildOpenRouterHeaders(\n provider: OpenRouterProviderConfig,\n): Record<string, string> | undefined {\n const headers = { ...provider.headers };\n\n if (provider.appUrl) {\n headers['HTTP-Referer'] = provider.appUrl;\n }\n\n if (provider.appName) {\n headers['X-Title'] = provider.appName;\n }\n\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction resolveLanguageModel(\n providerHandle: ProviderHandle,\n modelId: string,\n providerName: string,\n): LanguageModel {\n if (typeof providerHandle === 'function') {\n return providerHandle(modelId);\n }\n\n const dynamicHandle = providerHandle as Record<string, unknown>;\n const candidates = ['languageModel', 'chatModel', 'chat'];\n\n for (const candidate of candidates) {\n const factory = dynamicHandle[candidate];\n if (typeof factory === 'function') {\n return (factory as (id: string) => LanguageModel)(modelId);\n }\n }\n\n throw new RouterConfigurationError(\n `Provider \"${providerName}\" does not expose a supported language model factory.`,\n );\n}\n\nfunction normalizeUsage(usage: unknown): TokenUsage | undefined {\n if (!usage || typeof usage !== 'object') {\n return undefined;\n }\n\n const numericUsage = usage as Record<string, unknown>;\n const normalized: TokenUsage = {};\n\n const keys: Array<keyof TokenUsage> = [\n 'inputTokens',\n 'outputTokens',\n 'totalTokens',\n 'reasoningTokens',\n 'cachedInputTokens',\n ];\n\n for (const key of keys) {\n const value = numericUsage[key];\n if (typeof value === 'number') {\n normalized[key] = value;\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nfunction normalizeWarnings(warnings: unknown): unknown[] | undefined {\n return Array.isArray(warnings) ? warnings : undefined;\n}\n","import { RouterConfigurationError } from './errors.js';\nimport type {\n LlmConnection,\n LlmSource,\n LlmSourceConfig,\n OpenAICompatibleProviderConfig,\n OpenAICompatibleConnectionInput,\n OpenRouterConnectionInput,\n OpenRouterFreeSourceInput,\n OpenRouterProviderConfig,\n ProviderConfig,\n} from './types.js';\n\nexport function createLlmConnection<TProvider extends ProviderConfig>(\n provider: TProvider,\n): LlmConnection<TProvider> {\n assertConnectionProviderName(provider);\n\n return {\n provider,\n };\n}\n\nexport function createOpenRouterConnection(\n provider: OpenRouterConnectionInput,\n): LlmConnection<OpenRouterProviderConfig> {\n return createLlmConnection({\n ...provider,\n type: 'openrouter',\n });\n}\n\nexport function createOpenAICompatibleConnection(\n provider: OpenAICompatibleConnectionInput,\n): LlmConnection<OpenAICompatibleProviderConfig> {\n return createLlmConnection({\n ...provider,\n type: 'openai-compatible',\n });\n}\n\nexport function createLlmSource<TProvider extends ProviderConfig>(\n connection: LlmConnection<TProvider>,\n config: LlmSourceConfig<TProvider>,\n): LlmSource<TProvider> {\n assertSourceConfig(config);\n\n const normalizedConfig =\n config.access === 'free'\n ? config\n : ({\n ...config,\n access: 'standard',\n } satisfies LlmSourceConfig<TProvider>);\n\n return {\n connection,\n config: normalizedConfig,\n };\n}\n\nexport function createOpenRouterFreeSource(\n connection: LlmConnection<OpenRouterProviderConfig>,\n config: OpenRouterFreeSourceInput,\n): LlmSource<OpenRouterProviderConfig> {\n return createLlmSource(connection, {\n ...config,\n access: 'free',\n });\n}\n\nfunction assertConnectionProviderName(provider: ProviderConfig): void {\n if (!provider.name.trim()) {\n throw new RouterConfigurationError(\n 'Connection provider names must be non-empty.',\n );\n }\n}\n\nfunction assertSourceConfig(config: LlmSourceConfig): void {\n if (!config.name.trim()) {\n throw new RouterConfigurationError('Source names must be non-empty.');\n }\n\n if (!config.model.trim()) {\n throw new RouterConfigurationError('Source models must be non-empty.');\n }\n}\n","import { AllModelsFailedError, RouterConfigurationError, isAbortError, serializeError } from './errors.js';\nimport { createDefaultTextGenerationExecutor } from './provider-factory.js';\nimport type {\n AttemptRecord,\n ExecuteStreamTextTargetResult,\n LlmSource,\n ModelConfig,\n PendingAttempt,\n PrioLlmRouterOptions,\n ProviderConfig,\n ResolvedModelTarget,\n RouterGenerateTextRequest,\n RouterGenerateTextResult,\n RouterStreamTextRequest,\n RouterStreamTextResult,\n TextGenerationExecutor,\n} from './types.js';\n\ninterface IndexedModel extends ModelConfig {\n readonly __index: number;\n}\n\ninterface NormalizedRouterConfig {\n providers: ProviderConfig[];\n models: ModelConfig[];\n defaultChain?: string[];\n}\n\nexport class PrioLlmRouter {\n private readonly providersByName = new Map<string, ProviderConfig>();\n private readonly modelsByName = new Map<string, IndexedModel>();\n private readonly defaultChain: string[] | undefined;\n private readonly executor: TextGenerationExecutor;\n private readonly hooks: PrioLlmRouterOptions['hooks'] | undefined;\n\n constructor(options: PrioLlmRouterOptions) {\n const normalized = resolveRouterConfig(options);\n\n if (normalized.providers.length === 0) {\n throw new RouterConfigurationError(\n 'At least one provider configuration is required.',\n );\n }\n\n if (normalized.models.length === 0) {\n throw new RouterConfigurationError(\n 'At least one model configuration is required.',\n );\n }\n\n this.defaultChain = normalized.defaultChain;\n this.hooks = options.hooks;\n this.executor = options.executor ?? (\n options.defaultProviderMaxRetries === undefined\n ? createDefaultTextGenerationExecutor()\n : createDefaultTextGenerationExecutor({\n defaultProviderMaxRetries: options.defaultProviderMaxRetries,\n })\n );\n\n for (const provider of normalized.providers) {\n this.assertUniqueName(\n this.providersByName,\n provider.name,\n 'provider configuration',\n );\n this.validateProvider(provider);\n this.providersByName.set(provider.name, provider);\n }\n\n normalized.models.forEach((model, index) => {\n this.assertUniqueName(this.modelsByName, model.name, 'model configuration');\n\n if (!this.providersByName.has(model.provider)) {\n throw new RouterConfigurationError(\n `Model \"${model.name}\" references unknown provider \"${model.provider}\".`,\n );\n }\n\n this.modelsByName.set(model.name, {\n ...model,\n __index: index,\n });\n });\n\n if (this.defaultChain) {\n this.resolveNamedChain(this.defaultChain);\n }\n }\n\n listProviders(): ProviderConfig[] {\n return [...this.providersByName.values()];\n }\n\n listModels(): ResolvedModelTarget[] {\n return [...this.modelsByName.values()]\n .sort(compareModels)\n .map((model) => this.toResolvedTarget(model));\n }\n\n async generateText(\n request: RouterGenerateTextRequest,\n ): Promise<RouterGenerateTextResult> {\n const chain = this.resolveExecutionChain(request.chain);\n const attempts: AttemptRecord[] = [];\n let lastError: unknown;\n\n for (const [index, model] of chain.entries()) {\n const provider = this.providersByName.get(model.provider);\n\n if (!provider) {\n throw new RouterConfigurationError(\n `Provider \"${model.provider}\" was not found for target \"${model.name}\".`,\n );\n }\n\n const pendingAttempt: PendingAttempt = {\n attemptIndex: index,\n targetName: model.name,\n providerName: provider.name,\n providerType: provider.type,\n model: model.model,\n startedAt: new Date(),\n };\n\n if (model.tier !== undefined) {\n pendingAttempt.tier = model.tier;\n }\n\n this.hooks?.onAttemptStart?.(pendingAttempt);\n\n try {\n const result = await this.executor.execute({\n provider,\n model,\n request,\n });\n\n const finishedAt = new Date();\n const attemptRecord: AttemptRecord = {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: true,\n };\n\n attempts.push(attemptRecord);\n this.hooks?.onAttemptSuccess?.(attemptRecord);\n\n const response: RouterGenerateTextResult = {\n text: result.text,\n target: this.toResolvedTarget(model),\n attempts,\n finishReason: result.finishReason,\n raw: result.raw,\n };\n\n if (result.usage) {\n response.usage = result.usage;\n }\n\n if (result.warnings) {\n response.warnings = result.warnings;\n }\n\n return response;\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n\n const finishedAt = new Date();\n const attemptRecord: AttemptRecord = {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: false,\n error: serializeError(error),\n };\n\n attempts.push(attemptRecord);\n this.hooks?.onAttemptFailure?.(attemptRecord);\n lastError = error;\n }\n }\n\n throw new AllModelsFailedError(attempts, lastError);\n }\n\n async streamText(\n request: RouterStreamTextRequest,\n ): Promise<RouterStreamTextResult> {\n const chain = this.resolveExecutionChain(request.chain);\n const attempts: AttemptRecord[] = [];\n let lastError: unknown;\n\n for (const [index, model] of chain.entries()) {\n const provider = this.providersByName.get(model.provider);\n\n if (!provider) {\n throw new RouterConfigurationError(\n `Provider \"${model.provider}\" was not found for target \"${model.name}\".`,\n );\n }\n\n const pendingAttempt = createPendingAttempt(index, provider, model);\n this.hooks?.onAttemptStart?.(pendingAttempt);\n\n const { controller, cleanup, parentAborted } = createLinkedAbortController(\n request.abortSignal,\n );\n\n try {\n const streamResult = await this.executor.stream({\n provider,\n model,\n request: {\n ...request,\n abortSignal: controller.signal,\n },\n });\n\n const iterator = streamResult.textStream[Symbol.asyncIterator]();\n const firstChunk = await this.waitForFirstChunk({\n iterator,\n timeoutMs: request.firstChunkTimeoutMs,\n abortController: controller,\n parentAborted,\n });\n\n if (firstChunk.done) {\n throw createEmptyFirstChunkError(model.name);\n }\n\n return this.createStreamingResult({\n pendingAttempt,\n attempts,\n model,\n iterator,\n streamResult,\n firstChunk: firstChunk.value,\n cleanupAbortLink: cleanup,\n });\n } catch (error) {\n cleanup();\n\n if (isAbortError(error) && parentAborted()) {\n throw error;\n }\n\n const attemptRecord = createFailedAttemptRecord(pendingAttempt, error);\n attempts.push(attemptRecord);\n this.hooks?.onAttemptFailure?.(attemptRecord);\n lastError = error;\n }\n }\n\n throw new AllModelsFailedError(attempts, lastError);\n }\n\n private createStreamingResult(options: {\n pendingAttempt: PendingAttempt;\n attempts: AttemptRecord[];\n model: IndexedModel;\n iterator: AsyncIterator<string>;\n streamResult: ExecuteStreamTextTargetResult;\n firstChunk: string;\n cleanupAbortLink: () => void;\n }): RouterStreamTextResult {\n const {\n pendingAttempt,\n attempts,\n model,\n iterator,\n streamResult,\n firstChunk,\n cleanupAbortLink,\n } = options;\n\n let started = false;\n const textParts = [firstChunk];\n\n let resolveFinal!: (value: RouterGenerateTextResult) => void;\n let rejectFinal!: (reason?: unknown) => void;\n let finalized = false;\n const final = new Promise<RouterGenerateTextResult>((resolve, reject) => {\n resolveFinal = resolve;\n rejectFinal = reject;\n });\n\n const finalizeSuccess = async (): Promise<void> => {\n if (finalized) {\n return;\n }\n finalized = true;\n\n const finishedAt = new Date();\n const attemptRecord: AttemptRecord = {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: true,\n };\n\n attempts.push(attemptRecord);\n this.hooks?.onAttemptSuccess?.(attemptRecord);\n\n const result: RouterGenerateTextResult = {\n text: textParts.join(''),\n target: this.toResolvedTarget(model),\n attempts: [...attempts],\n finishReason: await streamResult.finishReason,\n raw: streamResult.raw,\n };\n\n const usage = await streamResult.usage;\n if (usage) {\n result.usage = usage;\n }\n\n const warnings = await streamResult.warnings;\n if (warnings) {\n result.warnings = warnings;\n }\n\n cleanupAbortLink();\n resolveFinal(result);\n };\n\n const finalizeFailure = (error: unknown): void => {\n if (finalized) {\n return;\n }\n finalized = true;\n\n const attemptRecord = createFailedAttemptRecord(pendingAttempt, error);\n attempts.push(attemptRecord);\n this.hooks?.onAttemptFailure?.(attemptRecord);\n cleanupAbortLink();\n rejectFinal(error);\n };\n\n const wrappedStream: AsyncIterable<string> = {\n [Symbol.asyncIterator]: () => {\n if (started) {\n throw new RouterConfigurationError(\n 'This stream can only be consumed once.',\n );\n }\n\n started = true;\n\n return createRouterTextStreamIterator({\n firstChunk,\n iterator,\n onChunk: (chunk) => {\n textParts.push(chunk);\n },\n onSuccess: finalizeSuccess,\n onFailure: finalizeFailure,\n });\n },\n };\n\n return {\n target: this.toResolvedTarget(model),\n selectedAttempt: pendingAttempt,\n attempts: [...attempts],\n textStream: wrappedStream,\n final,\n consumeStream: async () => {\n if (!started) {\n for await (const _ of wrappedStream) {\n void _;\n }\n }\n\n return final;\n },\n };\n }\n\n private async waitForFirstChunk(options: {\n iterator: AsyncIterator<string>;\n timeoutMs: number | undefined;\n abortController: AbortController;\n parentAborted: () => boolean;\n }): Promise<IteratorResult<string>> {\n const { iterator, timeoutMs, abortController, parentAborted } = options;\n const nextPromise = iterator.next();\n\n if (timeoutMs === undefined) {\n return nextPromise;\n }\n\n const timeoutError = createFirstChunkTimeoutError(timeoutMs);\n\n const timedRace = await Promise.race([\n nextPromise.then(\n (value) => ({ kind: 'value' as const, value }),\n (error: unknown) => ({ kind: 'error' as const, error }),\n ),\n delay(timeoutMs).then(() => ({ kind: 'timeout' as const })),\n ]);\n\n if (timedRace.kind === 'value') {\n return timedRace.value;\n }\n\n if (timedRace.kind === 'timeout') {\n abortController.abort(timeoutError);\n void nextPromise.catch(() => undefined);\n throw timeoutError;\n }\n\n if (isAbortError(timedRace.error) && parentAborted()) {\n throw timedRace.error;\n }\n\n throw timedRace.error;\n }\n\n private resolveExecutionChain(chain?: string[]): IndexedModel[] {\n if (chain?.length) {\n return this.resolveNamedChain(chain);\n }\n\n if (this.defaultChain?.length) {\n return this.resolveNamedChain(this.defaultChain);\n }\n\n const implicitChain = [...this.modelsByName.values()]\n .filter((model) => this.isModelEnabled(model))\n .sort(compareModels);\n\n if (implicitChain.length === 0) {\n throw new RouterConfigurationError(\n 'No enabled model targets are available for execution.',\n );\n }\n\n return implicitChain;\n }\n\n private resolveNamedChain(chain: string[]): IndexedModel[] {\n const resolved: IndexedModel[] = [];\n const seen = new Set<string>();\n\n for (const targetName of chain) {\n if (seen.has(targetName)) {\n continue;\n }\n\n seen.add(targetName);\n const model = this.modelsByName.get(targetName);\n\n if (!model) {\n throw new RouterConfigurationError(\n `Model target \"${targetName}\" is not configured.`,\n );\n }\n\n if (!this.isModelEnabled(model)) {\n throw new RouterConfigurationError(\n `Model target \"${targetName}\" is disabled or its provider is disabled.`,\n );\n }\n\n resolved.push(model);\n }\n\n if (resolved.length === 0) {\n throw new RouterConfigurationError(\n 'The resolved execution chain is empty.',\n );\n }\n\n return resolved;\n }\n\n private isModelEnabled(model: ModelConfig): boolean {\n if (model.enabled === false) {\n return false;\n }\n\n const provider = this.providersByName.get(model.provider);\n return provider?.enabled !== false;\n }\n\n private toResolvedTarget(model: ModelConfig): ResolvedModelTarget {\n const provider = this.providersByName.get(model.provider);\n\n if (!provider) {\n throw new RouterConfigurationError(\n `Model \"${model.name}\" references missing provider \"${model.provider}\".`,\n );\n }\n\n const resolvedTarget: ResolvedModelTarget = {\n name: model.name,\n providerName: provider.name,\n providerType: provider.type,\n model: model.model,\n };\n\n if (model.priority !== undefined) {\n resolvedTarget.priority = model.priority;\n }\n\n if (model.tier !== undefined) {\n resolvedTarget.tier = model.tier;\n }\n\n if (model.metadata !== undefined) {\n resolvedTarget.metadata = model.metadata;\n }\n\n return resolvedTarget;\n }\n\n private validateProvider(provider: ProviderConfig): void {\n if (!provider.name.trim()) {\n throw new RouterConfigurationError(\n 'Provider configuration names must be non-empty.',\n );\n }\n\n if (!provider.auth.apiKey.trim()) {\n throw new RouterConfigurationError(\n `Provider \"${provider.name}\" requires a non-empty API key.`,\n );\n }\n }\n\n private assertUniqueName(\n registry: Map<string, unknown>,\n name: string,\n label: string,\n ): void {\n if (!name.trim()) {\n throw new RouterConfigurationError(`${label} names must be non-empty.`);\n }\n\n if (registry.has(name)) {\n throw new RouterConfigurationError(\n `Duplicate ${label} name \"${name}\" detected.`,\n );\n }\n }\n}\n\nexport function createLlmRouter(\n options: PrioLlmRouterOptions,\n): PrioLlmRouter {\n return new PrioLlmRouter(options);\n}\n\nfunction resolveRouterConfig(\n options: PrioLlmRouterOptions,\n): NormalizedRouterConfig {\n if ('sources' in options) {\n return compileSources(options.sources, options.defaultChain);\n }\n\n const normalized: NormalizedRouterConfig = {\n providers: options.providers,\n models: options.models,\n };\n\n if (options.defaultChain !== undefined) {\n normalized.defaultChain = options.defaultChain;\n }\n\n return normalized;\n}\n\nfunction compareModels(left: IndexedModel, right: IndexedModel): number {\n const leftPriority = left.priority ?? Number.MAX_SAFE_INTEGER;\n const rightPriority = right.priority ?? Number.MAX_SAFE_INTEGER;\n\n if (leftPriority !== rightPriority) {\n return leftPriority - rightPriority;\n }\n\n return left.__index - right.__index;\n}\n\nfunction compileSources(\n sources: LlmSource[],\n defaultChain?: string[],\n): NormalizedRouterConfig {\n const providersByName = new Map<string, ProviderConfig>();\n const models: ModelConfig[] = [];\n\n for (const source of sources) {\n const provider = source.connection.provider;\n const providerName = provider.name.trim();\n const modelId = source.config.model.trim();\n const access = source.config.access ?? 'standard';\n\n if (!providerName) {\n throw new RouterConfigurationError(\n 'Connection provider names must be non-empty.',\n );\n }\n\n if (!source.config.name.trim()) {\n throw new RouterConfigurationError('Source names must be non-empty.');\n }\n\n if (!modelId) {\n throw new RouterConfigurationError('Source models must be non-empty.');\n }\n\n const existingProvider = providersByName.get(providerName);\n if (existingProvider) {\n assertMatchingSourceProvider(existingProvider, provider);\n } else {\n providersByName.set(providerName, provider);\n }\n\n if (access === 'free') {\n assertGuaranteedFreeSource(provider, source.config.model);\n }\n\n if (access === 'free' && source.config.tier === 'paid') {\n throw new RouterConfigurationError(\n `Free source \"${source.config.name}\" cannot be marked as paid.`,\n );\n }\n\n const compiledModel: ModelConfig = {\n name: source.config.name,\n provider: providerName,\n model: modelId,\n };\n\n if (source.config.enabled !== undefined) {\n compiledModel.enabled = source.config.enabled;\n }\n\n if (source.config.priority !== undefined) {\n compiledModel.priority = source.config.priority;\n }\n\n const tier = source.config.tier ?? (access === 'free' ? 'free' : undefined);\n if (tier !== undefined) {\n compiledModel.tier = tier;\n }\n\n if (source.config.metadata !== undefined) {\n compiledModel.metadata = source.config.metadata;\n }\n\n models.push(compiledModel);\n }\n\n const normalized: NormalizedRouterConfig = {\n providers: [...providersByName.values()],\n models,\n };\n\n if (defaultChain !== undefined) {\n normalized.defaultChain = defaultChain;\n }\n\n return normalized;\n}\n\nfunction assertMatchingSourceProvider(\n existingProvider: ProviderConfig,\n nextProvider: ProviderConfig,\n): void {\n if (JSON.stringify(existingProvider) === JSON.stringify(nextProvider)) {\n return;\n }\n\n throw new RouterConfigurationError(\n `Connection provider \"${existingProvider.name}\" is configured more than once with different settings.`,\n );\n}\n\nfunction assertGuaranteedFreeSource(\n provider: ProviderConfig,\n model: string,\n): void {\n if (provider.type !== 'openrouter') {\n throw new RouterConfigurationError(\n `Provider \"${provider.name}\" does not support strict free sources. Only OpenRouter with explicit \":free\" model variants is supported today.`,\n );\n }\n\n const normalizedModel = model.trim();\n\n if (normalizedModel === 'openrouter/free') {\n throw new RouterConfigurationError(\n `Free source \"${provider.name}\" cannot use \"openrouter/free\". Use an explicit \":free\" model id instead.`,\n );\n }\n\n if (!normalizedModel.endsWith(':free')) {\n throw new RouterConfigurationError(\n `Free OpenRouter sources must use an explicit \":free\" model id. Received \"${normalizedModel}\".`,\n );\n }\n}\n\nfunction createPendingAttempt(\n attemptIndex: number,\n provider: ProviderConfig,\n model: ModelConfig,\n): PendingAttempt {\n const pendingAttempt: PendingAttempt = {\n attemptIndex,\n targetName: model.name,\n providerName: provider.name,\n providerType: provider.type,\n model: model.model,\n startedAt: new Date(),\n };\n\n if (model.tier !== undefined) {\n pendingAttempt.tier = model.tier;\n }\n\n return pendingAttempt;\n}\n\nfunction createFailedAttemptRecord(\n pendingAttempt: PendingAttempt,\n error: unknown,\n): AttemptRecord {\n const finishedAt = new Date();\n\n return {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: false,\n error: serializeError(error),\n };\n}\n\nfunction createRouterTextStreamIterator(options: {\n firstChunk: string;\n iterator: AsyncIterator<string>;\n onChunk: (chunk: string) => void;\n onSuccess: () => Promise<void>;\n onFailure: (error: unknown) => void;\n}): AsyncIterator<string> {\n const { firstChunk, iterator, onChunk, onSuccess, onFailure } = options;\n let firstYielded = false;\n let finished = false;\n\n return {\n async next(): Promise<IteratorResult<string>> {\n if (finished) {\n return {\n done: true,\n value: undefined,\n };\n }\n\n if (!firstYielded) {\n firstYielded = true;\n return {\n done: false,\n value: firstChunk,\n };\n }\n\n try {\n const next = await iterator.next();\n\n if (next.done) {\n finished = true;\n await onSuccess();\n return {\n done: true,\n value: undefined,\n };\n }\n\n onChunk(next.value);\n return {\n done: false,\n value: next.value,\n };\n } catch (error) {\n finished = true;\n onFailure(error);\n throw error;\n }\n },\n async return(): Promise<IteratorResult<string>> {\n finished = true;\n onFailure(createStreamClosedEarlyError());\n\n if (typeof iterator.return === 'function') {\n await iterator.return();\n }\n\n return {\n done: true,\n value: undefined,\n };\n },\n async throw(error?: unknown): Promise<IteratorResult<string>> {\n finished = true;\n onFailure(error);\n\n if (typeof iterator.throw === 'function') {\n return iterator.throw(error);\n }\n\n throw error;\n },\n };\n}\n\nfunction createLinkedAbortController(parentSignal?: AbortSignal): {\n controller: AbortController;\n cleanup: () => void;\n parentAborted: () => boolean;\n} {\n const controller = new AbortController();\n let abortedByParent = false;\n\n const abortFromParent = (): void => {\n abortedByParent = true;\n controller.abort(parentSignal?.reason);\n };\n\n if (parentSignal?.aborted) {\n abortFromParent();\n } else {\n parentSignal?.addEventListener('abort', abortFromParent, { once: true });\n }\n\n return {\n controller,\n cleanup: () => {\n parentSignal?.removeEventListener('abort', abortFromParent);\n },\n parentAborted: () => abortedByParent,\n };\n}\n\nfunction createFirstChunkTimeoutError(timeoutMs: number): Error {\n const error = new Error(\n `The first stream chunk did not arrive within ${timeoutMs}ms.`,\n );\n error.name = 'FirstChunkTimeoutError';\n return error;\n}\n\nfunction createEmptyFirstChunkError(targetName: string): Error {\n const error = new Error(\n `Stream for target \"${targetName}\" completed before the first text chunk.`,\n );\n error.name = 'EmptyStreamError';\n return error;\n}\n\nfunction createStreamClosedEarlyError(): Error {\n const error = new Error('The stream was closed before completion.');\n error.name = 'StreamClosedError';\n return error;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/provider-factory.ts","../src/source-builders.ts","../src/prio-llm-router.ts"],"names":["generateText","streamText","createAnthropic","createCohere","createDeepSeek","createGoogleGenerativeAI","createGroq","createMistral","createOpenAI","createOpenAICompatible","createOpenRouter","createPerplexity","createTogetherAI","createXai"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { AttemptRecord, SerializedError } from './types.js';\n\nexport class PrioLlmRouterError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\nexport class RouterConfigurationError extends PrioLlmRouterError {}\n\nexport class AllModelsFailedError extends PrioLlmRouterError {\n readonly attempts: AttemptRecord[];\n\n constructor(attempts: AttemptRecord[], cause?: unknown) {\n super(buildFailureMessage(attempts), { cause });\n this.attempts = attempts;\n }\n}\n\nexport function serializeError(error: unknown): SerializedError {\n if (error instanceof Error) {\n const maybeError = error as Error & {\n code?: string;\n statusCode?: number;\n status?: number;\n };\n\n const serialized: SerializedError = {\n name: error.name,\n message: error.message,\n };\n\n if (maybeError.code !== undefined) {\n serialized.code = maybeError.code;\n }\n\n const statusCode = maybeError.statusCode ?? maybeError.status;\n if (statusCode !== undefined) {\n serialized.statusCode = statusCode;\n }\n\n return serialized;\n }\n\n if (typeof error === 'string') {\n return {\n name: 'Error',\n message: error,\n };\n }\n\n return {\n name: 'UnknownError',\n message: 'Unknown router error',\n };\n}\n\nexport function isAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === 'AbortError' || error.name === 'TimeoutError';\n}\n\nfunction buildFailureMessage(attempts: AttemptRecord[]): string {\n const summary = attempts\n .map((attempt) => {\n const errorMessage = attempt.error?.message ?? 'Unknown error';\n return `${attempt.targetName} (${attempt.providerName}/${attempt.model}): ${errorMessage}`;\n })\n .join('; ');\n\n return summary\n ? `All configured model attempts failed. ${summary}`\n : 'All configured model attempts failed.';\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createCohere } from '@ai-sdk/cohere';\nimport { createDeepSeek } from '@ai-sdk/deepseek';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { createGroq } from '@ai-sdk/groq';\nimport { createMistral } from '@ai-sdk/mistral';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport { createPerplexity } from '@ai-sdk/perplexity';\nimport { createTogetherAI } from '@ai-sdk/togetherai';\nimport { createXai } from '@ai-sdk/xai';\nimport { generateText, streamText, type LanguageModel } from 'ai';\nimport { createOpenRouter } from '@openrouter/ai-sdk-provider';\n\nimport { RouterConfigurationError } from './errors.js';\nimport type {\n ExecuteStreamTextTargetResult,\n ExecuteTextTargetInput,\n ExecuteTextTargetResult,\n OpenRouterProviderConfig,\n ProviderConfig,\n TextGenerationExecutor,\n TokenUsage,\n} from './types.js';\n\ntype AiSdkGenerateTextOptions = Parameters<typeof generateText>[0];\ntype AiSdkStreamTextOptions = Parameters<typeof streamText>[0];\ntype ProviderHandle =\n | ((modelId: string) => LanguageModel)\n | {\n languageModel?: (modelId: string) => LanguageModel;\n chat?: (modelId: string) => LanguageModel;\n chatModel?: (modelId: string) => LanguageModel;\n };\n\nexport function createDefaultTextGenerationExecutor(options?: {\n defaultProviderMaxRetries?: number;\n}): TextGenerationExecutor {\n return new AiSdkTextGenerationExecutor(options?.defaultProviderMaxRetries ?? 0);\n}\n\nclass AiSdkTextGenerationExecutor implements TextGenerationExecutor {\n private readonly providerCache = new Map<string, ProviderHandle>();\n\n constructor(private readonly defaultProviderMaxRetries: number) {}\n\n async execute({\n provider,\n model,\n request,\n }: ExecuteTextTargetInput): Promise<ExecuteTextTargetResult> {\n const languageModel = this.getLanguageModel(provider, model.model);\n const call = buildBaseTextCallOptions({\n languageModel,\n request,\n defaultProviderMaxRetries: this.defaultProviderMaxRetries,\n }) as AiSdkGenerateTextOptions;\n\n const result = await generateText(call);\n\n const output: ExecuteTextTargetResult = {\n text: result.text,\n finishReason: result.finishReason ?? null,\n raw: result,\n };\n\n const usage = normalizeUsage(result.usage);\n if (usage) {\n output.usage = usage;\n }\n\n const warnings = normalizeWarnings(result.warnings);\n if (warnings) {\n output.warnings = warnings;\n }\n\n return output;\n }\n\n async stream({\n provider,\n model,\n request,\n }: ExecuteTextTargetInput): Promise<ExecuteStreamTextTargetResult> {\n await Promise.resolve();\n\n const languageModel = this.getLanguageModel(provider, model.model);\n\n const call = buildBaseTextCallOptions({\n languageModel,\n request,\n defaultProviderMaxRetries: this.defaultProviderMaxRetries,\n }) as AiSdkStreamTextOptions;\n\n const result = streamText(call);\n\n return {\n textStream: result.textStream,\n consumeStream: async () => {\n await result.consumeStream();\n },\n finishReason: Promise.resolve(result.finishReason).then(\n (value) => value ?? null,\n ),\n usage: Promise.resolve(result.totalUsage).then((value) =>\n normalizeUsage(value),\n ),\n warnings: Promise.resolve(result.warnings).then((value) =>\n normalizeWarnings(value),\n ),\n raw: result,\n };\n }\n\n private getLanguageModel(\n provider: ProviderConfig,\n modelId: string,\n ): LanguageModel {\n const handle =\n this.providerCache.get(provider.name) ?? createProviderHandle(provider);\n\n if (!this.providerCache.has(provider.name)) {\n this.providerCache.set(provider.name, handle);\n }\n\n return resolveLanguageModel(handle, modelId, provider.name);\n }\n}\n\nfunction buildBaseTextCallOptions({\n languageModel,\n request,\n defaultProviderMaxRetries,\n}: {\n languageModel: LanguageModel;\n request: ExecuteTextTargetInput['request'];\n defaultProviderMaxRetries: number;\n}): Record<string, unknown> {\n const call: AiSdkGenerateTextOptions = {\n model: languageModel,\n system: request.system,\n temperature: request.temperature,\n topP: request.topP,\n maxRetries: request.providerMaxRetries ?? defaultProviderMaxRetries,\n abortSignal: request.abortSignal,\n } as AiSdkGenerateTextOptions;\n\n if (request.maxOutputTokens !== undefined) {\n (\n call as AiSdkGenerateTextOptions & {\n maxOutputTokens?: number;\n }\n ).maxOutputTokens = request.maxOutputTokens;\n }\n\n if (request.stopSequences !== undefined) {\n (\n call as AiSdkGenerateTextOptions & {\n stopSequences?: string[];\n }\n ).stopSequences = request.stopSequences;\n }\n\n if ('prompt' in request) {\n (\n call as AiSdkGenerateTextOptions & {\n prompt?: string;\n }\n ).prompt = request.prompt;\n } else {\n (\n call as AiSdkGenerateTextOptions & {\n messages?: ExecuteTextTargetInput['request']['messages'];\n }\n ).messages = request.messages;\n }\n\n return call as Record<string, unknown>;\n}\n\nfunction createProviderHandle(provider: ProviderConfig): ProviderHandle {\n const apiKey = provider.auth.apiKey.trim();\n\n if (!apiKey) {\n throw new RouterConfigurationError(\n `Provider \"${provider.name}\" is missing an API key.`,\n );\n }\n\n switch (provider.type) {\n case 'anthropic': {\n const options: Parameters<typeof createAnthropic>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createAnthropic(options);\n }\n\n case 'cohere': {\n const options: Parameters<typeof createCohere>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createCohere(options);\n }\n\n case 'deepseek': {\n const options: Parameters<typeof createDeepSeek>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createDeepSeek(options);\n }\n\n case 'google': {\n const options: Parameters<typeof createGoogleGenerativeAI>[0] = {\n apiKey,\n };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createGoogleGenerativeAI(options);\n }\n\n case 'groq': {\n const options: Parameters<typeof createGroq>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createGroq(options);\n }\n\n case 'mistral': {\n const options: Parameters<typeof createMistral>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createMistral(options);\n }\n\n case 'openai': {\n const options: Parameters<typeof createOpenAI>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createOpenAI(options);\n }\n\n case 'openai-compatible': {\n const options: Parameters<typeof createOpenAICompatible>[0] = {\n name: provider.providerLabel ?? provider.name,\n apiKey,\n baseURL: provider.baseURL,\n };\n if (provider.headers) {\n options.headers = provider.headers;\n }\n if (provider.queryParams) {\n options.queryParams = provider.queryParams;\n }\n return createOpenAICompatible(options);\n }\n\n case 'openrouter': {\n const options: NonNullable<Parameters<typeof createOpenRouter>[0]> = {\n apiKey,\n };\n const headers = buildOpenRouterHeaders(provider);\n if (headers) {\n options.headers = headers;\n }\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n return createOpenRouter(options);\n }\n\n case 'perplexity': {\n const options: Parameters<typeof createPerplexity>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createPerplexity(options);\n }\n\n case 'togetherai': {\n const options: Parameters<typeof createTogetherAI>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createTogetherAI(options);\n }\n\n case 'xai': {\n const options: Parameters<typeof createXai>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createXai(options);\n }\n\n default: {\n const exhaustiveCheck: never = provider;\n throw new RouterConfigurationError(\n `Unsupported provider type: ${JSON.stringify(exhaustiveCheck)}`,\n );\n }\n }\n}\n\nfunction buildOpenRouterHeaders(\n provider: OpenRouterProviderConfig,\n): Record<string, string> | undefined {\n const headers = { ...provider.headers };\n\n if (provider.appUrl) {\n headers['HTTP-Referer'] = provider.appUrl;\n }\n\n if (provider.appName) {\n headers['X-Title'] = provider.appName;\n }\n\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction resolveLanguageModel(\n providerHandle: ProviderHandle,\n modelId: string,\n providerName: string,\n): LanguageModel {\n if (typeof providerHandle === 'function') {\n return providerHandle(modelId);\n }\n\n const dynamicHandle = providerHandle as Record<string, unknown>;\n const candidates = ['languageModel', 'chatModel', 'chat'];\n\n for (const candidate of candidates) {\n const factory = dynamicHandle[candidate];\n if (typeof factory === 'function') {\n return (factory as (id: string) => LanguageModel)(modelId);\n }\n }\n\n throw new RouterConfigurationError(\n `Provider \"${providerName}\" does not expose a supported language model factory.`,\n );\n}\n\nfunction normalizeUsage(usage: unknown): TokenUsage | undefined {\n if (!usage || typeof usage !== 'object') {\n return undefined;\n }\n\n const numericUsage = usage as Record<string, unknown>;\n const normalized: TokenUsage = {};\n\n const keys: Array<keyof TokenUsage> = [\n 'inputTokens',\n 'outputTokens',\n 'totalTokens',\n 'reasoningTokens',\n 'cachedInputTokens',\n ];\n\n for (const key of keys) {\n const value = numericUsage[key];\n if (typeof value === 'number') {\n normalized[key] = value;\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nfunction normalizeWarnings(warnings: unknown): unknown[] | undefined {\n return Array.isArray(warnings) ? warnings : undefined;\n}\n","import { RouterConfigurationError } from './errors.js';\nimport type {\n LlmConnection,\n LlmSource,\n LlmSourceConfig,\n OpenAICompatibleProviderConfig,\n OpenAICompatibleConnectionInput,\n OpenRouterConnectionInput,\n OpenRouterFreeSourceInput,\n OpenRouterProviderConfig,\n ProviderConfig,\n} from './types.js';\n\nexport function createLlmConnection<TProvider extends ProviderConfig>(\n provider: TProvider,\n): LlmConnection<TProvider> {\n assertConnectionProviderName(provider);\n\n return {\n provider,\n };\n}\n\nexport function createOpenRouterConnection(\n provider: OpenRouterConnectionInput,\n): LlmConnection<OpenRouterProviderConfig> {\n return createLlmConnection({\n ...provider,\n type: 'openrouter',\n });\n}\n\nexport function createOpenAICompatibleConnection(\n provider: OpenAICompatibleConnectionInput,\n): LlmConnection<OpenAICompatibleProviderConfig> {\n return createLlmConnection({\n ...provider,\n type: 'openai-compatible',\n });\n}\n\nexport function createLlmSource<TProvider extends ProviderConfig>(\n connection: LlmConnection<TProvider>,\n config: LlmSourceConfig<TProvider>,\n): LlmSource<TProvider> {\n assertSourceConfig(config);\n\n const normalizedConfig =\n config.access === 'free'\n ? config\n : ({\n ...config,\n access: 'standard',\n } satisfies LlmSourceConfig<TProvider>);\n\n return {\n connection,\n config: normalizedConfig,\n };\n}\n\nexport function createOpenRouterFreeSource(\n connection: LlmConnection<OpenRouterProviderConfig>,\n config: OpenRouterFreeSourceInput,\n): LlmSource<OpenRouterProviderConfig> {\n return createLlmSource(connection, {\n ...config,\n access: 'free',\n });\n}\n\nfunction assertConnectionProviderName(provider: ProviderConfig): void {\n if (!provider.name.trim()) {\n throw new RouterConfigurationError(\n 'Connection provider names must be non-empty.',\n );\n }\n}\n\nfunction assertSourceConfig(config: LlmSourceConfig): void {\n if (!config.name.trim()) {\n throw new RouterConfigurationError('Source names must be non-empty.');\n }\n\n if (!config.model.trim()) {\n throw new RouterConfigurationError('Source models must be non-empty.');\n }\n}\n","import { AllModelsFailedError, RouterConfigurationError, isAbortError, serializeError } from './errors.js';\nimport { createDefaultTextGenerationExecutor } from './provider-factory.js';\nimport type {\n AttemptRecord,\n ExecuteStreamTextTargetResult,\n LlmSource,\n ModelConfig,\n PendingAttempt,\n PrioLlmRouterOptions,\n ProviderConfig,\n ResolvedModelTarget,\n RouterGenerateTextRequest,\n RouterGenerateTextResult,\n RouterStreamTextRequest,\n RouterStreamTextResult,\n TextGenerationExecutor,\n} from './types.js';\n\ninterface IndexedModel extends ModelConfig {\n readonly __index: number;\n}\n\ninterface NormalizedRouterConfig {\n providers: ProviderConfig[];\n models: ModelConfig[];\n defaultChain?: string[];\n}\n\nexport class PrioLlmRouter {\n private readonly providersByName = new Map<string, ProviderConfig>();\n private readonly modelsByName = new Map<string, IndexedModel>();\n private readonly defaultChain: string[] | undefined;\n private readonly executor: TextGenerationExecutor;\n private readonly hooks: PrioLlmRouterOptions['hooks'] | undefined;\n\n constructor(options: PrioLlmRouterOptions) {\n const normalized = resolveRouterConfig(options);\n\n if (normalized.providers.length === 0) {\n throw new RouterConfigurationError(\n 'At least one provider configuration is required.',\n );\n }\n\n if (normalized.models.length === 0) {\n throw new RouterConfigurationError(\n 'At least one model configuration is required.',\n );\n }\n\n this.defaultChain = normalized.defaultChain;\n this.hooks = createRouterHooks(options.hooks, options.debug === true);\n this.executor = options.executor ?? (\n options.defaultProviderMaxRetries === undefined\n ? createDefaultTextGenerationExecutor()\n : createDefaultTextGenerationExecutor({\n defaultProviderMaxRetries: options.defaultProviderMaxRetries,\n })\n );\n\n for (const provider of normalized.providers) {\n this.assertUniqueName(\n this.providersByName,\n provider.name,\n 'provider configuration',\n );\n this.validateProvider(provider);\n this.providersByName.set(provider.name, provider);\n }\n\n normalized.models.forEach((model, index) => {\n this.assertUniqueName(this.modelsByName, model.name, 'model configuration');\n\n if (!this.providersByName.has(model.provider)) {\n throw new RouterConfigurationError(\n `Model \"${model.name}\" references unknown provider \"${model.provider}\".`,\n );\n }\n\n this.modelsByName.set(model.name, {\n ...model,\n __index: index,\n });\n });\n\n if (this.defaultChain) {\n this.resolveNamedChain(this.defaultChain);\n }\n }\n\n listProviders(): ProviderConfig[] {\n return [...this.providersByName.values()];\n }\n\n listModels(): ResolvedModelTarget[] {\n return [...this.modelsByName.values()]\n .sort(compareModels)\n .map((model) => this.toResolvedTarget(model));\n }\n\n async generateText(\n request: RouterGenerateTextRequest,\n ): Promise<RouterGenerateTextResult> {\n const chain = this.resolveExecutionChain(request.chain);\n const attempts: AttemptRecord[] = [];\n let lastError: unknown;\n\n for (const [index, model] of chain.entries()) {\n const provider = this.providersByName.get(model.provider);\n\n if (!provider) {\n throw new RouterConfigurationError(\n `Provider \"${model.provider}\" was not found for target \"${model.name}\".`,\n );\n }\n\n const pendingAttempt: PendingAttempt = {\n attemptIndex: index,\n targetName: model.name,\n providerName: provider.name,\n providerType: provider.type,\n model: model.model,\n startedAt: new Date(),\n };\n\n if (model.tier !== undefined) {\n pendingAttempt.tier = model.tier;\n }\n\n this.hooks?.onAttemptStart?.(pendingAttempt);\n\n try {\n const result = await this.executor.execute({\n provider,\n model,\n request,\n });\n\n const finishedAt = new Date();\n const attemptRecord: AttemptRecord = {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: true,\n };\n\n attempts.push(attemptRecord);\n this.hooks?.onAttemptSuccess?.(attemptRecord);\n\n const response: RouterGenerateTextResult = {\n text: result.text,\n target: this.toResolvedTarget(model),\n attempts,\n finishReason: result.finishReason,\n raw: result.raw,\n };\n\n if (result.usage) {\n response.usage = result.usage;\n }\n\n if (result.warnings) {\n response.warnings = result.warnings;\n }\n\n return response;\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n\n const finishedAt = new Date();\n const attemptRecord: AttemptRecord = {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: false,\n error: serializeError(error),\n };\n\n attempts.push(attemptRecord);\n this.hooks?.onAttemptFailure?.(attemptRecord);\n lastError = error;\n }\n }\n\n throw new AllModelsFailedError(attempts, lastError);\n }\n\n async streamText(\n request: RouterStreamTextRequest,\n ): Promise<RouterStreamTextResult> {\n const chain = this.resolveExecutionChain(request.chain);\n const attempts: AttemptRecord[] = [];\n let lastError: unknown;\n\n for (const [index, model] of chain.entries()) {\n const provider = this.providersByName.get(model.provider);\n\n if (!provider) {\n throw new RouterConfigurationError(\n `Provider \"${model.provider}\" was not found for target \"${model.name}\".`,\n );\n }\n\n const pendingAttempt = createPendingAttempt(index, provider, model);\n this.hooks?.onAttemptStart?.(pendingAttempt);\n\n const { controller, cleanup, parentAborted } = createLinkedAbortController(\n request.abortSignal,\n );\n\n try {\n const streamResult = await this.executor.stream({\n provider,\n model,\n request: {\n ...request,\n abortSignal: controller.signal,\n },\n });\n\n const iterator = streamResult.textStream[Symbol.asyncIterator]();\n const firstChunk = await this.waitForFirstChunk({\n iterator,\n timeoutMs: request.firstChunkTimeoutMs,\n abortController: controller,\n parentAborted,\n });\n\n if (firstChunk.done) {\n throw createEmptyFirstChunkError(model.name);\n }\n\n return this.createStreamingResult({\n pendingAttempt,\n attempts,\n model,\n iterator,\n streamResult,\n firstChunk: firstChunk.value,\n cleanupAbortLink: cleanup,\n });\n } catch (error) {\n cleanup();\n\n if (isAbortError(error) && parentAborted()) {\n throw error;\n }\n\n const attemptRecord = createFailedAttemptRecord(pendingAttempt, error);\n attempts.push(attemptRecord);\n this.hooks?.onAttemptFailure?.(attemptRecord);\n lastError = error;\n }\n }\n\n throw new AllModelsFailedError(attempts, lastError);\n }\n\n private createStreamingResult(options: {\n pendingAttempt: PendingAttempt;\n attempts: AttemptRecord[];\n model: IndexedModel;\n iterator: AsyncIterator<string>;\n streamResult: ExecuteStreamTextTargetResult;\n firstChunk: string;\n cleanupAbortLink: () => void;\n }): RouterStreamTextResult {\n const {\n pendingAttempt,\n attempts,\n model,\n iterator,\n streamResult,\n firstChunk,\n cleanupAbortLink,\n } = options;\n\n let started = false;\n const textParts = [firstChunk];\n\n let resolveFinal!: (value: RouterGenerateTextResult) => void;\n let rejectFinal!: (reason?: unknown) => void;\n let finalized = false;\n const final = new Promise<RouterGenerateTextResult>((resolve, reject) => {\n resolveFinal = resolve;\n rejectFinal = reject;\n });\n\n const finalizeSuccess = async (): Promise<void> => {\n if (finalized) {\n return;\n }\n finalized = true;\n\n const finishedAt = new Date();\n const attemptRecord: AttemptRecord = {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: true,\n };\n\n attempts.push(attemptRecord);\n this.hooks?.onAttemptSuccess?.(attemptRecord);\n\n const result: RouterGenerateTextResult = {\n text: textParts.join(''),\n target: this.toResolvedTarget(model),\n attempts: [...attempts],\n finishReason: await streamResult.finishReason,\n raw: streamResult.raw,\n };\n\n const usage = await streamResult.usage;\n if (usage) {\n result.usage = usage;\n }\n\n const warnings = await streamResult.warnings;\n if (warnings) {\n result.warnings = warnings;\n }\n\n cleanupAbortLink();\n resolveFinal(result);\n };\n\n const finalizeFailure = (error: unknown): void => {\n if (finalized) {\n return;\n }\n finalized = true;\n\n const attemptRecord = createFailedAttemptRecord(pendingAttempt, error);\n attempts.push(attemptRecord);\n this.hooks?.onAttemptFailure?.(attemptRecord);\n cleanupAbortLink();\n rejectFinal(error);\n };\n\n const wrappedStream: AsyncIterable<string> = {\n [Symbol.asyncIterator]: () => {\n if (started) {\n throw new RouterConfigurationError(\n 'This stream can only be consumed once.',\n );\n }\n\n started = true;\n\n return createRouterTextStreamIterator({\n firstChunk,\n iterator,\n onChunk: (chunk) => {\n textParts.push(chunk);\n },\n onSuccess: finalizeSuccess,\n onFailure: finalizeFailure,\n });\n },\n };\n\n return {\n target: this.toResolvedTarget(model),\n selectedAttempt: pendingAttempt,\n attempts: [...attempts],\n textStream: wrappedStream,\n final,\n consumeStream: async () => {\n if (!started) {\n for await (const _ of wrappedStream) {\n void _;\n }\n }\n\n return final;\n },\n };\n }\n\n private async waitForFirstChunk(options: {\n iterator: AsyncIterator<string>;\n timeoutMs: number | undefined;\n abortController: AbortController;\n parentAborted: () => boolean;\n }): Promise<IteratorResult<string>> {\n const { iterator, timeoutMs, abortController, parentAborted } = options;\n const nextPromise = iterator.next();\n\n if (timeoutMs === undefined) {\n return nextPromise;\n }\n\n const timeoutError = createFirstChunkTimeoutError(timeoutMs);\n\n const timedRace = await Promise.race([\n nextPromise.then(\n (value) => ({ kind: 'value' as const, value }),\n (error: unknown) => ({ kind: 'error' as const, error }),\n ),\n delay(timeoutMs).then(() => ({ kind: 'timeout' as const })),\n ]);\n\n if (timedRace.kind === 'value') {\n return timedRace.value;\n }\n\n if (timedRace.kind === 'timeout') {\n abortController.abort(timeoutError);\n void nextPromise.catch(() => undefined);\n throw timeoutError;\n }\n\n if (isAbortError(timedRace.error) && parentAborted()) {\n throw timedRace.error;\n }\n\n throw timedRace.error;\n }\n\n private resolveExecutionChain(chain?: string[]): IndexedModel[] {\n if (chain?.length) {\n return this.resolveNamedChain(chain);\n }\n\n if (this.defaultChain?.length) {\n return this.resolveNamedChain(this.defaultChain);\n }\n\n const implicitChain = [...this.modelsByName.values()]\n .filter((model) => this.isModelEnabled(model))\n .sort(compareModels);\n\n if (implicitChain.length === 0) {\n throw new RouterConfigurationError(\n 'No enabled model targets are available for execution.',\n );\n }\n\n return implicitChain;\n }\n\n private resolveNamedChain(chain: string[]): IndexedModel[] {\n const resolved: IndexedModel[] = [];\n const seen = new Set<string>();\n\n for (const targetName of chain) {\n if (seen.has(targetName)) {\n continue;\n }\n\n seen.add(targetName);\n const model = this.modelsByName.get(targetName);\n\n if (!model) {\n throw new RouterConfigurationError(\n `Model target \"${targetName}\" is not configured.`,\n );\n }\n\n if (!this.isModelEnabled(model)) {\n throw new RouterConfigurationError(\n `Model target \"${targetName}\" is disabled or its provider is disabled.`,\n );\n }\n\n resolved.push(model);\n }\n\n if (resolved.length === 0) {\n throw new RouterConfigurationError(\n 'The resolved execution chain is empty.',\n );\n }\n\n return resolved;\n }\n\n private isModelEnabled(model: ModelConfig): boolean {\n if (model.enabled === false) {\n return false;\n }\n\n const provider = this.providersByName.get(model.provider);\n return provider?.enabled !== false;\n }\n\n private toResolvedTarget(model: ModelConfig): ResolvedModelTarget {\n const provider = this.providersByName.get(model.provider);\n\n if (!provider) {\n throw new RouterConfigurationError(\n `Model \"${model.name}\" references missing provider \"${model.provider}\".`,\n );\n }\n\n const resolvedTarget: ResolvedModelTarget = {\n name: model.name,\n providerName: provider.name,\n providerType: provider.type,\n model: model.model,\n };\n\n if (model.priority !== undefined) {\n resolvedTarget.priority = model.priority;\n }\n\n if (model.tier !== undefined) {\n resolvedTarget.tier = model.tier;\n }\n\n if (model.metadata !== undefined) {\n resolvedTarget.metadata = model.metadata;\n }\n\n return resolvedTarget;\n }\n\n private validateProvider(provider: ProviderConfig): void {\n if (!provider.name.trim()) {\n throw new RouterConfigurationError(\n 'Provider configuration names must be non-empty.',\n );\n }\n\n if (!provider.auth.apiKey.trim()) {\n throw new RouterConfigurationError(\n `Provider \"${provider.name}\" requires a non-empty API key.`,\n );\n }\n }\n\n private assertUniqueName(\n registry: Map<string, unknown>,\n name: string,\n label: string,\n ): void {\n if (!name.trim()) {\n throw new RouterConfigurationError(`${label} names must be non-empty.`);\n }\n\n if (registry.has(name)) {\n throw new RouterConfigurationError(\n `Duplicate ${label} name \"${name}\" detected.`,\n );\n }\n }\n}\n\nexport function createLlmRouter(\n options: PrioLlmRouterOptions,\n): PrioLlmRouter {\n return new PrioLlmRouter(options);\n}\n\nfunction resolveRouterConfig(\n options: PrioLlmRouterOptions,\n): NormalizedRouterConfig {\n if ('sources' in options) {\n return compileSources(options.sources, options.defaultChain);\n }\n\n const normalized: NormalizedRouterConfig = {\n providers: options.providers,\n models: options.models,\n };\n\n if (options.defaultChain !== undefined) {\n normalized.defaultChain = options.defaultChain;\n }\n\n return normalized;\n}\n\nfunction compareModels(left: IndexedModel, right: IndexedModel): number {\n const leftPriority = left.priority ?? Number.MAX_SAFE_INTEGER;\n const rightPriority = right.priority ?? Number.MAX_SAFE_INTEGER;\n\n if (leftPriority !== rightPriority) {\n return leftPriority - rightPriority;\n }\n\n return left.__index - right.__index;\n}\n\nfunction compileSources(\n sources: LlmSource[],\n defaultChain?: string[],\n): NormalizedRouterConfig {\n const providersByName = new Map<string, ProviderConfig>();\n const models: ModelConfig[] = [];\n\n for (const source of sources) {\n const provider = source.connection.provider;\n const providerName = provider.name.trim();\n const modelId = source.config.model.trim();\n const access = source.config.access ?? 'standard';\n\n if (!providerName) {\n throw new RouterConfigurationError(\n 'Connection provider names must be non-empty.',\n );\n }\n\n if (!source.config.name.trim()) {\n throw new RouterConfigurationError('Source names must be non-empty.');\n }\n\n if (!modelId) {\n throw new RouterConfigurationError('Source models must be non-empty.');\n }\n\n const existingProvider = providersByName.get(providerName);\n if (existingProvider) {\n assertMatchingSourceProvider(existingProvider, provider);\n } else {\n providersByName.set(providerName, provider);\n }\n\n if (access === 'free') {\n assertGuaranteedFreeSource(provider, source.config.model);\n }\n\n if (access === 'free' && source.config.tier === 'paid') {\n throw new RouterConfigurationError(\n `Free source \"${source.config.name}\" cannot be marked as paid.`,\n );\n }\n\n const compiledModel: ModelConfig = {\n name: source.config.name,\n provider: providerName,\n model: modelId,\n };\n\n if (source.config.enabled !== undefined) {\n compiledModel.enabled = source.config.enabled;\n }\n\n if (source.config.priority !== undefined) {\n compiledModel.priority = source.config.priority;\n }\n\n const tier = source.config.tier ?? (access === 'free' ? 'free' : undefined);\n if (tier !== undefined) {\n compiledModel.tier = tier;\n }\n\n if (source.config.metadata !== undefined) {\n compiledModel.metadata = source.config.metadata;\n }\n\n models.push(compiledModel);\n }\n\n const normalized: NormalizedRouterConfig = {\n providers: [...providersByName.values()],\n models,\n };\n\n if (defaultChain !== undefined) {\n normalized.defaultChain = defaultChain;\n }\n\n return normalized;\n}\n\nfunction assertMatchingSourceProvider(\n existingProvider: ProviderConfig,\n nextProvider: ProviderConfig,\n): void {\n if (JSON.stringify(existingProvider) === JSON.stringify(nextProvider)) {\n return;\n }\n\n throw new RouterConfigurationError(\n `Connection provider \"${existingProvider.name}\" is configured more than once with different settings.`,\n );\n}\n\nfunction assertGuaranteedFreeSource(\n provider: ProviderConfig,\n model: string,\n): void {\n if (provider.type !== 'openrouter') {\n throw new RouterConfigurationError(\n `Provider \"${provider.name}\" does not support strict free sources. Only OpenRouter with explicit \":free\" model variants is supported today.`,\n );\n }\n\n const normalizedModel = model.trim();\n\n if (normalizedModel === 'openrouter/free') {\n throw new RouterConfigurationError(\n `Free source \"${provider.name}\" cannot use \"openrouter/free\". Use an explicit \":free\" model id instead.`,\n );\n }\n\n if (!normalizedModel.endsWith(':free')) {\n throw new RouterConfigurationError(\n `Free OpenRouter sources must use an explicit \":free\" model id. Received \"${normalizedModel}\".`,\n );\n }\n}\n\nfunction createPendingAttempt(\n attemptIndex: number,\n provider: ProviderConfig,\n model: ModelConfig,\n): PendingAttempt {\n const pendingAttempt: PendingAttempt = {\n attemptIndex,\n targetName: model.name,\n providerName: provider.name,\n providerType: provider.type,\n model: model.model,\n startedAt: new Date(),\n };\n\n if (model.tier !== undefined) {\n pendingAttempt.tier = model.tier;\n }\n\n return pendingAttempt;\n}\n\nfunction createFailedAttemptRecord(\n pendingAttempt: PendingAttempt,\n error: unknown,\n): AttemptRecord {\n const finishedAt = new Date();\n\n return {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: false,\n error: serializeError(error),\n };\n}\n\nfunction createRouterTextStreamIterator(options: {\n firstChunk: string;\n iterator: AsyncIterator<string>;\n onChunk: (chunk: string) => void;\n onSuccess: () => Promise<void>;\n onFailure: (error: unknown) => void;\n}): AsyncIterator<string> {\n const { firstChunk, iterator, onChunk, onSuccess, onFailure } = options;\n let firstYielded = false;\n let finished = false;\n\n return {\n async next(): Promise<IteratorResult<string>> {\n if (finished) {\n return {\n done: true,\n value: undefined,\n };\n }\n\n if (!firstYielded) {\n firstYielded = true;\n return {\n done: false,\n value: firstChunk,\n };\n }\n\n try {\n const next = await iterator.next();\n\n if (next.done) {\n finished = true;\n await onSuccess();\n return {\n done: true,\n value: undefined,\n };\n }\n\n onChunk(next.value);\n return {\n done: false,\n value: next.value,\n };\n } catch (error) {\n finished = true;\n onFailure(error);\n throw error;\n }\n },\n async return(): Promise<IteratorResult<string>> {\n finished = true;\n onFailure(createStreamClosedEarlyError());\n\n if (typeof iterator.return === 'function') {\n await iterator.return();\n }\n\n return {\n done: true,\n value: undefined,\n };\n },\n async throw(error?: unknown): Promise<IteratorResult<string>> {\n finished = true;\n onFailure(error);\n\n if (typeof iterator.throw === 'function') {\n return iterator.throw(error);\n }\n\n throw error;\n },\n };\n}\n\nfunction createLinkedAbortController(parentSignal?: AbortSignal): {\n controller: AbortController;\n cleanup: () => void;\n parentAborted: () => boolean;\n} {\n const controller = new AbortController();\n let abortedByParent = false;\n\n const abortFromParent = (): void => {\n abortedByParent = true;\n controller.abort(parentSignal?.reason);\n };\n\n if (parentSignal?.aborted) {\n abortFromParent();\n } else {\n parentSignal?.addEventListener('abort', abortFromParent, { once: true });\n }\n\n return {\n controller,\n cleanup: () => {\n parentSignal?.removeEventListener('abort', abortFromParent);\n },\n parentAborted: () => abortedByParent,\n };\n}\n\nfunction createFirstChunkTimeoutError(timeoutMs: number): Error {\n const error = new Error(\n `The first stream chunk did not arrive within ${timeoutMs}ms.`,\n );\n error.name = 'FirstChunkTimeoutError';\n return error;\n}\n\nfunction createEmptyFirstChunkError(targetName: string): Error {\n const error = new Error(\n `Stream for target \"${targetName}\" completed before the first text chunk.`,\n );\n error.name = 'EmptyStreamError';\n return error;\n}\n\nfunction createStreamClosedEarlyError(): Error {\n const error = new Error('The stream was closed before completion.');\n error.name = 'StreamClosedError';\n return error;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction createRouterHooks(\n hooks: PrioLlmRouterOptions['hooks'] | undefined,\n debug: boolean,\n): PrioLlmRouterOptions['hooks'] | undefined {\n if (!debug) {\n return hooks;\n }\n\n return {\n onAttemptStart: (attempt) => {\n console.log('[prio-llm-router] attempt:start', attempt);\n hooks?.onAttemptStart?.(attempt);\n },\n onAttemptSuccess: (attempt) => {\n console.log('[prio-llm-router] attempt:success', attempt);\n hooks?.onAttemptSuccess?.(attempt);\n },\n onAttemptFailure: (attempt) => {\n console.error('[prio-llm-router] attempt:failure', attempt);\n hooks?.onAttemptFailure?.(attempt);\n },\n };\n}\n"]}
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -435,7 +435,7 @@ var PrioLlmRouter = class {
|
|
|
435
435
|
);
|
|
436
436
|
}
|
|
437
437
|
this.defaultChain = normalized.defaultChain;
|
|
438
|
-
this.hooks = options.hooks;
|
|
438
|
+
this.hooks = createRouterHooks(options.hooks, options.debug === true);
|
|
439
439
|
this.executor = options.executor ?? (options.defaultProviderMaxRetries === void 0 ? createDefaultTextGenerationExecutor() : createDefaultTextGenerationExecutor({
|
|
440
440
|
defaultProviderMaxRetries: options.defaultProviderMaxRetries
|
|
441
441
|
}));
|
|
@@ -1059,6 +1059,25 @@ function delay(ms) {
|
|
|
1059
1059
|
setTimeout(resolve, ms);
|
|
1060
1060
|
});
|
|
1061
1061
|
}
|
|
1062
|
+
function createRouterHooks(hooks, debug) {
|
|
1063
|
+
if (!debug) {
|
|
1064
|
+
return hooks;
|
|
1065
|
+
}
|
|
1066
|
+
return {
|
|
1067
|
+
onAttemptStart: (attempt) => {
|
|
1068
|
+
console.log("[prio-llm-router] attempt:start", attempt);
|
|
1069
|
+
hooks?.onAttemptStart?.(attempt);
|
|
1070
|
+
},
|
|
1071
|
+
onAttemptSuccess: (attempt) => {
|
|
1072
|
+
console.log("[prio-llm-router] attempt:success", attempt);
|
|
1073
|
+
hooks?.onAttemptSuccess?.(attempt);
|
|
1074
|
+
},
|
|
1075
|
+
onAttemptFailure: (attempt) => {
|
|
1076
|
+
console.error("[prio-llm-router] attempt:failure", attempt);
|
|
1077
|
+
hooks?.onAttemptFailure?.(attempt);
|
|
1078
|
+
}
|
|
1079
|
+
};
|
|
1080
|
+
}
|
|
1062
1081
|
|
|
1063
1082
|
export { AllModelsFailedError, PrioLlmRouter, PrioLlmRouterError, RouterConfigurationError, createDefaultTextGenerationExecutor, createLlmConnection, createLlmRouter, createLlmSource, createOpenAICompatibleConnection, createOpenRouterConnection, createOpenRouterFreeSource, isAbortError, serializeError };
|
|
1064
1083
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/provider-factory.ts","../src/source-builders.ts","../src/prio-llm-router.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAC5C,WAAA,CAAY,SAAiB,OAAA,EAAwB;AACnD,IAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACtB,IAAA,IAAA,CAAK,OAAO,GAAA,CAAA,MAAA,CAAW,IAAA;AAAA,EACzB;AACF;AAEO,IAAM,wBAAA,GAAN,cAAuC,kBAAA,CAAmB;AAAC;AAE3D,IAAM,oBAAA,GAAN,cAAmC,kBAAA,CAAmB;AAAA,EAClD,QAAA;AAAA,EAET,WAAA,CAAY,UAA2B,KAAA,EAAiB;AACtD,IAAA,KAAA,CAAM,mBAAA,CAAoB,QAAQ,CAAA,EAAG,EAAE,OAAO,CAAA;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AACF;AAEO,SAAS,eAAe,KAAA,EAAiC;AAC9D,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,MAAM,UAAA,GAAa,KAAA;AAMnB,IAAA,MAAM,UAAA,GAA8B;AAAA,MAClC,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAS,KAAA,CAAM;AAAA,KACjB;AAEA,IAAA,IAAI,UAAA,CAAW,SAAS,MAAA,EAAW;AACjC,MAAA,UAAA,CAAW,OAAO,UAAA,CAAW,IAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,UAAA,IAAc,UAAA,CAAW,MAAA;AACvD,IAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,MAAA,UAAA,CAAW,UAAA,GAAa,UAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AACF;AAEO,SAAS,aAAa,KAAA,EAAyB;AACpD,EAAA,IAAI,EAAE,iBAAiB,KAAA,CAAA,EAAQ;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA,KAAS,YAAA,IAAgB,KAAA,CAAM,IAAA,KAAS,cAAA;AACvD;AAEA,SAAS,oBAAoB,QAAA,EAAmC;AAC9D,EAAA,MAAM,OAAA,GAAU,QAAA,CACb,GAAA,CAAI,CAAC,OAAA,KAAY;AAChB,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,EAAO,OAAA,IAAW,eAAA;AAC/C,IAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,UAAU,CAAA,EAAA,EAAK,OAAA,CAAQ,YAAY,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,GAAA,EAAM,YAAY,CAAA,CAAA;AAAA,EAC1F,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,OAAO,OAAA,GACH,CAAA,sCAAA,EAAyC,OAAO,CAAA,CAAA,GAChD,uCAAA;AACN;AC1CO,SAAS,oCAAoC,OAAA,EAEzB;AACzB,EAAA,OAAO,IAAI,2BAAA,CAA4B,OAAA,EAAS,yBAAA,IAA6B,CAAC,CAAA;AAChF;AAEA,IAAM,8BAAN,MAAoE;AAAA,EAGlE,YAA6B,yBAAA,EAAmC;AAAnC,IAAA,IAAA,CAAA,yBAAA,GAAA,yBAAA;AAAA,EAAoC;AAAA,EAFhD,aAAA,uBAAoB,GAAA,EAA4B;AAAA,EAIjE,MAAM,OAAA,CAAQ;AAAA,IACZ,QAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF,EAA6D;AAC3D,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,MAAM,KAAK,CAAA;AACjE,IAAA,MAAM,OAAO,wBAAA,CAAyB;AAAA,MACpC,aAAA;AAAA,MACA,OAAA;AAAA,MACA,2BAA2B,IAAA,CAAK;AAAA,KACjC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAEtC,IAAA,MAAM,MAAA,GAAkC;AAAA,MACtC,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,YAAA,EAAc,OAAO,YAAA,IAAgB,IAAA;AAAA,MACrC,GAAA,EAAK;AAAA,KACP;AAEA,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,CAAO,KAAK,CAAA;AACzC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AAAA,IACjB;AAEA,IAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,MAAA,CAAO,QAAQ,CAAA;AAClD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAAA,IACpB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAA,CAAO;AAAA,IACX,QAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF,EAAmE;AACjE,IAAA,MAAM,QAAQ,OAAA,EAAQ;AAEtB,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,MAAM,KAAK,CAAA;AAEjE,IAAA,MAAM,OAAO,wBAAA,CAAyB;AAAA,MACpC,aAAA;AAAA,MACA,OAAA;AAAA,MACA,2BAA2B,IAAA,CAAK;AAAA,KACjC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAE9B,IAAA,OAAO;AAAA,MACL,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,eAAe,YAAY;AACzB,QAAA,MAAM,OAAO,aAAA,EAAc;AAAA,MAC7B,CAAA;AAAA,MACA,YAAA,EAAc,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAA,CAAE,IAAA;AAAA,QACjD,CAAC,UAAU,KAAA,IAAS;AAAA,OACtB;AAAA,MACA,KAAA,EAAO,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,CAAE,IAAA;AAAA,QAAK,CAAC,KAAA,KAC9C,cAAA,CAAe,KAAK;AAAA,OACtB;AAAA,MACA,QAAA,EAAU,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA;AAAA,QAAK,CAAC,KAAA,KAC/C,iBAAA,CAAkB,KAAK;AAAA,OACzB;AAAA,MACA,GAAA,EAAK;AAAA,KACP;AAAA,EACF;AAAA,EAEQ,gBAAA,CACN,UACA,OAAA,EACe;AACf,IAAA,MAAM,MAAA,GACJ,KAAK,aAAA,CAAc,GAAA,CAAI,SAAS,IAAI,CAAA,IAAK,qBAAqB,QAAQ,CAAA;AAExE,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1C,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,oBAAA,CAAqB,MAAA,EAAQ,OAAA,EAAS,QAAA,CAAS,IAAI,CAAA;AAAA,EAC5D;AACF,CAAA;AAEA,SAAS,wBAAA,CAAyB;AAAA,EAChC,aAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAI4B;AAC1B,EAAA,MAAM,IAAA,GAAiC;AAAA,IACrC,KAAA,EAAO,aAAA;AAAA,IACP,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,UAAA,EAAY,QAAQ,kBAAA,IAAsB,yBAAA;AAAA,IAC1C,aAAa,OAAA,CAAQ;AAAA,GACvB;AAEA,EAAA,IAAI,OAAA,CAAQ,oBAAoB,MAAA,EAAW;AACzC,IACE,IAAA,CAGA,kBAAkB,OAAA,CAAQ,eAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,OAAA,CAAQ,kBAAkB,MAAA,EAAW;AACvC,IACE,IAAA,CAGA,gBAAgB,OAAA,CAAQ,aAAA;AAAA,EAC5B;AAEA,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IACE,IAAA,CAGA,SAAS,OAAA,CAAQ,MAAA;AAAA,EACrB,CAAA,MAAO;AACL,IACE,IAAA,CAGA,WAAW,OAAA,CAAQ,QAAA;AAAA,EACvB;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,qBAAqB,QAAA,EAA0C;AACtE,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAEzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,CAAA,UAAA,EAAa,SAAS,IAAI,CAAA,wBAAA;AAAA,KAC5B;AAAA,EACF;AAEA,EAAA,QAAQ,SAAS,IAAA;AAAM,IACrB,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,OAAA,GAAiD,EAAE,MAAA,EAAO;AAChE,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,gBAAgB,OAAO,CAAA;AAAA,IAChC;AAAA,IAEA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,OAAA,GAA8C,EAAE,MAAA,EAAO;AAC7D,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,aAAa,OAAO,CAAA;AAAA,IAC7B;AAAA,IAEA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,OAAA,GAAgD,EAAE,MAAA,EAAO;AAC/D,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,eAAe,OAAO,CAAA;AAAA,IAC/B;AAAA,IAEA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,OAAA,GAA0D;AAAA,QAC9D;AAAA,OACF;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,yBAAyB,OAAO,CAAA;AAAA,IACzC;AAAA,IAEA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,OAAA,GAA4C,EAAE,MAAA,EAAO;AAC3D,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,WAAW,OAAO,CAAA;AAAA,IAC3B;AAAA,IAEA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,OAAA,GAA+C,EAAE,MAAA,EAAO;AAC9D,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,cAAc,OAAO,CAAA;AAAA,IAC9B;AAAA,IAEA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,OAAA,GAA8C,EAAE,MAAA,EAAO;AAC7D,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,aAAa,OAAO,CAAA;AAAA,IAC7B;AAAA,IAEA,KAAK,mBAAA,EAAqB;AACxB,MAAA,MAAM,OAAA,GAAwD;AAAA,QAC5D,IAAA,EAAM,QAAA,CAAS,aAAA,IAAiB,QAAA,CAAS,IAAA;AAAA,QACzC,MAAA;AAAA,QACA,SAAS,QAAA,CAAS;AAAA,OACpB;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,IAAI,SAAS,WAAA,EAAa;AACxB,QAAA,OAAA,CAAQ,cAAc,QAAA,CAAS,WAAA;AAAA,MACjC;AACA,MAAA,OAAO,uBAAuB,OAAO,CAAA;AAAA,IACvC;AAAA,IAEA,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,OAAA,GAA+D;AAAA,QACnE;AAAA,OACF;AACA,MAAA,MAAM,OAAA,GAAU,uBAAuB,QAAQ,CAAA;AAC/C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAAA,MACpB;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,iBAAiB,OAAO,CAAA;AAAA,IACjC;AAAA,IAEA,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,OAAA,GAAkD,EAAE,MAAA,EAAO;AACjE,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,iBAAiB,OAAO,CAAA;AAAA,IACjC;AAAA,IAEA,KAAK,YAAA,EAAc;AACjB,MAAA,MAAM,OAAA,GAAkD,EAAE,MAAA,EAAO;AACjE,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,iBAAiB,OAAO,CAAA;AAAA,IACjC;AAAA,IAEA,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,OAAA,GAA2C,EAAE,MAAA,EAAO;AAC1D,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,OAAA,CAAQ,UAAU,QAAA,CAAS,OAAA;AAAA,MAC7B;AACA,MAAA,OAAO,UAAU,OAAO,CAAA;AAAA,IAC1B;AAAA,IAEA,SAAS;AACP,MAAA,MAAM,eAAA,GAAyB,QAAA;AAC/B,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,CAAA,2BAAA,EAA8B,IAAA,CAAK,SAAA,CAAU,eAAe,CAAC,CAAA;AAAA,OAC/D;AAAA,IACF;AAAA;AAEJ;AAEA,SAAS,uBACP,QAAA,EACoC;AACpC,EAAA,MAAM,OAAA,GAAU,EAAE,GAAG,QAAA,CAAS,OAAA,EAAQ;AAEtC,EAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,IAAA,OAAA,CAAQ,cAAc,IAAI,QAAA,CAAS,MAAA;AAAA,EACrC;AAEA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,OAAA,CAAQ,SAAS,IAAI,QAAA,CAAS,OAAA;AAAA,EAChC;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,IAAI,OAAA,GAAU,MAAA;AACrD;AAEA,SAAS,oBAAA,CACP,cAAA,EACA,OAAA,EACA,YAAA,EACe;AACf,EAAA,IAAI,OAAO,mBAAmB,UAAA,EAAY;AACxC,IAAA,OAAO,eAAe,OAAO,CAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,aAAA,GAAgB,cAAA;AACtB,EAAA,MAAM,UAAA,GAAa,CAAC,eAAA,EAAiB,WAAA,EAAa,MAAM,CAAA;AAExD,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,OAAA,GAAU,cAAc,SAAS,CAAA;AACvC,IAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,MAAA,OAAQ,QAA0C,OAAO,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,wBAAA;AAAA,IACR,aAAa,YAAY,CAAA,qDAAA;AAAA,GAC3B;AACF;AAEA,SAAS,eAAe,KAAA,EAAwC;AAC9D,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,KAAA;AACrB,EAAA,MAAM,aAAyB,EAAC;AAEhC,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,aAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA;AAC9B,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa,MAAA;AAC3D;AAEA,SAAS,kBAAkB,QAAA,EAA0C;AACnE,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,GAAW,MAAA;AAC9C;;;AC3YO,SAAS,oBACd,QAAA,EAC0B;AAC1B,EAAA,4BAAA,CAA6B,QAAQ,CAAA;AAErC,EAAA,OAAO;AAAA,IACL;AAAA,GACF;AACF;AAEO,SAAS,2BACd,QAAA,EACyC;AACzC,EAAA,OAAO,mBAAA,CAAoB;AAAA,IACzB,GAAG,QAAA;AAAA,IACH,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAEO,SAAS,iCACd,QAAA,EAC+C;AAC/C,EAAA,OAAO,mBAAA,CAAoB;AAAA,IACzB,GAAG,QAAA;AAAA,IACH,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAEO,SAAS,eAAA,CACd,YACA,MAAA,EACsB;AACtB,EAAA,kBAAA,CAAmB,MAAM,CAAA;AAEzB,EAAA,MAAM,gBAAA,GACJ,MAAA,CAAO,MAAA,KAAW,MAAA,GACd,MAAA,GACC;AAAA,IACC,GAAG,MAAA;AAAA,IACH,MAAA,EAAQ;AAAA,GACV;AAEN,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;AAEO,SAAS,0BAAA,CACd,YACA,MAAA,EACqC;AACrC,EAAA,OAAO,gBAAgB,UAAA,EAAY;AAAA,IACjC,GAAG,MAAA;AAAA,IACH,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAEA,SAAS,6BAA6B,QAAA,EAAgC;AACpE,EAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,IAAA,EAAK,EAAG;AACzB,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAAA,EAA+B;AACzD,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,IAAA,EAAK,EAAG;AACvB,IAAA,MAAM,IAAI,yBAAyB,iCAAiC,CAAA;AAAA,EACtE;AAEA,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,IAAA,EAAK,EAAG;AACxB,IAAA,MAAM,IAAI,yBAAyB,kCAAkC,CAAA;AAAA,EACvE;AACF;;;AC3DO,IAAM,gBAAN,MAAoB;AAAA,EACR,eAAA,uBAAsB,GAAA,EAA4B;AAAA,EAClD,YAAA,uBAAmB,GAAA,EAA0B;AAAA,EAC7C,YAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EAEjB,YAAY,OAAA,EAA+B;AACzC,IAAA,MAAM,UAAA,GAAa,oBAAoB,OAAO,CAAA;AAE9C,IAAA,IAAI,UAAA,CAAW,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAClC,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAe,UAAA,CAAW,YAAA;AAC/B,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,KACtB,OAAA,CAAQ,8BAA8B,MAAA,GAClC,mCAAA,KACA,mCAAA,CAAoC;AAAA,MAClC,2BAA2B,OAAA,CAAQ;AAAA,KACpC,CAAA,CAAA;AAGP,IAAA,KAAA,MAAW,QAAA,IAAY,WAAW,SAAA,EAAW;AAC3C,MAAA,IAAA,CAAK,gBAAA;AAAA,QACH,IAAA,CAAK,eAAA;AAAA,QACL,QAAA,CAAS,IAAA;AAAA,QACT;AAAA,OACF;AACA,MAAA,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AAC9B,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAAA,IAClD;AAEA,IAAA,UAAA,CAAW,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AAC1C,MAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,CAAK,YAAA,EAAc,KAAA,CAAM,MAAM,qBAAqB,CAAA;AAE1E,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC7C,QAAA,MAAM,IAAI,wBAAA;AAAA,UACR,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,+BAAA,EAAkC,MAAM,QAAQ,CAAA,EAAA;AAAA,SACtE;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM;AAAA,QAChC,GAAG,KAAA;AAAA,QACH,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,YAAY,CAAA;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,aAAA,GAAkC;AAChC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAAA,EAC1C;AAAA,EAEA,UAAA,GAAoC;AAClC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,CAAA,CAClC,IAAA,CAAK,aAAa,CAAA,CAClB,IAAI,CAAC,KAAA,KAAU,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,aACJ,OAAA,EACmC;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,qBAAA,CAAsB,OAAA,CAAQ,KAAK,CAAA;AACtD,IAAA,MAAM,WAA4B,EAAC;AACnC,IAAA,IAAI,SAAA;AAEJ,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AAC5C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,QAAQ,CAAA;AAExD,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,wBAAA;AAAA,UACR,CAAA,UAAA,EAAa,KAAA,CAAM,QAAQ,CAAA,4BAAA,EAA+B,MAAM,IAAI,CAAA,EAAA;AAAA,SACtE;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiC;AAAA,QACrC,YAAA,EAAc,KAAA;AAAA,QACd,YAAY,KAAA,CAAM,IAAA;AAAA,QAClB,cAAc,QAAA,CAAS,IAAA;AAAA,QACvB,cAAc,QAAA,CAAS,IAAA;AAAA,QACvB,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,SAAA,sBAAe,IAAA;AAAK,OACtB;AAEA,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,QAAA,cAAA,CAAe,OAAO,KAAA,CAAM,IAAA;AAAA,MAC9B;AAEA,MAAA,IAAA,CAAK,KAAA,EAAO,iBAAiB,cAAc,CAAA;AAE3C,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ;AAAA,UACzC,QAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,MAAM,UAAA,uBAAiB,IAAA,EAAK;AAC5B,QAAA,MAAM,aAAA,GAA+B;AAAA,UACnC,GAAG,cAAA;AAAA,UACH,UAAA;AAAA,UACA,YAAY,UAAA,CAAW,OAAA,EAAQ,GAAI,cAAA,CAAe,UAAU,OAAA,EAAQ;AAAA,UACpE,OAAA,EAAS;AAAA,SACX;AAEA,QAAA,QAAA,CAAS,KAAK,aAAa,CAAA;AAC3B,QAAA,IAAA,CAAK,KAAA,EAAO,mBAAmB,aAAa,CAAA;AAE5C,QAAA,MAAM,QAAA,GAAqC;AAAA,UACzC,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAA,EAAQ,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAAA,UACnC,QAAA;AAAA,UACA,cAAc,MAAA,CAAO,YAAA;AAAA,UACrB,KAAK,MAAA,CAAO;AAAA,SACd;AAEA,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,QAAA,CAAS,QAAQ,MAAA,CAAO,KAAA;AAAA,QAC1B;AAEA,QAAA,IAAI,OAAO,QAAA,EAAU;AACnB,UAAA,QAAA,CAAS,WAAW,MAAA,CAAO,QAAA;AAAA,QAC7B;AAEA,QAAA,OAAO,QAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,MAAM,UAAA,uBAAiB,IAAA,EAAK;AAC5B,QAAA,MAAM,aAAA,GAA+B;AAAA,UACnC,GAAG,cAAA;AAAA,UACH,UAAA;AAAA,UACA,YAAY,UAAA,CAAW,OAAA,EAAQ,GAAI,cAAA,CAAe,UAAU,OAAA,EAAQ;AAAA,UACpE,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,eAAe,KAAK;AAAA,SAC7B;AAEA,QAAA,QAAA,CAAS,KAAK,aAAa,CAAA;AAC3B,QAAA,IAAA,CAAK,KAAA,EAAO,mBAAmB,aAAa,CAAA;AAC5C,QAAA,SAAA,GAAY,KAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,oBAAA,CAAqB,QAAA,EAAU,SAAS,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,WACJ,OAAA,EACiC;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,qBAAA,CAAsB,OAAA,CAAQ,KAAK,CAAA;AACtD,IAAA,MAAM,WAA4B,EAAC;AACnC,IAAA,IAAI,SAAA;AAEJ,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AAC5C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,QAAQ,CAAA;AAExD,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,IAAI,wBAAA;AAAA,UACR,CAAA,UAAA,EAAa,KAAA,CAAM,QAAQ,CAAA,4BAAA,EAA+B,MAAM,IAAI,CAAA,EAAA;AAAA,SACtE;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,oBAAA,CAAqB,KAAA,EAAO,QAAA,EAAU,KAAK,CAAA;AAClE,MAAA,IAAA,CAAK,KAAA,EAAO,iBAAiB,cAAc,CAAA;AAE3C,MAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,aAAA,EAAc,GAAI,2BAAA;AAAA,QAC7C,OAAA,CAAQ;AAAA,OACV;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO;AAAA,UAC9C,QAAA;AAAA,UACA,KAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,GAAG,OAAA;AAAA,YACH,aAAa,UAAA,CAAW;AAAA;AAC1B,SACD,CAAA;AAED,QAAA,MAAM,QAAA,GAAW,YAAA,CAAa,UAAA,CAAW,MAAA,CAAO,aAAa,CAAA,EAAE;AAC/D,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,iBAAA,CAAkB;AAAA,UAC9C,QAAA;AAAA,UACA,WAAW,OAAA,CAAQ,mBAAA;AAAA,UACnB,eAAA,EAAiB,UAAA;AAAA,UACjB;AAAA,SACD,CAAA;AAED,QAAA,IAAI,WAAW,IAAA,EAAM;AACnB,UAAA,MAAM,0BAAA,CAA2B,MAAM,IAAI,CAAA;AAAA,QAC7C;AAEA,QAAA,OAAO,KAAK,qBAAA,CAAsB;AAAA,UAChC,cAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA,YAAY,UAAA,CAAW,KAAA;AAAA,UACvB,gBAAA,EAAkB;AAAA,SACnB,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,EAAQ;AAER,QAAA,IAAI,YAAA,CAAa,KAAK,CAAA,IAAK,aAAA,EAAc,EAAG;AAC1C,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,MAAM,aAAA,GAAgB,yBAAA,CAA0B,cAAA,EAAgB,KAAK,CAAA;AACrE,QAAA,QAAA,CAAS,KAAK,aAAa,CAAA;AAC3B,QAAA,IAAA,CAAK,KAAA,EAAO,mBAAmB,aAAa,CAAA;AAC5C,QAAA,SAAA,GAAY,KAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,oBAAA,CAAqB,QAAA,EAAU,SAAS,CAAA;AAAA,EACpD;AAAA,EAEQ,sBAAsB,OAAA,EAQH;AACzB,IAAA,MAAM;AAAA,MACJ,cAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF,GAAI,OAAA;AAEJ,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,SAAA,GAAY,CAAC,UAAU,CAAA;AAE7B,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAkC,CAAC,SAAS,MAAA,KAAW;AACvE,MAAA,YAAA,GAAe,OAAA;AACf,MAAA,WAAA,GAAc,MAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,MAAM,kBAAkB,YAA2B;AACjD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA;AAAA,MACF;AACA,MAAA,SAAA,GAAY,IAAA;AAEZ,MAAA,MAAM,UAAA,uBAAiB,IAAA,EAAK;AAC5B,MAAA,MAAM,aAAA,GAA+B;AAAA,QACnC,GAAG,cAAA;AAAA,QACH,UAAA;AAAA,QACA,YAAY,UAAA,CAAW,OAAA,EAAQ,GAAI,cAAA,CAAe,UAAU,OAAA,EAAQ;AAAA,QACpE,OAAA,EAAS;AAAA,OACX;AAEA,MAAA,QAAA,CAAS,KAAK,aAAa,CAAA;AAC3B,MAAA,IAAA,CAAK,KAAA,EAAO,mBAAmB,aAAa,CAAA;AAE5C,MAAA,MAAM,MAAA,GAAmC;AAAA,QACvC,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAAA,QACvB,MAAA,EAAQ,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAAA,QACnC,QAAA,EAAU,CAAC,GAAG,QAAQ,CAAA;AAAA,QACtB,YAAA,EAAc,MAAM,YAAA,CAAa,YAAA;AAAA,QACjC,KAAK,YAAA,CAAa;AAAA,OACpB;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,KAAA;AACjC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AAAA,MACjB;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,QAAA;AACpC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAAA,MACpB;AAEA,MAAA,gBAAA,EAAiB;AACjB,MAAA,YAAA,CAAa,MAAM,CAAA;AAAA,IACrB,CAAA;AAEA,IAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAyB;AAChD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA;AAAA,MACF;AACA,MAAA,SAAA,GAAY,IAAA;AAEZ,MAAA,MAAM,aAAA,GAAgB,yBAAA,CAA0B,cAAA,EAAgB,KAAK,CAAA;AACrE,MAAA,QAAA,CAAS,KAAK,aAAa,CAAA;AAC3B,MAAA,IAAA,CAAK,KAAA,EAAO,mBAAmB,aAAa,CAAA;AAC5C,MAAA,gBAAA,EAAiB;AACjB,MAAA,WAAA,CAAY,KAAK,CAAA;AAAA,IACnB,CAAA;AAEA,IAAA,MAAM,aAAA,GAAuC;AAAA,MAC3C,CAAC,MAAA,CAAO,aAAa,GAAG,MAAM;AAC5B,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,IAAI,wBAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AAEA,QAAA,OAAA,GAAU,IAAA;AAEV,QAAA,OAAO,8BAAA,CAA+B;AAAA,UACpC,UAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,YAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,UACtB,CAAA;AAAA,UACA,SAAA,EAAW,eAAA;AAAA,UACX,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAAA,MACnC,eAAA,EAAiB,cAAA;AAAA,MACjB,QAAA,EAAU,CAAC,GAAG,QAAQ,CAAA;AAAA,MACtB,UAAA,EAAY,aAAA;AAAA,MACZ,KAAA;AAAA,MACA,eAAe,YAAY;AACzB,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,WAAA,MAAiB,KAAK,aAAA,EAAe;AAC9B,UACP;AAAA,QACF;AAEA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAc,kBAAkB,OAAA,EAKI;AAClC,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,eAAA,EAAiB,eAAc,GAAI,OAAA;AAChE,IAAA,MAAM,WAAA,GAAc,SAAS,IAAA,EAAK;AAElC,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAA,GAAe,6BAA6B,SAAS,CAAA;AAE3D,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,MACnC,WAAA,CAAY,IAAA;AAAA,QACV,CAAC,KAAA,MAAW,EAAE,IAAA,EAAM,SAAkB,KAAA,EAAM,CAAA;AAAA,QAC5C,CAAC,KAAA,MAAoB,EAAE,IAAA,EAAM,SAAkB,KAAA,EAAM;AAAA,OACvD;AAAA,MACA,KAAA,CAAM,SAAS,CAAA,CAAE,IAAA,CAAK,OAAO,EAAE,IAAA,EAAM,WAAmB,CAAE;AAAA,KAC3D,CAAA;AAED,IAAA,IAAI,SAAA,CAAU,SAAS,OAAA,EAAS;AAC9B,MAAA,OAAO,SAAA,CAAU,KAAA;AAAA,IACnB;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,SAAA,EAAW;AAChC,MAAA,eAAA,CAAgB,MAAM,YAAY,CAAA;AAClC,MAAA,KAAK,WAAA,CAAY,KAAA,CAAM,MAAM,MAAS,CAAA;AACtC,MAAA,MAAM,YAAA;AAAA,IACR;AAEA,IAAA,IAAI,YAAA,CAAa,SAAA,CAAU,KAAK,CAAA,IAAK,eAAc,EAAG;AACpD,MAAA,MAAM,SAAA,CAAU,KAAA;AAAA,IAClB;AAEA,IAAA,MAAM,SAAA,CAAU,KAAA;AAAA,EAClB;AAAA,EAEQ,sBAAsB,KAAA,EAAkC;AAC9D,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,OAAO,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAQ;AAC7B,MAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,YAAY,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,gBAAgB,CAAC,GAAG,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA,CACjD,MAAA,CAAO,CAAC,UAAU,IAAA,CAAK,cAAA,CAAe,KAAK,CAAC,CAAA,CAC5C,KAAK,aAAa,CAAA;AAErB,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,aAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,KAAA,EAAiC;AACzD,IAAA,MAAM,WAA2B,EAAC;AAClC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,IAAA,KAAA,MAAW,cAAc,KAAA,EAAO;AAC9B,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,EAAG;AACxB,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,IAAI,UAAU,CAAA;AACnB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AAE9C,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAM,IAAI,wBAAA;AAAA,UACR,iBAAiB,UAAU,CAAA,oBAAA;AAAA,SAC7B;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA,EAAG;AAC/B,QAAA,MAAM,IAAI,wBAAA;AAAA,UACR,iBAAiB,UAAU,CAAA,0CAAA;AAAA,SAC7B;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IACrB;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,eAAe,KAAA,EAA6B;AAClD,IAAA,IAAI,KAAA,CAAM,YAAY,KAAA,EAAO;AAC3B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,QAAQ,CAAA;AACxD,IAAA,OAAO,UAAU,OAAA,KAAY,KAAA;AAAA,EAC/B;AAAA,EAEQ,iBAAiB,KAAA,EAAyC;AAChE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,QAAQ,CAAA;AAExD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,+BAAA,EAAkC,MAAM,QAAQ,CAAA,EAAA;AAAA,OACtE;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAsC;AAAA,MAC1C,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,cAAc,QAAA,CAAS,IAAA;AAAA,MACvB,cAAc,QAAA,CAAS,IAAA;AAAA,MACvB,OAAO,KAAA,CAAM;AAAA,KACf;AAEA,IAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,MAAA,cAAA,CAAe,WAAW,KAAA,CAAM,QAAA;AAAA,IAClC;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,MAAA,cAAA,CAAe,OAAO,KAAA,CAAM,IAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,MAAA,cAAA,CAAe,WAAW,KAAA,CAAM,QAAA;AAAA,IAClC;AAEA,IAAA,OAAO,cAAA;AAAA,EACT;AAAA,EAEQ,iBAAiB,QAAA,EAAgC;AACvD,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,IAAA,EAAK,EAAG;AACzB,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,MAAK,EAAG;AAChC,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,CAAA,UAAA,EAAa,SAAS,IAAI,CAAA,+BAAA;AAAA,OAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAA,CACN,QAAA,EACA,IAAA,EACA,KAAA,EACM;AACN,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,MAAA,MAAM,IAAI,wBAAA,CAAyB,CAAA,EAAG,KAAK,CAAA,yBAAA,CAA2B,CAAA;AAAA,IACxE;AAEA,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,CAAA,UAAA,EAAa,KAAK,CAAA,OAAA,EAAU,IAAI,CAAA,WAAA;AAAA,OAClC;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,gBACd,OAAA,EACe;AACf,EAAA,OAAO,IAAI,cAAc,OAAO,CAAA;AAClC;AAEA,SAAS,oBACP,OAAA,EACwB;AACxB,EAAA,IAAI,aAAa,OAAA,EAAS;AACxB,IAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,YAAY,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,QAAQ,OAAA,CAAQ;AAAA,GAClB;AAEA,EAAA,IAAI,OAAA,CAAQ,iBAAiB,MAAA,EAAW;AACtC,IAAA,UAAA,CAAW,eAAe,OAAA,CAAQ,YAAA;AAAA,EACpC;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,aAAA,CAAc,MAAoB,KAAA,EAA6B;AACtE,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,IAAY,MAAA,CAAO,gBAAA;AAC7C,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,QAAA,IAAY,MAAA,CAAO,gBAAA;AAE/C,EAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,IAAA,OAAO,YAAA,GAAe,aAAA;AAAA,EACxB;AAEA,EAAA,OAAO,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA;AAC9B;AAEA,SAAS,cAAA,CACP,SACA,YAAA,EACwB;AACxB,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAA4B;AACxD,EAAA,MAAM,SAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,QAAA,GAAW,OAAO,UAAA,CAAW,QAAA;AACnC,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,IAAA,CAAK,IAAA,EAAK;AACxC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,IAAA,EAAK;AACzC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,UAAA;AAEvC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAK,EAAG;AAC9B,MAAA,MAAM,IAAI,yBAAyB,iCAAiC,CAAA;AAAA,IACtE;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,yBAAyB,kCAAkC,CAAA;AAAA,IACvE;AAEA,IAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,GAAA,CAAI,YAAY,CAAA;AACzD,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,4BAAA,CAA6B,kBAAkB,QAAQ,CAAA;AAAA,IACzD,CAAA,MAAO;AACL,MAAA,eAAA,CAAgB,GAAA,CAAI,cAAc,QAAQ,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,0BAAA,CAA2B,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,MAAA,KAAW,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,SAAS,MAAA,EAAQ;AACtD,MAAA,MAAM,IAAI,wBAAA;AAAA,QACR,CAAA,aAAA,EAAgB,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,2BAAA;AAAA,OACpC;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,OAAO,MAAA,CAAO,IAAA;AAAA,MACpB,QAAA,EAAU,YAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,OAAA,KAAY,MAAA,EAAW;AACvC,MAAA,aAAA,CAAc,OAAA,GAAU,OAAO,MAAA,CAAO,OAAA;AAAA,IACxC;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW;AACxC,MAAA,aAAA,CAAc,QAAA,GAAW,OAAO,MAAA,CAAO,QAAA;AAAA,IACzC;AAEA,IAAA,MAAM,OAAO,MAAA,CAAO,MAAA,CAAO,IAAA,KAAS,MAAA,KAAW,SAAS,MAAA,GAAS,MAAA,CAAA;AACjE,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,aAAA,CAAc,IAAA,GAAO,IAAA;AAAA,IACvB;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW;AACxC,MAAA,aAAA,CAAc,QAAA,GAAW,OAAO,MAAA,CAAO,QAAA;AAAA,IACzC;AAEA,IAAA,MAAA,CAAO,KAAK,aAAa,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,SAAA,EAAW,CAAC,GAAG,eAAA,CAAgB,QAAQ,CAAA;AAAA,IACvC;AAAA,GACF;AAEA,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,UAAA,CAAW,YAAA,GAAe,YAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,4BAAA,CACP,kBACA,YAAA,EACM;AACN,EAAA,IAAI,KAAK,SAAA,CAAU,gBAAgB,MAAM,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA,EAAG;AACrE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,wBAAA;AAAA,IACR,CAAA,qBAAA,EAAwB,iBAAiB,IAAI,CAAA,uDAAA;AAAA,GAC/C;AACF;AAEA,SAAS,0BAAA,CACP,UACA,KAAA,EACM;AACN,EAAA,IAAI,QAAA,CAAS,SAAS,YAAA,EAAc;AAClC,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,CAAA,UAAA,EAAa,SAAS,IAAI,CAAA,gHAAA;AAAA,KAC5B;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,EAAK;AAEnC,EAAA,IAAI,oBAAoB,iBAAA,EAAmB;AACzC,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,CAAA,aAAA,EAAgB,SAAS,IAAI,CAAA,yEAAA;AAAA,KAC/B;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,eAAA,CAAgB,QAAA,CAAS,OAAO,CAAA,EAAG;AACtC,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,4EAA4E,eAAe,CAAA,EAAA;AAAA,KAC7F;AAAA,EACF;AACF;AAEA,SAAS,oBAAA,CACP,YAAA,EACA,QAAA,EACA,KAAA,EACgB;AAChB,EAAA,MAAM,cAAA,GAAiC;AAAA,IACrC,YAAA;AAAA,IACA,YAAY,KAAA,CAAM,IAAA;AAAA,IAClB,cAAc,QAAA,CAAS,IAAA;AAAA,IACvB,cAAc,QAAA,CAAS,IAAA;AAAA,IACvB,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAA,sBAAe,IAAA;AAAK,GACtB;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,IAAA,cAAA,CAAe,OAAO,KAAA,CAAM,IAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,cAAA;AACT;AAEA,SAAS,yBAAA,CACP,gBACA,KAAA,EACe;AACf,EAAA,MAAM,UAAA,uBAAiB,IAAA,EAAK;AAE5B,EAAA,OAAO;AAAA,IACL,GAAG,cAAA;AAAA,IACH,UAAA;AAAA,IACA,YAAY,UAAA,CAAW,OAAA,EAAQ,GAAI,cAAA,CAAe,UAAU,OAAA,EAAQ;AAAA,IACpE,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO,eAAe,KAAK;AAAA,GAC7B;AACF;AAEA,SAAS,+BAA+B,OAAA,EAMd;AACxB,EAAA,MAAM,EAAE,UAAA,EAAY,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,WAAU,GAAI,OAAA;AAChE,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,IAAI,QAAA,GAAW,KAAA;AAEf,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,GAAwC;AAC5C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,IAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,YAAA,GAAe,IAAA;AACf,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,KAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAEjC,QAAA,IAAI,KAAK,IAAA,EAAM;AACb,UAAA,QAAA,GAAW,IAAA;AACX,UAAA,MAAM,SAAA,EAAU;AAChB,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,IAAA;AAAA,YACN,KAAA,EAAO,KAAA;AAAA,WACT;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,KAAA;AAAA,UACN,OAAO,IAAA,CAAK;AAAA,SACd;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,SAAA,CAAU,KAAK,CAAA;AACf,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,MAAM,MAAA,GAA0C;AAC9C,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,SAAA,CAAU,8BAA8B,CAAA;AAExC,MAAA,IAAI,OAAO,QAAA,CAAS,MAAA,KAAW,UAAA,EAAY;AACzC,QAAA,MAAM,SAAS,MAAA,EAAO;AAAA,MACxB;AAEA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,IAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACT;AAAA,IACF,CAAA;AAAA,IACA,MAAM,MAAM,KAAA,EAAkD;AAC5D,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,SAAA,CAAU,KAAK,CAAA;AAEf,MAAA,IAAI,OAAO,QAAA,CAAS,KAAA,KAAU,UAAA,EAAY;AACxC,QAAA,OAAO,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,MAC7B;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,GACF;AACF;AAEA,SAAS,4BAA4B,YAAA,EAInC;AACA,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,EAAA,MAAM,kBAAkB,MAAY;AAClC,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,UAAA,CAAW,KAAA,CAAM,cAAc,MAAM,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,IAAI,cAAc,OAAA,EAAS;AACzB,IAAA,eAAA,EAAgB;AAAA,EAClB,CAAA,MAAO;AACL,IAAA,YAAA,EAAc,iBAAiB,OAAA,EAAS,eAAA,EAAiB,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,SAAS,MAAM;AACb,MAAA,YAAA,EAAc,mBAAA,CAAoB,SAAS,eAAe,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,eAAe,MAAM;AAAA,GACvB;AACF;AAEA,SAAS,6BAA6B,SAAA,EAA0B;AAC9D,EAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,IAChB,gDAAgD,SAAS,CAAA,GAAA;AAAA,GAC3D;AACA,EAAA,KAAA,CAAM,IAAA,GAAO,wBAAA;AACb,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,2BAA2B,UAAA,EAA2B;AAC7D,EAAA,MAAM,QAAQ,IAAI,KAAA;AAAA,IAChB,sBAAsB,UAAU,CAAA,wCAAA;AAAA,GAClC;AACA,EAAA,KAAA,CAAM,IAAA,GAAO,kBAAA;AACb,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,4BAAA,GAAsC;AAC7C,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,0CAA0C,CAAA;AAClE,EAAA,KAAA,CAAM,IAAA,GAAO,mBAAA;AACb,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,UAAA,CAAW,SAAS,EAAE,CAAA;AAAA,EACxB,CAAC,CAAA;AACH","file":"index.js","sourcesContent":["import type { AttemptRecord, SerializedError } from './types.js';\n\nexport class PrioLlmRouterError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\nexport class RouterConfigurationError extends PrioLlmRouterError {}\n\nexport class AllModelsFailedError extends PrioLlmRouterError {\n readonly attempts: AttemptRecord[];\n\n constructor(attempts: AttemptRecord[], cause?: unknown) {\n super(buildFailureMessage(attempts), { cause });\n this.attempts = attempts;\n }\n}\n\nexport function serializeError(error: unknown): SerializedError {\n if (error instanceof Error) {\n const maybeError = error as Error & {\n code?: string;\n statusCode?: number;\n status?: number;\n };\n\n const serialized: SerializedError = {\n name: error.name,\n message: error.message,\n };\n\n if (maybeError.code !== undefined) {\n serialized.code = maybeError.code;\n }\n\n const statusCode = maybeError.statusCode ?? maybeError.status;\n if (statusCode !== undefined) {\n serialized.statusCode = statusCode;\n }\n\n return serialized;\n }\n\n if (typeof error === 'string') {\n return {\n name: 'Error',\n message: error,\n };\n }\n\n return {\n name: 'UnknownError',\n message: 'Unknown router error',\n };\n}\n\nexport function isAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === 'AbortError' || error.name === 'TimeoutError';\n}\n\nfunction buildFailureMessage(attempts: AttemptRecord[]): string {\n const summary = attempts\n .map((attempt) => {\n const errorMessage = attempt.error?.message ?? 'Unknown error';\n return `${attempt.targetName} (${attempt.providerName}/${attempt.model}): ${errorMessage}`;\n })\n .join('; ');\n\n return summary\n ? `All configured model attempts failed. ${summary}`\n : 'All configured model attempts failed.';\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createCohere } from '@ai-sdk/cohere';\nimport { createDeepSeek } from '@ai-sdk/deepseek';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { createGroq } from '@ai-sdk/groq';\nimport { createMistral } from '@ai-sdk/mistral';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport { createPerplexity } from '@ai-sdk/perplexity';\nimport { createTogetherAI } from '@ai-sdk/togetherai';\nimport { createXai } from '@ai-sdk/xai';\nimport { generateText, streamText, type LanguageModel } from 'ai';\nimport { createOpenRouter } from '@openrouter/ai-sdk-provider';\n\nimport { RouterConfigurationError } from './errors.js';\nimport type {\n ExecuteStreamTextTargetResult,\n ExecuteTextTargetInput,\n ExecuteTextTargetResult,\n OpenRouterProviderConfig,\n ProviderConfig,\n TextGenerationExecutor,\n TokenUsage,\n} from './types.js';\n\ntype AiSdkGenerateTextOptions = Parameters<typeof generateText>[0];\ntype AiSdkStreamTextOptions = Parameters<typeof streamText>[0];\ntype ProviderHandle =\n | ((modelId: string) => LanguageModel)\n | {\n languageModel?: (modelId: string) => LanguageModel;\n chat?: (modelId: string) => LanguageModel;\n chatModel?: (modelId: string) => LanguageModel;\n };\n\nexport function createDefaultTextGenerationExecutor(options?: {\n defaultProviderMaxRetries?: number;\n}): TextGenerationExecutor {\n return new AiSdkTextGenerationExecutor(options?.defaultProviderMaxRetries ?? 0);\n}\n\nclass AiSdkTextGenerationExecutor implements TextGenerationExecutor {\n private readonly providerCache = new Map<string, ProviderHandle>();\n\n constructor(private readonly defaultProviderMaxRetries: number) {}\n\n async execute({\n provider,\n model,\n request,\n }: ExecuteTextTargetInput): Promise<ExecuteTextTargetResult> {\n const languageModel = this.getLanguageModel(provider, model.model);\n const call = buildBaseTextCallOptions({\n languageModel,\n request,\n defaultProviderMaxRetries: this.defaultProviderMaxRetries,\n }) as AiSdkGenerateTextOptions;\n\n const result = await generateText(call);\n\n const output: ExecuteTextTargetResult = {\n text: result.text,\n finishReason: result.finishReason ?? null,\n raw: result,\n };\n\n const usage = normalizeUsage(result.usage);\n if (usage) {\n output.usage = usage;\n }\n\n const warnings = normalizeWarnings(result.warnings);\n if (warnings) {\n output.warnings = warnings;\n }\n\n return output;\n }\n\n async stream({\n provider,\n model,\n request,\n }: ExecuteTextTargetInput): Promise<ExecuteStreamTextTargetResult> {\n await Promise.resolve();\n\n const languageModel = this.getLanguageModel(provider, model.model);\n\n const call = buildBaseTextCallOptions({\n languageModel,\n request,\n defaultProviderMaxRetries: this.defaultProviderMaxRetries,\n }) as AiSdkStreamTextOptions;\n\n const result = streamText(call);\n\n return {\n textStream: result.textStream,\n consumeStream: async () => {\n await result.consumeStream();\n },\n finishReason: Promise.resolve(result.finishReason).then(\n (value) => value ?? null,\n ),\n usage: Promise.resolve(result.totalUsage).then((value) =>\n normalizeUsage(value),\n ),\n warnings: Promise.resolve(result.warnings).then((value) =>\n normalizeWarnings(value),\n ),\n raw: result,\n };\n }\n\n private getLanguageModel(\n provider: ProviderConfig,\n modelId: string,\n ): LanguageModel {\n const handle =\n this.providerCache.get(provider.name) ?? createProviderHandle(provider);\n\n if (!this.providerCache.has(provider.name)) {\n this.providerCache.set(provider.name, handle);\n }\n\n return resolveLanguageModel(handle, modelId, provider.name);\n }\n}\n\nfunction buildBaseTextCallOptions({\n languageModel,\n request,\n defaultProviderMaxRetries,\n}: {\n languageModel: LanguageModel;\n request: ExecuteTextTargetInput['request'];\n defaultProviderMaxRetries: number;\n}): Record<string, unknown> {\n const call: AiSdkGenerateTextOptions = {\n model: languageModel,\n system: request.system,\n temperature: request.temperature,\n topP: request.topP,\n maxRetries: request.providerMaxRetries ?? defaultProviderMaxRetries,\n abortSignal: request.abortSignal,\n } as AiSdkGenerateTextOptions;\n\n if (request.maxOutputTokens !== undefined) {\n (\n call as AiSdkGenerateTextOptions & {\n maxOutputTokens?: number;\n }\n ).maxOutputTokens = request.maxOutputTokens;\n }\n\n if (request.stopSequences !== undefined) {\n (\n call as AiSdkGenerateTextOptions & {\n stopSequences?: string[];\n }\n ).stopSequences = request.stopSequences;\n }\n\n if ('prompt' in request) {\n (\n call as AiSdkGenerateTextOptions & {\n prompt?: string;\n }\n ).prompt = request.prompt;\n } else {\n (\n call as AiSdkGenerateTextOptions & {\n messages?: ExecuteTextTargetInput['request']['messages'];\n }\n ).messages = request.messages;\n }\n\n return call as Record<string, unknown>;\n}\n\nfunction createProviderHandle(provider: ProviderConfig): ProviderHandle {\n const apiKey = provider.auth.apiKey.trim();\n\n if (!apiKey) {\n throw new RouterConfigurationError(\n `Provider \"${provider.name}\" is missing an API key.`,\n );\n }\n\n switch (provider.type) {\n case 'anthropic': {\n const options: Parameters<typeof createAnthropic>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createAnthropic(options);\n }\n\n case 'cohere': {\n const options: Parameters<typeof createCohere>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createCohere(options);\n }\n\n case 'deepseek': {\n const options: Parameters<typeof createDeepSeek>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createDeepSeek(options);\n }\n\n case 'google': {\n const options: Parameters<typeof createGoogleGenerativeAI>[0] = {\n apiKey,\n };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createGoogleGenerativeAI(options);\n }\n\n case 'groq': {\n const options: Parameters<typeof createGroq>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createGroq(options);\n }\n\n case 'mistral': {\n const options: Parameters<typeof createMistral>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createMistral(options);\n }\n\n case 'openai': {\n const options: Parameters<typeof createOpenAI>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createOpenAI(options);\n }\n\n case 'openai-compatible': {\n const options: Parameters<typeof createOpenAICompatible>[0] = {\n name: provider.providerLabel ?? provider.name,\n apiKey,\n baseURL: provider.baseURL,\n };\n if (provider.headers) {\n options.headers = provider.headers;\n }\n if (provider.queryParams) {\n options.queryParams = provider.queryParams;\n }\n return createOpenAICompatible(options);\n }\n\n case 'openrouter': {\n const options: NonNullable<Parameters<typeof createOpenRouter>[0]> = {\n apiKey,\n };\n const headers = buildOpenRouterHeaders(provider);\n if (headers) {\n options.headers = headers;\n }\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n return createOpenRouter(options);\n }\n\n case 'perplexity': {\n const options: Parameters<typeof createPerplexity>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createPerplexity(options);\n }\n\n case 'togetherai': {\n const options: Parameters<typeof createTogetherAI>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createTogetherAI(options);\n }\n\n case 'xai': {\n const options: Parameters<typeof createXai>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createXai(options);\n }\n\n default: {\n const exhaustiveCheck: never = provider;\n throw new RouterConfigurationError(\n `Unsupported provider type: ${JSON.stringify(exhaustiveCheck)}`,\n );\n }\n }\n}\n\nfunction buildOpenRouterHeaders(\n provider: OpenRouterProviderConfig,\n): Record<string, string> | undefined {\n const headers = { ...provider.headers };\n\n if (provider.appUrl) {\n headers['HTTP-Referer'] = provider.appUrl;\n }\n\n if (provider.appName) {\n headers['X-Title'] = provider.appName;\n }\n\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction resolveLanguageModel(\n providerHandle: ProviderHandle,\n modelId: string,\n providerName: string,\n): LanguageModel {\n if (typeof providerHandle === 'function') {\n return providerHandle(modelId);\n }\n\n const dynamicHandle = providerHandle as Record<string, unknown>;\n const candidates = ['languageModel', 'chatModel', 'chat'];\n\n for (const candidate of candidates) {\n const factory = dynamicHandle[candidate];\n if (typeof factory === 'function') {\n return (factory as (id: string) => LanguageModel)(modelId);\n }\n }\n\n throw new RouterConfigurationError(\n `Provider \"${providerName}\" does not expose a supported language model factory.`,\n );\n}\n\nfunction normalizeUsage(usage: unknown): TokenUsage | undefined {\n if (!usage || typeof usage !== 'object') {\n return undefined;\n }\n\n const numericUsage = usage as Record<string, unknown>;\n const normalized: TokenUsage = {};\n\n const keys: Array<keyof TokenUsage> = [\n 'inputTokens',\n 'outputTokens',\n 'totalTokens',\n 'reasoningTokens',\n 'cachedInputTokens',\n ];\n\n for (const key of keys) {\n const value = numericUsage[key];\n if (typeof value === 'number') {\n normalized[key] = value;\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nfunction normalizeWarnings(warnings: unknown): unknown[] | undefined {\n return Array.isArray(warnings) ? warnings : undefined;\n}\n","import { RouterConfigurationError } from './errors.js';\nimport type {\n LlmConnection,\n LlmSource,\n LlmSourceConfig,\n OpenAICompatibleProviderConfig,\n OpenAICompatibleConnectionInput,\n OpenRouterConnectionInput,\n OpenRouterFreeSourceInput,\n OpenRouterProviderConfig,\n ProviderConfig,\n} from './types.js';\n\nexport function createLlmConnection<TProvider extends ProviderConfig>(\n provider: TProvider,\n): LlmConnection<TProvider> {\n assertConnectionProviderName(provider);\n\n return {\n provider,\n };\n}\n\nexport function createOpenRouterConnection(\n provider: OpenRouterConnectionInput,\n): LlmConnection<OpenRouterProviderConfig> {\n return createLlmConnection({\n ...provider,\n type: 'openrouter',\n });\n}\n\nexport function createOpenAICompatibleConnection(\n provider: OpenAICompatibleConnectionInput,\n): LlmConnection<OpenAICompatibleProviderConfig> {\n return createLlmConnection({\n ...provider,\n type: 'openai-compatible',\n });\n}\n\nexport function createLlmSource<TProvider extends ProviderConfig>(\n connection: LlmConnection<TProvider>,\n config: LlmSourceConfig<TProvider>,\n): LlmSource<TProvider> {\n assertSourceConfig(config);\n\n const normalizedConfig =\n config.access === 'free'\n ? config\n : ({\n ...config,\n access: 'standard',\n } satisfies LlmSourceConfig<TProvider>);\n\n return {\n connection,\n config: normalizedConfig,\n };\n}\n\nexport function createOpenRouterFreeSource(\n connection: LlmConnection<OpenRouterProviderConfig>,\n config: OpenRouterFreeSourceInput,\n): LlmSource<OpenRouterProviderConfig> {\n return createLlmSource(connection, {\n ...config,\n access: 'free',\n });\n}\n\nfunction assertConnectionProviderName(provider: ProviderConfig): void {\n if (!provider.name.trim()) {\n throw new RouterConfigurationError(\n 'Connection provider names must be non-empty.',\n );\n }\n}\n\nfunction assertSourceConfig(config: LlmSourceConfig): void {\n if (!config.name.trim()) {\n throw new RouterConfigurationError('Source names must be non-empty.');\n }\n\n if (!config.model.trim()) {\n throw new RouterConfigurationError('Source models must be non-empty.');\n }\n}\n","import { AllModelsFailedError, RouterConfigurationError, isAbortError, serializeError } from './errors.js';\nimport { createDefaultTextGenerationExecutor } from './provider-factory.js';\nimport type {\n AttemptRecord,\n ExecuteStreamTextTargetResult,\n LlmSource,\n ModelConfig,\n PendingAttempt,\n PrioLlmRouterOptions,\n ProviderConfig,\n ResolvedModelTarget,\n RouterGenerateTextRequest,\n RouterGenerateTextResult,\n RouterStreamTextRequest,\n RouterStreamTextResult,\n TextGenerationExecutor,\n} from './types.js';\n\ninterface IndexedModel extends ModelConfig {\n readonly __index: number;\n}\n\ninterface NormalizedRouterConfig {\n providers: ProviderConfig[];\n models: ModelConfig[];\n defaultChain?: string[];\n}\n\nexport class PrioLlmRouter {\n private readonly providersByName = new Map<string, ProviderConfig>();\n private readonly modelsByName = new Map<string, IndexedModel>();\n private readonly defaultChain: string[] | undefined;\n private readonly executor: TextGenerationExecutor;\n private readonly hooks: PrioLlmRouterOptions['hooks'] | undefined;\n\n constructor(options: PrioLlmRouterOptions) {\n const normalized = resolveRouterConfig(options);\n\n if (normalized.providers.length === 0) {\n throw new RouterConfigurationError(\n 'At least one provider configuration is required.',\n );\n }\n\n if (normalized.models.length === 0) {\n throw new RouterConfigurationError(\n 'At least one model configuration is required.',\n );\n }\n\n this.defaultChain = normalized.defaultChain;\n this.hooks = options.hooks;\n this.executor = options.executor ?? (\n options.defaultProviderMaxRetries === undefined\n ? createDefaultTextGenerationExecutor()\n : createDefaultTextGenerationExecutor({\n defaultProviderMaxRetries: options.defaultProviderMaxRetries,\n })\n );\n\n for (const provider of normalized.providers) {\n this.assertUniqueName(\n this.providersByName,\n provider.name,\n 'provider configuration',\n );\n this.validateProvider(provider);\n this.providersByName.set(provider.name, provider);\n }\n\n normalized.models.forEach((model, index) => {\n this.assertUniqueName(this.modelsByName, model.name, 'model configuration');\n\n if (!this.providersByName.has(model.provider)) {\n throw new RouterConfigurationError(\n `Model \"${model.name}\" references unknown provider \"${model.provider}\".`,\n );\n }\n\n this.modelsByName.set(model.name, {\n ...model,\n __index: index,\n });\n });\n\n if (this.defaultChain) {\n this.resolveNamedChain(this.defaultChain);\n }\n }\n\n listProviders(): ProviderConfig[] {\n return [...this.providersByName.values()];\n }\n\n listModels(): ResolvedModelTarget[] {\n return [...this.modelsByName.values()]\n .sort(compareModels)\n .map((model) => this.toResolvedTarget(model));\n }\n\n async generateText(\n request: RouterGenerateTextRequest,\n ): Promise<RouterGenerateTextResult> {\n const chain = this.resolveExecutionChain(request.chain);\n const attempts: AttemptRecord[] = [];\n let lastError: unknown;\n\n for (const [index, model] of chain.entries()) {\n const provider = this.providersByName.get(model.provider);\n\n if (!provider) {\n throw new RouterConfigurationError(\n `Provider \"${model.provider}\" was not found for target \"${model.name}\".`,\n );\n }\n\n const pendingAttempt: PendingAttempt = {\n attemptIndex: index,\n targetName: model.name,\n providerName: provider.name,\n providerType: provider.type,\n model: model.model,\n startedAt: new Date(),\n };\n\n if (model.tier !== undefined) {\n pendingAttempt.tier = model.tier;\n }\n\n this.hooks?.onAttemptStart?.(pendingAttempt);\n\n try {\n const result = await this.executor.execute({\n provider,\n model,\n request,\n });\n\n const finishedAt = new Date();\n const attemptRecord: AttemptRecord = {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: true,\n };\n\n attempts.push(attemptRecord);\n this.hooks?.onAttemptSuccess?.(attemptRecord);\n\n const response: RouterGenerateTextResult = {\n text: result.text,\n target: this.toResolvedTarget(model),\n attempts,\n finishReason: result.finishReason,\n raw: result.raw,\n };\n\n if (result.usage) {\n response.usage = result.usage;\n }\n\n if (result.warnings) {\n response.warnings = result.warnings;\n }\n\n return response;\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n\n const finishedAt = new Date();\n const attemptRecord: AttemptRecord = {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: false,\n error: serializeError(error),\n };\n\n attempts.push(attemptRecord);\n this.hooks?.onAttemptFailure?.(attemptRecord);\n lastError = error;\n }\n }\n\n throw new AllModelsFailedError(attempts, lastError);\n }\n\n async streamText(\n request: RouterStreamTextRequest,\n ): Promise<RouterStreamTextResult> {\n const chain = this.resolveExecutionChain(request.chain);\n const attempts: AttemptRecord[] = [];\n let lastError: unknown;\n\n for (const [index, model] of chain.entries()) {\n const provider = this.providersByName.get(model.provider);\n\n if (!provider) {\n throw new RouterConfigurationError(\n `Provider \"${model.provider}\" was not found for target \"${model.name}\".`,\n );\n }\n\n const pendingAttempt = createPendingAttempt(index, provider, model);\n this.hooks?.onAttemptStart?.(pendingAttempt);\n\n const { controller, cleanup, parentAborted } = createLinkedAbortController(\n request.abortSignal,\n );\n\n try {\n const streamResult = await this.executor.stream({\n provider,\n model,\n request: {\n ...request,\n abortSignal: controller.signal,\n },\n });\n\n const iterator = streamResult.textStream[Symbol.asyncIterator]();\n const firstChunk = await this.waitForFirstChunk({\n iterator,\n timeoutMs: request.firstChunkTimeoutMs,\n abortController: controller,\n parentAborted,\n });\n\n if (firstChunk.done) {\n throw createEmptyFirstChunkError(model.name);\n }\n\n return this.createStreamingResult({\n pendingAttempt,\n attempts,\n model,\n iterator,\n streamResult,\n firstChunk: firstChunk.value,\n cleanupAbortLink: cleanup,\n });\n } catch (error) {\n cleanup();\n\n if (isAbortError(error) && parentAborted()) {\n throw error;\n }\n\n const attemptRecord = createFailedAttemptRecord(pendingAttempt, error);\n attempts.push(attemptRecord);\n this.hooks?.onAttemptFailure?.(attemptRecord);\n lastError = error;\n }\n }\n\n throw new AllModelsFailedError(attempts, lastError);\n }\n\n private createStreamingResult(options: {\n pendingAttempt: PendingAttempt;\n attempts: AttemptRecord[];\n model: IndexedModel;\n iterator: AsyncIterator<string>;\n streamResult: ExecuteStreamTextTargetResult;\n firstChunk: string;\n cleanupAbortLink: () => void;\n }): RouterStreamTextResult {\n const {\n pendingAttempt,\n attempts,\n model,\n iterator,\n streamResult,\n firstChunk,\n cleanupAbortLink,\n } = options;\n\n let started = false;\n const textParts = [firstChunk];\n\n let resolveFinal!: (value: RouterGenerateTextResult) => void;\n let rejectFinal!: (reason?: unknown) => void;\n let finalized = false;\n const final = new Promise<RouterGenerateTextResult>((resolve, reject) => {\n resolveFinal = resolve;\n rejectFinal = reject;\n });\n\n const finalizeSuccess = async (): Promise<void> => {\n if (finalized) {\n return;\n }\n finalized = true;\n\n const finishedAt = new Date();\n const attemptRecord: AttemptRecord = {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: true,\n };\n\n attempts.push(attemptRecord);\n this.hooks?.onAttemptSuccess?.(attemptRecord);\n\n const result: RouterGenerateTextResult = {\n text: textParts.join(''),\n target: this.toResolvedTarget(model),\n attempts: [...attempts],\n finishReason: await streamResult.finishReason,\n raw: streamResult.raw,\n };\n\n const usage = await streamResult.usage;\n if (usage) {\n result.usage = usage;\n }\n\n const warnings = await streamResult.warnings;\n if (warnings) {\n result.warnings = warnings;\n }\n\n cleanupAbortLink();\n resolveFinal(result);\n };\n\n const finalizeFailure = (error: unknown): void => {\n if (finalized) {\n return;\n }\n finalized = true;\n\n const attemptRecord = createFailedAttemptRecord(pendingAttempt, error);\n attempts.push(attemptRecord);\n this.hooks?.onAttemptFailure?.(attemptRecord);\n cleanupAbortLink();\n rejectFinal(error);\n };\n\n const wrappedStream: AsyncIterable<string> = {\n [Symbol.asyncIterator]: () => {\n if (started) {\n throw new RouterConfigurationError(\n 'This stream can only be consumed once.',\n );\n }\n\n started = true;\n\n return createRouterTextStreamIterator({\n firstChunk,\n iterator,\n onChunk: (chunk) => {\n textParts.push(chunk);\n },\n onSuccess: finalizeSuccess,\n onFailure: finalizeFailure,\n });\n },\n };\n\n return {\n target: this.toResolvedTarget(model),\n selectedAttempt: pendingAttempt,\n attempts: [...attempts],\n textStream: wrappedStream,\n final,\n consumeStream: async () => {\n if (!started) {\n for await (const _ of wrappedStream) {\n void _;\n }\n }\n\n return final;\n },\n };\n }\n\n private async waitForFirstChunk(options: {\n iterator: AsyncIterator<string>;\n timeoutMs: number | undefined;\n abortController: AbortController;\n parentAborted: () => boolean;\n }): Promise<IteratorResult<string>> {\n const { iterator, timeoutMs, abortController, parentAborted } = options;\n const nextPromise = iterator.next();\n\n if (timeoutMs === undefined) {\n return nextPromise;\n }\n\n const timeoutError = createFirstChunkTimeoutError(timeoutMs);\n\n const timedRace = await Promise.race([\n nextPromise.then(\n (value) => ({ kind: 'value' as const, value }),\n (error: unknown) => ({ kind: 'error' as const, error }),\n ),\n delay(timeoutMs).then(() => ({ kind: 'timeout' as const })),\n ]);\n\n if (timedRace.kind === 'value') {\n return timedRace.value;\n }\n\n if (timedRace.kind === 'timeout') {\n abortController.abort(timeoutError);\n void nextPromise.catch(() => undefined);\n throw timeoutError;\n }\n\n if (isAbortError(timedRace.error) && parentAborted()) {\n throw timedRace.error;\n }\n\n throw timedRace.error;\n }\n\n private resolveExecutionChain(chain?: string[]): IndexedModel[] {\n if (chain?.length) {\n return this.resolveNamedChain(chain);\n }\n\n if (this.defaultChain?.length) {\n return this.resolveNamedChain(this.defaultChain);\n }\n\n const implicitChain = [...this.modelsByName.values()]\n .filter((model) => this.isModelEnabled(model))\n .sort(compareModels);\n\n if (implicitChain.length === 0) {\n throw new RouterConfigurationError(\n 'No enabled model targets are available for execution.',\n );\n }\n\n return implicitChain;\n }\n\n private resolveNamedChain(chain: string[]): IndexedModel[] {\n const resolved: IndexedModel[] = [];\n const seen = new Set<string>();\n\n for (const targetName of chain) {\n if (seen.has(targetName)) {\n continue;\n }\n\n seen.add(targetName);\n const model = this.modelsByName.get(targetName);\n\n if (!model) {\n throw new RouterConfigurationError(\n `Model target \"${targetName}\" is not configured.`,\n );\n }\n\n if (!this.isModelEnabled(model)) {\n throw new RouterConfigurationError(\n `Model target \"${targetName}\" is disabled or its provider is disabled.`,\n );\n }\n\n resolved.push(model);\n }\n\n if (resolved.length === 0) {\n throw new RouterConfigurationError(\n 'The resolved execution chain is empty.',\n );\n }\n\n return resolved;\n }\n\n private isModelEnabled(model: ModelConfig): boolean {\n if (model.enabled === false) {\n return false;\n }\n\n const provider = this.providersByName.get(model.provider);\n return provider?.enabled !== false;\n }\n\n private toResolvedTarget(model: ModelConfig): ResolvedModelTarget {\n const provider = this.providersByName.get(model.provider);\n\n if (!provider) {\n throw new RouterConfigurationError(\n `Model \"${model.name}\" references missing provider \"${model.provider}\".`,\n );\n }\n\n const resolvedTarget: ResolvedModelTarget = {\n name: model.name,\n providerName: provider.name,\n providerType: provider.type,\n model: model.model,\n };\n\n if (model.priority !== undefined) {\n resolvedTarget.priority = model.priority;\n }\n\n if (model.tier !== undefined) {\n resolvedTarget.tier = model.tier;\n }\n\n if (model.metadata !== undefined) {\n resolvedTarget.metadata = model.metadata;\n }\n\n return resolvedTarget;\n }\n\n private validateProvider(provider: ProviderConfig): void {\n if (!provider.name.trim()) {\n throw new RouterConfigurationError(\n 'Provider configuration names must be non-empty.',\n );\n }\n\n if (!provider.auth.apiKey.trim()) {\n throw new RouterConfigurationError(\n `Provider \"${provider.name}\" requires a non-empty API key.`,\n );\n }\n }\n\n private assertUniqueName(\n registry: Map<string, unknown>,\n name: string,\n label: string,\n ): void {\n if (!name.trim()) {\n throw new RouterConfigurationError(`${label} names must be non-empty.`);\n }\n\n if (registry.has(name)) {\n throw new RouterConfigurationError(\n `Duplicate ${label} name \"${name}\" detected.`,\n );\n }\n }\n}\n\nexport function createLlmRouter(\n options: PrioLlmRouterOptions,\n): PrioLlmRouter {\n return new PrioLlmRouter(options);\n}\n\nfunction resolveRouterConfig(\n options: PrioLlmRouterOptions,\n): NormalizedRouterConfig {\n if ('sources' in options) {\n return compileSources(options.sources, options.defaultChain);\n }\n\n const normalized: NormalizedRouterConfig = {\n providers: options.providers,\n models: options.models,\n };\n\n if (options.defaultChain !== undefined) {\n normalized.defaultChain = options.defaultChain;\n }\n\n return normalized;\n}\n\nfunction compareModels(left: IndexedModel, right: IndexedModel): number {\n const leftPriority = left.priority ?? Number.MAX_SAFE_INTEGER;\n const rightPriority = right.priority ?? Number.MAX_SAFE_INTEGER;\n\n if (leftPriority !== rightPriority) {\n return leftPriority - rightPriority;\n }\n\n return left.__index - right.__index;\n}\n\nfunction compileSources(\n sources: LlmSource[],\n defaultChain?: string[],\n): NormalizedRouterConfig {\n const providersByName = new Map<string, ProviderConfig>();\n const models: ModelConfig[] = [];\n\n for (const source of sources) {\n const provider = source.connection.provider;\n const providerName = provider.name.trim();\n const modelId = source.config.model.trim();\n const access = source.config.access ?? 'standard';\n\n if (!providerName) {\n throw new RouterConfigurationError(\n 'Connection provider names must be non-empty.',\n );\n }\n\n if (!source.config.name.trim()) {\n throw new RouterConfigurationError('Source names must be non-empty.');\n }\n\n if (!modelId) {\n throw new RouterConfigurationError('Source models must be non-empty.');\n }\n\n const existingProvider = providersByName.get(providerName);\n if (existingProvider) {\n assertMatchingSourceProvider(existingProvider, provider);\n } else {\n providersByName.set(providerName, provider);\n }\n\n if (access === 'free') {\n assertGuaranteedFreeSource(provider, source.config.model);\n }\n\n if (access === 'free' && source.config.tier === 'paid') {\n throw new RouterConfigurationError(\n `Free source \"${source.config.name}\" cannot be marked as paid.`,\n );\n }\n\n const compiledModel: ModelConfig = {\n name: source.config.name,\n provider: providerName,\n model: modelId,\n };\n\n if (source.config.enabled !== undefined) {\n compiledModel.enabled = source.config.enabled;\n }\n\n if (source.config.priority !== undefined) {\n compiledModel.priority = source.config.priority;\n }\n\n const tier = source.config.tier ?? (access === 'free' ? 'free' : undefined);\n if (tier !== undefined) {\n compiledModel.tier = tier;\n }\n\n if (source.config.metadata !== undefined) {\n compiledModel.metadata = source.config.metadata;\n }\n\n models.push(compiledModel);\n }\n\n const normalized: NormalizedRouterConfig = {\n providers: [...providersByName.values()],\n models,\n };\n\n if (defaultChain !== undefined) {\n normalized.defaultChain = defaultChain;\n }\n\n return normalized;\n}\n\nfunction assertMatchingSourceProvider(\n existingProvider: ProviderConfig,\n nextProvider: ProviderConfig,\n): void {\n if (JSON.stringify(existingProvider) === JSON.stringify(nextProvider)) {\n return;\n }\n\n throw new RouterConfigurationError(\n `Connection provider \"${existingProvider.name}\" is configured more than once with different settings.`,\n );\n}\n\nfunction assertGuaranteedFreeSource(\n provider: ProviderConfig,\n model: string,\n): void {\n if (provider.type !== 'openrouter') {\n throw new RouterConfigurationError(\n `Provider \"${provider.name}\" does not support strict free sources. Only OpenRouter with explicit \":free\" model variants is supported today.`,\n );\n }\n\n const normalizedModel = model.trim();\n\n if (normalizedModel === 'openrouter/free') {\n throw new RouterConfigurationError(\n `Free source \"${provider.name}\" cannot use \"openrouter/free\". Use an explicit \":free\" model id instead.`,\n );\n }\n\n if (!normalizedModel.endsWith(':free')) {\n throw new RouterConfigurationError(\n `Free OpenRouter sources must use an explicit \":free\" model id. Received \"${normalizedModel}\".`,\n );\n }\n}\n\nfunction createPendingAttempt(\n attemptIndex: number,\n provider: ProviderConfig,\n model: ModelConfig,\n): PendingAttempt {\n const pendingAttempt: PendingAttempt = {\n attemptIndex,\n targetName: model.name,\n providerName: provider.name,\n providerType: provider.type,\n model: model.model,\n startedAt: new Date(),\n };\n\n if (model.tier !== undefined) {\n pendingAttempt.tier = model.tier;\n }\n\n return pendingAttempt;\n}\n\nfunction createFailedAttemptRecord(\n pendingAttempt: PendingAttempt,\n error: unknown,\n): AttemptRecord {\n const finishedAt = new Date();\n\n return {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: false,\n error: serializeError(error),\n };\n}\n\nfunction createRouterTextStreamIterator(options: {\n firstChunk: string;\n iterator: AsyncIterator<string>;\n onChunk: (chunk: string) => void;\n onSuccess: () => Promise<void>;\n onFailure: (error: unknown) => void;\n}): AsyncIterator<string> {\n const { firstChunk, iterator, onChunk, onSuccess, onFailure } = options;\n let firstYielded = false;\n let finished = false;\n\n return {\n async next(): Promise<IteratorResult<string>> {\n if (finished) {\n return {\n done: true,\n value: undefined,\n };\n }\n\n if (!firstYielded) {\n firstYielded = true;\n return {\n done: false,\n value: firstChunk,\n };\n }\n\n try {\n const next = await iterator.next();\n\n if (next.done) {\n finished = true;\n await onSuccess();\n return {\n done: true,\n value: undefined,\n };\n }\n\n onChunk(next.value);\n return {\n done: false,\n value: next.value,\n };\n } catch (error) {\n finished = true;\n onFailure(error);\n throw error;\n }\n },\n async return(): Promise<IteratorResult<string>> {\n finished = true;\n onFailure(createStreamClosedEarlyError());\n\n if (typeof iterator.return === 'function') {\n await iterator.return();\n }\n\n return {\n done: true,\n value: undefined,\n };\n },\n async throw(error?: unknown): Promise<IteratorResult<string>> {\n finished = true;\n onFailure(error);\n\n if (typeof iterator.throw === 'function') {\n return iterator.throw(error);\n }\n\n throw error;\n },\n };\n}\n\nfunction createLinkedAbortController(parentSignal?: AbortSignal): {\n controller: AbortController;\n cleanup: () => void;\n parentAborted: () => boolean;\n} {\n const controller = new AbortController();\n let abortedByParent = false;\n\n const abortFromParent = (): void => {\n abortedByParent = true;\n controller.abort(parentSignal?.reason);\n };\n\n if (parentSignal?.aborted) {\n abortFromParent();\n } else {\n parentSignal?.addEventListener('abort', abortFromParent, { once: true });\n }\n\n return {\n controller,\n cleanup: () => {\n parentSignal?.removeEventListener('abort', abortFromParent);\n },\n parentAborted: () => abortedByParent,\n };\n}\n\nfunction createFirstChunkTimeoutError(timeoutMs: number): Error {\n const error = new Error(\n `The first stream chunk did not arrive within ${timeoutMs}ms.`,\n );\n error.name = 'FirstChunkTimeoutError';\n return error;\n}\n\nfunction createEmptyFirstChunkError(targetName: string): Error {\n const error = new Error(\n `Stream for target \"${targetName}\" completed before the first text chunk.`,\n );\n error.name = 'EmptyStreamError';\n return error;\n}\n\nfunction createStreamClosedEarlyError(): Error {\n const error = new Error('The stream was closed before completion.');\n error.name = 'StreamClosedError';\n return error;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/provider-factory.ts","../src/source-builders.ts","../src/prio-llm-router.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { AttemptRecord, SerializedError } from './types.js';\n\nexport class PrioLlmRouterError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\nexport class RouterConfigurationError extends PrioLlmRouterError {}\n\nexport class AllModelsFailedError extends PrioLlmRouterError {\n readonly attempts: AttemptRecord[];\n\n constructor(attempts: AttemptRecord[], cause?: unknown) {\n super(buildFailureMessage(attempts), { cause });\n this.attempts = attempts;\n }\n}\n\nexport function serializeError(error: unknown): SerializedError {\n if (error instanceof Error) {\n const maybeError = error as Error & {\n code?: string;\n statusCode?: number;\n status?: number;\n };\n\n const serialized: SerializedError = {\n name: error.name,\n message: error.message,\n };\n\n if (maybeError.code !== undefined) {\n serialized.code = maybeError.code;\n }\n\n const statusCode = maybeError.statusCode ?? maybeError.status;\n if (statusCode !== undefined) {\n serialized.statusCode = statusCode;\n }\n\n return serialized;\n }\n\n if (typeof error === 'string') {\n return {\n name: 'Error',\n message: error,\n };\n }\n\n return {\n name: 'UnknownError',\n message: 'Unknown router error',\n };\n}\n\nexport function isAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === 'AbortError' || error.name === 'TimeoutError';\n}\n\nfunction buildFailureMessage(attempts: AttemptRecord[]): string {\n const summary = attempts\n .map((attempt) => {\n const errorMessage = attempt.error?.message ?? 'Unknown error';\n return `${attempt.targetName} (${attempt.providerName}/${attempt.model}): ${errorMessage}`;\n })\n .join('; ');\n\n return summary\n ? `All configured model attempts failed. ${summary}`\n : 'All configured model attempts failed.';\n}\n","import { createAnthropic } from '@ai-sdk/anthropic';\nimport { createCohere } from '@ai-sdk/cohere';\nimport { createDeepSeek } from '@ai-sdk/deepseek';\nimport { createGoogleGenerativeAI } from '@ai-sdk/google';\nimport { createGroq } from '@ai-sdk/groq';\nimport { createMistral } from '@ai-sdk/mistral';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport { createPerplexity } from '@ai-sdk/perplexity';\nimport { createTogetherAI } from '@ai-sdk/togetherai';\nimport { createXai } from '@ai-sdk/xai';\nimport { generateText, streamText, type LanguageModel } from 'ai';\nimport { createOpenRouter } from '@openrouter/ai-sdk-provider';\n\nimport { RouterConfigurationError } from './errors.js';\nimport type {\n ExecuteStreamTextTargetResult,\n ExecuteTextTargetInput,\n ExecuteTextTargetResult,\n OpenRouterProviderConfig,\n ProviderConfig,\n TextGenerationExecutor,\n TokenUsage,\n} from './types.js';\n\ntype AiSdkGenerateTextOptions = Parameters<typeof generateText>[0];\ntype AiSdkStreamTextOptions = Parameters<typeof streamText>[0];\ntype ProviderHandle =\n | ((modelId: string) => LanguageModel)\n | {\n languageModel?: (modelId: string) => LanguageModel;\n chat?: (modelId: string) => LanguageModel;\n chatModel?: (modelId: string) => LanguageModel;\n };\n\nexport function createDefaultTextGenerationExecutor(options?: {\n defaultProviderMaxRetries?: number;\n}): TextGenerationExecutor {\n return new AiSdkTextGenerationExecutor(options?.defaultProviderMaxRetries ?? 0);\n}\n\nclass AiSdkTextGenerationExecutor implements TextGenerationExecutor {\n private readonly providerCache = new Map<string, ProviderHandle>();\n\n constructor(private readonly defaultProviderMaxRetries: number) {}\n\n async execute({\n provider,\n model,\n request,\n }: ExecuteTextTargetInput): Promise<ExecuteTextTargetResult> {\n const languageModel = this.getLanguageModel(provider, model.model);\n const call = buildBaseTextCallOptions({\n languageModel,\n request,\n defaultProviderMaxRetries: this.defaultProviderMaxRetries,\n }) as AiSdkGenerateTextOptions;\n\n const result = await generateText(call);\n\n const output: ExecuteTextTargetResult = {\n text: result.text,\n finishReason: result.finishReason ?? null,\n raw: result,\n };\n\n const usage = normalizeUsage(result.usage);\n if (usage) {\n output.usage = usage;\n }\n\n const warnings = normalizeWarnings(result.warnings);\n if (warnings) {\n output.warnings = warnings;\n }\n\n return output;\n }\n\n async stream({\n provider,\n model,\n request,\n }: ExecuteTextTargetInput): Promise<ExecuteStreamTextTargetResult> {\n await Promise.resolve();\n\n const languageModel = this.getLanguageModel(provider, model.model);\n\n const call = buildBaseTextCallOptions({\n languageModel,\n request,\n defaultProviderMaxRetries: this.defaultProviderMaxRetries,\n }) as AiSdkStreamTextOptions;\n\n const result = streamText(call);\n\n return {\n textStream: result.textStream,\n consumeStream: async () => {\n await result.consumeStream();\n },\n finishReason: Promise.resolve(result.finishReason).then(\n (value) => value ?? null,\n ),\n usage: Promise.resolve(result.totalUsage).then((value) =>\n normalizeUsage(value),\n ),\n warnings: Promise.resolve(result.warnings).then((value) =>\n normalizeWarnings(value),\n ),\n raw: result,\n };\n }\n\n private getLanguageModel(\n provider: ProviderConfig,\n modelId: string,\n ): LanguageModel {\n const handle =\n this.providerCache.get(provider.name) ?? createProviderHandle(provider);\n\n if (!this.providerCache.has(provider.name)) {\n this.providerCache.set(provider.name, handle);\n }\n\n return resolveLanguageModel(handle, modelId, provider.name);\n }\n}\n\nfunction buildBaseTextCallOptions({\n languageModel,\n request,\n defaultProviderMaxRetries,\n}: {\n languageModel: LanguageModel;\n request: ExecuteTextTargetInput['request'];\n defaultProviderMaxRetries: number;\n}): Record<string, unknown> {\n const call: AiSdkGenerateTextOptions = {\n model: languageModel,\n system: request.system,\n temperature: request.temperature,\n topP: request.topP,\n maxRetries: request.providerMaxRetries ?? defaultProviderMaxRetries,\n abortSignal: request.abortSignal,\n } as AiSdkGenerateTextOptions;\n\n if (request.maxOutputTokens !== undefined) {\n (\n call as AiSdkGenerateTextOptions & {\n maxOutputTokens?: number;\n }\n ).maxOutputTokens = request.maxOutputTokens;\n }\n\n if (request.stopSequences !== undefined) {\n (\n call as AiSdkGenerateTextOptions & {\n stopSequences?: string[];\n }\n ).stopSequences = request.stopSequences;\n }\n\n if ('prompt' in request) {\n (\n call as AiSdkGenerateTextOptions & {\n prompt?: string;\n }\n ).prompt = request.prompt;\n } else {\n (\n call as AiSdkGenerateTextOptions & {\n messages?: ExecuteTextTargetInput['request']['messages'];\n }\n ).messages = request.messages;\n }\n\n return call as Record<string, unknown>;\n}\n\nfunction createProviderHandle(provider: ProviderConfig): ProviderHandle {\n const apiKey = provider.auth.apiKey.trim();\n\n if (!apiKey) {\n throw new RouterConfigurationError(\n `Provider \"${provider.name}\" is missing an API key.`,\n );\n }\n\n switch (provider.type) {\n case 'anthropic': {\n const options: Parameters<typeof createAnthropic>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createAnthropic(options);\n }\n\n case 'cohere': {\n const options: Parameters<typeof createCohere>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createCohere(options);\n }\n\n case 'deepseek': {\n const options: Parameters<typeof createDeepSeek>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createDeepSeek(options);\n }\n\n case 'google': {\n const options: Parameters<typeof createGoogleGenerativeAI>[0] = {\n apiKey,\n };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createGoogleGenerativeAI(options);\n }\n\n case 'groq': {\n const options: Parameters<typeof createGroq>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createGroq(options);\n }\n\n case 'mistral': {\n const options: Parameters<typeof createMistral>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createMistral(options);\n }\n\n case 'openai': {\n const options: Parameters<typeof createOpenAI>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createOpenAI(options);\n }\n\n case 'openai-compatible': {\n const options: Parameters<typeof createOpenAICompatible>[0] = {\n name: provider.providerLabel ?? provider.name,\n apiKey,\n baseURL: provider.baseURL,\n };\n if (provider.headers) {\n options.headers = provider.headers;\n }\n if (provider.queryParams) {\n options.queryParams = provider.queryParams;\n }\n return createOpenAICompatible(options);\n }\n\n case 'openrouter': {\n const options: NonNullable<Parameters<typeof createOpenRouter>[0]> = {\n apiKey,\n };\n const headers = buildOpenRouterHeaders(provider);\n if (headers) {\n options.headers = headers;\n }\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n return createOpenRouter(options);\n }\n\n case 'perplexity': {\n const options: Parameters<typeof createPerplexity>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createPerplexity(options);\n }\n\n case 'togetherai': {\n const options: Parameters<typeof createTogetherAI>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createTogetherAI(options);\n }\n\n case 'xai': {\n const options: Parameters<typeof createXai>[0] = { apiKey };\n if (provider.baseURL) {\n options.baseURL = provider.baseURL;\n }\n if (provider.headers) {\n options.headers = provider.headers;\n }\n return createXai(options);\n }\n\n default: {\n const exhaustiveCheck: never = provider;\n throw new RouterConfigurationError(\n `Unsupported provider type: ${JSON.stringify(exhaustiveCheck)}`,\n );\n }\n }\n}\n\nfunction buildOpenRouterHeaders(\n provider: OpenRouterProviderConfig,\n): Record<string, string> | undefined {\n const headers = { ...provider.headers };\n\n if (provider.appUrl) {\n headers['HTTP-Referer'] = provider.appUrl;\n }\n\n if (provider.appName) {\n headers['X-Title'] = provider.appName;\n }\n\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction resolveLanguageModel(\n providerHandle: ProviderHandle,\n modelId: string,\n providerName: string,\n): LanguageModel {\n if (typeof providerHandle === 'function') {\n return providerHandle(modelId);\n }\n\n const dynamicHandle = providerHandle as Record<string, unknown>;\n const candidates = ['languageModel', 'chatModel', 'chat'];\n\n for (const candidate of candidates) {\n const factory = dynamicHandle[candidate];\n if (typeof factory === 'function') {\n return (factory as (id: string) => LanguageModel)(modelId);\n }\n }\n\n throw new RouterConfigurationError(\n `Provider \"${providerName}\" does not expose a supported language model factory.`,\n );\n}\n\nfunction normalizeUsage(usage: unknown): TokenUsage | undefined {\n if (!usage || typeof usage !== 'object') {\n return undefined;\n }\n\n const numericUsage = usage as Record<string, unknown>;\n const normalized: TokenUsage = {};\n\n const keys: Array<keyof TokenUsage> = [\n 'inputTokens',\n 'outputTokens',\n 'totalTokens',\n 'reasoningTokens',\n 'cachedInputTokens',\n ];\n\n for (const key of keys) {\n const value = numericUsage[key];\n if (typeof value === 'number') {\n normalized[key] = value;\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n}\n\nfunction normalizeWarnings(warnings: unknown): unknown[] | undefined {\n return Array.isArray(warnings) ? warnings : undefined;\n}\n","import { RouterConfigurationError } from './errors.js';\nimport type {\n LlmConnection,\n LlmSource,\n LlmSourceConfig,\n OpenAICompatibleProviderConfig,\n OpenAICompatibleConnectionInput,\n OpenRouterConnectionInput,\n OpenRouterFreeSourceInput,\n OpenRouterProviderConfig,\n ProviderConfig,\n} from './types.js';\n\nexport function createLlmConnection<TProvider extends ProviderConfig>(\n provider: TProvider,\n): LlmConnection<TProvider> {\n assertConnectionProviderName(provider);\n\n return {\n provider,\n };\n}\n\nexport function createOpenRouterConnection(\n provider: OpenRouterConnectionInput,\n): LlmConnection<OpenRouterProviderConfig> {\n return createLlmConnection({\n ...provider,\n type: 'openrouter',\n });\n}\n\nexport function createOpenAICompatibleConnection(\n provider: OpenAICompatibleConnectionInput,\n): LlmConnection<OpenAICompatibleProviderConfig> {\n return createLlmConnection({\n ...provider,\n type: 'openai-compatible',\n });\n}\n\nexport function createLlmSource<TProvider extends ProviderConfig>(\n connection: LlmConnection<TProvider>,\n config: LlmSourceConfig<TProvider>,\n): LlmSource<TProvider> {\n assertSourceConfig(config);\n\n const normalizedConfig =\n config.access === 'free'\n ? config\n : ({\n ...config,\n access: 'standard',\n } satisfies LlmSourceConfig<TProvider>);\n\n return {\n connection,\n config: normalizedConfig,\n };\n}\n\nexport function createOpenRouterFreeSource(\n connection: LlmConnection<OpenRouterProviderConfig>,\n config: OpenRouterFreeSourceInput,\n): LlmSource<OpenRouterProviderConfig> {\n return createLlmSource(connection, {\n ...config,\n access: 'free',\n });\n}\n\nfunction assertConnectionProviderName(provider: ProviderConfig): void {\n if (!provider.name.trim()) {\n throw new RouterConfigurationError(\n 'Connection provider names must be non-empty.',\n );\n }\n}\n\nfunction assertSourceConfig(config: LlmSourceConfig): void {\n if (!config.name.trim()) {\n throw new RouterConfigurationError('Source names must be non-empty.');\n }\n\n if (!config.model.trim()) {\n throw new RouterConfigurationError('Source models must be non-empty.');\n }\n}\n","import { AllModelsFailedError, RouterConfigurationError, isAbortError, serializeError } from './errors.js';\nimport { createDefaultTextGenerationExecutor } from './provider-factory.js';\nimport type {\n AttemptRecord,\n ExecuteStreamTextTargetResult,\n LlmSource,\n ModelConfig,\n PendingAttempt,\n PrioLlmRouterOptions,\n ProviderConfig,\n ResolvedModelTarget,\n RouterGenerateTextRequest,\n RouterGenerateTextResult,\n RouterStreamTextRequest,\n RouterStreamTextResult,\n TextGenerationExecutor,\n} from './types.js';\n\ninterface IndexedModel extends ModelConfig {\n readonly __index: number;\n}\n\ninterface NormalizedRouterConfig {\n providers: ProviderConfig[];\n models: ModelConfig[];\n defaultChain?: string[];\n}\n\nexport class PrioLlmRouter {\n private readonly providersByName = new Map<string, ProviderConfig>();\n private readonly modelsByName = new Map<string, IndexedModel>();\n private readonly defaultChain: string[] | undefined;\n private readonly executor: TextGenerationExecutor;\n private readonly hooks: PrioLlmRouterOptions['hooks'] | undefined;\n\n constructor(options: PrioLlmRouterOptions) {\n const normalized = resolveRouterConfig(options);\n\n if (normalized.providers.length === 0) {\n throw new RouterConfigurationError(\n 'At least one provider configuration is required.',\n );\n }\n\n if (normalized.models.length === 0) {\n throw new RouterConfigurationError(\n 'At least one model configuration is required.',\n );\n }\n\n this.defaultChain = normalized.defaultChain;\n this.hooks = createRouterHooks(options.hooks, options.debug === true);\n this.executor = options.executor ?? (\n options.defaultProviderMaxRetries === undefined\n ? createDefaultTextGenerationExecutor()\n : createDefaultTextGenerationExecutor({\n defaultProviderMaxRetries: options.defaultProviderMaxRetries,\n })\n );\n\n for (const provider of normalized.providers) {\n this.assertUniqueName(\n this.providersByName,\n provider.name,\n 'provider configuration',\n );\n this.validateProvider(provider);\n this.providersByName.set(provider.name, provider);\n }\n\n normalized.models.forEach((model, index) => {\n this.assertUniqueName(this.modelsByName, model.name, 'model configuration');\n\n if (!this.providersByName.has(model.provider)) {\n throw new RouterConfigurationError(\n `Model \"${model.name}\" references unknown provider \"${model.provider}\".`,\n );\n }\n\n this.modelsByName.set(model.name, {\n ...model,\n __index: index,\n });\n });\n\n if (this.defaultChain) {\n this.resolveNamedChain(this.defaultChain);\n }\n }\n\n listProviders(): ProviderConfig[] {\n return [...this.providersByName.values()];\n }\n\n listModels(): ResolvedModelTarget[] {\n return [...this.modelsByName.values()]\n .sort(compareModels)\n .map((model) => this.toResolvedTarget(model));\n }\n\n async generateText(\n request: RouterGenerateTextRequest,\n ): Promise<RouterGenerateTextResult> {\n const chain = this.resolveExecutionChain(request.chain);\n const attempts: AttemptRecord[] = [];\n let lastError: unknown;\n\n for (const [index, model] of chain.entries()) {\n const provider = this.providersByName.get(model.provider);\n\n if (!provider) {\n throw new RouterConfigurationError(\n `Provider \"${model.provider}\" was not found for target \"${model.name}\".`,\n );\n }\n\n const pendingAttempt: PendingAttempt = {\n attemptIndex: index,\n targetName: model.name,\n providerName: provider.name,\n providerType: provider.type,\n model: model.model,\n startedAt: new Date(),\n };\n\n if (model.tier !== undefined) {\n pendingAttempt.tier = model.tier;\n }\n\n this.hooks?.onAttemptStart?.(pendingAttempt);\n\n try {\n const result = await this.executor.execute({\n provider,\n model,\n request,\n });\n\n const finishedAt = new Date();\n const attemptRecord: AttemptRecord = {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: true,\n };\n\n attempts.push(attemptRecord);\n this.hooks?.onAttemptSuccess?.(attemptRecord);\n\n const response: RouterGenerateTextResult = {\n text: result.text,\n target: this.toResolvedTarget(model),\n attempts,\n finishReason: result.finishReason,\n raw: result.raw,\n };\n\n if (result.usage) {\n response.usage = result.usage;\n }\n\n if (result.warnings) {\n response.warnings = result.warnings;\n }\n\n return response;\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n\n const finishedAt = new Date();\n const attemptRecord: AttemptRecord = {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: false,\n error: serializeError(error),\n };\n\n attempts.push(attemptRecord);\n this.hooks?.onAttemptFailure?.(attemptRecord);\n lastError = error;\n }\n }\n\n throw new AllModelsFailedError(attempts, lastError);\n }\n\n async streamText(\n request: RouterStreamTextRequest,\n ): Promise<RouterStreamTextResult> {\n const chain = this.resolveExecutionChain(request.chain);\n const attempts: AttemptRecord[] = [];\n let lastError: unknown;\n\n for (const [index, model] of chain.entries()) {\n const provider = this.providersByName.get(model.provider);\n\n if (!provider) {\n throw new RouterConfigurationError(\n `Provider \"${model.provider}\" was not found for target \"${model.name}\".`,\n );\n }\n\n const pendingAttempt = createPendingAttempt(index, provider, model);\n this.hooks?.onAttemptStart?.(pendingAttempt);\n\n const { controller, cleanup, parentAborted } = createLinkedAbortController(\n request.abortSignal,\n );\n\n try {\n const streamResult = await this.executor.stream({\n provider,\n model,\n request: {\n ...request,\n abortSignal: controller.signal,\n },\n });\n\n const iterator = streamResult.textStream[Symbol.asyncIterator]();\n const firstChunk = await this.waitForFirstChunk({\n iterator,\n timeoutMs: request.firstChunkTimeoutMs,\n abortController: controller,\n parentAborted,\n });\n\n if (firstChunk.done) {\n throw createEmptyFirstChunkError(model.name);\n }\n\n return this.createStreamingResult({\n pendingAttempt,\n attempts,\n model,\n iterator,\n streamResult,\n firstChunk: firstChunk.value,\n cleanupAbortLink: cleanup,\n });\n } catch (error) {\n cleanup();\n\n if (isAbortError(error) && parentAborted()) {\n throw error;\n }\n\n const attemptRecord = createFailedAttemptRecord(pendingAttempt, error);\n attempts.push(attemptRecord);\n this.hooks?.onAttemptFailure?.(attemptRecord);\n lastError = error;\n }\n }\n\n throw new AllModelsFailedError(attempts, lastError);\n }\n\n private createStreamingResult(options: {\n pendingAttempt: PendingAttempt;\n attempts: AttemptRecord[];\n model: IndexedModel;\n iterator: AsyncIterator<string>;\n streamResult: ExecuteStreamTextTargetResult;\n firstChunk: string;\n cleanupAbortLink: () => void;\n }): RouterStreamTextResult {\n const {\n pendingAttempt,\n attempts,\n model,\n iterator,\n streamResult,\n firstChunk,\n cleanupAbortLink,\n } = options;\n\n let started = false;\n const textParts = [firstChunk];\n\n let resolveFinal!: (value: RouterGenerateTextResult) => void;\n let rejectFinal!: (reason?: unknown) => void;\n let finalized = false;\n const final = new Promise<RouterGenerateTextResult>((resolve, reject) => {\n resolveFinal = resolve;\n rejectFinal = reject;\n });\n\n const finalizeSuccess = async (): Promise<void> => {\n if (finalized) {\n return;\n }\n finalized = true;\n\n const finishedAt = new Date();\n const attemptRecord: AttemptRecord = {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: true,\n };\n\n attempts.push(attemptRecord);\n this.hooks?.onAttemptSuccess?.(attemptRecord);\n\n const result: RouterGenerateTextResult = {\n text: textParts.join(''),\n target: this.toResolvedTarget(model),\n attempts: [...attempts],\n finishReason: await streamResult.finishReason,\n raw: streamResult.raw,\n };\n\n const usage = await streamResult.usage;\n if (usage) {\n result.usage = usage;\n }\n\n const warnings = await streamResult.warnings;\n if (warnings) {\n result.warnings = warnings;\n }\n\n cleanupAbortLink();\n resolveFinal(result);\n };\n\n const finalizeFailure = (error: unknown): void => {\n if (finalized) {\n return;\n }\n finalized = true;\n\n const attemptRecord = createFailedAttemptRecord(pendingAttempt, error);\n attempts.push(attemptRecord);\n this.hooks?.onAttemptFailure?.(attemptRecord);\n cleanupAbortLink();\n rejectFinal(error);\n };\n\n const wrappedStream: AsyncIterable<string> = {\n [Symbol.asyncIterator]: () => {\n if (started) {\n throw new RouterConfigurationError(\n 'This stream can only be consumed once.',\n );\n }\n\n started = true;\n\n return createRouterTextStreamIterator({\n firstChunk,\n iterator,\n onChunk: (chunk) => {\n textParts.push(chunk);\n },\n onSuccess: finalizeSuccess,\n onFailure: finalizeFailure,\n });\n },\n };\n\n return {\n target: this.toResolvedTarget(model),\n selectedAttempt: pendingAttempt,\n attempts: [...attempts],\n textStream: wrappedStream,\n final,\n consumeStream: async () => {\n if (!started) {\n for await (const _ of wrappedStream) {\n void _;\n }\n }\n\n return final;\n },\n };\n }\n\n private async waitForFirstChunk(options: {\n iterator: AsyncIterator<string>;\n timeoutMs: number | undefined;\n abortController: AbortController;\n parentAborted: () => boolean;\n }): Promise<IteratorResult<string>> {\n const { iterator, timeoutMs, abortController, parentAborted } = options;\n const nextPromise = iterator.next();\n\n if (timeoutMs === undefined) {\n return nextPromise;\n }\n\n const timeoutError = createFirstChunkTimeoutError(timeoutMs);\n\n const timedRace = await Promise.race([\n nextPromise.then(\n (value) => ({ kind: 'value' as const, value }),\n (error: unknown) => ({ kind: 'error' as const, error }),\n ),\n delay(timeoutMs).then(() => ({ kind: 'timeout' as const })),\n ]);\n\n if (timedRace.kind === 'value') {\n return timedRace.value;\n }\n\n if (timedRace.kind === 'timeout') {\n abortController.abort(timeoutError);\n void nextPromise.catch(() => undefined);\n throw timeoutError;\n }\n\n if (isAbortError(timedRace.error) && parentAborted()) {\n throw timedRace.error;\n }\n\n throw timedRace.error;\n }\n\n private resolveExecutionChain(chain?: string[]): IndexedModel[] {\n if (chain?.length) {\n return this.resolveNamedChain(chain);\n }\n\n if (this.defaultChain?.length) {\n return this.resolveNamedChain(this.defaultChain);\n }\n\n const implicitChain = [...this.modelsByName.values()]\n .filter((model) => this.isModelEnabled(model))\n .sort(compareModels);\n\n if (implicitChain.length === 0) {\n throw new RouterConfigurationError(\n 'No enabled model targets are available for execution.',\n );\n }\n\n return implicitChain;\n }\n\n private resolveNamedChain(chain: string[]): IndexedModel[] {\n const resolved: IndexedModel[] = [];\n const seen = new Set<string>();\n\n for (const targetName of chain) {\n if (seen.has(targetName)) {\n continue;\n }\n\n seen.add(targetName);\n const model = this.modelsByName.get(targetName);\n\n if (!model) {\n throw new RouterConfigurationError(\n `Model target \"${targetName}\" is not configured.`,\n );\n }\n\n if (!this.isModelEnabled(model)) {\n throw new RouterConfigurationError(\n `Model target \"${targetName}\" is disabled or its provider is disabled.`,\n );\n }\n\n resolved.push(model);\n }\n\n if (resolved.length === 0) {\n throw new RouterConfigurationError(\n 'The resolved execution chain is empty.',\n );\n }\n\n return resolved;\n }\n\n private isModelEnabled(model: ModelConfig): boolean {\n if (model.enabled === false) {\n return false;\n }\n\n const provider = this.providersByName.get(model.provider);\n return provider?.enabled !== false;\n }\n\n private toResolvedTarget(model: ModelConfig): ResolvedModelTarget {\n const provider = this.providersByName.get(model.provider);\n\n if (!provider) {\n throw new RouterConfigurationError(\n `Model \"${model.name}\" references missing provider \"${model.provider}\".`,\n );\n }\n\n const resolvedTarget: ResolvedModelTarget = {\n name: model.name,\n providerName: provider.name,\n providerType: provider.type,\n model: model.model,\n };\n\n if (model.priority !== undefined) {\n resolvedTarget.priority = model.priority;\n }\n\n if (model.tier !== undefined) {\n resolvedTarget.tier = model.tier;\n }\n\n if (model.metadata !== undefined) {\n resolvedTarget.metadata = model.metadata;\n }\n\n return resolvedTarget;\n }\n\n private validateProvider(provider: ProviderConfig): void {\n if (!provider.name.trim()) {\n throw new RouterConfigurationError(\n 'Provider configuration names must be non-empty.',\n );\n }\n\n if (!provider.auth.apiKey.trim()) {\n throw new RouterConfigurationError(\n `Provider \"${provider.name}\" requires a non-empty API key.`,\n );\n }\n }\n\n private assertUniqueName(\n registry: Map<string, unknown>,\n name: string,\n label: string,\n ): void {\n if (!name.trim()) {\n throw new RouterConfigurationError(`${label} names must be non-empty.`);\n }\n\n if (registry.has(name)) {\n throw new RouterConfigurationError(\n `Duplicate ${label} name \"${name}\" detected.`,\n );\n }\n }\n}\n\nexport function createLlmRouter(\n options: PrioLlmRouterOptions,\n): PrioLlmRouter {\n return new PrioLlmRouter(options);\n}\n\nfunction resolveRouterConfig(\n options: PrioLlmRouterOptions,\n): NormalizedRouterConfig {\n if ('sources' in options) {\n return compileSources(options.sources, options.defaultChain);\n }\n\n const normalized: NormalizedRouterConfig = {\n providers: options.providers,\n models: options.models,\n };\n\n if (options.defaultChain !== undefined) {\n normalized.defaultChain = options.defaultChain;\n }\n\n return normalized;\n}\n\nfunction compareModels(left: IndexedModel, right: IndexedModel): number {\n const leftPriority = left.priority ?? Number.MAX_SAFE_INTEGER;\n const rightPriority = right.priority ?? Number.MAX_SAFE_INTEGER;\n\n if (leftPriority !== rightPriority) {\n return leftPriority - rightPriority;\n }\n\n return left.__index - right.__index;\n}\n\nfunction compileSources(\n sources: LlmSource[],\n defaultChain?: string[],\n): NormalizedRouterConfig {\n const providersByName = new Map<string, ProviderConfig>();\n const models: ModelConfig[] = [];\n\n for (const source of sources) {\n const provider = source.connection.provider;\n const providerName = provider.name.trim();\n const modelId = source.config.model.trim();\n const access = source.config.access ?? 'standard';\n\n if (!providerName) {\n throw new RouterConfigurationError(\n 'Connection provider names must be non-empty.',\n );\n }\n\n if (!source.config.name.trim()) {\n throw new RouterConfigurationError('Source names must be non-empty.');\n }\n\n if (!modelId) {\n throw new RouterConfigurationError('Source models must be non-empty.');\n }\n\n const existingProvider = providersByName.get(providerName);\n if (existingProvider) {\n assertMatchingSourceProvider(existingProvider, provider);\n } else {\n providersByName.set(providerName, provider);\n }\n\n if (access === 'free') {\n assertGuaranteedFreeSource(provider, source.config.model);\n }\n\n if (access === 'free' && source.config.tier === 'paid') {\n throw new RouterConfigurationError(\n `Free source \"${source.config.name}\" cannot be marked as paid.`,\n );\n }\n\n const compiledModel: ModelConfig = {\n name: source.config.name,\n provider: providerName,\n model: modelId,\n };\n\n if (source.config.enabled !== undefined) {\n compiledModel.enabled = source.config.enabled;\n }\n\n if (source.config.priority !== undefined) {\n compiledModel.priority = source.config.priority;\n }\n\n const tier = source.config.tier ?? (access === 'free' ? 'free' : undefined);\n if (tier !== undefined) {\n compiledModel.tier = tier;\n }\n\n if (source.config.metadata !== undefined) {\n compiledModel.metadata = source.config.metadata;\n }\n\n models.push(compiledModel);\n }\n\n const normalized: NormalizedRouterConfig = {\n providers: [...providersByName.values()],\n models,\n };\n\n if (defaultChain !== undefined) {\n normalized.defaultChain = defaultChain;\n }\n\n return normalized;\n}\n\nfunction assertMatchingSourceProvider(\n existingProvider: ProviderConfig,\n nextProvider: ProviderConfig,\n): void {\n if (JSON.stringify(existingProvider) === JSON.stringify(nextProvider)) {\n return;\n }\n\n throw new RouterConfigurationError(\n `Connection provider \"${existingProvider.name}\" is configured more than once with different settings.`,\n );\n}\n\nfunction assertGuaranteedFreeSource(\n provider: ProviderConfig,\n model: string,\n): void {\n if (provider.type !== 'openrouter') {\n throw new RouterConfigurationError(\n `Provider \"${provider.name}\" does not support strict free sources. Only OpenRouter with explicit \":free\" model variants is supported today.`,\n );\n }\n\n const normalizedModel = model.trim();\n\n if (normalizedModel === 'openrouter/free') {\n throw new RouterConfigurationError(\n `Free source \"${provider.name}\" cannot use \"openrouter/free\". Use an explicit \":free\" model id instead.`,\n );\n }\n\n if (!normalizedModel.endsWith(':free')) {\n throw new RouterConfigurationError(\n `Free OpenRouter sources must use an explicit \":free\" model id. Received \"${normalizedModel}\".`,\n );\n }\n}\n\nfunction createPendingAttempt(\n attemptIndex: number,\n provider: ProviderConfig,\n model: ModelConfig,\n): PendingAttempt {\n const pendingAttempt: PendingAttempt = {\n attemptIndex,\n targetName: model.name,\n providerName: provider.name,\n providerType: provider.type,\n model: model.model,\n startedAt: new Date(),\n };\n\n if (model.tier !== undefined) {\n pendingAttempt.tier = model.tier;\n }\n\n return pendingAttempt;\n}\n\nfunction createFailedAttemptRecord(\n pendingAttempt: PendingAttempt,\n error: unknown,\n): AttemptRecord {\n const finishedAt = new Date();\n\n return {\n ...pendingAttempt,\n finishedAt,\n durationMs: finishedAt.getTime() - pendingAttempt.startedAt.getTime(),\n success: false,\n error: serializeError(error),\n };\n}\n\nfunction createRouterTextStreamIterator(options: {\n firstChunk: string;\n iterator: AsyncIterator<string>;\n onChunk: (chunk: string) => void;\n onSuccess: () => Promise<void>;\n onFailure: (error: unknown) => void;\n}): AsyncIterator<string> {\n const { firstChunk, iterator, onChunk, onSuccess, onFailure } = options;\n let firstYielded = false;\n let finished = false;\n\n return {\n async next(): Promise<IteratorResult<string>> {\n if (finished) {\n return {\n done: true,\n value: undefined,\n };\n }\n\n if (!firstYielded) {\n firstYielded = true;\n return {\n done: false,\n value: firstChunk,\n };\n }\n\n try {\n const next = await iterator.next();\n\n if (next.done) {\n finished = true;\n await onSuccess();\n return {\n done: true,\n value: undefined,\n };\n }\n\n onChunk(next.value);\n return {\n done: false,\n value: next.value,\n };\n } catch (error) {\n finished = true;\n onFailure(error);\n throw error;\n }\n },\n async return(): Promise<IteratorResult<string>> {\n finished = true;\n onFailure(createStreamClosedEarlyError());\n\n if (typeof iterator.return === 'function') {\n await iterator.return();\n }\n\n return {\n done: true,\n value: undefined,\n };\n },\n async throw(error?: unknown): Promise<IteratorResult<string>> {\n finished = true;\n onFailure(error);\n\n if (typeof iterator.throw === 'function') {\n return iterator.throw(error);\n }\n\n throw error;\n },\n };\n}\n\nfunction createLinkedAbortController(parentSignal?: AbortSignal): {\n controller: AbortController;\n cleanup: () => void;\n parentAborted: () => boolean;\n} {\n const controller = new AbortController();\n let abortedByParent = false;\n\n const abortFromParent = (): void => {\n abortedByParent = true;\n controller.abort(parentSignal?.reason);\n };\n\n if (parentSignal?.aborted) {\n abortFromParent();\n } else {\n parentSignal?.addEventListener('abort', abortFromParent, { once: true });\n }\n\n return {\n controller,\n cleanup: () => {\n parentSignal?.removeEventListener('abort', abortFromParent);\n },\n parentAborted: () => abortedByParent,\n };\n}\n\nfunction createFirstChunkTimeoutError(timeoutMs: number): Error {\n const error = new Error(\n `The first stream chunk did not arrive within ${timeoutMs}ms.`,\n );\n error.name = 'FirstChunkTimeoutError';\n return error;\n}\n\nfunction createEmptyFirstChunkError(targetName: string): Error {\n const error = new Error(\n `Stream for target \"${targetName}\" completed before the first text chunk.`,\n );\n error.name = 'EmptyStreamError';\n return error;\n}\n\nfunction createStreamClosedEarlyError(): Error {\n const error = new Error('The stream was closed before completion.');\n error.name = 'StreamClosedError';\n return error;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction createRouterHooks(\n hooks: PrioLlmRouterOptions['hooks'] | undefined,\n debug: boolean,\n): PrioLlmRouterOptions['hooks'] | undefined {\n if (!debug) {\n return hooks;\n }\n\n return {\n onAttemptStart: (attempt) => {\n console.log('[prio-llm-router] attempt:start', attempt);\n hooks?.onAttemptStart?.(attempt);\n },\n onAttemptSuccess: (attempt) => {\n console.log('[prio-llm-router] attempt:success', attempt);\n hooks?.onAttemptSuccess?.(attempt);\n },\n onAttemptFailure: (attempt) => {\n console.error('[prio-llm-router] attempt:failure', attempt);\n hooks?.onAttemptFailure?.(attempt);\n },\n };\n}\n"]}
|
package/package.json
CHANGED