@x12i/ai-gateway 10.4.1 → 10.4.4

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.
Files changed (36) hide show
  1. package/README.md +38 -1
  2. package/dist/activity-manager.js +24 -13
  3. package/dist/gateway-utils.d.ts +9 -1
  4. package/dist/gateway-utils.js +169 -15
  5. package/dist/gateway.js +22 -2
  6. package/dist/index.d.ts +3 -3
  7. package/dist/index.js +2 -2
  8. package/dist/instruction-errors.d.ts +11 -2
  9. package/dist/instruction-errors.js +8 -2
  10. package/dist/openrouter-runtime-adapter/create-openrouter-runtime-provider.js +1 -1
  11. package/dist/openrouter-runtime-adapter/index.d.ts +1 -1
  12. package/dist/openrouter-runtime-adapter/index.js +1 -1
  13. package/dist/openrouter-runtime-adapter/map-runtime-errors.js +18 -4
  14. package/dist/openrouter-runtime-adapter/map-runtime-response.d.ts +3 -0
  15. package/dist/openrouter-runtime-adapter/map-runtime-response.js +33 -0
  16. package/dist/openrouter-runtime-adapter/map-trace.js +5 -1
  17. package/dist/openrouter-runtime-adapter/validate-server-tools.js +1 -1
  18. package/dist/types.d.ts +36 -0
  19. package/dist-cjs/activity-manager.cjs +24 -13
  20. package/dist-cjs/gateway-utils.cjs +169 -15
  21. package/dist-cjs/gateway-utils.d.ts +9 -1
  22. package/dist-cjs/gateway.cjs +22 -2
  23. package/dist-cjs/index.cjs +2 -2
  24. package/dist-cjs/index.d.ts +3 -3
  25. package/dist-cjs/instruction-errors.cjs +8 -2
  26. package/dist-cjs/instruction-errors.d.ts +11 -2
  27. package/dist-cjs/openrouter-runtime-adapter/create-openrouter-runtime-provider.cjs +1 -1
  28. package/dist-cjs/openrouter-runtime-adapter/index.cjs +1 -1
  29. package/dist-cjs/openrouter-runtime-adapter/index.d.ts +1 -1
  30. package/dist-cjs/openrouter-runtime-adapter/map-runtime-errors.cjs +18 -4
  31. package/dist-cjs/openrouter-runtime-adapter/map-runtime-response.cjs +33 -0
  32. package/dist-cjs/openrouter-runtime-adapter/map-runtime-response.d.ts +3 -0
  33. package/dist-cjs/openrouter-runtime-adapter/map-trace.cjs +5 -1
  34. package/dist-cjs/openrouter-runtime-adapter/validate-server-tools.cjs +1 -1
  35. package/dist-cjs/types.d.ts +36 -0
  36. package/package.json +3 -3
@@ -9,7 +9,7 @@ export { LLMProviderRouter } from '@x12i/ai-providers-router';
9
9
  export type { RouterConfig, HealthCheckResult } from '@x12i/ai-providers-router';
10
10
  export { createRouter, createRouterFromConfig } from '@x12i/ai-providers-router';
11
11
  export type { CreateRouterConfig } from '@x12i/ai-providers-router';
12
- export { ProviderNotFoundError, FallbackExhaustedError } from '@x12i/ai-providers-router';
12
+ export { ProviderNotFoundError, FallbackExhaustedError, OpenRouterApiKeyMissingError, } from '@x12i/ai-providers-router';
13
13
  export type { RequestInterceptor, ResponseInterceptor } from '@x12i/ai-providers-router';
14
14
  export type { UsageTracker } from '@x12i/ai-providers-router';
15
15
  export * from '@x12i/ai-providers-router';
@@ -18,8 +18,8 @@ export { InstructionNotFoundError, InstructionBackendError, ModelRequiredError,
18
18
  export { normalizeInvokeModelAtIngress } from './invoke-model-ingress.js';
19
19
  export { autoRegisterProviders } from './gateway-provider-auto-register.js';
20
20
  export { registerOpenRouterRuntime, shouldUseOpenRouterRuntime, mapGatewayServerTools, } from './openrouter-runtime-adapter/index.js';
21
- export type { GatewayConfig, ProviderModelRef, ModelConfig, GatewayModelConfig, GatewayServerToolsConfig, GatewayOpenRouterConfig, GatewayOpenRouterRuntimeConfig, GatewayServerToolUsageMap, GatewayCitation, GatewayGeneratedImage, GatewayPatchProposal, GatewayOpenRouterRuntimeMetadata, RetryConfig, ChatRequest, AIInvokeRequest, AIRequest, GatewayActionType, GatewayInvokeRejectionMetadata, GatewayFallbackAttempt, GatewayTraceRequestIds, GatewayTraceAttempt, GatewayTraceUsageSummary, GatewayTraceMergedConfig, EnhancedLLMResponse, InstructionMetadata, ValidationRule, TemplateRenderOptions, SmartInputConfig, SmartInputRenderOptions } from './types.js';
22
- export { attachGatewayInvokeRejectionMetadata, buildInvokeRejectionMetadata, tryExtractRouterLikePayloadFromErrorChain, tryExtractFallbackAttemptsFromErrorChain, pickRequestIdsFromRouterLike, resolveActivityCostCompletion, resolveCostCompletionForActivity, resolveCostCompletionWithAiTools, buildGatewayPricingRecord, mapAiCostResultToResolvedActivityCost, catalogPricingSucceeded, extractUsageExtrasFromRouterResponse, buildTraceUsageSummary, enrichTraceAttemptsWithBilling, pickEnhancedOpenRouterMetadata, hasNonZeroTokenUsage, MODEL_PROFILE_UNROUTABLE, ModelProfileUnroutableError, ModelProfileInputRejectedError, buildGatewayFallbackAttemptsFromTrace, formatFallbackExhaustionMessage, logResolvedModelRouting, mapGatewayFallbackAttemptsToRouter } from './gateway-utils.js';
21
+ export type { GatewayConfig, ProviderModelRef, ModelConfig, GatewayModelConfig, GatewayServerToolsConfig, GatewayServerToolMode, GatewayServerToolUsage, GatewayNestedServerTool, GatewayWebSearchToolConfig, GatewayWebFetchToolConfig, GatewayDatetimeToolConfig, GatewayImageGenerationToolConfig, GatewayApplyPatchToolConfig, GatewayFusionToolConfig, GatewayAdvisorToolConfig, GatewaySubagentToolConfig, GatewayOpenRouterErrorMetadata, GatewayOpenRouterConfig, GatewayOpenRouterRuntimeConfig, GatewayServerToolUsageMap, GatewayCitation, GatewayGeneratedImage, GatewayPatchProposal, GatewayOpenRouterRuntimeMetadata, RetryConfig, ChatRequest, AIInvokeRequest, AIRequest, GatewayActionType, GatewayInvokeRejectionMetadata, GatewayFallbackAttempt, GatewayTraceRequestIds, GatewayTraceAttempt, GatewayTraceUsageSummary, GatewayTraceMergedConfig, EnhancedLLMResponse, InstructionMetadata, ValidationRule, TemplateRenderOptions, SmartInputConfig, SmartInputRenderOptions } from './types.js';
22
+ export { attachGatewayInvokeRejectionMetadata, buildInvokeRejectionMetadata, tryExtractRouterLikePayloadFromErrorChain, tryExtractOpenRouterMetadataFromErrorChain, tryExtractFallbackAttemptsFromErrorChain, pickRequestIdsFromRouterLike, resolveActivityCostCompletion, resolveCostCompletionForActivity, resolveCostCompletionWithAiTools, buildGatewayPricingRecord, mapAiCostResultToResolvedActivityCost, catalogPricingSucceeded, extractUsageExtrasFromRouterResponse, buildTraceUsageSummary, enrichTraceAttemptsWithBilling, pickEnhancedOpenRouterMetadata, hasNonZeroTokenUsage, MODEL_PROFILE_UNROUTABLE, ModelProfileUnroutableError, ModelProfileInputRejectedError, buildGatewayFallbackAttemptsFromTrace, formatFallbackExhaustionMessage, enrichGatewayFallbackExhaustedError, logResolvedModelRouting, mapGatewayFallbackAttemptsToRouter } from './gateway-utils.js';
23
23
  export { getGatewayOperationalMode, isProdGatewayMode, parseModelProviderSpec } from './gateway-mode.js';
24
24
  export type { GatewayOperationalMode } from './gateway-mode.js';
25
25
  export { DEFAULT_ACTIVITY_FULL_RESPONSE_MAX_CHARS, GATEWAY_DEFAULT_FREQUENCY_PENALTY, GATEWAY_DEFAULT_PRESENCE_PENALTY, GATEWAY_DEFAULT_RETRY, GATEWAY_DEFAULT_TEMPERATURE, GATEWAY_DEFAULT_TOP_P, resolveRetryConfig } from './gateway-defaults.js';
@@ -35,10 +35,13 @@ export class GatewayValidationError extends Error {
35
35
  }
36
36
  export class ProviderConfigError extends Error {
37
37
  code;
38
- constructor(code, message) {
38
+ /** Stable alternate codes documented for upstream consumers (e.g. CR-GW-ST-001). */
39
+ codeAliases;
40
+ constructor(code, message, options) {
39
41
  super(message);
40
42
  this.name = 'ProviderConfigError';
41
43
  this.code = code;
44
+ this.codeAliases = options?.codeAliases;
42
45
  }
43
46
  }
44
47
  export class ProviderInvokeError extends Error {
@@ -55,10 +58,13 @@ export class ProviderInvokeError extends Error {
55
58
  }
56
59
  export class GatewayPolicyViolationError extends Error {
57
60
  code;
58
- constructor(code, message) {
61
+ /** Partial OpenRouter tool metadata preserved when policy fails after a runtime response. */
62
+ routerMetadata;
63
+ constructor(code, message, options) {
59
64
  super(message);
60
65
  this.name = 'GatewayPolicyViolationError';
61
66
  this.code = code;
67
+ this.routerMetadata = options?.routerMetadata;
62
68
  }
63
69
  }
64
70
  export class InstructionNotFoundError extends Error {
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Errors for instruction / prompt template resolution.
3
3
  */
4
+ import type { GatewayOpenRouterErrorMetadata } from './types.js';
4
5
  export declare class ModelRequiredError extends Error {
5
6
  readonly code = "MODEL_REQUIRED";
6
7
  constructor(message?: string);
@@ -20,7 +21,11 @@ export declare class GatewayValidationError extends Error {
20
21
  }
21
22
  export declare class ProviderConfigError extends Error {
22
23
  readonly code: string;
23
- constructor(code: string, message: string);
24
+ /** Stable alternate codes documented for upstream consumers (e.g. CR-GW-ST-001). */
25
+ readonly codeAliases?: readonly string[];
26
+ constructor(code: string, message: string, options?: {
27
+ codeAliases?: readonly string[];
28
+ });
24
29
  }
25
30
  export declare class ProviderInvokeError extends Error {
26
31
  readonly code: string;
@@ -33,7 +38,11 @@ export declare class ProviderInvokeError extends Error {
33
38
  }
34
39
  export declare class GatewayPolicyViolationError extends Error {
35
40
  readonly code: string;
36
- constructor(code: string, message: string);
41
+ /** Partial OpenRouter tool metadata preserved when policy fails after a runtime response. */
42
+ routerMetadata?: GatewayOpenRouterErrorMetadata;
43
+ constructor(code: string, message: string, options?: {
44
+ routerMetadata?: GatewayOpenRouterErrorMetadata;
45
+ });
37
46
  }
38
47
  export declare class InstructionNotFoundError extends Error {
39
48
  key: string;
@@ -7,7 +7,7 @@ export function createOpenRouterRuntimeProvider(options) {
7
7
  apiKey: options.apiKey,
8
8
  defaults: {
9
9
  retry: { enabled: false },
10
- onPolicyViolation: 'return_error',
10
+ onPolicyViolation: 'throw',
11
11
  },
12
12
  });
13
13
  return {
@@ -3,6 +3,6 @@ export { createOpenRouterRuntimeProvider } from './create-openrouter-runtime-pro
3
3
  export { createOpenRouterRuntimeAdapter } from './create-openrouter-runtime-adapter.js';
4
4
  export { mapGatewayServerTools } from './map-server-tools.js';
5
5
  export { mapGatewayRequestToRuntimeRequest } from './map-gateway-request.js';
6
- export { pickOpenRouterRuntimeMetadataSlice, extractOpenRouterRuntimeRouterMetadata, parseRuntimeResponseToAIResponse, } from './map-runtime-response.js';
6
+ export { buildPartialMetadataFromRuntimeResponse, buildRouterLikeEnvelopeFromRuntimeResponse, pickOpenRouterRuntimeMetadataSlice, extractOpenRouterRuntimeRouterMetadata, parseRuntimeResponseToAIResponse, } from './map-runtime-response.js';
7
7
  export { applyOnlineVariantMigration, applyPostRoutingServerToolsPolicy, mergeOpenRouterConfig, mergeServerToolsConfig, normalizeApplyPatchDefaults, validateApplyPatchConfig, hasAnyActiveServerTool, hasRequiredServerTool, } from './validate-server-tools.js';
8
8
  export { buildTraceAttemptOpenRouterRuntimeSlice, enrichTraceOpenRouterRuntimeMetadata, redactRawOpenRouterPayload, } from './map-trace.js';
@@ -3,6 +3,6 @@ export { createOpenRouterRuntimeProvider } from './create-openrouter-runtime-pro
3
3
  export { createOpenRouterRuntimeAdapter } from './create-openrouter-runtime-adapter.js';
4
4
  export { mapGatewayServerTools } from './map-server-tools.js';
5
5
  export { mapGatewayRequestToRuntimeRequest } from './map-gateway-request.js';
6
- export { pickOpenRouterRuntimeMetadataSlice, extractOpenRouterRuntimeRouterMetadata, parseRuntimeResponseToAIResponse, } from './map-runtime-response.js';
6
+ export { buildPartialMetadataFromRuntimeResponse, buildRouterLikeEnvelopeFromRuntimeResponse, pickOpenRouterRuntimeMetadataSlice, extractOpenRouterRuntimeRouterMetadata, parseRuntimeResponseToAIResponse, } from './map-runtime-response.js';
7
7
  export { applyOnlineVariantMigration, applyPostRoutingServerToolsPolicy, mergeOpenRouterConfig, mergeServerToolsConfig, normalizeApplyPatchDefaults, validateApplyPatchConfig, hasAnyActiveServerTool, hasRequiredServerTool, } from './validate-server-tools.js';
8
8
  export { buildTraceAttemptOpenRouterRuntimeSlice, enrichTraceOpenRouterRuntimeMetadata, redactRawOpenRouterPayload, } from './map-trace.js';
@@ -1,5 +1,10 @@
1
1
  import { OpenRouterHttpError, RuntimeConfigError, } from '@x12i/openrouter-runtime';
2
2
  import { GatewayPolicyViolationError, GatewayValidationError, ProviderConfigError, ProviderInvokeError, } from '../instruction-errors.js';
3
+ import { buildPartialMetadataFromRuntimeResponse, buildRouterLikeEnvelopeFromRuntimeResponse, } from './map-runtime-response.js';
4
+ function attachRouterEnvelopeToError(err, response) {
5
+ const envelope = buildRouterLikeEnvelopeFromRuntimeResponse(response);
6
+ err.response = envelope;
7
+ }
3
8
  export function throwMappedRuntimeConfigError(err) {
4
9
  const code = err.code;
5
10
  if (code === 'OPENROUTER_API_KEY_MISSING') {
@@ -25,17 +30,26 @@ export function throwMappedOpenRouterHttpError(err) {
25
30
  export function throwMappedRuntimeResponseErrors(response) {
26
31
  if (response.status === 'completed')
27
32
  return;
33
+ const routerMetadata = buildPartialMetadataFromRuntimeResponse(response);
28
34
  const primary = response.errors[0];
29
35
  if (!primary) {
30
- throw new ProviderInvokeError('OPENROUTER_REQUEST_FAILED', 'OpenRouter runtime request failed');
36
+ const err = new ProviderInvokeError('OPENROUTER_REQUEST_FAILED', 'OpenRouter runtime request failed');
37
+ attachRouterEnvelopeToError(err, response);
38
+ throw err;
31
39
  }
32
40
  if (primary.source === 'policy' || response.status === 'policy_violation') {
33
- throw new GatewayPolicyViolationError(primary.code, primary.message);
41
+ const err = new GatewayPolicyViolationError(primary.code, primary.message, { routerMetadata });
42
+ attachRouterEnvelopeToError(err, response);
43
+ throw err;
34
44
  }
35
45
  if (primary.retryable) {
36
- throw new ProviderInvokeError(primary.code, primary.message, { retryable: true });
46
+ const err = new ProviderInvokeError(primary.code, primary.message, { retryable: true });
47
+ attachRouterEnvelopeToError(err, response);
48
+ throw err;
37
49
  }
38
- throw new ProviderInvokeError(primary.code, primary.message);
50
+ const err = new ProviderInvokeError(primary.code, primary.message);
51
+ attachRouterEnvelopeToError(err, response);
52
+ throw err;
39
53
  }
40
54
  export function mapRuntimeErrorToGatewayError(err) {
41
55
  if (err instanceof RuntimeConfigError) {
@@ -64,6 +64,39 @@ export function buildOpenRouterRuntimeMetadata(response) {
64
64
  requestIds: response.id ? [response.id] : undefined,
65
65
  };
66
66
  }
67
+ export function buildPartialMetadataFromRuntimeResponse(response) {
68
+ return {
69
+ serverTools: mapRuntimeToolUsage(response.toolUsage),
70
+ citations: mapRuntimeCitations(response.citations),
71
+ generatedImages: mapRuntimeImages(response.images),
72
+ patchProposals: mapRuntimePatches(response.patches),
73
+ openrouterRuntime: buildOpenRouterRuntimeMetadata(response),
74
+ };
75
+ }
76
+ /** Router-shaped envelope for error-chain metadata extraction. */
77
+ export function buildRouterLikeEnvelopeFromRuntimeResponse(response) {
78
+ const partial = buildPartialMetadataFromRuntimeResponse(response);
79
+ const usage = response.usage;
80
+ const promptTokens = usage?.inputTokens ?? 0;
81
+ const completionTokens = usage?.outputTokens ?? 0;
82
+ return {
83
+ requestId: response.id,
84
+ metadata: {
85
+ provider: 'openrouter',
86
+ modelUsed: response.model,
87
+ serverTools: partial.serverTools,
88
+ citations: partial.citations,
89
+ generatedImages: partial.generatedImages,
90
+ patchProposals: partial.patchProposals,
91
+ openrouterRuntime: partial.openrouterRuntime,
92
+ },
93
+ usage: {
94
+ promptTokens,
95
+ completionTokens,
96
+ totalTokens: usage?.totalTokens ?? promptTokens + completionTokens,
97
+ },
98
+ };
99
+ }
67
100
  export function extractOpenRouterRuntimeRouterMetadata(routerResponse) {
68
101
  if (routerResponse == null || typeof routerResponse !== 'object')
69
102
  return {};
@@ -15,6 +15,9 @@ export type OpenRouterRuntimeRouterMetadata = {
15
15
  costUsd?: number;
16
16
  costStatus?: 'priced' | 'unpriced';
17
17
  };
18
+ export declare function buildPartialMetadataFromRuntimeResponse(response: RuntimeResponse): OpenRouterRuntimeRouterMetadata;
19
+ /** Router-shaped envelope for error-chain metadata extraction. */
20
+ export declare function buildRouterLikeEnvelopeFromRuntimeResponse(response: RuntimeResponse): Record<string, unknown>;
18
21
  export declare function extractOpenRouterRuntimeRouterMetadata(routerResponse: unknown): OpenRouterRuntimeRouterMetadata;
19
22
  export declare function parseRuntimeResponseToAIResponse(input: {
20
23
  requestId: string;
@@ -1,5 +1,7 @@
1
1
  export function buildTraceAttemptOpenRouterRuntimeSlice(metadata) {
2
- if (!metadata.openrouterRuntime && !metadata.serverTools)
2
+ const hasPolicy = (metadata.openrouterRuntime?.policyViolations?.length ?? 0) > 0 ||
3
+ (metadata.openrouterRuntime?.warnings?.length ?? 0) > 0;
4
+ if (!metadata.openrouterRuntime && !metadata.serverTools && !hasPolicy)
3
5
  return undefined;
4
6
  return {
5
7
  apiMode: metadata.openrouterRuntime?.apiMode,
@@ -7,6 +9,8 @@ export function buildTraceAttemptOpenRouterRuntimeSlice(metadata) {
7
9
  citationCount: metadata.citations?.length ?? 0,
8
10
  generatedImageCount: metadata.generatedImages?.length ?? 0,
9
11
  patchProposalCount: metadata.patchProposals?.length ?? 0,
12
+ warnings: metadata.openrouterRuntime?.warnings ?? [],
13
+ policyViolations: metadata.openrouterRuntime?.policyViolations ?? [],
10
14
  };
11
15
  }
12
16
  export function enrichTraceOpenRouterRuntimeMetadata(base, metadata, traceEnabled) {
@@ -75,7 +75,7 @@ export function applyPostRoutingServerToolsPolicy(input) {
75
75
  validateApplyPatchConfig(serverTools, openrouter);
76
76
  if (hasRequiredServerTool(serverTools)) {
77
77
  if (!openRouterApiKey) {
78
- throw new ProviderConfigError('OPENROUTER_SERVER_TOOL_REQUIRES_KEY', 'Required OpenRouter server tools need OPENROUTER_API_KEY or GatewayConfig.openrouter.apiKey');
78
+ throw new ProviderConfigError('OPENROUTER_SERVER_TOOL_REQUIRES_KEY', 'Required OpenRouter server tools need OPENROUTER_API_KEY or GatewayConfig.openrouter.apiKey', { codeAliases: ['OPENROUTER_SERVER_TOOL_REQUIRES_OPENROUTER_KEY'] });
79
79
  }
80
80
  if (provider !== 'openrouter') {
81
81
  provider = 'openrouter';
@@ -297,8 +297,18 @@ export type GatewayTraceAttempt = {
297
297
  citationCount?: number;
298
298
  generatedImageCount?: number;
299
299
  patchProposalCount?: number;
300
+ warnings?: GatewayWarning[];
301
+ policyViolations?: GatewayPolicyViolation[];
300
302
  };
301
303
  };
304
+ /** OpenRouter tool metadata attached to policy/invoke errors and rejection payloads. */
305
+ export type GatewayOpenRouterErrorMetadata = {
306
+ serverTools?: GatewayServerToolUsageMap;
307
+ citations?: GatewayCitation[];
308
+ generatedImages?: GatewayGeneratedImage[];
309
+ patchProposals?: GatewayPatchProposal[];
310
+ openrouterRuntime?: GatewayOpenRouterRuntimeMetadata;
311
+ };
302
312
  /**
303
313
  * Allowlisted merged router/generation config returned in {@link EnhancedLLMResponse.metadata}
304
314
  * when `diagnostics.mode === 'trace'`. Omits arbitrary extras and secrets.
@@ -349,11 +359,33 @@ export type GatewayInvokeRejectionMetadata = {
349
359
  * Sourced from {@link FallbackExhaustedError.attempts} on the router error chain.
350
360
  */
351
361
  fallbackAttempts?: GatewayFallbackAttempt[];
362
+ /**
363
+ * Structured per-attempt diagnostics (`@x12i/ai-providers-router` ≥ 4.10).
364
+ * Same attempts as {@link fallbackAttempts} when enriched; prefer this for UIs.
365
+ */
366
+ providerAttempts?: Array<{
367
+ provider: string;
368
+ modelId?: string;
369
+ httpStatus?: number;
370
+ message: string;
371
+ code?: string;
372
+ }>;
373
+ /** Dominant stable failure sub-code when fallback chain exhausts (router ≥ 4.10). */
374
+ providerSubCode?: string;
375
+ /** Short remediation hint from router enrichment (router ≥ 4.10). */
376
+ operatorHint?: string;
352
377
  /**
353
378
  * True when {@link mergeConfig} did not run (e.g. message-building threw first).
354
379
  * Routing facts may only reflect request.config / modelConfig, not flex-md defaults.
355
380
  */
356
381
  mergeConfigUnavailable?: true;
382
+ /** OpenRouter server-tool usage map when available on partial router response or policy error. */
383
+ serverTools?: GatewayServerToolUsageMap;
384
+ citations?: GatewayCitation[];
385
+ generatedImages?: GatewayGeneratedImage[];
386
+ patchProposals?: GatewayPatchProposal[];
387
+ openrouterRuntime?: GatewayOpenRouterRuntimeMetadata;
388
+ policyViolations?: GatewayPolicyViolation[];
357
389
  };
358
390
  /** Serializable slice of a router fallback attempt for rejection metadata. */
359
391
  export type GatewayFallbackAttempt = {
@@ -361,6 +393,8 @@ export type GatewayFallbackAttempt = {
361
393
  model?: string;
362
394
  httpStatus?: number;
363
395
  error: string;
396
+ /** Stable sub-code from `@x12i/ai-providers-router` ≥ 4.10 (`PROVIDER_AUTH_FAILED`, …). */
397
+ code?: string;
364
398
  responsePreview?: string;
365
399
  };
366
400
  /**
@@ -523,10 +557,12 @@ export interface ModelConfig {
523
557
  stop?: string[];
524
558
  /**
525
559
  * OpenRouter-only server tools. Ignored unless final provider is openrouter.
560
+ * Merge precedence at invoke: `modelConfig.serverTools` > `config.serverTools` > `GatewayConfig.defaultServerTools`.
526
561
  */
527
562
  serverTools?: GatewayServerToolsConfig;
528
563
  /**
529
564
  * OpenRouter-specific execution controls.
565
+ * Merge precedence at invoke: `modelConfig.openrouter` > `config.openrouter` > `GatewayConfig.openrouterRuntime` defaults.
530
566
  */
531
567
  openrouter?: GatewayOpenRouterConfig;
532
568
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x12i/ai-gateway",
3
- "version": "10.4.1",
3
+ "version": "10.4.4",
4
4
  "description": "AI Gateway - Unified interface for LLM provider routing and management",
5
5
  "type": "module",
6
6
  "exports": {
@@ -44,11 +44,11 @@
44
44
  "dependencies": {
45
45
  "@x12i/activix": "^9.0.2",
46
46
  "@x12i/ai-profiles": "^3.4.1",
47
- "@x12i/ai-providers-router": "^4.9.2",
47
+ "@x12i/ai-providers-router": "^4.10.0",
48
48
  "@x12i/ai-tools": "^3.3.5",
49
49
  "@x12i/flex-md": "^4.8.0",
50
50
  "@x12i/logxer": "^5.1.0",
51
- "@x12i/openrouter-runtime": "^1.0.2",
51
+ "@x12i/openrouter-runtime": "^1.0.4",
52
52
  "@x12i/rendrix": "^4.3.0"
53
53
  },
54
54
  "devDependencies": {