@rudderjs/ai 0.0.1

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 (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +461 -0
  3. package/boost/guidelines.md +150 -0
  4. package/dist/agent.d.ts +74 -0
  5. package/dist/agent.d.ts.map +1 -0
  6. package/dist/agent.js +1070 -0
  7. package/dist/agent.js.map +1 -0
  8. package/dist/attachment.d.ts +35 -0
  9. package/dist/attachment.d.ts.map +1 -0
  10. package/dist/attachment.js +121 -0
  11. package/dist/attachment.js.map +1 -0
  12. package/dist/audio.d.ts +33 -0
  13. package/dist/audio.d.ts.map +1 -0
  14. package/dist/audio.js +76 -0
  15. package/dist/audio.js.map +1 -0
  16. package/dist/cached-embedding.d.ts +14 -0
  17. package/dist/cached-embedding.d.ts.map +1 -0
  18. package/dist/cached-embedding.js +44 -0
  19. package/dist/cached-embedding.js.map +1 -0
  20. package/dist/conversation.d.ts +16 -0
  21. package/dist/conversation.d.ts.map +1 -0
  22. package/dist/conversation.js +53 -0
  23. package/dist/conversation.js.map +1 -0
  24. package/dist/facade.d.ts +53 -0
  25. package/dist/facade.d.ts.map +1 -0
  26. package/dist/facade.js +100 -0
  27. package/dist/facade.js.map +1 -0
  28. package/dist/fake.d.ts +55 -0
  29. package/dist/fake.d.ts.map +1 -0
  30. package/dist/fake.js +172 -0
  31. package/dist/fake.js.map +1 -0
  32. package/dist/image.d.ts +27 -0
  33. package/dist/image.d.ts.map +1 -0
  34. package/dist/image.js +90 -0
  35. package/dist/image.js.map +1 -0
  36. package/dist/index.d.ts +30 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +45 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/middleware.d.ts +18 -0
  41. package/dist/middleware.d.ts.map +1 -0
  42. package/dist/middleware.js +72 -0
  43. package/dist/middleware.js.map +1 -0
  44. package/dist/output.d.ts +22 -0
  45. package/dist/output.d.ts.map +1 -0
  46. package/dist/output.js +55 -0
  47. package/dist/output.js.map +1 -0
  48. package/dist/provider-tools.d.ts +60 -0
  49. package/dist/provider-tools.d.ts.map +1 -0
  50. package/dist/provider-tools.js +133 -0
  51. package/dist/provider-tools.js.map +1 -0
  52. package/dist/provider.d.ts +12 -0
  53. package/dist/provider.d.ts.map +1 -0
  54. package/dist/provider.js +94 -0
  55. package/dist/provider.js.map +1 -0
  56. package/dist/providers/anthropic.d.ts +12 -0
  57. package/dist/providers/anthropic.d.ts.map +1 -0
  58. package/dist/providers/anthropic.js +221 -0
  59. package/dist/providers/anthropic.js.map +1 -0
  60. package/dist/providers/azure.d.ts +13 -0
  61. package/dist/providers/azure.d.ts.map +1 -0
  62. package/dist/providers/azure.js +15 -0
  63. package/dist/providers/azure.js.map +1 -0
  64. package/dist/providers/deepseek.d.ts +12 -0
  65. package/dist/providers/deepseek.d.ts.map +1 -0
  66. package/dist/providers/deepseek.js +15 -0
  67. package/dist/providers/deepseek.js.map +1 -0
  68. package/dist/providers/google.d.ts +13 -0
  69. package/dist/providers/google.d.ts.map +1 -0
  70. package/dist/providers/google.js +293 -0
  71. package/dist/providers/google.js.map +1 -0
  72. package/dist/providers/groq.d.ts +12 -0
  73. package/dist/providers/groq.d.ts.map +1 -0
  74. package/dist/providers/groq.js +15 -0
  75. package/dist/providers/groq.js.map +1 -0
  76. package/dist/providers/mistral.d.ts +13 -0
  77. package/dist/providers/mistral.d.ts.map +1 -0
  78. package/dist/providers/mistral.js +46 -0
  79. package/dist/providers/mistral.js.map +1 -0
  80. package/dist/providers/ollama.d.ts +11 -0
  81. package/dist/providers/ollama.d.ts.map +1 -0
  82. package/dist/providers/ollama.js +15 -0
  83. package/dist/providers/ollama.js.map +1 -0
  84. package/dist/providers/openai.d.ts +26 -0
  85. package/dist/providers/openai.d.ts.map +1 -0
  86. package/dist/providers/openai.js +374 -0
  87. package/dist/providers/openai.js.map +1 -0
  88. package/dist/providers/xai.d.ts +12 -0
  89. package/dist/providers/xai.d.ts.map +1 -0
  90. package/dist/providers/xai.js +15 -0
  91. package/dist/providers/xai.js.map +1 -0
  92. package/dist/queue-job.d.ts +35 -0
  93. package/dist/queue-job.d.ts.map +1 -0
  94. package/dist/queue-job.js +82 -0
  95. package/dist/queue-job.js.map +1 -0
  96. package/dist/registry.d.ts +25 -0
  97. package/dist/registry.d.ts.map +1 -0
  98. package/dist/registry.js +54 -0
  99. package/dist/registry.js.map +1 -0
  100. package/dist/tool.d.ts +157 -0
  101. package/dist/tool.d.ts.map +1 -0
  102. package/dist/tool.js +134 -0
  103. package/dist/tool.js.map +1 -0
  104. package/dist/transcription.d.ts +28 -0
  105. package/dist/transcription.d.ts.map +1 -0
  106. package/dist/transcription.js +63 -0
  107. package/dist/transcription.js.map +1 -0
  108. package/dist/types.d.ts +439 -0
  109. package/dist/types.d.ts.map +1 -0
  110. package/dist/types.js +2 -0
  111. package/dist/types.js.map +1 -0
  112. package/dist/vercel-protocol.d.ts +18 -0
  113. package/dist/vercel-protocol.d.ts.map +1 -0
  114. package/dist/vercel-protocol.js +75 -0
  115. package/dist/vercel-protocol.js.map +1 -0
  116. package/dist/zod-to-json-schema.d.ts +8 -0
  117. package/dist/zod-to-json-schema.d.ts.map +1 -0
  118. package/dist/zod-to-json-schema.js +86 -0
  119. package/dist/zod-to-json-schema.js.map +1 -0
  120. package/package.json +45 -0
package/dist/facade.js ADDED
@@ -0,0 +1,100 @@
1
+ import { AiRegistry } from './registry.js';
2
+ import { agent as agentHelper } from './agent.js';
3
+ import { ImageGenerator } from './image.js';
4
+ import { AudioGenerator } from './audio.js';
5
+ import { Transcription } from './transcription.js';
6
+ import { CachedEmbeddingAdapter } from './cached-embedding.js';
7
+ /**
8
+ * AI facade — static entry point for quick prompts, embeddings, and image generation.
9
+ *
10
+ * @example
11
+ * const response = await AI.prompt('Hello')
12
+ * const a = AI.agent('You are helpful.')
13
+ * const result = await AI.embed('Some text')
14
+ * const image = await AI.image('A sunset').generate()
15
+ */
16
+ export class AI {
17
+ /** Quick prompt with default model */
18
+ static async prompt(input, options) {
19
+ const opts = {
20
+ instructions: 'You are a helpful assistant.',
21
+ };
22
+ if (options?.model)
23
+ opts.model = options.model;
24
+ return agentHelper(opts).prompt(input);
25
+ }
26
+ /** Create an anonymous agent */
27
+ static agent(instructionsOrOptions) {
28
+ return agentHelper(instructionsOrOptions);
29
+ }
30
+ /** Create an image generator with a fluent API */
31
+ static image(prompt) {
32
+ return ImageGenerator.of(prompt);
33
+ }
34
+ /** Create a text-to-speech audio generator */
35
+ static audio(text) {
36
+ return AudioGenerator.of(text);
37
+ }
38
+ /** Create a speech-to-text transcription */
39
+ static transcribe(pathOrBuffer) {
40
+ return typeof pathOrBuffer === 'string'
41
+ ? Transcription.fromPath(pathOrBuffer)
42
+ : Transcription.fromBuffer(pathOrBuffer);
43
+ }
44
+ /**
45
+ * Generate embeddings for text.
46
+ *
47
+ * Large arrays (100+ items) are automatically chunked into batches.
48
+ * Pass `cache: true` to enable in-memory caching of embeddings.
49
+ *
50
+ * @example
51
+ * const result = await AI.embed('Hello world')
52
+ * const result = await AI.embed(['text1', 'text2'])
53
+ * const result = await AI.embed('text', { model: 'openai/text-embedding-3-small' })
54
+ * const result = await AI.embed('text', { cache: true })
55
+ */
56
+ static async embed(input, options) {
57
+ const modelString = options?.model ?? AiRegistry.getDefault();
58
+ const [providerName, modelId] = AiRegistry.parseModelString(modelString);
59
+ const factory = AiRegistry.getFactory(providerName);
60
+ if (!factory.createEmbedding) {
61
+ throw new Error(`[RudderJS AI] Provider "${providerName}" does not support embeddings. ` +
62
+ `Use a provider that implements createEmbedding() (e.g. openai, google, mistral).`);
63
+ }
64
+ let adapter = factory.createEmbedding(modelId);
65
+ if (options?.cache) {
66
+ adapter = AI.getCachedAdapter(adapter);
67
+ }
68
+ // Batch chunking for large arrays
69
+ const inputs = Array.isArray(input) ? input : [input];
70
+ if (inputs.length > 100) {
71
+ const batches = [];
72
+ for (let i = 0; i < inputs.length; i += 100) {
73
+ batches.push(inputs.slice(i, i + 100));
74
+ }
75
+ const results = [];
76
+ for (const batch of batches) {
77
+ results.push(await adapter.embed(batch, modelId));
78
+ }
79
+ return {
80
+ embeddings: results.flatMap(r => r.embeddings),
81
+ usage: {
82
+ promptTokens: results.reduce((sum, r) => sum + r.usage.promptTokens, 0),
83
+ totalTokens: results.reduce((sum, r) => sum + r.usage.totalTokens, 0),
84
+ },
85
+ };
86
+ }
87
+ return adapter.embed(inputs.length === 1 ? inputs[0] : inputs, modelId);
88
+ }
89
+ /** Cache adapter instances so the in-memory cache persists across calls. */
90
+ static cachedAdapters = new WeakMap();
91
+ static getCachedAdapter(inner) {
92
+ let cached = AI.cachedAdapters.get(inner);
93
+ if (!cached) {
94
+ cached = new CachedEmbeddingAdapter(inner);
95
+ AI.cachedAdapters.set(inner, cached);
96
+ }
97
+ return cached;
98
+ }
99
+ }
100
+ //# sourceMappingURL=facade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facade.js","sourceRoot":"","sources":["../src/facade.ts"],"names":[],"mappings":"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"}
package/dist/fake.d.ts ADDED
@@ -0,0 +1,55 @@
1
+ import type { ProviderRequestOptions, ImageGenerationOptions, TextToSpeechOptions, SpeechToTextOptions } from './types.js';
2
+ /**
3
+ * Testing fake for @rudderjs/ai.
4
+ *
5
+ * @example
6
+ * const fake = AiFake.fake()
7
+ * fake.respondWith('Mocked response')
8
+ *
9
+ * const response = await AI.prompt('Hello')
10
+ * assert.strictEqual(response.text, 'Mocked response')
11
+ *
12
+ * fake.assertPrompted(input => input.includes('Hello'))
13
+ * fake.restore()
14
+ */
15
+ export declare class AiFake {
16
+ private readonly calls;
17
+ private readonly imageCalls;
18
+ private readonly ttsCalls;
19
+ private readonly sttCalls;
20
+ private _response;
21
+ private _imageResponse;
22
+ private _ttsResponse;
23
+ private _sttResponse;
24
+ /** Set the text response the fake will return */
25
+ respondWith(text: string): void;
26
+ /** Set the base64 image the fake will return */
27
+ respondWithImage(base64: string): void;
28
+ /** Set the audio buffer the TTS fake will return */
29
+ respondWithAudio(audio: Buffer): void;
30
+ /** Set the transcription text the STT fake will return */
31
+ respondWithTranscription(text: string): void;
32
+ /** Install the fake — replaces all registered providers with a mock */
33
+ static fake(): AiFake;
34
+ /** Assert at least one prompt was sent, optionally matching a predicate */
35
+ assertPrompted(predicate?: (input: string) => boolean): void;
36
+ /** Assert no prompts were sent */
37
+ assertNothingPrompted(): void;
38
+ /** Assert at least one image generation was made */
39
+ assertImageGenerated(predicate?: (prompt: string) => boolean): void;
40
+ /** Assert at least one TTS generation was made */
41
+ assertAudioGenerated(predicate?: (text: string) => boolean): void;
42
+ /** Assert at least one transcription was made */
43
+ assertTranscribed(predicate?: (opts: SpeechToTextOptions) => boolean): void;
44
+ /** Get all recorded provider calls */
45
+ getCalls(): ProviderRequestOptions[];
46
+ /** Get all recorded image generation calls */
47
+ getImageCalls(): ImageGenerationOptions[];
48
+ /** Get all recorded TTS calls */
49
+ getTtsCalls(): TextToSpeechOptions[];
50
+ /** Get all recorded STT calls */
51
+ getSttCalls(): SpeechToTextOptions[];
52
+ /** Restore — clears the fake (user must re-register real providers) */
53
+ restore(): void;
54
+ }
55
+ //# sourceMappingURL=fake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake.d.ts","sourceRoot":"","sources":["../src/fake.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,sBAAsB,EAItB,sBAAsB,EAGtB,mBAAmB,EAGnB,mBAAmB,EAEpB,MAAM,YAAY,CAAA;AAEnB;;;;;;;;;;;;GAYG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAC1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,YAAY,CAAuB;IAE3C,iDAAiD;IACjD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,gDAAgD;IAChD,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC,oDAAoD;IACpD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC,0DAA0D;IAC1D,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI5C,uEAAuE;IACvE,MAAM,CAAC,IAAI,IAAI,MAAM;IAiErB,2EAA2E;IAC3E,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI;IAa5D,kCAAkC;IAClC,qBAAqB,IAAI,IAAI;IAM7B,oDAAoD;IACpD,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI;IAQnE,kDAAkD;IAClD,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI;IAQjE,iDAAiD;IACjD,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,OAAO,GAAG,IAAI;IAQ3E,sCAAsC;IACtC,QAAQ,IAAI,sBAAsB,EAAE;IAIpC,8CAA8C;IAC9C,aAAa,IAAI,sBAAsB,EAAE;IAIzC,iCAAiC;IACjC,WAAW,IAAI,mBAAmB,EAAE;IAIpC,iCAAiC;IACjC,WAAW,IAAI,mBAAmB,EAAE;IAIpC,uEAAuE;IACvE,OAAO,IAAI,IAAI;CAGhB"}
package/dist/fake.js ADDED
@@ -0,0 +1,172 @@
1
+ import { AiRegistry } from './registry.js';
2
+ /**
3
+ * Testing fake for @rudderjs/ai.
4
+ *
5
+ * @example
6
+ * const fake = AiFake.fake()
7
+ * fake.respondWith('Mocked response')
8
+ *
9
+ * const response = await AI.prompt('Hello')
10
+ * assert.strictEqual(response.text, 'Mocked response')
11
+ *
12
+ * fake.assertPrompted(input => input.includes('Hello'))
13
+ * fake.restore()
14
+ */
15
+ export class AiFake {
16
+ calls = [];
17
+ imageCalls = [];
18
+ ttsCalls = [];
19
+ sttCalls = [];
20
+ _response = 'fake response';
21
+ _imageResponse = 'ZmFrZS1pbWFnZQ=='; // base64 of 'fake-image'
22
+ _ttsResponse = Buffer.from('fake-audio');
23
+ _sttResponse = 'fake transcription';
24
+ /** Set the text response the fake will return */
25
+ respondWith(text) {
26
+ this._response = text;
27
+ }
28
+ /** Set the base64 image the fake will return */
29
+ respondWithImage(base64) {
30
+ this._imageResponse = base64;
31
+ }
32
+ /** Set the audio buffer the TTS fake will return */
33
+ respondWithAudio(audio) {
34
+ this._ttsResponse = audio;
35
+ }
36
+ /** Set the transcription text the STT fake will return */
37
+ respondWithTranscription(text) {
38
+ this._sttResponse = text;
39
+ }
40
+ /** Install the fake — replaces all registered providers with a mock */
41
+ static fake() {
42
+ const fake = new AiFake();
43
+ const adapter = {
44
+ async generate(opts) {
45
+ fake.calls.push(opts);
46
+ return {
47
+ message: { role: 'assistant', content: fake._response },
48
+ usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },
49
+ finishReason: 'stop',
50
+ };
51
+ },
52
+ async *stream(opts) {
53
+ fake.calls.push(opts);
54
+ yield { type: 'text-delta', text: fake._response };
55
+ yield { type: 'finish', finishReason: 'stop', usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 } };
56
+ },
57
+ };
58
+ const imageAdapter = {
59
+ async generate(opts) {
60
+ fake.imageCalls.push(opts);
61
+ return {
62
+ images: [{ base64: fake._imageResponse }],
63
+ model: opts.model ?? 'fake-image',
64
+ };
65
+ },
66
+ };
67
+ const ttsAdapter = {
68
+ async generate(opts) {
69
+ fake.ttsCalls.push(opts);
70
+ return {
71
+ audio: fake._ttsResponse,
72
+ format: opts.format ?? 'mp3',
73
+ model: opts.model ?? 'fake-tts',
74
+ };
75
+ },
76
+ };
77
+ const sttAdapter = {
78
+ async transcribe(opts) {
79
+ fake.sttCalls.push(opts);
80
+ return {
81
+ text: fake._sttResponse,
82
+ language: opts.language,
83
+ model: opts.model ?? 'fake-stt',
84
+ };
85
+ },
86
+ };
87
+ const factory = {
88
+ name: '__fake__',
89
+ create: () => adapter,
90
+ createImage: () => imageAdapter,
91
+ createTts: () => ttsAdapter,
92
+ createStt: () => sttAdapter,
93
+ };
94
+ AiRegistry.reset();
95
+ AiRegistry.register(factory);
96
+ AiRegistry.setDefault('__fake__/default');
97
+ return fake;
98
+ }
99
+ /** Assert at least one prompt was sent, optionally matching a predicate */
100
+ assertPrompted(predicate) {
101
+ if (this.calls.length === 0)
102
+ throw new Error('[RudderJS AI] Expected at least one prompt, but none were sent.');
103
+ if (predicate) {
104
+ const match = this.calls.some(c => {
105
+ const userMsg = c.messages.find(m => m.role === 'user');
106
+ if (!userMsg)
107
+ return false;
108
+ const text = typeof userMsg.content === 'string' ? userMsg.content : userMsg.content.filter(p => p.type === 'text').map(p => p.text).join('');
109
+ return predicate(text);
110
+ });
111
+ if (!match)
112
+ throw new Error('[RudderJS AI] No prompt matched the predicate.');
113
+ }
114
+ }
115
+ /** Assert no prompts were sent */
116
+ assertNothingPrompted() {
117
+ if (this.calls.length > 0) {
118
+ throw new Error(`[RudderJS AI] Expected no prompts, but ${this.calls.length} were sent.`);
119
+ }
120
+ }
121
+ /** Assert at least one image generation was made */
122
+ assertImageGenerated(predicate) {
123
+ if (this.imageCalls.length === 0)
124
+ throw new Error('[RudderJS AI] Expected at least one image generation, but none were made.');
125
+ if (predicate) {
126
+ const match = this.imageCalls.some(c => predicate(c.prompt));
127
+ if (!match)
128
+ throw new Error('[RudderJS AI] No image generation matched the predicate.');
129
+ }
130
+ }
131
+ /** Assert at least one TTS generation was made */
132
+ assertAudioGenerated(predicate) {
133
+ if (this.ttsCalls.length === 0)
134
+ throw new Error('[RudderJS AI] Expected at least one audio generation, but none were made.');
135
+ if (predicate) {
136
+ const match = this.ttsCalls.some(c => predicate(c.text));
137
+ if (!match)
138
+ throw new Error('[RudderJS AI] No audio generation matched the predicate.');
139
+ }
140
+ }
141
+ /** Assert at least one transcription was made */
142
+ assertTranscribed(predicate) {
143
+ if (this.sttCalls.length === 0)
144
+ throw new Error('[RudderJS AI] Expected at least one transcription, but none were made.');
145
+ if (predicate) {
146
+ const match = this.sttCalls.some(c => predicate(c));
147
+ if (!match)
148
+ throw new Error('[RudderJS AI] No transcription matched the predicate.');
149
+ }
150
+ }
151
+ /** Get all recorded provider calls */
152
+ getCalls() {
153
+ return [...this.calls];
154
+ }
155
+ /** Get all recorded image generation calls */
156
+ getImageCalls() {
157
+ return [...this.imageCalls];
158
+ }
159
+ /** Get all recorded TTS calls */
160
+ getTtsCalls() {
161
+ return [...this.ttsCalls];
162
+ }
163
+ /** Get all recorded STT calls */
164
+ getSttCalls() {
165
+ return [...this.sttCalls];
166
+ }
167
+ /** Restore — clears the fake (user must re-register real providers) */
168
+ restore() {
169
+ AiRegistry.reset();
170
+ }
171
+ }
172
+ //# sourceMappingURL=fake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake.js","sourceRoot":"","sources":["../src/fake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ImageGenerationResult } from './types.js';
2
+ /**
3
+ * Fluent image generation facade.
4
+ *
5
+ * @example
6
+ * const result = await ImageGenerator.of('A sunset over mountains').size('landscape').generate()
7
+ * const path = await ImageGenerator.of('A logo').model('openai/dall-e-3').store('images/logo.png')
8
+ */
9
+ export declare class ImageGenerator {
10
+ private readonly _prompt;
11
+ private _model;
12
+ private _size;
13
+ private _quality;
14
+ private _style;
15
+ private _n;
16
+ private constructor();
17
+ static of(prompt: string): ImageGenerator;
18
+ model(model: string): this;
19
+ size(size: string): this;
20
+ quality(quality: 'standard' | 'hd'): this;
21
+ style(style: 'natural' | 'vivid'): this;
22
+ count(n: number): this;
23
+ generate(): Promise<ImageGenerationResult>;
24
+ /** Generate and store the first image to storage. Requires @rudderjs/storage. */
25
+ store(path: string): Promise<string>;
26
+ }
27
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA0B,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAE/E;;;;;;GAMG;AACH,qBAAa,cAAc;IAOL,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN5C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,EAAE,CAAoB;IAE9B,OAAO;IAEP,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAIzC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKxB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI;IAKzC,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,GAAG,IAAI;IAKvC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKhB,QAAQ,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAuBhD,iFAAiF;IAC3E,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAwB3C"}
package/dist/image.js ADDED
@@ -0,0 +1,90 @@
1
+ import { AiRegistry } from './registry.js';
2
+ /**
3
+ * Fluent image generation facade.
4
+ *
5
+ * @example
6
+ * const result = await ImageGenerator.of('A sunset over mountains').size('landscape').generate()
7
+ * const path = await ImageGenerator.of('A logo').model('openai/dall-e-3').store('images/logo.png')
8
+ */
9
+ export class ImageGenerator {
10
+ _prompt;
11
+ _model;
12
+ _size;
13
+ _quality;
14
+ _style;
15
+ _n;
16
+ constructor(_prompt) {
17
+ this._prompt = _prompt;
18
+ }
19
+ static of(prompt) {
20
+ return new ImageGenerator(prompt);
21
+ }
22
+ model(model) {
23
+ this._model = model;
24
+ return this;
25
+ }
26
+ size(size) {
27
+ this._size = size;
28
+ return this;
29
+ }
30
+ quality(quality) {
31
+ this._quality = quality;
32
+ return this;
33
+ }
34
+ style(style) {
35
+ this._style = style;
36
+ return this;
37
+ }
38
+ count(n) {
39
+ this._n = n;
40
+ return this;
41
+ }
42
+ async generate() {
43
+ const modelStr = this._model ?? AiRegistry.getDefault();
44
+ const [providerName, modelName] = AiRegistry.parseModelString(modelStr);
45
+ const factory = AiRegistry.getFactory(providerName);
46
+ if (!factory.createImage) {
47
+ throw new Error(`[RudderJS AI] Provider "${providerName}" does not support image generation.`);
48
+ }
49
+ const adapter = factory.createImage(modelName);
50
+ const options = {
51
+ prompt: this._prompt,
52
+ model: modelStr,
53
+ };
54
+ if (this._size !== undefined)
55
+ options.size = this._size;
56
+ if (this._quality !== undefined)
57
+ options.quality = this._quality;
58
+ if (this._style !== undefined)
59
+ options.style = this._style;
60
+ if (this._n !== undefined)
61
+ options.n = this._n;
62
+ return adapter.generate(options);
63
+ }
64
+ /** Generate and store the first image to storage. Requires @rudderjs/storage. */
65
+ async store(path) {
66
+ const result = await this.generate();
67
+ const image = result.images[0];
68
+ if (!image)
69
+ throw new Error('[RudderJS AI] No image generated.');
70
+ try {
71
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
72
+ const mod = await import(/* @vite-ignore */ '@rudderjs/storage');
73
+ const Storage = mod.Storage;
74
+ if (image.base64) {
75
+ const buffer = Buffer.from(image.base64, 'base64');
76
+ await Storage.put(path, buffer);
77
+ }
78
+ else if (image.url) {
79
+ const response = await fetch(image.url);
80
+ const buffer = Buffer.from(await response.arrayBuffer());
81
+ await Storage.put(path, buffer);
82
+ }
83
+ return path;
84
+ }
85
+ catch {
86
+ throw new Error('[RudderJS AI] Image storage requires @rudderjs/storage to be installed.');
87
+ }
88
+ }
89
+ }
90
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG1C;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IAOY;IAN7B,MAAM,CAAoB;IAC1B,KAAK,CAAoB;IACzB,QAAQ,CAA+B;IACvC,MAAM,CAAiC;IACvC,EAAE,CAAoB;IAE9B,YAAqC,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAExD,MAAM,CAAC,EAAE,CAAC,MAAc;QACtB,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC,IAAY;QACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,CAAC,OAA0B;QAChC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,KAA0B;QAC9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,CAAS;QACb,IAAI,CAAC,EAAE,GAAG,CAAC,CAAA;QACX,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,UAAU,EAAE,CAAA;QACvD,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QACvE,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;QAEnD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,sCAAsC,CAAC,CAAA;QAChG,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;QAE9C,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,KAAK,EAAE,QAAQ;SAChB,CAAA;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAA;QACvD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAA;QAChE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1D,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;QAE9C,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAA;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC9B,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;QAEhE,IAAI,CAAC;YACH,iEAAiE;YACjE,MAAM,GAAG,GAAQ,MAAM,MAAM,CAAC,kBAAkB,CAAC,mBAA6B,CAAC,CAAA;YAC/E,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAA;YAE3B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;gBAClD,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YACjC,CAAC;iBAAM,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;gBACrB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBACvC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;gBACxD,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YACjC,CAAC;YAED,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;QAC5F,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,30 @@
1
+ export { DocumentAttachment as Document, ImageAttachment as Image, getMessageText, attachmentsToContentParts } from './attachment.js';
2
+ export type { AgentPromptOptions, Attachment, AiMessage, ContentPart, AiConfig, AiModelConfig, AiProviderConfig, AiMiddleware, AgentResponse, AgentStep, AgentStreamResponse, AnyTool, BeforeToolCallResult, ClientTool, ConversationStore, ConversationStoreMeta, FinishReason, HasMiddleware, HasMemory, HasStructuredOutput, HasTools, MiddlewareConfigResult, MiddlewareContext, PrepareStepResult, ProviderAdapter, ProviderFactory, ProviderRequestOptions, ProviderResponse, ServerTool, StopCondition, Tool, StreamChunk, TokenUsage, ToolCall, ToolCallContext, ToolChoice, ToolDefinitionOptions, ToolDefinitionSchema, ToolExecuteFn, ToolNeedsApproval, ToolResult, EmbeddingAdapter, EmbeddingResult, ImageGenerationAdapter, ImageGenerationOptions, ImageGenerationResult, TextToSpeechAdapter, TextToSpeechOptions, TextToSpeechResult, SpeechToTextAdapter, SpeechToTextOptions, SpeechToTextResult, } from './types.js';
3
+ export { AiRegistry } from './registry.js';
4
+ export { AnthropicProvider, type AnthropicConfig } from './providers/anthropic.js';
5
+ export { OpenAIProvider, OpenAIAdapter, type OpenAIConfig } from './providers/openai.js';
6
+ export { GoogleProvider, type GoogleConfig } from './providers/google.js';
7
+ export { OllamaProvider, type OllamaConfig } from './providers/ollama.js';
8
+ export { DeepSeekProvider, type DeepSeekConfig } from './providers/deepseek.js';
9
+ export { XaiProvider, type XaiConfig } from './providers/xai.js';
10
+ export { GroqProvider, type GroqConfig } from './providers/groq.js';
11
+ export { MistralProvider, type MistralConfig } from './providers/mistral.js';
12
+ export { AzureOpenAIProvider, type AzureOpenAIConfig } from './providers/azure.js';
13
+ export { toolDefinition, dynamicTool, ToolBuilder, toolToSchema, pauseForClientTools, isPauseForClientToolsChunk, } from './tool.js';
14
+ export type { PauseForClientToolsChunk } from './tool.js';
15
+ export { zodToJsonSchema } from './zod-to-json-schema.js';
16
+ export { Agent, ConversableAgent, agent, stepCountIs, hasToolCall, setConversationStore } from './agent.js';
17
+ export { QueuedPromptBuilder } from './queue-job.js';
18
+ export { runOnConfig, runOnChunk, runOnBeforeToolCall, runOnAfterToolCall, runSequential, runOnUsage, runOnAbort, runOnError } from './middleware.js';
19
+ export { Output, type OutputWrapper } from './output.js';
20
+ export { MemoryConversationStore } from './conversation.js';
21
+ export { AI } from './facade.js';
22
+ export { ai } from './provider.js';
23
+ export { ImageGenerator } from './image.js';
24
+ export { AudioGenerator } from './audio.js';
25
+ export { Transcription } from './transcription.js';
26
+ export { WebSearch, WebFetch, CodeExecution } from './provider-tools.js';
27
+ export { toVercelDataStream, toVercelResponse } from './vercel-protocol.js';
28
+ export { CachedEmbeddingAdapter } from './cached-embedding.js';
29
+ export { AiFake } from './fake.js';
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,45 @@
1
+ // @rudderjs/ai — AI engine
2
+ // Attachments
3
+ export { DocumentAttachment as Document, ImageAttachment as Image, getMessageText, attachmentsToContentParts } from './attachment.js';
4
+ // Registry
5
+ export { AiRegistry } from './registry.js';
6
+ // Providers
7
+ export { AnthropicProvider } from './providers/anthropic.js';
8
+ export { OpenAIProvider, OpenAIAdapter } from './providers/openai.js';
9
+ export { GoogleProvider } from './providers/google.js';
10
+ export { OllamaProvider } from './providers/ollama.js';
11
+ export { DeepSeekProvider } from './providers/deepseek.js';
12
+ export { XaiProvider } from './providers/xai.js';
13
+ export { GroqProvider } from './providers/groq.js';
14
+ export { MistralProvider } from './providers/mistral.js';
15
+ export { AzureOpenAIProvider } from './providers/azure.js';
16
+ // Tools
17
+ export { toolDefinition, dynamicTool, ToolBuilder, toolToSchema, pauseForClientTools, isPauseForClientToolsChunk, } from './tool.js';
18
+ export { zodToJsonSchema } from './zod-to-json-schema.js';
19
+ // Agent
20
+ export { Agent, ConversableAgent, agent, stepCountIs, hasToolCall, setConversationStore } from './agent.js';
21
+ export { QueuedPromptBuilder } from './queue-job.js';
22
+ // Middleware
23
+ export { runOnConfig, runOnChunk, runOnBeforeToolCall, runOnAfterToolCall, runSequential, runOnUsage, runOnAbort, runOnError } from './middleware.js';
24
+ // Structured Output
25
+ export { Output } from './output.js';
26
+ // Conversation
27
+ export { MemoryConversationStore } from './conversation.js';
28
+ // Facade
29
+ export { AI } from './facade.js';
30
+ // ServiceProvider factory
31
+ export { ai } from './provider.js';
32
+ // Image Generation
33
+ export { ImageGenerator } from './image.js';
34
+ // Audio (TTS & STT)
35
+ export { AudioGenerator } from './audio.js';
36
+ export { Transcription } from './transcription.js';
37
+ // Provider Tools
38
+ export { WebSearch, WebFetch, CodeExecution } from './provider-tools.js';
39
+ // Vercel AI Protocol
40
+ export { toVercelDataStream, toVercelResponse } from './vercel-protocol.js';
41
+ // Cached Embeddings
42
+ export { CachedEmbeddingAdapter } from './cached-embedding.js';
43
+ // Testing
44
+ export { AiFake } from './fake.js';
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,cAAc;AACd,OAAO,EAAE,kBAAkB,IAAI,QAAQ,EAAE,eAAe,IAAI,KAAK,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AA0DrI,WAAW;AACX,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,YAAY;AACZ,OAAO,EAAE,iBAAiB,EAAwB,MAAM,0BAA0B,CAAA;AAClF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAqB,MAAM,uBAAuB,CAAA;AACxF,OAAO,EAAE,cAAc,EAAqB,MAAM,uBAAuB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAqB,MAAM,uBAAuB,CAAA;AACzE,OAAO,EAAE,gBAAgB,EAAuB,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EAAE,WAAW,EAAkB,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,YAAY,EAAmB,MAAM,qBAAqB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAsB,MAAM,wBAAwB,CAAA;AAC5E,OAAO,EAAE,mBAAmB,EAA0B,MAAM,sBAAsB,CAAA;AAElF,QAAQ;AACR,OAAO,EACL,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,WAAW,CAAA;AAElB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAEzD,QAAQ;AACR,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAC3G,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpD,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAErJ,oBAAoB;AACpB,OAAO,EAAE,MAAM,EAAsB,MAAM,aAAa,CAAA;AAExD,eAAe;AACf,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAE3D,SAAS;AACT,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAEhC,0BAA0B;AAC1B,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAA;AAElC,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE3C,oBAAoB;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,iBAAiB;AACjB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExE,qBAAqB;AACrB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE3E,oBAAoB;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,UAAU;AACV,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,18 @@
1
+ import type { AiMiddleware, BeforeToolCallResult, MiddlewareConfigResult, MiddlewareContext, StreamChunk, TokenUsage } from './types.js';
2
+ /** Run onConfig hooks — piped (each transforms config, next sees result) */
3
+ export declare function runOnConfig(middlewares: AiMiddleware[], ctx: MiddlewareContext, config: MiddlewareConfigResult, phase: 'init' | 'beforeModel'): MiddlewareConfigResult;
4
+ /** Run onChunk hooks — piped (each can transform or drop by returning null) */
5
+ export declare function runOnChunk(middlewares: AiMiddleware[], ctx: MiddlewareContext, chunk: StreamChunk): StreamChunk | null;
6
+ /** Run onBeforeToolCall hooks — first non-void result wins */
7
+ export declare function runOnBeforeToolCall(middlewares: AiMiddleware[], ctx: MiddlewareContext, toolName: string, args: Record<string, unknown>): Promise<BeforeToolCallResult>;
8
+ /** Run a sequential hook (onStart, onIteration, onAfterToolCall, etc.) */
9
+ export declare function runSequential(middlewares: AiMiddleware[], hook: 'onStart' | 'onIteration' | 'onToolPhaseComplete' | 'onFinish', ctx: MiddlewareContext): Promise<void>;
10
+ /** Run onAfterToolCall hooks sequentially */
11
+ export declare function runOnAfterToolCall(middlewares: AiMiddleware[], ctx: MiddlewareContext, toolName: string, args: Record<string, unknown>, result: unknown): Promise<void>;
12
+ /** Run onUsage hooks sequentially */
13
+ export declare function runOnUsage(middlewares: AiMiddleware[], ctx: MiddlewareContext, usage: TokenUsage): Promise<void>;
14
+ /** Run onAbort hooks sequentially */
15
+ export declare function runOnAbort(middlewares: AiMiddleware[], ctx: MiddlewareContext, reason: string): Promise<void>;
16
+ /** Run onError hooks sequentially */
17
+ export declare function runOnError(middlewares: AiMiddleware[], ctx: MiddlewareContext, error: unknown): Promise<void>;
18
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,WAAW,EACX,UAAU,EACX,MAAM,YAAY,CAAA;AAEnB,4EAA4E;AAC5E,wBAAgB,WAAW,CACzB,WAAW,EAAE,YAAY,EAAE,EAC3B,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,MAAM,GAAG,aAAa,GAC5B,sBAAsB,CASxB;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CACxB,WAAW,EAAE,YAAY,EAAE,EAC3B,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,WAAW,GACjB,WAAW,GAAG,IAAI,CASpB;AAED,8DAA8D;AAC9D,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,YAAY,EAAE,EAC3B,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CAQ/B;AAED,0EAA0E;AAC1E,wBAAsB,aAAa,CACjC,WAAW,EAAE,YAAY,EAAE,EAC3B,IAAI,EAAE,SAAS,GAAG,aAAa,GAAG,qBAAqB,GAAG,UAAU,EACpE,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,6CAA6C;AAC7C,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,YAAY,EAAE,EAC3B,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,qCAAqC;AACrC,wBAAsB,UAAU,CAC9B,WAAW,EAAE,YAAY,EAAE,EAC3B,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,qCAAqC;AACrC,wBAAsB,UAAU,CAC9B,WAAW,EAAE,YAAY,EAAE,EAC3B,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,qCAAqC;AACrC,wBAAsB,UAAU,CAC9B,WAAW,EAAE,YAAY,EAAE,EAC3B,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,IAAI,CAAC,CAIf"}