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.
- package/.turbo/turbo-build.log +5 -0
- package/.turbo/turbo-test.log +105 -0
- package/README.md +232 -37
- package/TODO.md +138 -0
- package/dist/ai-promise.d.ts +219 -0
- package/dist/ai-promise.d.ts.map +1 -0
- package/dist/ai-promise.js +610 -0
- package/dist/ai-promise.js.map +1 -0
- package/dist/ai.d.ts +285 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +842 -0
- package/dist/ai.js.map +1 -0
- package/dist/batch/anthropic.d.ts +23 -0
- package/dist/batch/anthropic.d.ts.map +1 -0
- package/dist/batch/anthropic.js +257 -0
- package/dist/batch/anthropic.js.map +1 -0
- package/dist/batch/bedrock.d.ts +64 -0
- package/dist/batch/bedrock.d.ts.map +1 -0
- package/dist/batch/bedrock.js +586 -0
- package/dist/batch/bedrock.js.map +1 -0
- package/dist/batch/cloudflare.d.ts +37 -0
- package/dist/batch/cloudflare.d.ts.map +1 -0
- package/dist/batch/cloudflare.js +289 -0
- package/dist/batch/cloudflare.js.map +1 -0
- package/dist/batch/google.d.ts +41 -0
- package/dist/batch/google.d.ts.map +1 -0
- package/dist/batch/google.js +360 -0
- package/dist/batch/google.js.map +1 -0
- package/dist/batch/index.d.ts +31 -0
- package/dist/batch/index.d.ts.map +1 -0
- package/dist/batch/index.js +31 -0
- package/dist/batch/index.js.map +1 -0
- package/dist/batch/memory.d.ts +44 -0
- package/dist/batch/memory.d.ts.map +1 -0
- package/dist/batch/memory.js +188 -0
- package/dist/batch/memory.js.map +1 -0
- package/dist/batch/openai.d.ts +37 -0
- package/dist/batch/openai.d.ts.map +1 -0
- package/dist/batch/openai.js +403 -0
- package/dist/batch/openai.js.map +1 -0
- package/dist/batch-map.d.ts +125 -0
- package/dist/batch-map.d.ts.map +1 -0
- package/dist/batch-map.js +406 -0
- package/dist/batch-map.js.map +1 -0
- package/dist/batch-queue.d.ts +273 -0
- package/dist/batch-queue.d.ts.map +1 -0
- package/dist/batch-queue.js +271 -0
- package/dist/batch-queue.js.map +1 -0
- package/dist/context.d.ts +133 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +267 -0
- package/dist/context.js.map +1 -0
- package/dist/embeddings.d.ts +123 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +170 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/eval/index.d.ts +8 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +8 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/models.d.ts +66 -0
- package/dist/eval/models.d.ts.map +1 -0
- package/dist/eval/models.js +120 -0
- package/dist/eval/models.js.map +1 -0
- package/dist/eval/runner.d.ts +64 -0
- package/dist/eval/runner.d.ts.map +1 -0
- package/dist/eval/runner.js +148 -0
- package/dist/eval/runner.js.map +1 -0
- package/dist/generate.d.ts +168 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +174 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives.d.ts +292 -0
- package/dist/primitives.d.ts.map +1 -0
- package/dist/primitives.js +471 -0
- package/dist/primitives.js.map +1 -0
- package/dist/providers/cloudflare.d.ts +9 -0
- package/dist/providers/cloudflare.d.ts.map +1 -0
- package/dist/providers/cloudflare.js +9 -0
- package/dist/providers/cloudflare.js.map +1 -0
- package/dist/providers/index.d.ts +9 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +9 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/schema.d.ts +54 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +109 -0
- package/dist/schema.js.map +1 -0
- package/dist/template.d.ts +73 -0
- package/dist/template.d.ts.map +1 -0
- package/dist/template.js +129 -0
- package/dist/template.js.map +1 -0
- package/dist/types.d.ts +481 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/evalite.config.ts +19 -0
- package/evals/README.md +212 -0
- package/evals/classification.eval.ts +108 -0
- package/evals/marketing.eval.ts +370 -0
- package/evals/math.eval.ts +94 -0
- package/evals/run-evals.ts +166 -0
- package/evals/structured-output.eval.ts +143 -0
- package/evals/writing.eval.ts +117 -0
- package/examples/batch-blog-posts.ts +160 -0
- package/package.json +59 -43
- package/src/ai-promise.ts +784 -0
- package/src/ai.ts +1183 -0
- package/src/batch/anthropic.ts +375 -0
- package/src/batch/bedrock.ts +801 -0
- package/src/batch/cloudflare.ts +421 -0
- package/src/batch/google.ts +491 -0
- package/src/batch/index.ts +31 -0
- package/src/batch/memory.ts +253 -0
- package/src/batch/openai.ts +557 -0
- package/src/batch-map.ts +534 -0
- package/src/batch-queue.ts +493 -0
- package/src/context.ts +332 -0
- package/src/embeddings.ts +244 -0
- package/src/eval/index.ts +8 -0
- package/src/eval/models.ts +158 -0
- package/src/eval/runner.ts +217 -0
- package/src/generate.ts +245 -0
- package/src/index.ts +154 -0
- package/src/primitives.ts +612 -0
- package/src/providers/cloudflare.ts +15 -0
- package/src/providers/index.ts +14 -0
- package/src/schema.ts +147 -0
- package/src/template.ts +209 -0
- package/src/types.ts +540 -0
- package/test/README.md +105 -0
- package/test/ai-proxy.test.ts +192 -0
- package/test/async-iterators.test.ts +327 -0
- package/test/batch-background.test.ts +482 -0
- package/test/batch-blog-posts.test.ts +387 -0
- package/test/blog-generation.test.ts +510 -0
- package/test/browse-read.test.ts +611 -0
- package/test/core-functions.test.ts +694 -0
- package/test/decide.test.ts +393 -0
- package/test/define.test.ts +274 -0
- package/test/e2e-bedrock-manual.ts +163 -0
- package/test/e2e-bedrock.test.ts +191 -0
- package/test/e2e-flex-gateway.ts +157 -0
- package/test/e2e-flex-manual.ts +183 -0
- package/test/e2e-flex.test.ts +209 -0
- package/test/e2e-google-manual.ts +178 -0
- package/test/e2e-google.test.ts +216 -0
- package/test/embeddings.test.ts +284 -0
- package/test/evals/define-function.eval.test.ts +379 -0
- package/test/evals/primitives.eval.test.ts +384 -0
- package/test/function-types.test.ts +492 -0
- package/test/generate-core.test.ts +319 -0
- package/test/generate.test.ts +163 -0
- package/test/implicit-batch.test.ts +422 -0
- package/test/schema.test.ts +109 -0
- package/test/tagged-templates.test.ts +302 -0
- package/tsconfig.json +8 -6
- package/vitest.config.ts +42 -0
- package/LICENSE +0 -21
- package/db/cache.ts +0 -6
- package/db/mongo.ts +0 -75
- package/dist/mjs/db/cache.d.ts +0 -1
- package/dist/mjs/db/cache.js +0 -5
- package/dist/mjs/db/mongo.d.ts +0 -31
- package/dist/mjs/db/mongo.js +0 -48
- package/dist/mjs/examples/data.d.ts +0 -1105
- package/dist/mjs/examples/data.js +0 -1105
- package/dist/mjs/functions/ai.d.ts +0 -20
- package/dist/mjs/functions/ai.js +0 -83
- package/dist/mjs/functions/ai.test.d.ts +0 -1
- package/dist/mjs/functions/ai.test.js +0 -29
- package/dist/mjs/functions/gpt.d.ts +0 -4
- package/dist/mjs/functions/gpt.js +0 -10
- package/dist/mjs/functions/list.d.ts +0 -7
- package/dist/mjs/functions/list.js +0 -72
- package/dist/mjs/index.d.ts +0 -3
- package/dist/mjs/index.js +0 -3
- package/dist/mjs/queue/kafka.d.ts +0 -0
- package/dist/mjs/queue/kafka.js +0 -1
- package/dist/mjs/queue/memory.d.ts +0 -0
- package/dist/mjs/queue/memory.js +0 -1
- package/dist/mjs/queue/mongo.d.ts +0 -30
- package/dist/mjs/queue/mongo.js +0 -42
- package/dist/mjs/streams/kafka.d.ts +0 -0
- package/dist/mjs/streams/kafka.js +0 -1
- package/dist/mjs/streams/memory.d.ts +0 -0
- package/dist/mjs/streams/memory.js +0 -1
- package/dist/mjs/streams/mongo.d.ts +0 -0
- package/dist/mjs/streams/mongo.js +0 -1
- package/dist/mjs/streams/types.d.ts +0 -0
- package/dist/mjs/streams/types.js +0 -1
- package/dist/mjs/types.d.ts +0 -11
- package/dist/mjs/types.js +0 -1
- package/dist/mjs/utils/completion.d.ts +0 -9
- package/dist/mjs/utils/completion.js +0 -20
- package/dist/mjs/utils/schema.d.ts +0 -10
- package/dist/mjs/utils/schema.js +0 -72
- package/dist/mjs/utils/schema.test.d.ts +0 -1
- package/dist/mjs/utils/schema.test.js +0 -60
- package/dist/mjs/utils/state.d.ts +0 -1
- package/dist/mjs/utils/state.js +0 -19
- package/examples/data.ts +0 -1105
- package/fixup +0 -11
- package/functions/ai.test.ts +0 -41
- package/functions/ai.ts +0 -115
- package/functions/gpt.ts +0 -12
- package/functions/list.ts +0 -84
- package/index.ts +0 -3
- package/queue/kafka.ts +0 -0
- package/queue/memory.ts +0 -0
- package/queue/mongo.ts +0 -88
- package/streams/kafka.ts +0 -0
- package/streams/memory.ts +0 -0
- package/streams/mongo.ts +0 -0
- package/streams/types.ts +0 -0
- package/tsconfig-backup.json +0 -105
- package/tsconfig-base.json +0 -26
- package/tsconfig-cjs.json +0 -8
- package/types.ts +0 -12
- package/utils/completion.ts +0 -28
- package/utils/schema.test.ts +0 -69
- package/utils/schema.ts +0 -74
- 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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"}
|