ai-functions 0.3.0 → 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 (400) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/.turbo/turbo-test.log +105 -0
  3. package/README.md +190 -86
  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 +29 -4
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +53 -52
  76. package/dist/index.js.map +1 -1
  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 +474 -106
  98. package/dist/types.d.ts.map +1 -1
  99. package/dist/types.js +4 -8
  100. package/dist/types.js.map +1 -1
  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 +57 -57
  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 +10 -0
  162. package/vitest.config.ts +42 -0
  163. package/LICENSE +0 -21
  164. package/bin/cli.js +0 -5
  165. package/dist/cli/index.d.ts +0 -10
  166. package/dist/cli/index.d.ts.map +0 -1
  167. package/dist/cli/index.js +0 -38
  168. package/dist/cli/index.js.map +0 -1
  169. package/dist/cli/index.test.d.ts +0 -2
  170. package/dist/cli/index.test.d.ts.map +0 -1
  171. package/dist/cli/index.test.js +0 -35
  172. package/dist/cli/index.test.js.map +0 -1
  173. package/dist/constants/models.d.ts +0 -10
  174. package/dist/constants/models.d.ts.map +0 -1
  175. package/dist/constants/models.js +0 -12
  176. package/dist/constants/models.js.map +0 -1
  177. package/dist/converters/index.d.ts +0 -3
  178. package/dist/converters/index.d.ts.map +0 -1
  179. package/dist/converters/index.js +0 -3
  180. package/dist/converters/index.js.map +0 -1
  181. package/dist/converters/model.d.ts +0 -4
  182. package/dist/converters/model.d.ts.map +0 -1
  183. package/dist/converters/model.js +0 -19
  184. package/dist/converters/model.js.map +0 -1
  185. package/dist/converters/schema.d.ts +0 -4
  186. package/dist/converters/schema.d.ts.map +0 -1
  187. package/dist/converters/schema.js +0 -25
  188. package/dist/converters/schema.js.map +0 -1
  189. package/dist/core/responses.d.ts +0 -5
  190. package/dist/core/responses.d.ts.map +0 -1
  191. package/dist/core/responses.js +0 -16
  192. package/dist/core/responses.js.map +0 -1
  193. package/dist/core/responses.test.d.ts +0 -2
  194. package/dist/core/responses.test.d.ts.map +0 -1
  195. package/dist/core/responses.test.js +0 -31
  196. package/dist/core/responses.test.js.map +0 -1
  197. package/dist/errors.d.ts +0 -6
  198. package/dist/errors.d.ts.map +0 -1
  199. package/dist/errors.js +0 -9
  200. package/dist/errors.js.map +0 -1
  201. package/dist/examples/streaming.test.d.ts +0 -2
  202. package/dist/examples/streaming.test.d.ts.map +0 -1
  203. package/dist/examples/streaming.test.js +0 -176
  204. package/dist/examples/streaming.test.js.map +0 -1
  205. package/dist/factory/__tests__/index.test.d.ts +0 -2
  206. package/dist/factory/__tests__/index.test.d.ts.map +0 -1
  207. package/dist/factory/__tests__/index.test.js +0 -430
  208. package/dist/factory/__tests__/index.test.js.map +0 -1
  209. package/dist/factory/__tests__/list.test.d.ts +0 -2
  210. package/dist/factory/__tests__/list.test.d.ts.map +0 -1
  211. package/dist/factory/__tests__/list.test.js +0 -92
  212. package/dist/factory/__tests__/list.test.js.map +0 -1
  213. package/dist/factory/index.d.ts +0 -20
  214. package/dist/factory/index.d.ts.map +0 -1
  215. package/dist/factory/index.js +0 -287
  216. package/dist/factory/index.js.map +0 -1
  217. package/dist/factory/index.test.d.ts +0 -2
  218. package/dist/factory/index.test.d.ts.map +0 -1
  219. package/dist/factory/index.test.js +0 -287
  220. package/dist/factory/index.test.js.map +0 -1
  221. package/dist/factory/list.d.ts +0 -3
  222. package/dist/factory/list.d.ts.map +0 -1
  223. package/dist/factory/list.js +0 -221
  224. package/dist/factory/list.js.map +0 -1
  225. package/dist/factory/list.test.d.ts +0 -2
  226. package/dist/factory/list.test.d.ts.map +0 -1
  227. package/dist/factory/list.test.js +0 -84
  228. package/dist/factory/list.test.js.map +0 -1
  229. package/dist/generate/index.d.ts +0 -5
  230. package/dist/generate/index.d.ts.map +0 -1
  231. package/dist/generate/index.js +0 -17
  232. package/dist/generate/index.js.map +0 -1
  233. package/dist/index.test.d.ts +0 -2
  234. package/dist/index.test.d.ts.map +0 -1
  235. package/dist/index.test.js +0 -59
  236. package/dist/index.test.js.map +0 -1
  237. package/dist/list/await.d.ts +0 -3
  238. package/dist/list/await.d.ts.map +0 -1
  239. package/dist/list/await.js +0 -28
  240. package/dist/list/await.js.map +0 -1
  241. package/dist/list/constants.d.ts +0 -4
  242. package/dist/list/constants.d.ts.map +0 -1
  243. package/dist/list/constants.js +0 -5
  244. package/dist/list/constants.js.map +0 -1
  245. package/dist/list/create-function.d.ts +0 -3
  246. package/dist/list/create-function.d.ts.map +0 -1
  247. package/dist/list/create-function.js +0 -11
  248. package/dist/list/create-function.js.map +0 -1
  249. package/dist/list/index.d.ts +0 -4
  250. package/dist/list/index.d.ts.map +0 -1
  251. package/dist/list/index.js +0 -5
  252. package/dist/list/index.js.map +0 -1
  253. package/dist/list/prompt.d.ts +0 -3
  254. package/dist/list/prompt.d.ts.map +0 -1
  255. package/dist/list/prompt.js +0 -6
  256. package/dist/list/prompt.js.map +0 -1
  257. package/dist/list/schemas.d.ts +0 -4
  258. package/dist/list/schemas.d.ts.map +0 -1
  259. package/dist/list/schemas.js +0 -8
  260. package/dist/list/schemas.js.map +0 -1
  261. package/dist/list/stream.d.ts +0 -3
  262. package/dist/list/stream.d.ts.map +0 -1
  263. package/dist/list/stream.js +0 -33
  264. package/dist/list/stream.js.map +0 -1
  265. package/dist/list/types.d.ts +0 -11
  266. package/dist/list/types.d.ts.map +0 -1
  267. package/dist/list/types.js +0 -2
  268. package/dist/list/types.js.map +0 -1
  269. package/dist/list/validation.d.ts +0 -3
  270. package/dist/list/validation.d.ts.map +0 -1
  271. package/dist/list/validation.js +0 -12
  272. package/dist/list/validation.js.map +0 -1
  273. package/dist/providers/config.d.ts +0 -4
  274. package/dist/providers/config.d.ts.map +0 -1
  275. package/dist/providers/config.js +0 -21
  276. package/dist/providers/config.js.map +0 -1
  277. package/dist/providers/config.test.d.ts +0 -2
  278. package/dist/providers/config.test.d.ts.map +0 -1
  279. package/dist/providers/config.test.js +0 -37
  280. package/dist/providers/config.test.js.map +0 -1
  281. package/dist/proxy/constants.d.ts +0 -4
  282. package/dist/proxy/constants.d.ts.map +0 -1
  283. package/dist/proxy/constants.js +0 -5
  284. package/dist/proxy/constants.js.map +0 -1
  285. package/dist/proxy/create-function.d.ts +0 -4
  286. package/dist/proxy/create-function.d.ts.map +0 -1
  287. package/dist/proxy/create-function.js +0 -24
  288. package/dist/proxy/create-function.js.map +0 -1
  289. package/dist/proxy/create-proxy.d.ts +0 -2
  290. package/dist/proxy/create-proxy.d.ts.map +0 -1
  291. package/dist/proxy/create-proxy.js +0 -11
  292. package/dist/proxy/create-proxy.js.map +0 -1
  293. package/dist/proxy/function-generator.d.ts +0 -9
  294. package/dist/proxy/function-generator.d.ts.map +0 -1
  295. package/dist/proxy/function-generator.js +0 -29
  296. package/dist/proxy/function-generator.js.map +0 -1
  297. package/dist/proxy/index.d.ts +0 -4
  298. package/dist/proxy/index.d.ts.map +0 -1
  299. package/dist/proxy/index.js +0 -4
  300. package/dist/proxy/index.js.map +0 -1
  301. package/dist/proxy/prompt.d.ts +0 -2
  302. package/dist/proxy/prompt.d.ts.map +0 -1
  303. package/dist/proxy/prompt.js +0 -6
  304. package/dist/proxy/prompt.js.map +0 -1
  305. package/dist/proxy/types.d.ts +0 -7
  306. package/dist/proxy/types.d.ts.map +0 -1
  307. package/dist/proxy/types.js +0 -2
  308. package/dist/proxy/types.js.map +0 -1
  309. package/dist/queue/manager.d.ts +0 -5
  310. package/dist/queue/manager.d.ts.map +0 -1
  311. package/dist/queue/manager.js +0 -37
  312. package/dist/queue/manager.js.map +0 -1
  313. package/dist/queue/manager.test.d.ts +0 -2
  314. package/dist/queue/manager.test.d.ts.map +0 -1
  315. package/dist/queue/manager.test.js +0 -52
  316. package/dist/queue/manager.test.js.map +0 -1
  317. package/dist/schema-converter.d.ts +0 -4
  318. package/dist/schema-converter.d.ts.map +0 -1
  319. package/dist/schema-converter.js +0 -30
  320. package/dist/schema-converter.js.map +0 -1
  321. package/dist/stream/index.d.ts +0 -7
  322. package/dist/stream/index.d.ts.map +0 -1
  323. package/dist/stream/index.js +0 -23
  324. package/dist/stream/index.js.map +0 -1
  325. package/dist/streaming/utils.d.ts +0 -4
  326. package/dist/streaming/utils.d.ts.map +0 -1
  327. package/dist/streaming/utils.js +0 -131
  328. package/dist/streaming/utils.js.map +0 -1
  329. package/dist/streaming/utils.test.d.ts +0 -2
  330. package/dist/streaming/utils.test.d.ts.map +0 -1
  331. package/dist/streaming/utils.test.js +0 -84
  332. package/dist/streaming/utils.test.js.map +0 -1
  333. package/dist/templates/result.d.ts +0 -7
  334. package/dist/templates/result.d.ts.map +0 -1
  335. package/dist/templates/result.js +0 -40
  336. package/dist/templates/result.js.map +0 -1
  337. package/dist/templates/result.test.d.ts +0 -2
  338. package/dist/templates/result.test.d.ts.map +0 -1
  339. package/dist/templates/result.test.js +0 -75
  340. package/dist/templates/result.test.js.map +0 -1
  341. package/dist/test/setup.d.ts +0 -2
  342. package/dist/test/setup.d.ts.map +0 -1
  343. package/dist/test/setup.js +0 -21
  344. package/dist/test/setup.js.map +0 -1
  345. package/dist/test-types.d.ts +0 -13
  346. package/dist/test-types.d.ts.map +0 -1
  347. package/dist/test-types.js +0 -55
  348. package/dist/test-types.js.map +0 -1
  349. package/dist/types/index.d.ts +0 -4
  350. package/dist/types/index.d.ts.map +0 -1
  351. package/dist/types/index.js +0 -4
  352. package/dist/types/index.js.map +0 -1
  353. package/dist/types/list.d.ts +0 -10
  354. package/dist/types/list.d.ts.map +0 -1
  355. package/dist/types/list.js +0 -2
  356. package/dist/types/list.js.map +0 -1
  357. package/dist/types/model.d.ts +0 -7
  358. package/dist/types/model.d.ts.map +0 -1
  359. package/dist/types/model.js +0 -2
  360. package/dist/types/model.js.map +0 -1
  361. package/dist/types/options.d.ts +0 -25
  362. package/dist/types/options.d.ts.map +0 -1
  363. package/dist/types/options.js +0 -2
  364. package/dist/types/options.js.map +0 -1
  365. package/dist/types/schema.d.ts +0 -5
  366. package/dist/types/schema.d.ts.map +0 -1
  367. package/dist/types/schema.js +0 -2
  368. package/dist/types/schema.js.map +0 -1
  369. package/dist/utils/__tests__/request-handler.test.d.ts +0 -2
  370. package/dist/utils/__tests__/request-handler.test.d.ts.map +0 -1
  371. package/dist/utils/__tests__/request-handler.test.js +0 -134
  372. package/dist/utils/__tests__/request-handler.test.js.map +0 -1
  373. package/dist/utils/__tests__/schema.test.d.ts +0 -2
  374. package/dist/utils/__tests__/schema.test.d.ts.map +0 -1
  375. package/dist/utils/__tests__/schema.test.js +0 -49
  376. package/dist/utils/__tests__/schema.test.js.map +0 -1
  377. package/dist/utils/__tests__/stream-progress.test.d.ts +0 -2
  378. package/dist/utils/__tests__/stream-progress.test.d.ts.map +0 -1
  379. package/dist/utils/__tests__/stream-progress.test.js +0 -85
  380. package/dist/utils/__tests__/stream-progress.test.js.map +0 -1
  381. package/dist/utils/index.d.ts +0 -2
  382. package/dist/utils/index.d.ts.map +0 -1
  383. package/dist/utils/index.js +0 -2
  384. package/dist/utils/index.js.map +0 -1
  385. package/dist/utils/request-handler.d.ts +0 -17
  386. package/dist/utils/request-handler.d.ts.map +0 -1
  387. package/dist/utils/request-handler.js +0 -105
  388. package/dist/utils/request-handler.js.map +0 -1
  389. package/dist/utils/schema.d.ts +0 -11
  390. package/dist/utils/schema.d.ts.map +0 -1
  391. package/dist/utils/schema.js +0 -51
  392. package/dist/utils/schema.js.map +0 -1
  393. package/dist/utils/stream-progress.d.ts +0 -17
  394. package/dist/utils/stream-progress.d.ts.map +0 -1
  395. package/dist/utils/stream-progress.js +0 -86
  396. package/dist/utils/stream-progress.js.map +0 -1
  397. package/dist/utils/validation.d.ts +0 -3
  398. package/dist/utils/validation.d.ts.map +0 -1
  399. package/dist/utils/validation.js +0 -30
  400. package/dist/utils/validation.js.map +0 -1
@@ -0,0 +1,273 @@
1
+ /**
2
+ * BatchQueue - Deferred execution queue for batch processing
3
+ *
4
+ * Collects AI operations and submits them to provider batch APIs
5
+ * for cost-effective processing (typically 50% discount, 24hr turnaround).
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * // Create a batch queue
10
+ * const batch = createBatch({ provider: 'openai' })
11
+ *
12
+ * // Add items to the batch (these are deferred, not executed)
13
+ * const titles = await list`10 blog post titles about startups`
14
+ * const posts = titles.map(title => batch.add(write`blog post about ${title}`))
15
+ *
16
+ * // Submit the batch - returns job info
17
+ * const job = await batch.submit()
18
+ * console.log(job.id) // batch_abc123
19
+ *
20
+ * // Poll for results or use webhook
21
+ * const results = await batch.wait()
22
+ * ```
23
+ *
24
+ * @packageDocumentation
25
+ */
26
+ import type { FunctionOptions } from './template.js';
27
+ import type { SimpleSchema } from './schema.js';
28
+ /** Batch processing mode */
29
+ export type BatchMode = 'sync' | 'async' | 'background';
30
+ /** Supported batch providers */
31
+ export type BatchProvider = 'openai' | 'anthropic' | 'google' | 'bedrock' | 'cloudflare';
32
+ /** Status of a batch job */
33
+ export type BatchStatus = 'pending' | 'validating' | 'in_progress' | 'finalizing' | 'completed' | 'failed' | 'expired' | 'cancelling' | 'cancelled';
34
+ /** Individual item in a batch */
35
+ export interface BatchItem<T = unknown> {
36
+ /** Unique ID for this item */
37
+ id: string;
38
+ /** The prompt to process */
39
+ prompt: string;
40
+ /** Schema for structured output */
41
+ schema?: SimpleSchema;
42
+ /** Generation options */
43
+ options?: FunctionOptions;
44
+ /** Custom metadata */
45
+ metadata?: Record<string, unknown>;
46
+ /** Resolved value (after completion) */
47
+ result?: T;
48
+ /** Error if failed */
49
+ error?: string;
50
+ /** Status of this item */
51
+ status: 'pending' | 'completed' | 'failed';
52
+ }
53
+ /** Batch job information */
54
+ export interface BatchJob {
55
+ /** Unique batch ID */
56
+ id: string;
57
+ /** Provider this batch was submitted to */
58
+ provider: BatchProvider;
59
+ /** Current status */
60
+ status: BatchStatus;
61
+ /** Number of items in the batch */
62
+ totalItems: number;
63
+ /** Number of completed items */
64
+ completedItems: number;
65
+ /** Number of failed items */
66
+ failedItems: number;
67
+ /** When the batch was created */
68
+ createdAt: Date;
69
+ /** When the batch started processing */
70
+ startedAt?: Date;
71
+ /** When the batch completed */
72
+ completedAt?: Date;
73
+ /** Expected completion time */
74
+ expiresAt?: Date;
75
+ /** Webhook URL for completion notification */
76
+ webhookUrl?: string;
77
+ /** Input file ID (for OpenAI) */
78
+ inputFileId?: string;
79
+ /** Output file ID (for OpenAI) */
80
+ outputFileId?: string;
81
+ /** Error file ID (for OpenAI) */
82
+ errorFileId?: string;
83
+ }
84
+ /** Result of a batch submission */
85
+ export interface BatchSubmitResult {
86
+ job: BatchJob;
87
+ /** Promise that resolves when batch is complete */
88
+ completion: Promise<BatchResult[]>;
89
+ }
90
+ /** Result of a single item in the batch */
91
+ export interface BatchResult<T = unknown> {
92
+ /** Item ID */
93
+ id: string;
94
+ /** Custom ID if provided */
95
+ customId?: string;
96
+ /** Status */
97
+ status: 'completed' | 'failed';
98
+ /** The result (if successful) */
99
+ result?: T;
100
+ /** Error message (if failed) */
101
+ error?: string;
102
+ /** Token usage */
103
+ usage?: {
104
+ promptTokens: number;
105
+ completionTokens: number;
106
+ totalTokens: number;
107
+ };
108
+ }
109
+ /** Options for creating a batch queue */
110
+ export interface BatchQueueOptions {
111
+ /** Provider to use for batch processing */
112
+ provider?: BatchProvider;
113
+ /** Model to use */
114
+ model?: string;
115
+ /** Webhook URL for completion notification */
116
+ webhookUrl?: string;
117
+ /** Custom metadata for the batch */
118
+ metadata?: Record<string, unknown>;
119
+ /** Maximum items per batch (provider-specific limits) */
120
+ maxItems?: number;
121
+ /** Auto-submit when queue reaches maxItems */
122
+ autoSubmit?: boolean;
123
+ }
124
+ /**
125
+ * BatchQueue collects AI operations for deferred batch execution
126
+ */
127
+ export declare class BatchQueue {
128
+ private items;
129
+ private options;
130
+ private idCounter;
131
+ private submitted;
132
+ private job;
133
+ constructor(options?: BatchQueueOptions);
134
+ /**
135
+ * Add an item to the batch queue
136
+ * Returns a placeholder that will be resolved after batch completion
137
+ */
138
+ add<T = unknown>(prompt: string, options?: {
139
+ schema?: SimpleSchema;
140
+ options?: FunctionOptions;
141
+ customId?: string;
142
+ metadata?: Record<string, unknown>;
143
+ }): BatchItem<T>;
144
+ /**
145
+ * Get all items in the queue
146
+ */
147
+ getItems(): BatchItem[];
148
+ /**
149
+ * Get the number of items in the queue
150
+ */
151
+ get size(): number;
152
+ /**
153
+ * Check if the batch has been submitted
154
+ */
155
+ get isSubmitted(): boolean;
156
+ /**
157
+ * Get the batch job info (after submission)
158
+ */
159
+ getJob(): BatchJob | null;
160
+ /**
161
+ * Submit the batch to the provider
162
+ */
163
+ submit(): Promise<BatchSubmitResult>;
164
+ /**
165
+ * Cancel the batch (if supported by provider)
166
+ */
167
+ cancel(): Promise<void>;
168
+ /**
169
+ * Get the current status of the batch
170
+ */
171
+ getStatus(): Promise<BatchJob>;
172
+ /**
173
+ * Wait for the batch to complete and return results
174
+ */
175
+ wait(pollInterval?: number): Promise<BatchResult[]>;
176
+ }
177
+ /**
178
+ * Interface for provider-specific batch implementations
179
+ */
180
+ export interface BatchAdapter {
181
+ /** Submit a batch to the provider */
182
+ submit(items: BatchItem[], options: BatchQueueOptions): Promise<BatchSubmitResult>;
183
+ /** Get the status of a batch */
184
+ getStatus(batchId: string): Promise<BatchJob>;
185
+ /** Cancel a batch */
186
+ cancel(batchId: string): Promise<void>;
187
+ /** Get results of a completed batch */
188
+ getResults(batchId: string): Promise<BatchResult[]>;
189
+ /** Wait for batch completion */
190
+ waitForCompletion(batchId: string, pollInterval?: number): Promise<BatchResult[]>;
191
+ }
192
+ /**
193
+ * Interface for flex processing (faster than batch, ~50% discount)
194
+ * Available for OpenAI and AWS Bedrock
195
+ */
196
+ export interface FlexAdapter {
197
+ /**
198
+ * Submit items for flex processing
199
+ * Flex is faster than batch (minutes vs hours) but has same discount
200
+ *
201
+ * @param items - Items to process
202
+ * @param options - Processing options
203
+ * @returns Results (resolves when all items complete)
204
+ */
205
+ submitFlex(items: BatchItem[], options: {
206
+ model?: string;
207
+ }): Promise<BatchResult[]>;
208
+ }
209
+ /**
210
+ * Register a batch adapter for a provider
211
+ */
212
+ export declare function registerBatchAdapter(provider: BatchProvider, adapter: BatchAdapter): void;
213
+ /**
214
+ * Register a flex adapter for a provider
215
+ */
216
+ export declare function registerFlexAdapter(provider: BatchProvider, adapter: FlexAdapter): void;
217
+ /**
218
+ * Get the batch adapter for a provider
219
+ */
220
+ export declare function getBatchAdapter(provider: BatchProvider): BatchAdapter;
221
+ /**
222
+ * Get the flex adapter for a provider
223
+ */
224
+ export declare function getFlexAdapter(provider: BatchProvider): FlexAdapter;
225
+ /**
226
+ * Check if flex is available for a provider
227
+ */
228
+ export declare function hasFlexAdapter(provider: BatchProvider): boolean;
229
+ /**
230
+ * Create a new batch queue
231
+ *
232
+ * @example
233
+ * ```ts
234
+ * const batch = createBatch({ provider: 'openai' })
235
+ * batch.add('Write a poem about cats')
236
+ * batch.add('Write a poem about dogs')
237
+ * const { job } = await batch.submit()
238
+ * const results = await batch.wait()
239
+ * ```
240
+ */
241
+ export declare function createBatch(options?: BatchQueueOptions): BatchQueue;
242
+ /**
243
+ * Execute operations in batch mode
244
+ *
245
+ * @example
246
+ * ```ts
247
+ * const results = await withBatch(async (batch) => {
248
+ * const titles = ['TypeScript', 'React', 'Next.js']
249
+ * return titles.map(title => batch.add(`Write a blog post about ${title}`))
250
+ * })
251
+ * ```
252
+ */
253
+ export declare function withBatch<T>(fn: (batch: BatchQueue) => T[] | Promise<T[]>, options?: BatchQueueOptions): Promise<BatchResult<T>[]>;
254
+ /** Symbol to mark an AIPromise as batched/deferred */
255
+ export declare const BATCH_MODE_SYMBOL: unique symbol;
256
+ /** Options for deferred execution */
257
+ export interface DeferredOptions extends FunctionOptions {
258
+ /** Batch queue to add to */
259
+ batch?: BatchQueue;
260
+ /** Custom ID for this item in the batch */
261
+ customId?: string;
262
+ }
263
+ /**
264
+ * Check if we're in batch mode
265
+ */
266
+ export declare function isBatchMode(options?: DeferredOptions): boolean;
267
+ /**
268
+ * Add an operation to the batch queue instead of executing immediately
269
+ */
270
+ export declare function deferToBatch<T>(batch: BatchQueue, prompt: string, schema: SimpleSchema | undefined, options?: FunctionOptions & {
271
+ customId?: string;
272
+ }): BatchItem<T>;
273
+ //# sourceMappingURL=batch-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-queue.d.ts","sourceRoot":"","sources":["../src/batch-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,271 @@
1
+ /**
2
+ * BatchQueue - Deferred execution queue for batch processing
3
+ *
4
+ * Collects AI operations and submits them to provider batch APIs
5
+ * for cost-effective processing (typically 50% discount, 24hr turnaround).
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * // Create a batch queue
10
+ * const batch = createBatch({ provider: 'openai' })
11
+ *
12
+ * // Add items to the batch (these are deferred, not executed)
13
+ * const titles = await list`10 blog post titles about startups`
14
+ * const posts = titles.map(title => batch.add(write`blog post about ${title}`))
15
+ *
16
+ * // Submit the batch - returns job info
17
+ * const job = await batch.submit()
18
+ * console.log(job.id) // batch_abc123
19
+ *
20
+ * // Poll for results or use webhook
21
+ * const results = await batch.wait()
22
+ * ```
23
+ *
24
+ * @packageDocumentation
25
+ */
26
+ // ============================================================================
27
+ // BatchQueue Implementation
28
+ // ============================================================================
29
+ /**
30
+ * BatchQueue collects AI operations for deferred batch execution
31
+ */
32
+ export class BatchQueue {
33
+ items = [];
34
+ options;
35
+ idCounter = 0;
36
+ submitted = false;
37
+ job = null;
38
+ constructor(options = {}) {
39
+ this.options = {
40
+ provider: 'openai',
41
+ maxItems: 50000, // OpenAI's limit
42
+ autoSubmit: false,
43
+ ...options,
44
+ };
45
+ }
46
+ /**
47
+ * Add an item to the batch queue
48
+ * Returns a placeholder that will be resolved after batch completion
49
+ */
50
+ add(prompt, options) {
51
+ if (this.submitted) {
52
+ throw new Error('Cannot add items to a submitted batch');
53
+ }
54
+ const item = {
55
+ id: options?.customId || `item_${++this.idCounter}`,
56
+ prompt,
57
+ schema: options?.schema,
58
+ options: options?.options,
59
+ metadata: options?.metadata,
60
+ status: 'pending',
61
+ };
62
+ this.items.push(item);
63
+ // Auto-submit if we hit the limit
64
+ if (this.options.autoSubmit && this.items.length >= (this.options.maxItems || 50000)) {
65
+ // Fire and forget - user can await the completion promise
66
+ this.submit().catch(console.error);
67
+ }
68
+ return item;
69
+ }
70
+ /**
71
+ * Get all items in the queue
72
+ */
73
+ getItems() {
74
+ return [...this.items];
75
+ }
76
+ /**
77
+ * Get the number of items in the queue
78
+ */
79
+ get size() {
80
+ return this.items.length;
81
+ }
82
+ /**
83
+ * Check if the batch has been submitted
84
+ */
85
+ get isSubmitted() {
86
+ return this.submitted;
87
+ }
88
+ /**
89
+ * Get the batch job info (after submission)
90
+ */
91
+ getJob() {
92
+ return this.job;
93
+ }
94
+ /**
95
+ * Submit the batch to the provider
96
+ */
97
+ async submit() {
98
+ if (this.submitted) {
99
+ throw new Error('Batch has already been submitted');
100
+ }
101
+ if (this.items.length === 0) {
102
+ throw new Error('Cannot submit empty batch');
103
+ }
104
+ this.submitted = true;
105
+ // Get the appropriate batch adapter
106
+ const adapter = getBatchAdapter(this.options.provider || 'openai');
107
+ // Submit the batch
108
+ const result = await adapter.submit(this.items, this.options);
109
+ this.job = result.job;
110
+ // When completion resolves, update item statuses
111
+ result.completion.then((results) => {
112
+ for (const r of results) {
113
+ const item = this.items.find((i) => i.id === r.id);
114
+ if (item) {
115
+ item.status = r.status;
116
+ item.result = r.result;
117
+ item.error = r.error;
118
+ }
119
+ }
120
+ });
121
+ return result;
122
+ }
123
+ /**
124
+ * Cancel the batch (if supported by provider)
125
+ */
126
+ async cancel() {
127
+ if (!this.job) {
128
+ throw new Error('Batch has not been submitted');
129
+ }
130
+ const adapter = getBatchAdapter(this.options.provider || 'openai');
131
+ await adapter.cancel(this.job.id);
132
+ this.job.status = 'cancelling';
133
+ }
134
+ /**
135
+ * Get the current status of the batch
136
+ */
137
+ async getStatus() {
138
+ if (!this.job) {
139
+ throw new Error('Batch has not been submitted');
140
+ }
141
+ const adapter = getBatchAdapter(this.options.provider || 'openai');
142
+ this.job = await adapter.getStatus(this.job.id);
143
+ return this.job;
144
+ }
145
+ /**
146
+ * Wait for the batch to complete and return results
147
+ */
148
+ async wait(pollInterval = 5000) {
149
+ if (!this.job) {
150
+ throw new Error('Batch has not been submitted');
151
+ }
152
+ const adapter = getBatchAdapter(this.options.provider || 'openai');
153
+ return adapter.waitForCompletion(this.job.id, pollInterval);
154
+ }
155
+ }
156
+ // Adapter registry
157
+ const adapters = {
158
+ openai: null,
159
+ anthropic: null,
160
+ google: null,
161
+ bedrock: null,
162
+ cloudflare: null,
163
+ };
164
+ // Flex adapter registry (only OpenAI and Bedrock support flex)
165
+ const flexAdapters = {
166
+ openai: null,
167
+ anthropic: null,
168
+ google: null,
169
+ bedrock: null,
170
+ cloudflare: null,
171
+ };
172
+ /**
173
+ * Register a batch adapter for a provider
174
+ */
175
+ export function registerBatchAdapter(provider, adapter) {
176
+ adapters[provider] = adapter;
177
+ }
178
+ /**
179
+ * Register a flex adapter for a provider
180
+ */
181
+ export function registerFlexAdapter(provider, adapter) {
182
+ flexAdapters[provider] = adapter;
183
+ }
184
+ /**
185
+ * Get the batch adapter for a provider
186
+ */
187
+ export function getBatchAdapter(provider) {
188
+ const adapter = adapters[provider];
189
+ if (!adapter) {
190
+ throw new Error(`No batch adapter registered for provider: ${provider}. ` +
191
+ `Import the adapter: import 'ai-functions/batch/${provider}'`);
192
+ }
193
+ return adapter;
194
+ }
195
+ /**
196
+ * Get the flex adapter for a provider
197
+ */
198
+ export function getFlexAdapter(provider) {
199
+ const adapter = flexAdapters[provider];
200
+ if (!adapter) {
201
+ throw new Error(`No flex adapter registered for provider: ${provider}. ` +
202
+ `Flex processing is only available for OpenAI and AWS Bedrock.`);
203
+ }
204
+ return adapter;
205
+ }
206
+ /**
207
+ * Check if flex is available for a provider
208
+ */
209
+ export function hasFlexAdapter(provider) {
210
+ return flexAdapters[provider] !== null;
211
+ }
212
+ // ============================================================================
213
+ // Factory Functions
214
+ // ============================================================================
215
+ /**
216
+ * Create a new batch queue
217
+ *
218
+ * @example
219
+ * ```ts
220
+ * const batch = createBatch({ provider: 'openai' })
221
+ * batch.add('Write a poem about cats')
222
+ * batch.add('Write a poem about dogs')
223
+ * const { job } = await batch.submit()
224
+ * const results = await batch.wait()
225
+ * ```
226
+ */
227
+ export function createBatch(options) {
228
+ return new BatchQueue(options);
229
+ }
230
+ /**
231
+ * Execute operations in batch mode
232
+ *
233
+ * @example
234
+ * ```ts
235
+ * const results = await withBatch(async (batch) => {
236
+ * const titles = ['TypeScript', 'React', 'Next.js']
237
+ * return titles.map(title => batch.add(`Write a blog post about ${title}`))
238
+ * })
239
+ * ```
240
+ */
241
+ export async function withBatch(fn, options) {
242
+ const batch = createBatch(options);
243
+ const items = await fn(batch);
244
+ if (batch.size === 0) {
245
+ return [];
246
+ }
247
+ const { completion } = await batch.submit();
248
+ return completion;
249
+ }
250
+ // ============================================================================
251
+ // Deferred Execution Support
252
+ // ============================================================================
253
+ /** Symbol to mark an AIPromise as batched/deferred */
254
+ export const BATCH_MODE_SYMBOL = Symbol.for('ai-batch-mode');
255
+ /**
256
+ * Check if we're in batch mode
257
+ */
258
+ export function isBatchMode(options) {
259
+ return !!options?.batch;
260
+ }
261
+ /**
262
+ * Add an operation to the batch queue instead of executing immediately
263
+ */
264
+ export function deferToBatch(batch, prompt, schema, options) {
265
+ return batch.add(prompt, {
266
+ schema,
267
+ options,
268
+ customId: options?.customId,
269
+ });
270
+ }
271
+ //# sourceMappingURL=batch-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-queue.js","sourceRoot":"","sources":["../src/batch-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Execution Context for AI Functions
3
+ *
4
+ * Provides configuration without polluting function signatures.
5
+ * Settings flow from environment → global context → local context.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * // Set global defaults (from environment or initialization)
10
+ * configure({
11
+ * provider: 'anthropic',
12
+ * model: 'claude-sonnet-4-20250514',
13
+ * batchMode: 'auto', // 'auto' | 'immediate' | 'deferred'
14
+ * })
15
+ *
16
+ * // Or use execution context for specific operations
17
+ * await withContext({ provider: 'openai', model: 'gpt-4o' }, async () => {
18
+ * const titles = await list`10 blog titles`
19
+ * return titles.map(title => write`blog post: ${title}`)
20
+ * })
21
+ * ```
22
+ *
23
+ * @packageDocumentation
24
+ */
25
+ import type { FunctionOptions } from './template.js';
26
+ import type { BatchProvider } from './batch-queue.js';
27
+ /** Batch execution mode */
28
+ export type BatchMode = 'auto' | 'immediate' | 'flex' | 'deferred';
29
+ /** Execution context configuration */
30
+ export interface ExecutionContext extends FunctionOptions {
31
+ /** Batch provider to use */
32
+ provider?: BatchProvider;
33
+ /** Batch execution mode */
34
+ batchMode?: BatchMode;
35
+ /** Minimum items to use flex processing (for 'auto' mode, default: 5) */
36
+ flexThreshold?: number;
37
+ /** Minimum items to use batch API (for 'auto' mode, default: 500) */
38
+ batchThreshold?: number;
39
+ /** Webhook URL for batch completion notifications */
40
+ webhookUrl?: string;
41
+ /** Custom metadata for batch jobs */
42
+ metadata?: Record<string, unknown>;
43
+ }
44
+ /**
45
+ * Configure global defaults for AI functions
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * configure({
50
+ * model: 'claude-sonnet-4-20250514',
51
+ * provider: 'anthropic',
52
+ * batchMode: 'auto',
53
+ * batchThreshold: 5,
54
+ * })
55
+ * ```
56
+ */
57
+ export declare function configure(context: ExecutionContext): void;
58
+ /**
59
+ * Get the current global context
60
+ */
61
+ export declare function getGlobalContext(): ExecutionContext;
62
+ /**
63
+ * Reset global context to defaults
64
+ */
65
+ export declare function resetContext(): void;
66
+ /**
67
+ * Get the current execution context
68
+ * Merges: environment defaults → global context → local context
69
+ */
70
+ export declare function getContext(): ExecutionContext;
71
+ /**
72
+ * Run a function with a specific execution context
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * const posts = await withContext({ provider: 'openai', batchMode: 'deferred' }, async () => {
77
+ * const titles = await list`10 blog titles`
78
+ * return titles.map(title => write`blog post: ${title}`)
79
+ * })
80
+ * ```
81
+ */
82
+ export declare function withContext<T>(context: ExecutionContext, fn: () => T | Promise<T>): T | Promise<T>;
83
+ /**
84
+ * Get the effective model from context
85
+ */
86
+ export declare function getModel(): string;
87
+ /**
88
+ * Get the effective provider from context
89
+ */
90
+ export declare function getProvider(): BatchProvider;
91
+ /**
92
+ * Get the effective batch mode from context
93
+ */
94
+ export declare function getBatchMode(): BatchMode;
95
+ /**
96
+ * Get the flex threshold from context (minimum items to use flex)
97
+ * Default: 5 items
98
+ */
99
+ export declare function getFlexThreshold(): number;
100
+ /**
101
+ * Get the batch threshold from context (minimum items to use full batch)
102
+ * Default: 500 items
103
+ */
104
+ export declare function getBatchThreshold(): number;
105
+ /** Execution tier for processing */
106
+ export type ExecutionTier = 'immediate' | 'flex' | 'batch';
107
+ /**
108
+ * Determine the execution tier for a given number of items
109
+ *
110
+ * Auto mode tiers:
111
+ * - immediate: < flexThreshold (default 5) - concurrent requests, full price
112
+ * - flex: flexThreshold to batchThreshold (5-500) - ~50% discount, minutes
113
+ * - batch: >= batchThreshold (500+) - 50% discount, up to 24hr
114
+ *
115
+ * @example
116
+ * ```ts
117
+ * getExecutionTier(3) // 'immediate' (< 5)
118
+ * getExecutionTier(50) // 'flex' (5-500)
119
+ * getExecutionTier(1000) // 'batch' (500+)
120
+ * ```
121
+ */
122
+ export declare function getExecutionTier(itemCount: number): ExecutionTier;
123
+ /**
124
+ * Check if we should use the batch API for a given number of items
125
+ * @deprecated Use getExecutionTier() instead for more granular control
126
+ */
127
+ export declare function shouldUseBatchAPI(itemCount: number): boolean;
128
+ /**
129
+ * Check if flex processing is available for the current provider
130
+ * Only OpenAI and AWS Bedrock support flex processing currently
131
+ */
132
+ export declare function isFlexAvailable(): boolean;
133
+ //# sourceMappingURL=context.d.ts.map