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,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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"}