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,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Batch Adapter for Testing
|
|
3
|
+
*
|
|
4
|
+
* Simulates batch processing locally for testing purposes.
|
|
5
|
+
* Executes requests immediately (or with configurable delay).
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import { registerBatchAdapter, } from '../batch-queue.js';
|
|
10
|
+
import { generateObject, generateText } from '../generate.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Storage
|
|
13
|
+
// ============================================================================
|
|
14
|
+
const batches = new Map();
|
|
15
|
+
let batchCounter = 0;
|
|
16
|
+
let memoryOptions = {};
|
|
17
|
+
/**
|
|
18
|
+
* Configure the memory adapter
|
|
19
|
+
*/
|
|
20
|
+
export function configureMemoryAdapter(options) {
|
|
21
|
+
memoryOptions = options;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Clear all stored batches (for testing)
|
|
25
|
+
*/
|
|
26
|
+
export function clearBatches() {
|
|
27
|
+
batches.clear();
|
|
28
|
+
batchCounter = 0;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get all stored batches (for testing)
|
|
32
|
+
*/
|
|
33
|
+
export function getBatches() {
|
|
34
|
+
return batches;
|
|
35
|
+
}
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// Memory Batch Adapter
|
|
38
|
+
// ============================================================================
|
|
39
|
+
const memoryAdapter = {
|
|
40
|
+
async submit(items, options) {
|
|
41
|
+
const batchId = `batch_memory_${++batchCounter}`;
|
|
42
|
+
const batch = {
|
|
43
|
+
id: batchId,
|
|
44
|
+
items: [...items],
|
|
45
|
+
options,
|
|
46
|
+
status: 'pending',
|
|
47
|
+
results: [],
|
|
48
|
+
createdAt: new Date(),
|
|
49
|
+
};
|
|
50
|
+
batches.set(batchId, batch);
|
|
51
|
+
// Start processing asynchronously
|
|
52
|
+
const completion = processMemoryBatch(batch);
|
|
53
|
+
const job = {
|
|
54
|
+
id: batchId,
|
|
55
|
+
provider: 'openai', // Simulating OpenAI
|
|
56
|
+
status: 'pending',
|
|
57
|
+
totalItems: items.length,
|
|
58
|
+
completedItems: 0,
|
|
59
|
+
failedItems: 0,
|
|
60
|
+
createdAt: batch.createdAt,
|
|
61
|
+
webhookUrl: options.webhookUrl,
|
|
62
|
+
};
|
|
63
|
+
return { job, completion };
|
|
64
|
+
},
|
|
65
|
+
async getStatus(batchId) {
|
|
66
|
+
const batch = batches.get(batchId);
|
|
67
|
+
if (!batch) {
|
|
68
|
+
throw new Error(`Batch not found: ${batchId}`);
|
|
69
|
+
}
|
|
70
|
+
const completedItems = batch.results.filter((r) => r.status === 'completed').length;
|
|
71
|
+
const failedItems = batch.results.filter((r) => r.status === 'failed').length;
|
|
72
|
+
return {
|
|
73
|
+
id: batch.id,
|
|
74
|
+
provider: 'openai',
|
|
75
|
+
status: batch.status === 'completed' ? 'completed' : batch.status === 'failed' ? 'failed' : 'in_progress',
|
|
76
|
+
totalItems: batch.items.length,
|
|
77
|
+
completedItems,
|
|
78
|
+
failedItems,
|
|
79
|
+
createdAt: batch.createdAt,
|
|
80
|
+
completedAt: batch.completedAt,
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
async cancel(batchId) {
|
|
84
|
+
const batch = batches.get(batchId);
|
|
85
|
+
if (!batch) {
|
|
86
|
+
throw new Error(`Batch not found: ${batchId}`);
|
|
87
|
+
}
|
|
88
|
+
batch.status = 'failed';
|
|
89
|
+
},
|
|
90
|
+
async getResults(batchId) {
|
|
91
|
+
const batch = batches.get(batchId);
|
|
92
|
+
if (!batch) {
|
|
93
|
+
throw new Error(`Batch not found: ${batchId}`);
|
|
94
|
+
}
|
|
95
|
+
return batch.results;
|
|
96
|
+
},
|
|
97
|
+
async waitForCompletion(batchId) {
|
|
98
|
+
const batch = batches.get(batchId);
|
|
99
|
+
if (!batch) {
|
|
100
|
+
throw new Error(`Batch not found: ${batchId}`);
|
|
101
|
+
}
|
|
102
|
+
// Wait for completion
|
|
103
|
+
while (batch.status !== 'completed' && batch.status !== 'failed') {
|
|
104
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
105
|
+
}
|
|
106
|
+
return batch.results;
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
// ============================================================================
|
|
110
|
+
// Processing
|
|
111
|
+
// ============================================================================
|
|
112
|
+
async function processMemoryBatch(batch) {
|
|
113
|
+
batch.status = 'in_progress';
|
|
114
|
+
// Optional delay
|
|
115
|
+
if (memoryOptions.delay) {
|
|
116
|
+
await new Promise((resolve) => setTimeout(resolve, memoryOptions.delay));
|
|
117
|
+
}
|
|
118
|
+
const results = [];
|
|
119
|
+
for (const item of batch.items) {
|
|
120
|
+
try {
|
|
121
|
+
// Simulate failure
|
|
122
|
+
if (memoryOptions.failureRate && Math.random() < memoryOptions.failureRate) {
|
|
123
|
+
throw new Error('Simulated failure');
|
|
124
|
+
}
|
|
125
|
+
let result;
|
|
126
|
+
if (memoryOptions.handler) {
|
|
127
|
+
// Use custom handler
|
|
128
|
+
result = await memoryOptions.handler(item);
|
|
129
|
+
}
|
|
130
|
+
else if (item.schema) {
|
|
131
|
+
// Generate structured output
|
|
132
|
+
const response = await generateObject({
|
|
133
|
+
model: batch.options.model || 'sonnet',
|
|
134
|
+
schema: item.schema,
|
|
135
|
+
prompt: item.prompt,
|
|
136
|
+
system: item.options?.system,
|
|
137
|
+
temperature: item.options?.temperature,
|
|
138
|
+
maxTokens: item.options?.maxTokens,
|
|
139
|
+
});
|
|
140
|
+
result = response.object;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Generate text
|
|
144
|
+
const response = await generateText({
|
|
145
|
+
model: batch.options.model || 'sonnet',
|
|
146
|
+
prompt: item.prompt,
|
|
147
|
+
system: item.options?.system,
|
|
148
|
+
temperature: item.options?.temperature,
|
|
149
|
+
maxTokens: item.options?.maxTokens,
|
|
150
|
+
});
|
|
151
|
+
result = response.text;
|
|
152
|
+
}
|
|
153
|
+
results.push({
|
|
154
|
+
id: item.id,
|
|
155
|
+
customId: item.id,
|
|
156
|
+
status: 'completed',
|
|
157
|
+
result,
|
|
158
|
+
usage: {
|
|
159
|
+
promptTokens: 100,
|
|
160
|
+
completionTokens: 200,
|
|
161
|
+
totalTokens: 300,
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
results.push({
|
|
167
|
+
id: item.id,
|
|
168
|
+
customId: item.id,
|
|
169
|
+
status: 'failed',
|
|
170
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
batch.results = results;
|
|
175
|
+
batch.status = results.every((r) => r.status === 'completed') ? 'completed' : 'failed';
|
|
176
|
+
batch.completedAt = new Date();
|
|
177
|
+
return results;
|
|
178
|
+
}
|
|
179
|
+
// ============================================================================
|
|
180
|
+
// Register Adapter
|
|
181
|
+
// ============================================================================
|
|
182
|
+
registerBatchAdapter('openai', memoryAdapter);
|
|
183
|
+
registerBatchAdapter('anthropic', memoryAdapter);
|
|
184
|
+
registerBatchAdapter('google', memoryAdapter);
|
|
185
|
+
registerBatchAdapter('bedrock', memoryAdapter);
|
|
186
|
+
registerBatchAdapter('cloudflare', memoryAdapter);
|
|
187
|
+
export { memoryAdapter };
|
|
188
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/batch/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Batch API Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements batch processing using OpenAI's Batch API:
|
|
5
|
+
* - 50% cost discount
|
|
6
|
+
* - 24-hour turnaround
|
|
7
|
+
* - Up to 50,000 requests per batch
|
|
8
|
+
*
|
|
9
|
+
* @see https://platform.openai.com/docs/guides/batch
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import { type BatchAdapter, type FlexAdapter } from '../batch-queue.js';
|
|
14
|
+
/**
|
|
15
|
+
* Configure the OpenAI client
|
|
16
|
+
*/
|
|
17
|
+
export declare function configureOpenAI(options: {
|
|
18
|
+
apiKey?: string;
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
}): void;
|
|
21
|
+
declare const openaiAdapter: BatchAdapter;
|
|
22
|
+
/**
|
|
23
|
+
* OpenAI Flex Adapter
|
|
24
|
+
*
|
|
25
|
+
* Flex processing uses concurrent requests with a service tier that provides
|
|
26
|
+
* ~50% discount similar to batch, but with much faster turnaround (minutes vs 24hr).
|
|
27
|
+
*
|
|
28
|
+
* This is ideal for 5-500 items where you need results quickly but still want
|
|
29
|
+
* cost savings.
|
|
30
|
+
*
|
|
31
|
+
* Note: As of 2024, OpenAI doesn't have an official "flex" tier API.
|
|
32
|
+
* This adapter implements concurrent processing as a middle ground.
|
|
33
|
+
* When OpenAI adds official flex support, this can be updated.
|
|
34
|
+
*/
|
|
35
|
+
declare const openaiFlexAdapter: FlexAdapter;
|
|
36
|
+
export { openaiAdapter, openaiFlexAdapter };
|
|
37
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/batch/openai.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,WAAW,EAOjB,MAAM,mBAAmB,CAAA;AA+E1B;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGpF;AA2FD,QAAA,MAAM,aAAa,EAAE,YAmLpB,CAAA;AAkDD;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,iBAAiB,EAAE,WA+BxB,CAAA;AAmFD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAA"}
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Batch API Adapter
|
|
3
|
+
*
|
|
4
|
+
* Implements batch processing using OpenAI's Batch API:
|
|
5
|
+
* - 50% cost discount
|
|
6
|
+
* - 24-hour turnaround
|
|
7
|
+
* - Up to 50,000 requests per batch
|
|
8
|
+
*
|
|
9
|
+
* @see https://platform.openai.com/docs/guides/batch
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import { registerBatchAdapter, registerFlexAdapter, } from '../batch-queue.js';
|
|
14
|
+
import { schema as convertSchema } from '../schema.js';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// OpenAI Client
|
|
17
|
+
// ============================================================================
|
|
18
|
+
let openaiApiKey;
|
|
19
|
+
let openaiBaseUrl = 'https://api.openai.com/v1';
|
|
20
|
+
/**
|
|
21
|
+
* Configure the OpenAI client
|
|
22
|
+
*/
|
|
23
|
+
export function configureOpenAI(options) {
|
|
24
|
+
if (options.apiKey)
|
|
25
|
+
openaiApiKey = options.apiKey;
|
|
26
|
+
if (options.baseUrl)
|
|
27
|
+
openaiBaseUrl = options.baseUrl;
|
|
28
|
+
}
|
|
29
|
+
function getApiKey() {
|
|
30
|
+
const key = openaiApiKey || process.env.OPENAI_API_KEY;
|
|
31
|
+
if (!key) {
|
|
32
|
+
throw new Error('OpenAI API key not configured. Set OPENAI_API_KEY or call configureOpenAI()');
|
|
33
|
+
}
|
|
34
|
+
return key;
|
|
35
|
+
}
|
|
36
|
+
async function openaiRequest(method, path, body) {
|
|
37
|
+
const url = `${openaiBaseUrl}${path}`;
|
|
38
|
+
const response = await fetch(url, {
|
|
39
|
+
method,
|
|
40
|
+
headers: {
|
|
41
|
+
Authorization: `Bearer ${getApiKey()}`,
|
|
42
|
+
'Content-Type': 'application/json',
|
|
43
|
+
},
|
|
44
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
const error = await response.text();
|
|
48
|
+
throw new Error(`OpenAI API error: ${response.status} ${error}`);
|
|
49
|
+
}
|
|
50
|
+
return response.json();
|
|
51
|
+
}
|
|
52
|
+
async function uploadFile(content, purpose) {
|
|
53
|
+
const formData = new FormData();
|
|
54
|
+
formData.append('purpose', purpose);
|
|
55
|
+
formData.append('file', new Blob([content], { type: 'application/jsonl' }), 'batch.jsonl');
|
|
56
|
+
const response = await fetch(`${openaiBaseUrl}/files`, {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
headers: {
|
|
59
|
+
Authorization: `Bearer ${getApiKey()}`,
|
|
60
|
+
},
|
|
61
|
+
body: formData,
|
|
62
|
+
});
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
const error = await response.text();
|
|
65
|
+
throw new Error(`OpenAI file upload error: ${response.status} ${error}`);
|
|
66
|
+
}
|
|
67
|
+
return response.json();
|
|
68
|
+
}
|
|
69
|
+
async function downloadFile(fileId) {
|
|
70
|
+
const response = await fetch(`${openaiBaseUrl}/files/${fileId}/content`, {
|
|
71
|
+
headers: {
|
|
72
|
+
Authorization: `Bearer ${getApiKey()}`,
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
if (!response.ok) {
|
|
76
|
+
const error = await response.text();
|
|
77
|
+
throw new Error(`OpenAI file download error: ${response.status} ${error}`);
|
|
78
|
+
}
|
|
79
|
+
return response.text();
|
|
80
|
+
}
|
|
81
|
+
// ============================================================================
|
|
82
|
+
// Status Mapping
|
|
83
|
+
// ============================================================================
|
|
84
|
+
function mapStatus(status) {
|
|
85
|
+
const statusMap = {
|
|
86
|
+
validating: 'validating',
|
|
87
|
+
in_progress: 'in_progress',
|
|
88
|
+
finalizing: 'finalizing',
|
|
89
|
+
completed: 'completed',
|
|
90
|
+
failed: 'failed',
|
|
91
|
+
expired: 'expired',
|
|
92
|
+
cancelling: 'cancelling',
|
|
93
|
+
cancelled: 'cancelled',
|
|
94
|
+
};
|
|
95
|
+
return statusMap[status] || 'pending';
|
|
96
|
+
}
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// OpenAI Batch Adapter
|
|
99
|
+
// ============================================================================
|
|
100
|
+
const openaiAdapter = {
|
|
101
|
+
async submit(items, options) {
|
|
102
|
+
const model = options.model || 'gpt-4o';
|
|
103
|
+
// Build JSONL content
|
|
104
|
+
const requests = items.map((item) => {
|
|
105
|
+
const request = {
|
|
106
|
+
custom_id: item.id,
|
|
107
|
+
method: 'POST',
|
|
108
|
+
url: '/v1/chat/completions',
|
|
109
|
+
body: {
|
|
110
|
+
model,
|
|
111
|
+
messages: [
|
|
112
|
+
...(item.options?.system ? [{ role: 'system', content: item.options.system }] : []),
|
|
113
|
+
{ role: 'user', content: item.prompt },
|
|
114
|
+
],
|
|
115
|
+
max_tokens: item.options?.maxTokens,
|
|
116
|
+
temperature: item.options?.temperature,
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
// Add JSON schema if provided
|
|
120
|
+
if (item.schema) {
|
|
121
|
+
const zodSchema = convertSchema(item.schema);
|
|
122
|
+
// Convert Zod to JSON Schema (simplified - you'd want a proper converter)
|
|
123
|
+
request.body.response_format = {
|
|
124
|
+
type: 'json_schema',
|
|
125
|
+
json_schema: {
|
|
126
|
+
name: 'response',
|
|
127
|
+
schema: zodToJsonSchema(zodSchema),
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return request;
|
|
132
|
+
});
|
|
133
|
+
const jsonlContent = requests.map((r) => JSON.stringify(r)).join('\n');
|
|
134
|
+
// Upload the input file
|
|
135
|
+
const inputFile = await uploadFile(jsonlContent, 'batch');
|
|
136
|
+
// Create the batch
|
|
137
|
+
const batch = await openaiRequest('POST', '/batches', {
|
|
138
|
+
input_file_id: inputFile.id,
|
|
139
|
+
endpoint: '/v1/chat/completions',
|
|
140
|
+
completion_window: '24h',
|
|
141
|
+
metadata: options.metadata,
|
|
142
|
+
});
|
|
143
|
+
const job = {
|
|
144
|
+
id: batch.id,
|
|
145
|
+
provider: 'openai',
|
|
146
|
+
status: mapStatus(batch.status),
|
|
147
|
+
totalItems: items.length,
|
|
148
|
+
completedItems: 0,
|
|
149
|
+
failedItems: 0,
|
|
150
|
+
createdAt: new Date(batch.created_at * 1000),
|
|
151
|
+
expiresAt: batch.expires_at ? new Date(batch.expires_at * 1000) : undefined,
|
|
152
|
+
webhookUrl: options.webhookUrl,
|
|
153
|
+
inputFileId: batch.input_file_id,
|
|
154
|
+
};
|
|
155
|
+
// Create completion promise
|
|
156
|
+
const completion = this.waitForCompletion(batch.id);
|
|
157
|
+
return { job, completion };
|
|
158
|
+
},
|
|
159
|
+
async getStatus(batchId) {
|
|
160
|
+
const batch = await openaiRequest('GET', `/batches/${batchId}`);
|
|
161
|
+
return {
|
|
162
|
+
id: batch.id,
|
|
163
|
+
provider: 'openai',
|
|
164
|
+
status: mapStatus(batch.status),
|
|
165
|
+
totalItems: batch.request_counts.total,
|
|
166
|
+
completedItems: batch.request_counts.completed,
|
|
167
|
+
failedItems: batch.request_counts.failed,
|
|
168
|
+
createdAt: new Date(batch.created_at * 1000),
|
|
169
|
+
startedAt: batch.in_progress_at ? new Date(batch.in_progress_at * 1000) : undefined,
|
|
170
|
+
completedAt: batch.completed_at ? new Date(batch.completed_at * 1000) : undefined,
|
|
171
|
+
expiresAt: batch.expires_at ? new Date(batch.expires_at * 1000) : undefined,
|
|
172
|
+
inputFileId: batch.input_file_id,
|
|
173
|
+
outputFileId: batch.output_file_id || undefined,
|
|
174
|
+
errorFileId: batch.error_file_id || undefined,
|
|
175
|
+
};
|
|
176
|
+
},
|
|
177
|
+
async cancel(batchId) {
|
|
178
|
+
await openaiRequest('POST', `/batches/${batchId}/cancel`);
|
|
179
|
+
},
|
|
180
|
+
async getResults(batchId) {
|
|
181
|
+
const status = await this.getStatus(batchId);
|
|
182
|
+
if (status.status !== 'completed' && status.status !== 'failed') {
|
|
183
|
+
throw new Error(`Batch not complete. Status: ${status.status}`);
|
|
184
|
+
}
|
|
185
|
+
const results = [];
|
|
186
|
+
// Download and parse output file
|
|
187
|
+
if (status.outputFileId) {
|
|
188
|
+
const content = await downloadFile(status.outputFileId);
|
|
189
|
+
const lines = content.trim().split('\n');
|
|
190
|
+
for (const line of lines) {
|
|
191
|
+
const response = JSON.parse(line);
|
|
192
|
+
if (response.error) {
|
|
193
|
+
results.push({
|
|
194
|
+
id: response.custom_id,
|
|
195
|
+
customId: response.custom_id,
|
|
196
|
+
status: 'failed',
|
|
197
|
+
error: response.error.message,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
else if (response.response) {
|
|
201
|
+
const content = response.response.body.choices[0]?.message?.content;
|
|
202
|
+
let result = content;
|
|
203
|
+
// Try to parse JSON if it looks like JSON
|
|
204
|
+
if (content?.startsWith('{') || content?.startsWith('[')) {
|
|
205
|
+
try {
|
|
206
|
+
result = JSON.parse(content);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// Keep as string
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
results.push({
|
|
213
|
+
id: response.custom_id,
|
|
214
|
+
customId: response.custom_id,
|
|
215
|
+
status: 'completed',
|
|
216
|
+
result,
|
|
217
|
+
usage: {
|
|
218
|
+
promptTokens: response.response.body.usage.prompt_tokens,
|
|
219
|
+
completionTokens: response.response.body.usage.completion_tokens,
|
|
220
|
+
totalTokens: response.response.body.usage.total_tokens,
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Download and parse error file
|
|
227
|
+
if (status.errorFileId) {
|
|
228
|
+
const content = await downloadFile(status.errorFileId);
|
|
229
|
+
const lines = content.trim().split('\n');
|
|
230
|
+
for (const line of lines) {
|
|
231
|
+
const response = JSON.parse(line);
|
|
232
|
+
results.push({
|
|
233
|
+
id: response.custom_id,
|
|
234
|
+
customId: response.custom_id,
|
|
235
|
+
status: 'failed',
|
|
236
|
+
error: response.error?.message || 'Unknown error',
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return results;
|
|
241
|
+
},
|
|
242
|
+
async waitForCompletion(batchId, pollInterval = 5000) {
|
|
243
|
+
while (true) {
|
|
244
|
+
const status = await this.getStatus(batchId);
|
|
245
|
+
if (status.status === 'completed' || status.status === 'failed') {
|
|
246
|
+
return this.getResults(batchId);
|
|
247
|
+
}
|
|
248
|
+
if (status.status === 'cancelled' || status.status === 'expired') {
|
|
249
|
+
throw new Error(`Batch ${status.status}`);
|
|
250
|
+
}
|
|
251
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
// ============================================================================
|
|
256
|
+
// Helpers
|
|
257
|
+
// ============================================================================
|
|
258
|
+
/**
|
|
259
|
+
* Simple Zod to JSON Schema converter
|
|
260
|
+
* In production, use a proper library like zod-to-json-schema
|
|
261
|
+
*/
|
|
262
|
+
function zodToJsonSchema(zodSchema) {
|
|
263
|
+
// This is a simplified converter - in production use zod-to-json-schema
|
|
264
|
+
const schema = zodSchema;
|
|
265
|
+
if (!schema._def) {
|
|
266
|
+
return { type: 'object' };
|
|
267
|
+
}
|
|
268
|
+
const typeName = schema._def.typeName;
|
|
269
|
+
switch (typeName) {
|
|
270
|
+
case 'ZodString':
|
|
271
|
+
return { type: 'string' };
|
|
272
|
+
case 'ZodNumber':
|
|
273
|
+
return { type: 'number' };
|
|
274
|
+
case 'ZodBoolean':
|
|
275
|
+
return { type: 'boolean' };
|
|
276
|
+
case 'ZodArray':
|
|
277
|
+
return { type: 'array', items: zodToJsonSchema(schema._def.type) };
|
|
278
|
+
case 'ZodObject': {
|
|
279
|
+
const shape = schema._def.shape();
|
|
280
|
+
const properties = {};
|
|
281
|
+
for (const [key, value] of Object.entries(shape)) {
|
|
282
|
+
properties[key] = zodToJsonSchema(value);
|
|
283
|
+
}
|
|
284
|
+
return { type: 'object', properties, required: Object.keys(properties) };
|
|
285
|
+
}
|
|
286
|
+
default:
|
|
287
|
+
return { type: 'object' };
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// ============================================================================
|
|
291
|
+
// Register Adapter
|
|
292
|
+
// ============================================================================
|
|
293
|
+
// ============================================================================
|
|
294
|
+
// OpenAI Flex Adapter
|
|
295
|
+
// ============================================================================
|
|
296
|
+
/**
|
|
297
|
+
* OpenAI Flex Adapter
|
|
298
|
+
*
|
|
299
|
+
* Flex processing uses concurrent requests with a service tier that provides
|
|
300
|
+
* ~50% discount similar to batch, but with much faster turnaround (minutes vs 24hr).
|
|
301
|
+
*
|
|
302
|
+
* This is ideal for 5-500 items where you need results quickly but still want
|
|
303
|
+
* cost savings.
|
|
304
|
+
*
|
|
305
|
+
* Note: As of 2024, OpenAI doesn't have an official "flex" tier API.
|
|
306
|
+
* This adapter implements concurrent processing as a middle ground.
|
|
307
|
+
* When OpenAI adds official flex support, this can be updated.
|
|
308
|
+
*/
|
|
309
|
+
const openaiFlexAdapter = {
|
|
310
|
+
async submitFlex(items, options) {
|
|
311
|
+
const model = options.model || 'gpt-4o';
|
|
312
|
+
const CONCURRENCY = 10; // Higher concurrency for flex tier
|
|
313
|
+
const results = [];
|
|
314
|
+
// Process items concurrently in batches
|
|
315
|
+
for (let i = 0; i < items.length; i += CONCURRENCY) {
|
|
316
|
+
const batch = items.slice(i, i + CONCURRENCY);
|
|
317
|
+
const batchResults = await Promise.all(batch.map(async (item) => {
|
|
318
|
+
try {
|
|
319
|
+
return await processOpenAIItem(item, model);
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
return {
|
|
323
|
+
id: item.id,
|
|
324
|
+
customId: item.id,
|
|
325
|
+
status: 'failed',
|
|
326
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
}));
|
|
330
|
+
results.push(...batchResults);
|
|
331
|
+
}
|
|
332
|
+
return results;
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
/**
|
|
336
|
+
* Process a single item via OpenAI Chat Completions API
|
|
337
|
+
*/
|
|
338
|
+
async function processOpenAIItem(item, model) {
|
|
339
|
+
const messages = [];
|
|
340
|
+
if (item.options?.system) {
|
|
341
|
+
messages.push({ role: 'system', content: item.options.system });
|
|
342
|
+
}
|
|
343
|
+
messages.push({ role: 'user', content: item.prompt });
|
|
344
|
+
const body = {
|
|
345
|
+
model,
|
|
346
|
+
messages,
|
|
347
|
+
max_tokens: item.options?.maxTokens,
|
|
348
|
+
temperature: item.options?.temperature,
|
|
349
|
+
};
|
|
350
|
+
// Add JSON schema if provided
|
|
351
|
+
if (item.schema) {
|
|
352
|
+
const zodSchema = convertSchema(item.schema);
|
|
353
|
+
body.response_format = {
|
|
354
|
+
type: 'json_schema',
|
|
355
|
+
json_schema: {
|
|
356
|
+
name: 'response',
|
|
357
|
+
schema: zodToJsonSchema(zodSchema),
|
|
358
|
+
},
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
const response = await fetch(`${openaiBaseUrl}/chat/completions`, {
|
|
362
|
+
method: 'POST',
|
|
363
|
+
headers: {
|
|
364
|
+
Authorization: `Bearer ${getApiKey()}`,
|
|
365
|
+
'Content-Type': 'application/json',
|
|
366
|
+
},
|
|
367
|
+
body: JSON.stringify(body),
|
|
368
|
+
});
|
|
369
|
+
if (!response.ok) {
|
|
370
|
+
const error = await response.text();
|
|
371
|
+
throw new Error(`OpenAI API error: ${response.status} ${error}`);
|
|
372
|
+
}
|
|
373
|
+
const data = (await response.json());
|
|
374
|
+
const content = data.choices[0]?.message?.content;
|
|
375
|
+
let result = content;
|
|
376
|
+
// Try to parse JSON if schema was provided or content looks like JSON
|
|
377
|
+
if (content && (item.schema || content.startsWith('{') || content.startsWith('['))) {
|
|
378
|
+
try {
|
|
379
|
+
result = JSON.parse(content);
|
|
380
|
+
}
|
|
381
|
+
catch {
|
|
382
|
+
// Keep as string
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
return {
|
|
386
|
+
id: item.id,
|
|
387
|
+
customId: item.id,
|
|
388
|
+
status: 'completed',
|
|
389
|
+
result,
|
|
390
|
+
usage: {
|
|
391
|
+
promptTokens: data.usage.prompt_tokens,
|
|
392
|
+
completionTokens: data.usage.completion_tokens,
|
|
393
|
+
totalTokens: data.usage.total_tokens,
|
|
394
|
+
},
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
// ============================================================================
|
|
398
|
+
// Register Adapters
|
|
399
|
+
// ============================================================================
|
|
400
|
+
registerBatchAdapter('openai', openaiAdapter);
|
|
401
|
+
registerFlexAdapter('openai', openaiFlexAdapter);
|
|
402
|
+
export { openaiAdapter, openaiFlexAdapter };
|
|
403
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/batch/openai.ts"],"names":[],"mappings":"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"}
|