ai-functions 0.2.19 → 0.4.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 (227) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/.turbo/turbo-test.log +105 -0
  3. package/README.md +232 -37
  4. package/TODO.md +138 -0
  5. package/dist/ai-promise.d.ts +219 -0
  6. package/dist/ai-promise.d.ts.map +1 -0
  7. package/dist/ai-promise.js +610 -0
  8. package/dist/ai-promise.js.map +1 -0
  9. package/dist/ai.d.ts +285 -0
  10. package/dist/ai.d.ts.map +1 -0
  11. package/dist/ai.js +842 -0
  12. package/dist/ai.js.map +1 -0
  13. package/dist/batch/anthropic.d.ts +23 -0
  14. package/dist/batch/anthropic.d.ts.map +1 -0
  15. package/dist/batch/anthropic.js +257 -0
  16. package/dist/batch/anthropic.js.map +1 -0
  17. package/dist/batch/bedrock.d.ts +64 -0
  18. package/dist/batch/bedrock.d.ts.map +1 -0
  19. package/dist/batch/bedrock.js +586 -0
  20. package/dist/batch/bedrock.js.map +1 -0
  21. package/dist/batch/cloudflare.d.ts +37 -0
  22. package/dist/batch/cloudflare.d.ts.map +1 -0
  23. package/dist/batch/cloudflare.js +289 -0
  24. package/dist/batch/cloudflare.js.map +1 -0
  25. package/dist/batch/google.d.ts +41 -0
  26. package/dist/batch/google.d.ts.map +1 -0
  27. package/dist/batch/google.js +360 -0
  28. package/dist/batch/google.js.map +1 -0
  29. package/dist/batch/index.d.ts +31 -0
  30. package/dist/batch/index.d.ts.map +1 -0
  31. package/dist/batch/index.js +31 -0
  32. package/dist/batch/index.js.map +1 -0
  33. package/dist/batch/memory.d.ts +44 -0
  34. package/dist/batch/memory.d.ts.map +1 -0
  35. package/dist/batch/memory.js +188 -0
  36. package/dist/batch/memory.js.map +1 -0
  37. package/dist/batch/openai.d.ts +37 -0
  38. package/dist/batch/openai.d.ts.map +1 -0
  39. package/dist/batch/openai.js +403 -0
  40. package/dist/batch/openai.js.map +1 -0
  41. package/dist/batch-map.d.ts +125 -0
  42. package/dist/batch-map.d.ts.map +1 -0
  43. package/dist/batch-map.js +406 -0
  44. package/dist/batch-map.js.map +1 -0
  45. package/dist/batch-queue.d.ts +273 -0
  46. package/dist/batch-queue.d.ts.map +1 -0
  47. package/dist/batch-queue.js +271 -0
  48. package/dist/batch-queue.js.map +1 -0
  49. package/dist/context.d.ts +133 -0
  50. package/dist/context.d.ts.map +1 -0
  51. package/dist/context.js +267 -0
  52. package/dist/context.js.map +1 -0
  53. package/dist/embeddings.d.ts +123 -0
  54. package/dist/embeddings.d.ts.map +1 -0
  55. package/dist/embeddings.js +170 -0
  56. package/dist/embeddings.js.map +1 -0
  57. package/dist/eval/index.d.ts +8 -0
  58. package/dist/eval/index.d.ts.map +1 -0
  59. package/dist/eval/index.js +8 -0
  60. package/dist/eval/index.js.map +1 -0
  61. package/dist/eval/models.d.ts +66 -0
  62. package/dist/eval/models.d.ts.map +1 -0
  63. package/dist/eval/models.js +120 -0
  64. package/dist/eval/models.js.map +1 -0
  65. package/dist/eval/runner.d.ts +64 -0
  66. package/dist/eval/runner.d.ts.map +1 -0
  67. package/dist/eval/runner.js +148 -0
  68. package/dist/eval/runner.js.map +1 -0
  69. package/dist/generate.d.ts +168 -0
  70. package/dist/generate.d.ts.map +1 -0
  71. package/dist/generate.js +174 -0
  72. package/dist/generate.js.map +1 -0
  73. package/dist/index.d.ts +30 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +54 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/primitives.d.ts +292 -0
  78. package/dist/primitives.d.ts.map +1 -0
  79. package/dist/primitives.js +471 -0
  80. package/dist/primitives.js.map +1 -0
  81. package/dist/providers/cloudflare.d.ts +9 -0
  82. package/dist/providers/cloudflare.d.ts.map +1 -0
  83. package/dist/providers/cloudflare.js +9 -0
  84. package/dist/providers/cloudflare.js.map +1 -0
  85. package/dist/providers/index.d.ts +9 -0
  86. package/dist/providers/index.d.ts.map +1 -0
  87. package/dist/providers/index.js +9 -0
  88. package/dist/providers/index.js.map +1 -0
  89. package/dist/schema.d.ts +54 -0
  90. package/dist/schema.d.ts.map +1 -0
  91. package/dist/schema.js +109 -0
  92. package/dist/schema.js.map +1 -0
  93. package/dist/template.d.ts +73 -0
  94. package/dist/template.d.ts.map +1 -0
  95. package/dist/template.js +129 -0
  96. package/dist/template.js.map +1 -0
  97. package/dist/types.d.ts +481 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +5 -0
  100. package/dist/types.js.map +1 -0
  101. package/evalite.config.ts +19 -0
  102. package/evals/README.md +212 -0
  103. package/evals/classification.eval.ts +108 -0
  104. package/evals/marketing.eval.ts +370 -0
  105. package/evals/math.eval.ts +94 -0
  106. package/evals/run-evals.ts +166 -0
  107. package/evals/structured-output.eval.ts +143 -0
  108. package/evals/writing.eval.ts +117 -0
  109. package/examples/batch-blog-posts.ts +160 -0
  110. package/package.json +59 -43
  111. package/src/ai-promise.ts +784 -0
  112. package/src/ai.ts +1183 -0
  113. package/src/batch/anthropic.ts +375 -0
  114. package/src/batch/bedrock.ts +801 -0
  115. package/src/batch/cloudflare.ts +421 -0
  116. package/src/batch/google.ts +491 -0
  117. package/src/batch/index.ts +31 -0
  118. package/src/batch/memory.ts +253 -0
  119. package/src/batch/openai.ts +557 -0
  120. package/src/batch-map.ts +534 -0
  121. package/src/batch-queue.ts +493 -0
  122. package/src/context.ts +332 -0
  123. package/src/embeddings.ts +244 -0
  124. package/src/eval/index.ts +8 -0
  125. package/src/eval/models.ts +158 -0
  126. package/src/eval/runner.ts +217 -0
  127. package/src/generate.ts +245 -0
  128. package/src/index.ts +154 -0
  129. package/src/primitives.ts +612 -0
  130. package/src/providers/cloudflare.ts +15 -0
  131. package/src/providers/index.ts +14 -0
  132. package/src/schema.ts +147 -0
  133. package/src/template.ts +209 -0
  134. package/src/types.ts +540 -0
  135. package/test/README.md +105 -0
  136. package/test/ai-proxy.test.ts +192 -0
  137. package/test/async-iterators.test.ts +327 -0
  138. package/test/batch-background.test.ts +482 -0
  139. package/test/batch-blog-posts.test.ts +387 -0
  140. package/test/blog-generation.test.ts +510 -0
  141. package/test/browse-read.test.ts +611 -0
  142. package/test/core-functions.test.ts +694 -0
  143. package/test/decide.test.ts +393 -0
  144. package/test/define.test.ts +274 -0
  145. package/test/e2e-bedrock-manual.ts +163 -0
  146. package/test/e2e-bedrock.test.ts +191 -0
  147. package/test/e2e-flex-gateway.ts +157 -0
  148. package/test/e2e-flex-manual.ts +183 -0
  149. package/test/e2e-flex.test.ts +209 -0
  150. package/test/e2e-google-manual.ts +178 -0
  151. package/test/e2e-google.test.ts +216 -0
  152. package/test/embeddings.test.ts +284 -0
  153. package/test/evals/define-function.eval.test.ts +379 -0
  154. package/test/evals/primitives.eval.test.ts +384 -0
  155. package/test/function-types.test.ts +492 -0
  156. package/test/generate-core.test.ts +319 -0
  157. package/test/generate.test.ts +163 -0
  158. package/test/implicit-batch.test.ts +422 -0
  159. package/test/schema.test.ts +109 -0
  160. package/test/tagged-templates.test.ts +302 -0
  161. package/tsconfig.json +8 -6
  162. package/vitest.config.ts +42 -0
  163. package/LICENSE +0 -21
  164. package/db/cache.ts +0 -6
  165. package/db/mongo.ts +0 -75
  166. package/dist/mjs/db/cache.d.ts +0 -1
  167. package/dist/mjs/db/cache.js +0 -5
  168. package/dist/mjs/db/mongo.d.ts +0 -31
  169. package/dist/mjs/db/mongo.js +0 -48
  170. package/dist/mjs/examples/data.d.ts +0 -1105
  171. package/dist/mjs/examples/data.js +0 -1105
  172. package/dist/mjs/functions/ai.d.ts +0 -20
  173. package/dist/mjs/functions/ai.js +0 -83
  174. package/dist/mjs/functions/ai.test.d.ts +0 -1
  175. package/dist/mjs/functions/ai.test.js +0 -29
  176. package/dist/mjs/functions/gpt.d.ts +0 -4
  177. package/dist/mjs/functions/gpt.js +0 -10
  178. package/dist/mjs/functions/list.d.ts +0 -7
  179. package/dist/mjs/functions/list.js +0 -72
  180. package/dist/mjs/index.d.ts +0 -3
  181. package/dist/mjs/index.js +0 -3
  182. package/dist/mjs/queue/kafka.d.ts +0 -0
  183. package/dist/mjs/queue/kafka.js +0 -1
  184. package/dist/mjs/queue/memory.d.ts +0 -0
  185. package/dist/mjs/queue/memory.js +0 -1
  186. package/dist/mjs/queue/mongo.d.ts +0 -30
  187. package/dist/mjs/queue/mongo.js +0 -42
  188. package/dist/mjs/streams/kafka.d.ts +0 -0
  189. package/dist/mjs/streams/kafka.js +0 -1
  190. package/dist/mjs/streams/memory.d.ts +0 -0
  191. package/dist/mjs/streams/memory.js +0 -1
  192. package/dist/mjs/streams/mongo.d.ts +0 -0
  193. package/dist/mjs/streams/mongo.js +0 -1
  194. package/dist/mjs/streams/types.d.ts +0 -0
  195. package/dist/mjs/streams/types.js +0 -1
  196. package/dist/mjs/types.d.ts +0 -11
  197. package/dist/mjs/types.js +0 -1
  198. package/dist/mjs/utils/completion.d.ts +0 -9
  199. package/dist/mjs/utils/completion.js +0 -20
  200. package/dist/mjs/utils/schema.d.ts +0 -10
  201. package/dist/mjs/utils/schema.js +0 -72
  202. package/dist/mjs/utils/schema.test.d.ts +0 -1
  203. package/dist/mjs/utils/schema.test.js +0 -60
  204. package/dist/mjs/utils/state.d.ts +0 -1
  205. package/dist/mjs/utils/state.js +0 -19
  206. package/examples/data.ts +0 -1105
  207. package/fixup +0 -11
  208. package/functions/ai.test.ts +0 -41
  209. package/functions/ai.ts +0 -115
  210. package/functions/gpt.ts +0 -12
  211. package/functions/list.ts +0 -84
  212. package/index.ts +0 -3
  213. package/queue/kafka.ts +0 -0
  214. package/queue/memory.ts +0 -0
  215. package/queue/mongo.ts +0 -88
  216. package/streams/kafka.ts +0 -0
  217. package/streams/memory.ts +0 -0
  218. package/streams/mongo.ts +0 -0
  219. package/streams/types.ts +0 -0
  220. package/tsconfig-backup.json +0 -105
  221. package/tsconfig-base.json +0 -26
  222. package/tsconfig-cjs.json +0 -8
  223. package/types.ts +0 -12
  224. package/utils/completion.ts +0 -28
  225. package/utils/schema.test.ts +0 -69
  226. package/utils/schema.ts +0 -74
  227. package/utils/state.ts +0 -23
@@ -0,0 +1,610 @@
1
+ /**
2
+ * AIPromise - RPC-style promise pipelining for AI functions
3
+ *
4
+ * Inspired by capnweb's RpcPromise, this enables:
5
+ * - Property access tracking for dynamic schema inference
6
+ * - Promise pipelining without await
7
+ * - Magical .map() for batch processing
8
+ * - Dependency graph resolution
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * // Dynamic schema from destructuring
13
+ * const { summary, keyPoints, conclusion } = ai`write about ${topic}`
14
+ *
15
+ * // Pipeline without await
16
+ * const isValid = is`${conclusion} is solid given ${keyPoints}`
17
+ *
18
+ * // Batch process with map
19
+ * const ideas = list`startup ideas`
20
+ * const evaluated = await ideas.map(idea => ({
21
+ * idea,
22
+ * viable: is`${idea} is viable`,
23
+ * market: ai`market size for ${idea}`,
24
+ * }))
25
+ *
26
+ * // Only await at the end
27
+ * if (await isValid) { ... }
28
+ * ```
29
+ *
30
+ * @packageDocumentation
31
+ */
32
+ import { generateObject } from './generate.js';
33
+ import { isInRecordingMode, getCurrentItemPlaceholder, captureOperation, createBatchMap, BatchMapPromise, } from './batch-map.js';
34
+ import { getModel } from './context.js';
35
+ // ============================================================================
36
+ // Types
37
+ // ============================================================================
38
+ /** Symbol to identify AIPromise instances */
39
+ export const AI_PROMISE_SYMBOL = Symbol.for('ai-promise');
40
+ /** Symbol to get the raw AIPromise from a proxy */
41
+ export const RAW_PROMISE_SYMBOL = Symbol.for('ai-promise-raw');
42
+ /** Recording mode for map() */
43
+ export const RECORDING_MODE = Symbol.for('ai-promise-recording');
44
+ // ============================================================================
45
+ // Global State
46
+ // ============================================================================
47
+ /** Current recording context for map() */
48
+ let currentRecording = null;
49
+ /** Pending promises for batch resolution */
50
+ const pendingPromises = new Set();
51
+ /** Promise resolution queue */
52
+ let resolutionScheduled = false;
53
+ // ============================================================================
54
+ // AIPromise Implementation
55
+ // ============================================================================
56
+ /**
57
+ * AIPromise - Like capnweb's RpcPromise but for AI functions
58
+ *
59
+ * Acts as both a Promise AND a stub that:
60
+ * - Tracks property accesses for dynamic schema inference
61
+ * - Records dependencies for promise pipelining
62
+ * - Supports .map() for batch processing
63
+ */
64
+ export class AIPromise {
65
+ /** Marker to identify AIPromise instances */
66
+ [AI_PROMISE_SYMBOL] = true;
67
+ /** The prompt that will generate this value */
68
+ _prompt;
69
+ /** Options for generation */
70
+ _options;
71
+ /** Properties accessed on this promise (for schema inference) */
72
+ _accessedProps = new Set();
73
+ /** Property path from parent (for nested access) */
74
+ _propertyPath;
75
+ /** Parent promise (if this is a property access) */
76
+ _parent;
77
+ /** Dependencies (other AIPromises used in our prompt) */
78
+ _dependencies = [];
79
+ /** Cached resolver promise */
80
+ _resolver = null;
81
+ /** Resolved value (cached after first resolution) */
82
+ _resolvedValue;
83
+ /** Whether this promise has been resolved */
84
+ _isResolved = false;
85
+ /** Whether we're in recording mode */
86
+ _isRecording = false;
87
+ constructor(prompt, options = {}) {
88
+ this._prompt = prompt;
89
+ this._options = options;
90
+ this._propertyPath = options.propertyPath || [];
91
+ this._parent = options.parent || null;
92
+ // Track this promise for batch resolution
93
+ pendingPromises.add(this);
94
+ // Return a proxy that intercepts property access
95
+ return new Proxy(this, PROXY_HANDLERS);
96
+ }
97
+ /** Get the prompt */
98
+ get prompt() {
99
+ return this._prompt;
100
+ }
101
+ /** Get the property path */
102
+ get path() {
103
+ return this._propertyPath;
104
+ }
105
+ /** Check if resolved */
106
+ get isResolved() {
107
+ return this._isResolved;
108
+ }
109
+ /** Get accessed properties */
110
+ get accessedProps() {
111
+ return this._accessedProps;
112
+ }
113
+ /**
114
+ * Add a dependency (another AIPromise used in this one's prompt)
115
+ */
116
+ addDependency(promise, path = []) {
117
+ this._dependencies.push({ promise, path });
118
+ }
119
+ /**
120
+ * Resolve this promise
121
+ */
122
+ async resolve() {
123
+ if (this._isResolved) {
124
+ return this._resolvedValue;
125
+ }
126
+ // If this is a property access on a parent, resolve the parent first
127
+ if (this._parent) {
128
+ const parentValue = await this._parent.resolve();
129
+ const value = getNestedValue(parentValue, this._propertyPath);
130
+ this._resolvedValue = value;
131
+ this._isResolved = true;
132
+ return this._resolvedValue;
133
+ }
134
+ // Resolve dependencies first
135
+ const resolvedDeps = {};
136
+ for (const dep of this._dependencies) {
137
+ const value = await dep.promise.resolve();
138
+ const key = dep.path.length > 0 ? dep.path.join('.') : `dep_${this._dependencies.indexOf(dep)}`;
139
+ resolvedDeps[key] = value;
140
+ }
141
+ // Substitute resolved dependencies into prompt
142
+ let finalPrompt = this._prompt;
143
+ for (const [key, value] of Object.entries(resolvedDeps)) {
144
+ finalPrompt = finalPrompt.replace(new RegExp(`\\$\\{${key}\\}`, 'g'), String(value));
145
+ }
146
+ // Build schema from accessed properties
147
+ const schema = this._buildSchema();
148
+ // Generate the result
149
+ const result = await generateObject({
150
+ model: this._options.model || 'sonnet',
151
+ schema,
152
+ prompt: finalPrompt,
153
+ system: this._options.system,
154
+ temperature: this._options.temperature,
155
+ maxTokens: this._options.maxTokens,
156
+ });
157
+ this._resolvedValue = result.object;
158
+ this._isResolved = true;
159
+ pendingPromises.delete(this);
160
+ return this._resolvedValue;
161
+ }
162
+ /**
163
+ * Build schema from accessed properties and base schema
164
+ */
165
+ _buildSchema() {
166
+ const baseSchema = this._options.baseSchema || {};
167
+ // If no properties accessed, use base schema or infer from type
168
+ if (this._accessedProps.size === 0) {
169
+ if (typeof baseSchema === 'object' && Object.keys(baseSchema).length > 0) {
170
+ return baseSchema;
171
+ }
172
+ // Infer from type
173
+ switch (this._options.type) {
174
+ case 'list':
175
+ return { items: ['List items'] };
176
+ case 'lists':
177
+ return { categories: ['Category names'], data: 'JSON object with categorized lists' };
178
+ case 'boolean':
179
+ return { answer: 'true | false' };
180
+ case 'text':
181
+ return { text: 'The generated text' };
182
+ default:
183
+ return { result: 'The result' };
184
+ }
185
+ }
186
+ // Build schema from accessed properties
187
+ const schema = {};
188
+ for (const prop of this._accessedProps) {
189
+ // Check if base schema has this property
190
+ if (typeof baseSchema === 'object' && !Array.isArray(baseSchema) && prop in baseSchema) {
191
+ const propSchema = baseSchema[prop];
192
+ if (propSchema !== undefined) {
193
+ schema[prop] = propSchema;
194
+ continue;
195
+ }
196
+ }
197
+ // Infer type from property name patterns
198
+ const lowerProp = prop.toLowerCase();
199
+ if (lowerProp.endsWith('s') ||
200
+ lowerProp.includes('list') ||
201
+ lowerProp.includes('items') ||
202
+ lowerProp.includes('array')) {
203
+ schema[prop] = [`List of ${prop}`];
204
+ }
205
+ else if (lowerProp.includes('is') ||
206
+ lowerProp.includes('has') ||
207
+ lowerProp.includes('can') ||
208
+ lowerProp.includes('should')) {
209
+ schema[prop] = `Whether ${prop} (true/false)`;
210
+ }
211
+ else if (lowerProp.includes('count') ||
212
+ lowerProp.includes('number') ||
213
+ lowerProp.includes('total') ||
214
+ lowerProp.includes('amount')) {
215
+ schema[prop] = `The ${prop} (number)`;
216
+ }
217
+ else {
218
+ schema[prop] = `The ${prop}`;
219
+ }
220
+ }
221
+ return schema;
222
+ }
223
+ /**
224
+ * Map over array results - automatically batches operations!
225
+ *
226
+ * When you map over a list, the operations are captured and
227
+ * automatically batched when resolved. Uses provider batch APIs
228
+ * for cost savings (50% discount) when beneficial.
229
+ *
230
+ * @example
231
+ * ```ts
232
+ * // Simple map - each title becomes a blog post
233
+ * const titles = await list`10 blog post titles`
234
+ * const posts = titles.map(title => write`blog post: # ${title}`)
235
+ * console.log(await posts) // 10 blog posts via batch API
236
+ *
237
+ * // Complex map - multiple operations per item
238
+ * const ideas = await list`startup ideas`
239
+ * const evaluated = await ideas.map(idea => ({
240
+ * idea,
241
+ * viable: is`${idea} is viable`,
242
+ * market: ai`market size for ${idea}`,
243
+ * }))
244
+ * ```
245
+ */
246
+ map(callback) {
247
+ // Create a wrapper that resolves this promise first, then maps
248
+ const mapPromise = new BatchMapPromise([], [], {});
249
+ // Override the resolve to first get the list items
250
+ const originalResolve = mapPromise.resolve.bind(mapPromise);
251
+ mapPromise.resolve = async () => {
252
+ // First, resolve the list
253
+ const items = await this.resolve();
254
+ if (!Array.isArray(items)) {
255
+ throw new Error('Cannot map over non-array result');
256
+ }
257
+ // Now create the actual batch map with the resolved items
258
+ const actualBatchMap = createBatchMap(items, callback);
259
+ return actualBatchMap.resolve();
260
+ };
261
+ return mapPromise;
262
+ }
263
+ /**
264
+ * Map with explicit batch options
265
+ *
266
+ * @example
267
+ * ```ts
268
+ * // Force immediate execution (no batch API)
269
+ * const posts = titles.mapImmediate(title => write`blog post: ${title}`)
270
+ *
271
+ * // Force batch API (even for small lists)
272
+ * const posts = titles.mapDeferred(title => write`blog post: ${title}`)
273
+ * ```
274
+ */
275
+ mapImmediate(callback) {
276
+ const mapPromise = new BatchMapPromise([], [], { immediate: true });
277
+ mapPromise.resolve = async () => {
278
+ const items = await this.resolve();
279
+ if (!Array.isArray(items)) {
280
+ throw new Error('Cannot map over non-array result');
281
+ }
282
+ const actualBatchMap = createBatchMap(items, callback, { immediate: true });
283
+ return actualBatchMap.resolve();
284
+ };
285
+ return mapPromise;
286
+ }
287
+ mapDeferred(callback) {
288
+ const mapPromise = new BatchMapPromise([], [], { deferred: true });
289
+ mapPromise.resolve = async () => {
290
+ const items = await this.resolve();
291
+ if (!Array.isArray(items)) {
292
+ throw new Error('Cannot map over non-array result');
293
+ }
294
+ const actualBatchMap = createBatchMap(items, callback, { deferred: true });
295
+ return actualBatchMap.resolve();
296
+ };
297
+ return mapPromise;
298
+ }
299
+ /**
300
+ * ForEach with automatic batching
301
+ *
302
+ * @example
303
+ * ```ts
304
+ * await list`startup ideas`.forEach(async idea => {
305
+ * console.log(await is`${idea} is viable`)
306
+ * })
307
+ * ```
308
+ */
309
+ async forEach(callback) {
310
+ const items = await this.resolve();
311
+ if (Array.isArray(items)) {
312
+ for (let i = 0; i < items.length; i++) {
313
+ await callback(items[i], i);
314
+ }
315
+ }
316
+ else {
317
+ await callback(items, 0);
318
+ }
319
+ }
320
+ /**
321
+ * Async iterator support with smart batching
322
+ */
323
+ async *[Symbol.asyncIterator]() {
324
+ const items = await this.resolve();
325
+ if (Array.isArray(items)) {
326
+ for (const item of items) {
327
+ yield item;
328
+ }
329
+ }
330
+ else {
331
+ yield items;
332
+ }
333
+ }
334
+ /**
335
+ * Promise interface - then()
336
+ */
337
+ then(onfulfilled, onrejected) {
338
+ if (!this._resolver) {
339
+ // Schedule batch resolution on next microtask
340
+ this._resolver = new Promise((resolve, reject) => {
341
+ queueMicrotask(async () => {
342
+ try {
343
+ const value = await this.resolve();
344
+ resolve(value);
345
+ }
346
+ catch (error) {
347
+ reject(error);
348
+ }
349
+ });
350
+ });
351
+ }
352
+ return this._resolver.then(onfulfilled, onrejected);
353
+ }
354
+ /**
355
+ * Promise interface - catch()
356
+ */
357
+ catch(onrejected) {
358
+ return this.then(null, onrejected);
359
+ }
360
+ /**
361
+ * Promise interface - finally()
362
+ */
363
+ finally(onfinally) {
364
+ return this.then((value) => {
365
+ onfinally?.();
366
+ return value;
367
+ }, (reason) => {
368
+ onfinally?.();
369
+ throw reason;
370
+ });
371
+ }
372
+ }
373
+ // ============================================================================
374
+ // Proxy Handlers
375
+ // ============================================================================
376
+ const PROXY_HANDLERS = {
377
+ get(target, prop, receiver) {
378
+ // Handle symbols
379
+ if (typeof prop === 'symbol') {
380
+ if (prop === AI_PROMISE_SYMBOL)
381
+ return true;
382
+ if (prop === RAW_PROMISE_SYMBOL)
383
+ return target;
384
+ if (prop === Symbol.asyncIterator)
385
+ return target[Symbol.asyncIterator].bind(target);
386
+ return target[prop];
387
+ }
388
+ // Handle promise methods
389
+ if (prop === 'then' || prop === 'catch' || prop === 'finally') {
390
+ return target[prop].bind(target);
391
+ }
392
+ // Handle AIPromise methods
393
+ if (prop === 'map' || prop === 'forEach' || prop === 'resolve') {
394
+ return target[prop].bind(target);
395
+ }
396
+ // Handle internal properties
397
+ if (prop.startsWith('_') || prop === 'prompt' || prop === 'path' || prop === 'isResolved' || prop === 'accessedProps') {
398
+ return target[prop];
399
+ }
400
+ // Track property access for schema inference
401
+ target.accessedProps.add(prop);
402
+ // If we're in recording mode, record this access
403
+ if (currentRecording) {
404
+ // Just track the access, don't create new promise
405
+ }
406
+ // Return a new AIPromise for the property path
407
+ return new AIPromise(target.prompt, {
408
+ ...target['_options'],
409
+ parent: target,
410
+ propertyPath: [...target.path, prop],
411
+ });
412
+ },
413
+ // Prevent mutation
414
+ set() {
415
+ throw new Error('AIPromise properties are read-only');
416
+ },
417
+ deleteProperty() {
418
+ throw new Error('AIPromise properties cannot be deleted');
419
+ },
420
+ // Handle function calls (for chained methods)
421
+ apply(target, thisArg, args) {
422
+ // If the target is callable (e.g., from a template function), call it
423
+ if (typeof target._call === 'function') {
424
+ return target._call(...args);
425
+ }
426
+ throw new Error('AIPromise is not callable');
427
+ },
428
+ };
429
+ // ============================================================================
430
+ // Helper Functions
431
+ // ============================================================================
432
+ /**
433
+ * Get a nested value from an object by path
434
+ */
435
+ function getNestedValue(obj, path) {
436
+ let current = obj;
437
+ for (const key of path) {
438
+ if (current === null || current === undefined)
439
+ return undefined;
440
+ if (key === '__item__')
441
+ continue; // Skip internal markers
442
+ current = current[key];
443
+ }
444
+ return current;
445
+ }
446
+ /**
447
+ * Analyze the result of a map callback to build batch schema
448
+ */
449
+ function analyzeRecordingResult(result, recording) {
450
+ if (result === null || result === undefined) {
451
+ return { result: 'The result' };
452
+ }
453
+ if (typeof result !== 'object') {
454
+ return { result: 'The result' };
455
+ }
456
+ // Build schema from the result structure
457
+ const schema = {};
458
+ for (const [key, value] of Object.entries(result)) {
459
+ if (isAIPromise(value)) {
460
+ // This is a reference to an AI operation
461
+ const aiPromise = getRawPromise(value);
462
+ // Infer schema from the promise's accessed properties or type
463
+ if (aiPromise.accessedProps.size > 0) {
464
+ schema[key] = Object.fromEntries(Array.from(aiPromise.accessedProps).map(p => [p, `The ${p}`]));
465
+ }
466
+ else {
467
+ const type = aiPromise._options?.type;
468
+ if (type === 'boolean') {
469
+ schema[key] = 'true | false';
470
+ }
471
+ else if (type === 'list') {
472
+ schema[key] = ['List items'];
473
+ }
474
+ else {
475
+ schema[key] = `The ${key}`;
476
+ }
477
+ }
478
+ }
479
+ else if (typeof value === 'object' && value !== null) {
480
+ // Recursively analyze nested objects
481
+ schema[key] = analyzeRecordingResult(value, recording);
482
+ }
483
+ else {
484
+ // Literal value - include as-is
485
+ schema[key] = `Value: ${JSON.stringify(value)}`;
486
+ }
487
+ }
488
+ return schema;
489
+ }
490
+ /**
491
+ * Check if a value is an AIPromise
492
+ */
493
+ export function isAIPromise(value) {
494
+ return (value !== null &&
495
+ typeof value === 'object' &&
496
+ AI_PROMISE_SYMBOL in value &&
497
+ value[AI_PROMISE_SYMBOL] === true);
498
+ }
499
+ /**
500
+ * Get the raw AIPromise from a proxied value
501
+ */
502
+ export function getRawPromise(value) {
503
+ if (RAW_PROMISE_SYMBOL in value) {
504
+ return value[RAW_PROMISE_SYMBOL];
505
+ }
506
+ return value;
507
+ }
508
+ // ============================================================================
509
+ // Factory Functions
510
+ // ============================================================================
511
+ /**
512
+ * Create an AIPromise for text generation
513
+ */
514
+ export function createTextPromise(prompt, options) {
515
+ return new AIPromise(prompt, { ...options, type: 'text' });
516
+ }
517
+ /**
518
+ * Create an AIPromise for object generation with dynamic schema
519
+ */
520
+ export function createObjectPromise(prompt, options) {
521
+ return new AIPromise(prompt, { ...options, type: 'object' });
522
+ }
523
+ /**
524
+ * Create an AIPromise for list generation
525
+ */
526
+ export function createListPromise(prompt, options) {
527
+ return new AIPromise(prompt, { ...options, type: 'list' });
528
+ }
529
+ /**
530
+ * Create an AIPromise for multiple lists generation
531
+ */
532
+ export function createListsPromise(prompt, options) {
533
+ return new AIPromise(prompt, { ...options, type: 'lists' });
534
+ }
535
+ /**
536
+ * Create an AIPromise for boolean/is check
537
+ */
538
+ export function createBooleanPromise(prompt, options) {
539
+ return new AIPromise(prompt, { ...options, type: 'boolean' });
540
+ }
541
+ /**
542
+ * Create an AIPromise for extraction
543
+ */
544
+ export function createExtractPromise(prompt, options) {
545
+ return new AIPromise(prompt, { ...options, type: 'extract' });
546
+ }
547
+ // ============================================================================
548
+ // Template Tag Helpers
549
+ // ============================================================================
550
+ /**
551
+ * Parse template literals and track AIPromise dependencies
552
+ */
553
+ export function parseTemplateWithDependencies(strings, ...values) {
554
+ const dependencies = [];
555
+ let prompt = '';
556
+ for (let i = 0; i < strings.length; i++) {
557
+ prompt += strings[i];
558
+ if (i < values.length) {
559
+ const value = values[i];
560
+ if (isAIPromise(value)) {
561
+ // Track as dependency
562
+ const rawPromise = getRawPromise(value);
563
+ const depKey = `dep_${dependencies.length}`;
564
+ dependencies.push({ promise: rawPromise, path: rawPromise.path });
565
+ prompt += `\${${depKey}}`;
566
+ }
567
+ else {
568
+ // Inline the value
569
+ prompt += String(value);
570
+ }
571
+ }
572
+ }
573
+ return { prompt, dependencies };
574
+ }
575
+ /**
576
+ * Create a template function that returns AIPromise
577
+ */
578
+ export function createAITemplateFunction(type, baseOptions) {
579
+ function templateFn(promptOrStrings, ...args) {
580
+ let prompt;
581
+ let dependencies = [];
582
+ let options = { ...baseOptions };
583
+ if (Array.isArray(promptOrStrings) && 'raw' in promptOrStrings) {
584
+ // Tagged template literal
585
+ const parsed = parseTemplateWithDependencies(promptOrStrings, ...args);
586
+ prompt = parsed.prompt;
587
+ dependencies = parsed.dependencies;
588
+ }
589
+ else {
590
+ // Regular function call
591
+ prompt = promptOrStrings;
592
+ if (args.length > 0 && typeof args[0] === 'object') {
593
+ options = { ...options, ...args[0] };
594
+ }
595
+ }
596
+ // If we're in recording mode (inside a .map() callback), capture this operation
597
+ if (isInRecordingMode()) {
598
+ const batchType = type === 'text' ? 'text' : type === 'boolean' ? 'boolean' : type === 'list' ? 'list' : 'object';
599
+ captureOperation(prompt, batchType, options.baseSchema, options.system);
600
+ }
601
+ const promise = new AIPromise(prompt, { ...options, type });
602
+ // Add dependencies
603
+ for (const dep of dependencies) {
604
+ promise.addDependency(dep.promise, dep.path);
605
+ }
606
+ return promise;
607
+ }
608
+ return templateFn;
609
+ }
610
+ //# sourceMappingURL=ai-promise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-promise.js","sourceRoot":"","sources":["../src/ai-promise.ts"],"names":[],"mappings":"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"}