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 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAMrD,2BAA2B;AAC3B,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,WAAW,GACX,MAAM,GACN,UAAU,CAAA;AAEd,sCAAsC;AACtC,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAQD;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,CAEnD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAuCD;;;GAGG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,CAS7C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,OAAO,EAAE,gBAAgB,EACzB,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAehB;AAwDD;;GAEG;AACH,wBAAgB,QAAQ,IAAI,MAAM,CAGjC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,aAAa,CAG3C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAGxC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAGzC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C;AAED,oCAAoC;AACpC,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAA;AAE1D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAwBjE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC"}
@@ -0,0 +1,267 @@
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
+ // ============================================================================
26
+ // Global Context
27
+ // ============================================================================
28
+ let globalContext = {};
29
+ /**
30
+ * Configure global defaults for AI functions
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * configure({
35
+ * model: 'claude-sonnet-4-20250514',
36
+ * provider: 'anthropic',
37
+ * batchMode: 'auto',
38
+ * batchThreshold: 5,
39
+ * })
40
+ * ```
41
+ */
42
+ export function configure(context) {
43
+ globalContext = { ...globalContext, ...context };
44
+ }
45
+ /**
46
+ * Get the current global context
47
+ */
48
+ export function getGlobalContext() {
49
+ return { ...globalContext };
50
+ }
51
+ /**
52
+ * Reset global context to defaults
53
+ */
54
+ export function resetContext() {
55
+ globalContext = {};
56
+ }
57
+ // ============================================================================
58
+ // Async Local Storage for Execution Context
59
+ // ============================================================================
60
+ // Use AsyncLocalStorage if available (Node.js), otherwise fallback to global
61
+ let asyncLocalStorage = null;
62
+ // Lazy initialization of AsyncLocalStorage
63
+ let asyncLocalStorageInitialized = false;
64
+ async function initAsyncLocalStorage() {
65
+ if (asyncLocalStorageInitialized)
66
+ return;
67
+ asyncLocalStorageInitialized = true;
68
+ try {
69
+ const { AsyncLocalStorage } = await import('async_hooks');
70
+ asyncLocalStorage = new AsyncLocalStorage();
71
+ }
72
+ catch {
73
+ // Not in Node.js environment, use global context only
74
+ }
75
+ }
76
+ // Initialize synchronously if possible (for Node.js environments)
77
+ if (typeof process !== 'undefined' && process.versions?.node) {
78
+ import('async_hooks')
79
+ .then(({ AsyncLocalStorage }) => {
80
+ asyncLocalStorage = new AsyncLocalStorage();
81
+ asyncLocalStorageInitialized = true;
82
+ })
83
+ .catch(() => {
84
+ asyncLocalStorageInitialized = true;
85
+ });
86
+ }
87
+ /**
88
+ * Get the current execution context
89
+ * Merges: environment defaults → global context → local context
90
+ */
91
+ export function getContext() {
92
+ const envContext = getEnvContext();
93
+ const localContext = asyncLocalStorage?.getStore();
94
+ return {
95
+ ...envContext,
96
+ ...globalContext,
97
+ ...localContext,
98
+ };
99
+ }
100
+ /**
101
+ * Run a function with a specific execution context
102
+ *
103
+ * @example
104
+ * ```ts
105
+ * const posts = await withContext({ provider: 'openai', batchMode: 'deferred' }, async () => {
106
+ * const titles = await list`10 blog titles`
107
+ * return titles.map(title => write`blog post: ${title}`)
108
+ * })
109
+ * ```
110
+ */
111
+ export function withContext(context, fn) {
112
+ const mergedContext = { ...getContext(), ...context };
113
+ if (asyncLocalStorage) {
114
+ return asyncLocalStorage.run(mergedContext, fn);
115
+ }
116
+ // Fallback: temporarily modify global context
117
+ const previousContext = globalContext;
118
+ globalContext = mergedContext;
119
+ try {
120
+ return fn();
121
+ }
122
+ finally {
123
+ globalContext = previousContext;
124
+ }
125
+ }
126
+ // ============================================================================
127
+ // Environment Defaults
128
+ // ============================================================================
129
+ function getEnvContext() {
130
+ if (typeof process === 'undefined')
131
+ return {};
132
+ const context = {};
133
+ // Model defaults
134
+ if (process.env.AI_MODEL) {
135
+ context.model = process.env.AI_MODEL;
136
+ }
137
+ // Provider defaults
138
+ if (process.env.AI_PROVIDER) {
139
+ context.provider = process.env.AI_PROVIDER;
140
+ }
141
+ else if (process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY) {
142
+ context.provider = 'anthropic';
143
+ }
144
+ else if (process.env.OPENAI_API_KEY) {
145
+ context.provider = 'openai';
146
+ }
147
+ else if (process.env.CLOUDFLARE_API_TOKEN) {
148
+ context.provider = 'cloudflare';
149
+ }
150
+ else if (process.env.AWS_ACCESS_KEY_ID) {
151
+ context.provider = 'bedrock';
152
+ }
153
+ // Batch mode
154
+ if (process.env.AI_BATCH_MODE) {
155
+ context.batchMode = process.env.AI_BATCH_MODE;
156
+ }
157
+ // Flex threshold (when to start using flex processing)
158
+ if (process.env.AI_FLEX_THRESHOLD) {
159
+ context.flexThreshold = parseInt(process.env.AI_FLEX_THRESHOLD, 10);
160
+ }
161
+ // Batch threshold (when to switch from flex to full batch)
162
+ if (process.env.AI_BATCH_THRESHOLD) {
163
+ context.batchThreshold = parseInt(process.env.AI_BATCH_THRESHOLD, 10);
164
+ }
165
+ // Webhook URL
166
+ if (process.env.AI_BATCH_WEBHOOK_URL) {
167
+ context.webhookUrl = process.env.AI_BATCH_WEBHOOK_URL;
168
+ }
169
+ return context;
170
+ }
171
+ // ============================================================================
172
+ // Context Helpers
173
+ // ============================================================================
174
+ /**
175
+ * Get the effective model from context
176
+ */
177
+ export function getModel() {
178
+ const ctx = getContext();
179
+ return ctx.model || 'sonnet';
180
+ }
181
+ /**
182
+ * Get the effective provider from context
183
+ */
184
+ export function getProvider() {
185
+ const ctx = getContext();
186
+ return ctx.provider || 'openai';
187
+ }
188
+ /**
189
+ * Get the effective batch mode from context
190
+ */
191
+ export function getBatchMode() {
192
+ const ctx = getContext();
193
+ return ctx.batchMode || 'auto';
194
+ }
195
+ /**
196
+ * Get the flex threshold from context (minimum items to use flex)
197
+ * Default: 5 items
198
+ */
199
+ export function getFlexThreshold() {
200
+ const ctx = getContext();
201
+ return ctx.flexThreshold || 5;
202
+ }
203
+ /**
204
+ * Get the batch threshold from context (minimum items to use full batch)
205
+ * Default: 500 items
206
+ */
207
+ export function getBatchThreshold() {
208
+ const ctx = getContext();
209
+ return ctx.batchThreshold || 500;
210
+ }
211
+ /**
212
+ * Determine the execution tier for a given number of items
213
+ *
214
+ * Auto mode tiers:
215
+ * - immediate: < flexThreshold (default 5) - concurrent requests, full price
216
+ * - flex: flexThreshold to batchThreshold (5-500) - ~50% discount, minutes
217
+ * - batch: >= batchThreshold (500+) - 50% discount, up to 24hr
218
+ *
219
+ * @example
220
+ * ```ts
221
+ * getExecutionTier(3) // 'immediate' (< 5)
222
+ * getExecutionTier(50) // 'flex' (5-500)
223
+ * getExecutionTier(1000) // 'batch' (500+)
224
+ * ```
225
+ */
226
+ export function getExecutionTier(itemCount) {
227
+ const mode = getBatchMode();
228
+ switch (mode) {
229
+ case 'immediate':
230
+ return 'immediate';
231
+ case 'flex':
232
+ return 'flex';
233
+ case 'deferred':
234
+ return 'batch';
235
+ case 'auto':
236
+ default: {
237
+ const flexThreshold = getFlexThreshold();
238
+ const batchThreshold = getBatchThreshold();
239
+ if (itemCount < flexThreshold) {
240
+ return 'immediate';
241
+ }
242
+ else if (itemCount < batchThreshold) {
243
+ return 'flex';
244
+ }
245
+ else {
246
+ return 'batch';
247
+ }
248
+ }
249
+ }
250
+ }
251
+ /**
252
+ * Check if we should use the batch API for a given number of items
253
+ * @deprecated Use getExecutionTier() instead for more granular control
254
+ */
255
+ export function shouldUseBatchAPI(itemCount) {
256
+ const tier = getExecutionTier(itemCount);
257
+ return tier === 'flex' || tier === 'batch';
258
+ }
259
+ /**
260
+ * Check if flex processing is available for the current provider
261
+ * Only OpenAI and AWS Bedrock support flex processing currently
262
+ */
263
+ export function isFlexAvailable() {
264
+ const provider = getProvider();
265
+ return provider === 'openai' || provider === 'bedrock' || provider === 'google';
266
+ }
267
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Embedding utilities from AI SDK
3
+ *
4
+ * Re-exports embed, embedMany, and cosineSimilarity from the Vercel AI SDK
5
+ * with additional convenience wrappers.
6
+ *
7
+ * Default model: Cloudflare Workers AI @cf/baai/bge-m3
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ export { embed, embedMany, cosineSimilarity } from 'ai';
12
+ export type { EmbeddingModel, Embedding } from 'ai';
13
+ export { cloudflare, cloudflareEmbedding, DEFAULT_CF_EMBEDDING_MODEL } from 'ai-providers/cloudflare';
14
+ /**
15
+ * Get the default embedding model (Cloudflare @cf/baai/bge-m3)
16
+ */
17
+ export declare function getDefaultEmbeddingModel(): import("ai").EmbeddingModel<string>;
18
+ /**
19
+ * Embed a single value using the default Cloudflare model
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { embedText } from 'ai-functions'
24
+ *
25
+ * const { embedding } = await embedText('hello world')
26
+ * ```
27
+ */
28
+ export declare function embedText(value: string): Promise<import("ai").EmbedResult<string>>;
29
+ /**
30
+ * Embed multiple values using the default Cloudflare model
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * import { embedTexts } from 'ai-functions'
35
+ *
36
+ * const { embeddings } = await embedTexts(['doc1', 'doc2', 'doc3'])
37
+ * ```
38
+ */
39
+ export declare function embedTexts(values: string[]): Promise<import("ai").EmbedManyResult<string>>;
40
+ /**
41
+ * Result of an embed operation
42
+ */
43
+ export interface EmbedResult<T = string> {
44
+ /** The original input value */
45
+ value: T;
46
+ /** The generated embedding vector */
47
+ embedding: number[];
48
+ /** Token usage */
49
+ usage: {
50
+ tokens: number;
51
+ };
52
+ }
53
+ /**
54
+ * Result of an embedMany operation
55
+ */
56
+ export interface EmbedManyResult<T = string> {
57
+ /** The original input values */
58
+ values: T[];
59
+ /** The generated embedding vectors */
60
+ embeddings: number[][];
61
+ /** Token usage */
62
+ usage: {
63
+ tokens: number;
64
+ };
65
+ }
66
+ /**
67
+ * Find the most similar items to a query embedding
68
+ *
69
+ * @example
70
+ * ```ts
71
+ * import { embed, embedMany, findSimilar } from 'ai-functions'
72
+ *
73
+ * const documents = ['doc1', 'doc2', 'doc3']
74
+ * const { embeddings } = await embedMany({ model, values: documents })
75
+ * const { embedding: queryEmbedding } = await embed({ model, value: 'search query' })
76
+ *
77
+ * const results = findSimilar(queryEmbedding, embeddings, documents, { topK: 2 })
78
+ * // [{ item: 'doc1', score: 0.95, index: 0 }, { item: 'doc2', score: 0.82, index: 1 }]
79
+ * ```
80
+ */
81
+ export declare function findSimilar<T>(queryEmbedding: number[], embeddings: number[][], items: T[], options?: {
82
+ /** Number of results to return (default: 10) */
83
+ topK?: number;
84
+ /** Minimum similarity score (default: 0) */
85
+ minScore?: number;
86
+ }): Array<{
87
+ item: T;
88
+ score: number;
89
+ index: number;
90
+ }>;
91
+ /**
92
+ * Calculate pairwise similarities between all embeddings
93
+ *
94
+ * @example
95
+ * ```ts
96
+ * const matrix = pairwiseSimilarity(embeddings)
97
+ * // matrix[i][j] = similarity between embeddings[i] and embeddings[j]
98
+ * ```
99
+ */
100
+ export declare function pairwiseSimilarity(embeddings: number[][]): number[][];
101
+ /**
102
+ * Cluster embeddings by similarity using a simple threshold-based approach
103
+ *
104
+ * @example
105
+ * ```ts
106
+ * const clusters = clusterBySimilarity(embeddings, items, { threshold: 0.8 })
107
+ * // [[item1, item2], [item3], [item4, item5, item6]]
108
+ * ```
109
+ */
110
+ export declare function clusterBySimilarity<T>(embeddings: number[][], items: T[], options?: {
111
+ /** Similarity threshold for clustering (default: 0.8) */
112
+ threshold?: number;
113
+ }): T[][];
114
+ /**
115
+ * Average multiple embeddings into a single embedding
116
+ * Useful for creating document embeddings from chunk embeddings
117
+ */
118
+ export declare function averageEmbeddings(embeddings: number[][]): number[];
119
+ /**
120
+ * Normalize an embedding to unit length
121
+ */
122
+ export declare function normalizeEmbedding(embedding: number[]): number[];
123
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,IAAI,CAAA;AAGvD,YAAY,EACV,cAAc,EACd,SAAS,EACV,MAAM,IAAI,CAAA;AAGX,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAKrG;;GAEG;AACH,wBAAgB,wBAAwB,wCAEvC;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,6CAK5C;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,iDAKhD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,MAAM;IACrC,+BAA+B;IAC/B,KAAK,EAAE,CAAC,CAAA;IACR,qCAAqC;IACrC,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,kBAAkB;IAClB,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM;IACzC,gCAAgC;IAChC,MAAM,EAAE,CAAC,EAAE,CAAA;IACX,sCAAsC;IACtC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAA;IACtB,kBAAkB;IAClB,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAA;KACf,CAAA;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,cAAc,EAAE,MAAM,EAAE,EACxB,UAAU,EAAE,MAAM,EAAE,EAAE,EACtB,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,GAAE;IACP,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAA;CACb,GACL,KAAK,CAAC;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAgBrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,UAAU,EAAE,MAAM,EAAE,EAAE,EACtB,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,GAAE;IACP,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAA;CACd,GACL,CAAC,EAAE,EAAE,CA4BP;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,CAkBlE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAIhE"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Embedding utilities from AI SDK
3
+ *
4
+ * Re-exports embed, embedMany, and cosineSimilarity from the Vercel AI SDK
5
+ * with additional convenience wrappers.
6
+ *
7
+ * Default model: Cloudflare Workers AI @cf/baai/bge-m3
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ // Re-export core embedding functions from AI SDK
12
+ export { embed, embedMany, cosineSimilarity } from 'ai';
13
+ // Re-export Cloudflare provider from ai-providers
14
+ export { cloudflare, cloudflareEmbedding, DEFAULT_CF_EMBEDDING_MODEL } from 'ai-providers/cloudflare';
15
+ import { embed as aiEmbed, embedMany as aiEmbedMany } from 'ai';
16
+ import { cloudflareEmbedding, DEFAULT_CF_EMBEDDING_MODEL } from 'ai-providers/cloudflare';
17
+ /**
18
+ * Get the default embedding model (Cloudflare @cf/baai/bge-m3)
19
+ */
20
+ export function getDefaultEmbeddingModel() {
21
+ return cloudflareEmbedding(DEFAULT_CF_EMBEDDING_MODEL);
22
+ }
23
+ /**
24
+ * Embed a single value using the default Cloudflare model
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * import { embedText } from 'ai-functions'
29
+ *
30
+ * const { embedding } = await embedText('hello world')
31
+ * ```
32
+ */
33
+ export async function embedText(value) {
34
+ return aiEmbed({
35
+ model: getDefaultEmbeddingModel(),
36
+ value
37
+ });
38
+ }
39
+ /**
40
+ * Embed multiple values using the default Cloudflare model
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * import { embedTexts } from 'ai-functions'
45
+ *
46
+ * const { embeddings } = await embedTexts(['doc1', 'doc2', 'doc3'])
47
+ * ```
48
+ */
49
+ export async function embedTexts(values) {
50
+ return aiEmbedMany({
51
+ model: getDefaultEmbeddingModel(),
52
+ values
53
+ });
54
+ }
55
+ /**
56
+ * Find the most similar items to a query embedding
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * import { embed, embedMany, findSimilar } from 'ai-functions'
61
+ *
62
+ * const documents = ['doc1', 'doc2', 'doc3']
63
+ * const { embeddings } = await embedMany({ model, values: documents })
64
+ * const { embedding: queryEmbedding } = await embed({ model, value: 'search query' })
65
+ *
66
+ * const results = findSimilar(queryEmbedding, embeddings, documents, { topK: 2 })
67
+ * // [{ item: 'doc1', score: 0.95, index: 0 }, { item: 'doc2', score: 0.82, index: 1 }]
68
+ * ```
69
+ */
70
+ export function findSimilar(queryEmbedding, embeddings, items, options = {}) {
71
+ const { topK = 10, minScore = 0 } = options;
72
+ // Import cosineSimilarity dynamically to avoid issues if ai isn't installed
73
+ const { cosineSimilarity } = require('ai');
74
+ const scored = embeddings
75
+ .map((embedding, index) => ({
76
+ item: items[index],
77
+ score: cosineSimilarity(queryEmbedding, embedding),
78
+ index
79
+ }))
80
+ .filter(result => result.score >= minScore)
81
+ .sort((a, b) => b.score - a.score)
82
+ .slice(0, topK);
83
+ return scored;
84
+ }
85
+ /**
86
+ * Calculate pairwise similarities between all embeddings
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * const matrix = pairwiseSimilarity(embeddings)
91
+ * // matrix[i][j] = similarity between embeddings[i] and embeddings[j]
92
+ * ```
93
+ */
94
+ export function pairwiseSimilarity(embeddings) {
95
+ const { cosineSimilarity } = require('ai');
96
+ const n = embeddings.length;
97
+ const matrix = Array(n).fill(null).map(() => Array(n).fill(0));
98
+ for (let i = 0; i < n; i++) {
99
+ matrix[i][i] = 1; // Self-similarity is always 1
100
+ for (let j = i + 1; j < n; j++) {
101
+ const sim = cosineSimilarity(embeddings[i], embeddings[j]);
102
+ matrix[i][j] = sim;
103
+ matrix[j][i] = sim;
104
+ }
105
+ }
106
+ return matrix;
107
+ }
108
+ /**
109
+ * Cluster embeddings by similarity using a simple threshold-based approach
110
+ *
111
+ * @example
112
+ * ```ts
113
+ * const clusters = clusterBySimilarity(embeddings, items, { threshold: 0.8 })
114
+ * // [[item1, item2], [item3], [item4, item5, item6]]
115
+ * ```
116
+ */
117
+ export function clusterBySimilarity(embeddings, items, options = {}) {
118
+ const { threshold = 0.8 } = options;
119
+ const { cosineSimilarity } = require('ai');
120
+ const n = embeddings.length;
121
+ const assigned = new Set();
122
+ const clusters = [];
123
+ for (let i = 0; i < n; i++) {
124
+ if (assigned.has(i))
125
+ continue;
126
+ const cluster = [items[i]];
127
+ assigned.add(i);
128
+ for (let j = i + 1; j < n; j++) {
129
+ if (assigned.has(j))
130
+ continue;
131
+ const sim = cosineSimilarity(embeddings[i], embeddings[j]);
132
+ if (sim >= threshold) {
133
+ cluster.push(items[j]);
134
+ assigned.add(j);
135
+ }
136
+ }
137
+ clusters.push(cluster);
138
+ }
139
+ return clusters;
140
+ }
141
+ /**
142
+ * Average multiple embeddings into a single embedding
143
+ * Useful for creating document embeddings from chunk embeddings
144
+ */
145
+ export function averageEmbeddings(embeddings) {
146
+ if (embeddings.length === 0)
147
+ return [];
148
+ const dim = embeddings[0].length;
149
+ const result = new Array(dim).fill(0);
150
+ for (const embedding of embeddings) {
151
+ for (let i = 0; i < dim; i++) {
152
+ result[i] += embedding[i];
153
+ }
154
+ }
155
+ const n = embeddings.length;
156
+ for (let i = 0; i < dim; i++) {
157
+ result[i] /= n;
158
+ }
159
+ return result;
160
+ }
161
+ /**
162
+ * Normalize an embedding to unit length
163
+ */
164
+ export function normalizeEmbedding(embedding) {
165
+ const magnitude = Math.sqrt(embedding.reduce((sum, val) => sum + val * val, 0));
166
+ if (magnitude === 0)
167
+ return embedding;
168
+ return embedding.map(val => val / magnitude);
169
+ }
170
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * AI Functions Eval Suite
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export * from './models.js';
7
+ export * from './runner.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/eval/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * AI Functions Eval Suite
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export * from './models.js';
7
+ export * from './runner.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eval/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Model Registry for AI Functions Eval Suite
3
+ *
4
+ * Simple model list for running evals across providers.
5
+ * Uses ai-providers/language-models for resolution and pricing.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { type ModelInfo } from 'language-models';
10
+ export type ModelTier = 'best' | 'fast' | 'cheap';
11
+ export interface EvalModel {
12
+ /** Alias or full model ID */
13
+ id: string;
14
+ /** Human-readable name */
15
+ name: string;
16
+ /** Provider slug */
17
+ provider: string;
18
+ /** Capability tier */
19
+ tier: ModelTier;
20
+ /** Optional notes */
21
+ notes?: string;
22
+ }
23
+ /**
24
+ * Core models to test - one per tier per major provider
25
+ * These resolve via ai-providers to OpenRouter or direct SDKs
26
+ *
27
+ * Updated: December 2025
28
+ *
29
+ * Note: Some models use OpenRouter format (provider/model) to avoid
30
+ * resolution issues with provider_model_id mismatches.
31
+ */
32
+ export declare const EVAL_MODELS: EvalModel[];
33
+ /**
34
+ * Get models by tier
35
+ */
36
+ export declare function getModelsByTier(tier: ModelTier): EvalModel[];
37
+ /**
38
+ * Get models by provider
39
+ */
40
+ export declare function getModelsByProvider(provider: string): EvalModel[];
41
+ /**
42
+ * Get model info from language-models package (includes pricing)
43
+ */
44
+ export declare function getModelInfo(id: string): ModelInfo | undefined;
45
+ /**
46
+ * Get pricing for a model (from OpenRouter data)
47
+ */
48
+ export declare function getModelPricing(id: string): {
49
+ prompt: number;
50
+ completion: number;
51
+ } | undefined;
52
+ /**
53
+ * Create evalite variants for model testing
54
+ */
55
+ export declare function createModelVariants(opts?: {
56
+ tiers?: ModelTier[];
57
+ providers?: string[];
58
+ }): Array<{
59
+ name: string;
60
+ input: EvalModel;
61
+ }>;
62
+ /**
63
+ * Get a representative model from each provider for a given tier
64
+ */
65
+ export declare function getRepresentativeModels(tier: ModelTier): EvalModel[];
66
+ //# sourceMappingURL=models.d.ts.map