@x12i/ai-gateway 9.7.8 → 10.0.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.
Files changed (78) hide show
  1. package/README.md +67 -12
  2. package/dist/defaults/log-diagnostics.json +0 -68
  3. package/dist/gateway-config.d.ts +1 -15
  4. package/dist/gateway-config.js +17 -134
  5. package/dist/gateway-defaults.d.ts +23 -0
  6. package/dist/gateway-defaults.js +29 -0
  7. package/dist/gateway-log-diagnostics.d.ts +0 -4
  8. package/dist/gateway-log-diagnostics.js +1 -5
  9. package/dist/gateway-log-levels.d.ts +0 -1
  10. package/dist/gateway-log-levels.js +0 -1
  11. package/dist/gateway-messages.js +0 -3
  12. package/dist/gateway-meta.js +12 -10
  13. package/dist/gateway-mode.d.ts +3 -26
  14. package/dist/gateway-mode.js +3 -48
  15. package/dist/gateway-retry.js +7 -6
  16. package/dist/gateway-utils.d.ts +1 -19
  17. package/dist/gateway-utils.js +37 -199
  18. package/dist/gateway.d.ts +0 -3
  19. package/dist/gateway.js +4 -63
  20. package/dist/index.d.ts +4 -6
  21. package/dist/index.js +4 -7
  22. package/dist/instruction-errors.d.ts +9 -1
  23. package/dist/instruction-errors.js +15 -1
  24. package/dist/instruction-optimizer.js +5 -1
  25. package/dist/message-builder.d.ts +0 -6
  26. package/dist/message-builder.js +4 -145
  27. package/dist/types.d.ts +16 -57
  28. package/dist-cjs/defaults/log-diagnostics.json +0 -68
  29. package/dist-cjs/gateway-config.cjs +17 -134
  30. package/dist-cjs/gateway-config.d.ts +1 -15
  31. package/dist-cjs/gateway-defaults.cjs +29 -0
  32. package/dist-cjs/gateway-defaults.d.ts +23 -0
  33. package/dist-cjs/gateway-log-diagnostics.cjs +1 -5
  34. package/dist-cjs/gateway-log-diagnostics.d.ts +0 -4
  35. package/dist-cjs/gateway-log-levels.cjs +0 -1
  36. package/dist-cjs/gateway-log-levels.d.ts +0 -1
  37. package/dist-cjs/gateway-messages.cjs +0 -3
  38. package/dist-cjs/gateway-meta.cjs +12 -10
  39. package/dist-cjs/gateway-mode.cjs +3 -48
  40. package/dist-cjs/gateway-mode.d.ts +3 -26
  41. package/dist-cjs/gateway-retry.cjs +7 -6
  42. package/dist-cjs/gateway-utils.cjs +37 -199
  43. package/dist-cjs/gateway-utils.d.ts +1 -19
  44. package/dist-cjs/gateway.cjs +4 -63
  45. package/dist-cjs/gateway.d.ts +0 -3
  46. package/dist-cjs/index.cjs +4 -7
  47. package/dist-cjs/index.d.ts +4 -6
  48. package/dist-cjs/instruction-errors.cjs +15 -1
  49. package/dist-cjs/instruction-errors.d.ts +9 -1
  50. package/dist-cjs/instruction-optimizer.cjs +5 -1
  51. package/dist-cjs/message-builder.cjs +4 -145
  52. package/dist-cjs/message-builder.d.ts +0 -6
  53. package/dist-cjs/types.d.ts +16 -57
  54. package/package.json +2 -3
  55. package/dist/defaults/instructions-blocks.json +0 -61
  56. package/dist/defaults/model-config.json +0 -15
  57. package/dist/gateway-instructions.d.ts +0 -30
  58. package/dist/gateway-instructions.js +0 -62
  59. package/dist/gateway-rate-limiter-constants.d.ts +0 -16
  60. package/dist/gateway-rate-limiter-constants.js +0 -16
  61. package/dist/gateway-rate-limiter.d.ts +0 -56
  62. package/dist/gateway-rate-limiter.js +0 -107
  63. package/dist/optimixer-manager.d.ts +0 -33
  64. package/dist/optimixer-manager.js +0 -142
  65. package/dist/token-estimate.d.ts +0 -12
  66. package/dist/token-estimate.js +0 -30
  67. package/dist-cjs/defaults/instructions-blocks.json +0 -61
  68. package/dist-cjs/defaults/model-config.json +0 -15
  69. package/dist-cjs/gateway-instructions.cjs +0 -62
  70. package/dist-cjs/gateway-instructions.d.ts +0 -30
  71. package/dist-cjs/gateway-rate-limiter-constants.cjs +0 -16
  72. package/dist-cjs/gateway-rate-limiter-constants.d.ts +0 -16
  73. package/dist-cjs/gateway-rate-limiter.cjs +0 -107
  74. package/dist-cjs/gateway-rate-limiter.d.ts +0 -56
  75. package/dist-cjs/optimixer-manager.cjs +0 -142
  76. package/dist-cjs/optimixer-manager.d.ts +0 -33
  77. package/dist-cjs/token-estimate.cjs +0 -30
  78. package/dist-cjs/token-estimate.d.ts +0 -12
@@ -1,56 +0,0 @@
1
- /**
2
- * Gateway Rate Limiter
3
- *
4
- * Smart rate limiting for BETWEEN-CALLS (not retries).
5
- *
6
- * Two types of rate limiting in the system:
7
- * 1. RETRY delays (in gateway-retry.ts) - Simple sleep, not smart. Used when retrying after errors.
8
- * 2. BETWEEN-CALLS rate limiting (this class) - Smart, tracks last call time and only waits if needed.
9
- *
10
- * This class handles #2: it tracks when the last API call was made per provider
11
- * and only waits if necessary to maintain minimum intervals between separate API calls.
12
- * This prevents unnecessary delays when enough time has already passed.
13
- */
14
- import type { Logxer } from '@x12i/logxer';
15
- /**
16
- * Smart Rate Limiter (Between-Calls Only)
17
- *
18
- * Tracks the last API call time per provider and only waits if necessary.
19
- * Supports per-provider rate limits with safe defaults.
20
- *
21
- * NOTE: This is for BETWEEN-CALLS rate limiting (smart).
22
- * Retry delays are handled separately in gateway-retry.ts (simple sleep).
23
- *
24
- * This ensures minimum intervals between separate API calls regardless of what happens between them.
25
- */
26
- export declare class GatewayRateLimiter {
27
- private lastCallTimes;
28
- private defaultMinIntervalMs;
29
- private providerIntervals;
30
- private logger?;
31
- constructor(defaultMinIntervalMs?: number, providerIntervals?: Record<string, number>, logger?: Logxer);
32
- /**
33
- * Gets the minimum interval for a specific provider
34
- * Falls back to default if provider-specific interval not set
35
- */
36
- private getMinIntervalForProvider;
37
- /**
38
- * Waits only if necessary to maintain the minimum interval between calls for a provider
39
- * @param provider - Provider name (e.g., 'openai', 'grok')
40
- * @returns Promise that resolves when it's safe to make the next call
41
- */
42
- waitIfNeeded(provider?: string): Promise<void>;
43
- /**
44
- * Records that an API call was made (call this after the API call completes)
45
- * This ensures we track the actual call time, accounting for call duration
46
- */
47
- recordCall(provider?: string): void;
48
- /**
49
- * Gets the time since the last call for a provider
50
- */
51
- getTimeSinceLastCall(provider?: string): number;
52
- /**
53
- * Resets the rate limiter for a provider (useful for testing or reset scenarios)
54
- */
55
- reset(provider?: string): void;
56
- }
@@ -1,142 +0,0 @@
1
- import { Optimixer } from '@x12i/optimixer';
2
- import { exceptionEvidence, fieldEvidence, GatewayLogCode, gatewayWarnCode } from './gateway-log-diagnostics.js';
3
- import { resolveActivityTrackingConfig } from './config/activity-tracking-config.js';
4
- import { estimateMessagesTokenSizes } from './token-estimate.js';
5
- /** Optimixer bucket key: prefer taskTypeId (template), then identity actionType, else gateway default. */
6
- function resolveTemplateId(request) {
7
- if (request.taskTypeId && String(request.taskTypeId).trim()) {
8
- return String(request.taskTypeId).trim();
9
- }
10
- const identity = request.identity;
11
- if (identity?.actionType && String(identity.actionType).trim()) {
12
- return String(identity.actionType).trim();
13
- }
14
- return 'gateway.invoke';
15
- }
16
- function toActivixRunContext(identity) {
17
- if (!identity)
18
- return undefined;
19
- return identity;
20
- }
21
- export class OptimixerManager {
22
- config;
23
- logger;
24
- getActivix;
25
- optimixer;
26
- initPromise;
27
- activixCollection;
28
- constructor(config) {
29
- this.config = config.optimixer;
30
- this.logger = config.logger;
31
- this.getActivix = config.getActivix;
32
- this.activixCollection = resolveActivityTrackingConfig().collectionName;
33
- }
34
- isEnabled() {
35
- return this.config?.enabled === true;
36
- }
37
- async ensureReady() {
38
- if (!this.isEnabled())
39
- return undefined;
40
- if (this.optimixer)
41
- return this.optimixer;
42
- if (!this.initPromise) {
43
- this.initPromise = this.initialize();
44
- }
45
- await this.initPromise;
46
- return this.optimixer;
47
- }
48
- async initialize() {
49
- const activix = await this.getActivix();
50
- if (!activix) {
51
- gatewayWarnCode(this.logger, GatewayLogCode.OPTIMIXER_ACTIVIX_UNAVAILABLE, undefined, {
52
- activixCollection: this.activixCollection,
53
- evidence: [fieldEvidence('activixCollection', this.activixCollection)]
54
- });
55
- return;
56
- }
57
- try {
58
- this.optimixer = await Optimixer.create({
59
- activixClient: activix,
60
- activixCollection: this.activixCollection,
61
- pipelines: { aiMaxTokens: { enabled: true } },
62
- ...(typeof this.config?.warmupLimit === 'number' ? { warmupLimit: this.config.warmupLimit } : {})
63
- });
64
- this.logger.info('Optimixer initialized for adaptive max_tokens', {
65
- activixCollection: this.activixCollection,
66
- acceptableRisk: this.config?.acceptableRisk ?? 'medium'
67
- });
68
- }
69
- catch (error) {
70
- gatewayWarnCode(this.logger, GatewayLogCode.OPTIMIXER_INIT_FAILED, undefined, {
71
- error: error instanceof Error ? error.message : String(error),
72
- evidence: [
73
- fieldEvidence('activixCollection', this.activixCollection),
74
- ...(error instanceof Error ? [exceptionEvidence(error)] : [])
75
- ]
76
- });
77
- this.optimixer = undefined;
78
- }
79
- }
80
- async predictMaxTokens(ctx) {
81
- const optimixer = await this.ensureReady();
82
- if (!optimixer)
83
- return undefined;
84
- const { request, mergedConfig, messages } = ctx;
85
- const { inputSize, contextSize } = estimateMessagesTokenSizes(messages);
86
- const acceptableRisk = this.config?.acceptableRisk ?? 'medium';
87
- const provider = typeof mergedConfig?.provider === 'string' ? mergedConfig.provider : undefined;
88
- const model = typeof mergedConfig?.model === 'string' ? mergedConfig.model : undefined;
89
- try {
90
- return await optimixer.predictAiMaxTokens({
91
- templateId: resolveTemplateId(request),
92
- inputSize,
93
- contextSize,
94
- acceptableRisk,
95
- runContext: toActivixRunContext(request.identity),
96
- ...(provider || model
97
- ? { modelProfile: { ...(provider ? { provider } : {}), ...(model ? { model } : {}) } }
98
- : {})
99
- });
100
- }
101
- catch (error) {
102
- gatewayWarnCode(this.logger, GatewayLogCode.OPTIMIXER_PREDICT_FAILED, request.identity, {
103
- error: error instanceof Error ? error.message : String(error),
104
- aiRequestId: request.aiRequestId,
105
- evidence: [
106
- fieldEvidence('aiRequestId', request.aiRequestId),
107
- ...(error instanceof Error ? [exceptionEvidence(error)] : [])
108
- ]
109
- });
110
- return undefined;
111
- }
112
- }
113
- async completePrediction(requestId, actual) {
114
- const optimixer = await this.ensureReady();
115
- if (!optimixer)
116
- return;
117
- try {
118
- await optimixer.completeAiMaxTokensPrediction({ requestId, actual });
119
- }
120
- catch (error) {
121
- this.logger.warn('Optimixer completeAiMaxTokensPrediction failed (non-blocking)', {
122
- requestId,
123
- error: error instanceof Error ? error.message : String(error)
124
- });
125
- }
126
- }
127
- async shutdown() {
128
- const optimixer = this.optimixer;
129
- this.optimixer = undefined;
130
- this.initPromise = undefined;
131
- if (optimixer) {
132
- try {
133
- await optimixer.close();
134
- }
135
- catch (error) {
136
- this.logger.warn('OptimixerManager shutdown: close failed (non-blocking)', {
137
- error: error instanceof Error ? error.message : String(error)
138
- });
139
- }
140
- }
141
- }
142
- }
@@ -1,33 +0,0 @@
1
- import type { AiMaxTokensActualUsage, AiMaxTokensPredictionResult } from '@x12i/optimixer';
2
- import type { Activix } from '@x12i/activix';
3
- import type { Logxer } from '@x12i/logxer';
4
- import type { ChatRequest, GatewayConfig } from './types.js';
5
- export type OptimixerGatewayConfig = NonNullable<GatewayConfig['optimixer']>;
6
- export interface OptimixerManagerConfig {
7
- optimixer?: OptimixerGatewayConfig;
8
- logger: Logxer;
9
- getActivix: () => Promise<Activix | undefined>;
10
- }
11
- export type OptimixerMaxTokensContext = {
12
- request: ChatRequest;
13
- mergedConfig: ChatRequest['config'];
14
- messages: Array<{
15
- role?: string;
16
- content?: unknown;
17
- }>;
18
- };
19
- export declare class OptimixerManager {
20
- private readonly config;
21
- private readonly logger;
22
- private readonly getActivix;
23
- private optimixer?;
24
- private initPromise?;
25
- private readonly activixCollection;
26
- constructor(config: OptimixerManagerConfig);
27
- isEnabled(): boolean;
28
- private ensureReady;
29
- private initialize;
30
- predictMaxTokens(ctx: OptimixerMaxTokensContext): Promise<AiMaxTokensPredictionResult | undefined>;
31
- completePrediction(requestId: string, actual: AiMaxTokensActualUsage): Promise<void>;
32
- shutdown(): Promise<void>;
33
- }
@@ -1,30 +0,0 @@
1
- /**
2
- * Lightweight token-size estimates for Optimixer predict inputs.
3
- * Uses a chars/4 heuristic (no tiktoken dependency).
4
- */
5
- export function estimateTextTokens(text) {
6
- const trimmed = text.trim();
7
- if (!trimmed)
8
- return 0;
9
- return Math.max(1, Math.ceil(trimmed.length / 4));
10
- }
11
- export function estimateMessagesTokenSizes(messages) {
12
- let inputSize = 0;
13
- let contextSize = 0;
14
- for (const message of messages) {
15
- const role = typeof message.role === 'string' ? message.role.toLowerCase() : '';
16
- const content = typeof message.content === 'string'
17
- ? message.content
18
- : message.content != null
19
- ? JSON.stringify(message.content)
20
- : '';
21
- const tokens = estimateTextTokens(content);
22
- if (role === 'system') {
23
- contextSize += tokens;
24
- }
25
- else {
26
- inputSize += tokens;
27
- }
28
- }
29
- return { inputSize, contextSize };
30
- }
@@ -1,12 +0,0 @@
1
- /**
2
- * Lightweight token-size estimates for Optimixer predict inputs.
3
- * Uses a chars/4 heuristic (no tiktoken dependency).
4
- */
5
- export declare function estimateTextTokens(text: string): number;
6
- export declare function estimateMessagesTokenSizes(messages: Array<{
7
- role?: string;
8
- content?: unknown;
9
- }>): {
10
- inputSize: number;
11
- contextSize: number;
12
- };