ai-functions 2.1.1 → 2.3.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 (286) hide show
  1. package/.turbo/turbo-build.log +1 -4
  2. package/CHANGELOG.md +68 -1
  3. package/README.md +397 -157
  4. package/dist/ai-promise.d.ts +50 -3
  5. package/dist/ai-promise.d.ts.map +1 -1
  6. package/dist/ai-promise.js +410 -51
  7. package/dist/ai-promise.js.map +1 -1
  8. package/dist/ai-schemas.d.ts +56 -0
  9. package/dist/ai-schemas.d.ts.map +1 -0
  10. package/dist/ai-schemas.js +53 -0
  11. package/dist/ai-schemas.js.map +1 -0
  12. package/dist/ai.d.ts +16 -242
  13. package/dist/ai.d.ts.map +1 -1
  14. package/dist/ai.js +54 -837
  15. package/dist/ai.js.map +1 -1
  16. package/dist/batch/anthropic.d.ts +6 -4
  17. package/dist/batch/anthropic.d.ts.map +1 -1
  18. package/dist/batch/anthropic.js +83 -145
  19. package/dist/batch/anthropic.js.map +1 -1
  20. package/dist/batch/bedrock.d.ts +8 -30
  21. package/dist/batch/bedrock.d.ts.map +1 -1
  22. package/dist/batch/bedrock.js +155 -338
  23. package/dist/batch/bedrock.js.map +1 -1
  24. package/dist/batch/cloudflare.d.ts +8 -20
  25. package/dist/batch/cloudflare.d.ts.map +1 -1
  26. package/dist/batch/cloudflare.js +68 -189
  27. package/dist/batch/cloudflare.js.map +1 -1
  28. package/dist/batch/google.d.ts +6 -20
  29. package/dist/batch/google.d.ts.map +1 -1
  30. package/dist/batch/google.js +70 -238
  31. package/dist/batch/google.js.map +1 -1
  32. package/dist/batch/index.d.ts +4 -1
  33. package/dist/batch/index.d.ts.map +1 -1
  34. package/dist/batch/index.js +4 -1
  35. package/dist/batch/index.js.map +1 -1
  36. package/dist/batch/memory.d.ts +1 -1
  37. package/dist/batch/memory.d.ts.map +1 -1
  38. package/dist/batch/memory.js +14 -10
  39. package/dist/batch/memory.js.map +1 -1
  40. package/dist/batch/openai.d.ts +11 -14
  41. package/dist/batch/openai.d.ts.map +1 -1
  42. package/dist/batch/openai.js +52 -156
  43. package/dist/batch/openai.js.map +1 -1
  44. package/dist/batch/provider.d.ts +111 -0
  45. package/dist/batch/provider.d.ts.map +1 -0
  46. package/dist/batch/provider.js +233 -0
  47. package/dist/batch/provider.js.map +1 -0
  48. package/dist/batch-map.d.ts.map +1 -1
  49. package/dist/batch-map.js +23 -17
  50. package/dist/batch-map.js.map +1 -1
  51. package/dist/batch-queue.d.ts +65 -0
  52. package/dist/batch-queue.d.ts.map +1 -1
  53. package/dist/batch-queue.js +169 -14
  54. package/dist/batch-queue.js.map +1 -1
  55. package/dist/budget.d.ts +272 -0
  56. package/dist/budget.d.ts.map +1 -0
  57. package/dist/budget.js +513 -0
  58. package/dist/budget.js.map +1 -0
  59. package/dist/cache.d.ts +295 -0
  60. package/dist/cache.d.ts.map +1 -0
  61. package/dist/cache.js +433 -0
  62. package/dist/cache.js.map +1 -0
  63. package/dist/context.d.ts +42 -8
  64. package/dist/context.d.ts.map +1 -1
  65. package/dist/context.js +64 -62
  66. package/dist/context.js.map +1 -1
  67. package/dist/digital-objects-registry.d.ts +229 -0
  68. package/dist/digital-objects-registry.d.ts.map +1 -0
  69. package/dist/digital-objects-registry.js +617 -0
  70. package/dist/digital-objects-registry.js.map +1 -0
  71. package/dist/embeddings.d.ts +2 -2
  72. package/dist/embeddings.d.ts.map +1 -1
  73. package/dist/errors.d.ts +22 -0
  74. package/dist/errors.d.ts.map +1 -0
  75. package/dist/errors.js +35 -0
  76. package/dist/errors.js.map +1 -0
  77. package/dist/eval/runner.d.ts +10 -1
  78. package/dist/eval/runner.d.ts.map +1 -1
  79. package/dist/eval/runner.js +41 -35
  80. package/dist/eval/runner.js.map +1 -1
  81. package/dist/eval-log/in-memory.d.ts +34 -0
  82. package/dist/eval-log/in-memory.d.ts.map +1 -0
  83. package/dist/eval-log/in-memory.js +84 -0
  84. package/dist/eval-log/in-memory.js.map +1 -0
  85. package/dist/eval-log/index.d.ts +29 -0
  86. package/dist/eval-log/index.d.ts.map +1 -0
  87. package/dist/eval-log/index.js +39 -0
  88. package/dist/eval-log/index.js.map +1 -0
  89. package/dist/eval-log/types.d.ts +101 -0
  90. package/dist/eval-log/types.d.ts.map +1 -0
  91. package/dist/eval-log/types.js +16 -0
  92. package/dist/eval-log/types.js.map +1 -0
  93. package/dist/function-registry.d.ts +116 -0
  94. package/dist/function-registry.d.ts.map +1 -0
  95. package/dist/function-registry.js +546 -0
  96. package/dist/function-registry.js.map +1 -0
  97. package/dist/generate.d.ts +9 -3
  98. package/dist/generate.d.ts.map +1 -1
  99. package/dist/generate.js +18 -22
  100. package/dist/generate.js.map +1 -1
  101. package/dist/index.d.ts +35 -20
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +89 -42
  104. package/dist/index.js.map +1 -1
  105. package/dist/logger.d.ts +118 -0
  106. package/dist/logger.d.ts.map +1 -0
  107. package/dist/logger.js +187 -0
  108. package/dist/logger.js.map +1 -0
  109. package/dist/middleware/budget.d.ts +84 -0
  110. package/dist/middleware/budget.d.ts.map +1 -0
  111. package/dist/middleware/budget.js +110 -0
  112. package/dist/middleware/budget.js.map +1 -0
  113. package/dist/middleware/cache.d.ts +103 -0
  114. package/dist/middleware/cache.d.ts.map +1 -0
  115. package/dist/middleware/cache.js +228 -0
  116. package/dist/middleware/cache.js.map +1 -0
  117. package/dist/middleware/embed-cache.d.ts +99 -0
  118. package/dist/middleware/embed-cache.d.ts.map +1 -0
  119. package/dist/middleware/embed-cache.js +128 -0
  120. package/dist/middleware/embed-cache.js.map +1 -0
  121. package/dist/middleware/index.d.ts +11 -0
  122. package/dist/middleware/index.d.ts.map +1 -0
  123. package/dist/middleware/index.js +11 -0
  124. package/dist/middleware/index.js.map +1 -0
  125. package/dist/middleware/trace.d.ts +103 -0
  126. package/dist/middleware/trace.d.ts.map +1 -0
  127. package/dist/middleware/trace.js +176 -0
  128. package/dist/middleware/trace.js.map +1 -0
  129. package/dist/primitives.d.ts +120 -1
  130. package/dist/primitives.d.ts.map +1 -1
  131. package/dist/primitives.js +398 -26
  132. package/dist/primitives.js.map +1 -1
  133. package/dist/retry.d.ts +368 -0
  134. package/dist/retry.d.ts.map +1 -0
  135. package/dist/retry.js +646 -0
  136. package/dist/retry.js.map +1 -0
  137. package/dist/schema.d.ts.map +1 -1
  138. package/dist/schema.js +2 -10
  139. package/dist/schema.js.map +1 -1
  140. package/dist/telemetry.d.ts +128 -0
  141. package/dist/telemetry.d.ts.map +1 -0
  142. package/dist/telemetry.js +285 -0
  143. package/dist/telemetry.js.map +1 -0
  144. package/dist/template.d.ts.map +1 -1
  145. package/dist/template.js +6 -1
  146. package/dist/template.js.map +1 -1
  147. package/dist/tool-orchestration.d.ts +453 -0
  148. package/dist/tool-orchestration.d.ts.map +1 -0
  149. package/dist/tool-orchestration.js +763 -0
  150. package/dist/tool-orchestration.js.map +1 -0
  151. package/dist/type-guards.d.ts +28 -0
  152. package/dist/type-guards.d.ts.map +1 -0
  153. package/dist/type-guards.js +29 -0
  154. package/dist/type-guards.js.map +1 -0
  155. package/dist/types.d.ts +135 -17
  156. package/dist/types.d.ts.map +1 -1
  157. package/dist/types.js +36 -1
  158. package/dist/types.js.map +1 -1
  159. package/dist/wrap-for-v3.d.ts +80 -0
  160. package/dist/wrap-for-v3.d.ts.map +1 -0
  161. package/dist/wrap-for-v3.js +89 -0
  162. package/dist/wrap-for-v3.js.map +1 -0
  163. package/examples/00-quickstart.ts +232 -0
  164. package/examples/01-rag-chatbot.ts +212 -0
  165. package/examples/02-multi-agent-research.ts +290 -0
  166. package/examples/03-email-classification.ts +379 -0
  167. package/examples/04-content-moderation.ts +400 -0
  168. package/examples/05-document-extraction.ts +455 -0
  169. package/examples/06-streaming-chat-nextjs.ts +437 -0
  170. package/examples/07-cloudflare-worker.ts +483 -0
  171. package/examples/08-batch-processing.ts +491 -0
  172. package/examples/09-budget-constrained.ts +527 -0
  173. package/examples/10-tool-orchestration.ts +565 -0
  174. package/examples/11-retry-resilience.ts +403 -0
  175. package/examples/12-caching-strategies.ts +422 -0
  176. package/examples/README.md +145 -0
  177. package/package.json +10 -6
  178. package/src/ai-promise.ts +528 -99
  179. package/src/ai-schemas.ts +122 -0
  180. package/src/ai.ts +69 -1153
  181. package/src/batch/anthropic.ts +96 -161
  182. package/src/batch/bedrock.ts +203 -454
  183. package/src/batch/cloudflare.ts +99 -282
  184. package/src/batch/google.ts +91 -297
  185. package/src/batch/index.ts +4 -1
  186. package/src/batch/memory.ts +15 -10
  187. package/src/batch/openai.ts +65 -193
  188. package/src/batch/provider.ts +336 -0
  189. package/src/batch-map.ts +29 -24
  190. package/src/batch-queue.ts +200 -11
  191. package/src/budget.ts +740 -0
  192. package/src/cache.ts +681 -0
  193. package/src/context.ts +122 -76
  194. package/src/digital-objects-registry.ts +750 -0
  195. package/src/errors.ts +37 -0
  196. package/src/eval/runner.ts +63 -38
  197. package/src/eval-log/in-memory.ts +90 -0
  198. package/src/eval-log/index.ts +46 -0
  199. package/src/eval-log/types.ts +110 -0
  200. package/src/function-registry.ts +671 -0
  201. package/src/generate.ts +33 -33
  202. package/src/index.ts +325 -49
  203. package/src/logger.ts +232 -0
  204. package/src/middleware/budget.ts +171 -0
  205. package/src/middleware/cache.ts +299 -0
  206. package/src/middleware/embed-cache.ts +195 -0
  207. package/src/middleware/index.ts +23 -0
  208. package/src/middleware/trace.ts +248 -0
  209. package/src/primitives.ts +589 -62
  210. package/src/retry.ts +902 -0
  211. package/src/schema.ts +8 -17
  212. package/src/telemetry.ts +403 -0
  213. package/src/template.ts +8 -4
  214. package/src/tool-orchestration.ts +1173 -0
  215. package/src/type-guards.ts +31 -0
  216. package/src/types.ts +164 -25
  217. package/src/wrap-for-v3.ts +105 -0
  218. package/test/ai-promise.test.ts +1080 -0
  219. package/test/ai-proxy.test.ts +1 -1
  220. package/test/backward-compat.test.ts +147 -0
  221. package/test/batch-autosubmit-errors.test.ts +610 -0
  222. package/test/batch-blog-posts.test.ts +87 -129
  223. package/test/budget-tracking.test.ts +800 -0
  224. package/test/cache.test.ts +712 -0
  225. package/test/context-isolation.test.ts +687 -0
  226. package/test/core-functions.test.ts +183 -579
  227. package/test/decide.test.ts +154 -322
  228. package/test/define.test.ts +211 -8
  229. package/test/digital-objects-registry.test.ts +760 -0
  230. package/test/embedding-cache-middleware.test.ts +140 -0
  231. package/test/evals/deterministic.eval.test.ts +376 -0
  232. package/test/generate-core.test.ts +140 -229
  233. package/test/implicit-batch.test.ts +22 -65
  234. package/test/json-parse-error-handling.test.ts +463 -0
  235. package/test/retry-policy-integration.test.ts +117 -0
  236. package/test/retry.test.ts +1016 -0
  237. package/test/schema.test.ts +55 -19
  238. package/test/streaming.test.ts +316 -0
  239. package/test/template.test.ts +1164 -0
  240. package/test/tool-orchestration.test.ts +1040 -0
  241. package/test/wrap-for-v3.test.ts +612 -0
  242. package/vitest.config.js +6 -0
  243. package/vitest.config.ts +20 -0
  244. package/dist/rpc/auth.d.ts +0 -69
  245. package/dist/rpc/auth.d.ts.map +0 -1
  246. package/dist/rpc/auth.js +0 -136
  247. package/dist/rpc/auth.js.map +0 -1
  248. package/dist/rpc/client.d.ts +0 -62
  249. package/dist/rpc/client.d.ts.map +0 -1
  250. package/dist/rpc/client.js +0 -103
  251. package/dist/rpc/client.js.map +0 -1
  252. package/dist/rpc/deferred.d.ts +0 -60
  253. package/dist/rpc/deferred.d.ts.map +0 -1
  254. package/dist/rpc/deferred.js +0 -96
  255. package/dist/rpc/deferred.js.map +0 -1
  256. package/dist/rpc/index.d.ts +0 -22
  257. package/dist/rpc/index.d.ts.map +0 -1
  258. package/dist/rpc/index.js +0 -38
  259. package/dist/rpc/index.js.map +0 -1
  260. package/dist/rpc/local.d.ts +0 -42
  261. package/dist/rpc/local.d.ts.map +0 -1
  262. package/dist/rpc/local.js +0 -50
  263. package/dist/rpc/local.js.map +0 -1
  264. package/dist/rpc/server.d.ts +0 -165
  265. package/dist/rpc/server.d.ts.map +0 -1
  266. package/dist/rpc/server.js +0 -405
  267. package/dist/rpc/server.js.map +0 -1
  268. package/dist/rpc/session.d.ts +0 -32
  269. package/dist/rpc/session.d.ts.map +0 -1
  270. package/dist/rpc/session.js +0 -43
  271. package/dist/rpc/session.js.map +0 -1
  272. package/dist/rpc/transport.d.ts +0 -306
  273. package/dist/rpc/transport.d.ts.map +0 -1
  274. package/dist/rpc/transport.js +0 -731
  275. package/dist/rpc/transport.js.map +0 -1
  276. package/src/batch/anthropic.js +0 -256
  277. package/src/batch/bedrock.js +0 -584
  278. package/src/batch/cloudflare.js +0 -287
  279. package/src/batch/google.js +0 -359
  280. package/src/batch/index.js +0 -30
  281. package/src/batch/memory.js +0 -187
  282. package/src/batch/openai.js +0 -402
  283. package/src/eval/index.js +0 -7
  284. package/src/eval/models.js +0 -119
  285. package/src/eval/runner.js +0 -147
  286. package/test/schema.test.js +0 -96
package/src/context.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Execution Context for AI Functions
3
3
  *
4
- * Provides configuration without polluting function signatures.
5
- * Settings flow from environment global context local context.
4
+ * Standalone context module with batch processing and budget tracking features.
5
+ * Settings flow from environment -> global context -> local context.
6
6
  *
7
7
  * @example
8
8
  * ```ts
@@ -23,24 +23,60 @@
23
23
  * @packageDocumentation
24
24
  */
25
25
 
26
- import type { FunctionOptions } from './template.js'
27
26
  import type { BatchProvider } from './batch-queue.js'
27
+ import type { RequestContext as IRequestContext, ModelPricing } from './budget.js'
28
28
 
29
29
  // ============================================================================
30
- // Types
30
+ // Core Types (from template.ts equivalent)
31
+ // ============================================================================
32
+
33
+ /**
34
+ * Common options for all AI functions
35
+ */
36
+ export interface FunctionOptions {
37
+ /** Model to use (e.g., 'claude-opus-4-5', 'gpt-5-1', 'gemini-3-pro') */
38
+ model?: string
39
+ /** Thinking level: 'none', 'low', 'medium', 'high', or token budget number */
40
+ thinking?: 'none' | 'low' | 'medium' | 'high' | number
41
+ /** Temperature (0-2) */
42
+ temperature?: number
43
+ /** Maximum tokens to generate */
44
+ maxTokens?: number
45
+ /** System prompt */
46
+ system?: string
47
+ /** Processing mode */
48
+ mode?: 'default' | 'background'
49
+ }
50
+
51
+ // ============================================================================
52
+ // Extended Types for Batch Processing
31
53
  // ============================================================================
32
54
 
33
55
  /** Batch execution mode */
34
56
  export type BatchMode =
35
- | 'auto' // Smart selection: immediate < flexThreshold, flex < batchThreshold, batch above
36
- | 'immediate' // Execute immediately (concurrent requests, full price)
37
- | 'flex' // Use flex processing (faster than batch, ~50% discount, minutes)
38
- | 'deferred' // Always use provider batch API (50% discount, up to 24hr)
57
+ | 'auto' // Smart selection: immediate < flexThreshold, flex < batchThreshold, batch above
58
+ | 'immediate' // Execute immediately (concurrent requests, full price)
59
+ | 'flex' // Use flex processing (faster than batch, ~50% discount, minutes)
60
+ | 'deferred' // Always use provider batch API (50% discount, up to 24hr)
61
+
62
+ /** Budget configuration for context */
63
+ export interface ContextBudgetConfig {
64
+ /** Maximum total tokens allowed */
65
+ maxTokens?: number
66
+ /** Maximum cost in USD */
67
+ maxCost?: number
68
+ /** Alert thresholds as fractions (e.g., [0.5, 0.8, 1.0]) */
69
+ alertThresholds?: number[]
70
+ /** Custom pricing for models not in default pricing table */
71
+ customPricing?: Record<string, ModelPricing>
72
+ }
39
73
 
40
- /** Execution context configuration */
74
+ /**
75
+ * Execution context with batch processing and budget features.
76
+ */
41
77
  export interface ExecutionContext extends FunctionOptions {
42
- /** Batch provider to use */
43
- provider?: BatchProvider
78
+ /** Provider to use (for model resolution) */
79
+ provider?: BatchProvider | string
44
80
  /** Batch execution mode */
45
81
  batchMode?: BatchMode
46
82
  /** Minimum items to use flex processing (for 'auto' mode, default: 5) */
@@ -51,6 +87,10 @@ export interface ExecutionContext extends FunctionOptions {
51
87
  webhookUrl?: string
52
88
  /** Custom metadata for batch jobs */
53
89
  metadata?: Record<string, unknown>
90
+ /** Budget configuration for tracking and limits */
91
+ budget?: ContextBudgetConfig
92
+ /** Request context for tracing */
93
+ requestContext?: IRequestContext
54
94
  }
55
95
 
56
96
  // ============================================================================
@@ -103,18 +143,6 @@ let asyncLocalStorage: {
103
143
  // Lazy initialization of AsyncLocalStorage
104
144
  let asyncLocalStorageInitialized = false
105
145
 
106
- async function initAsyncLocalStorage(): Promise<void> {
107
- if (asyncLocalStorageInitialized) return
108
- asyncLocalStorageInitialized = true
109
-
110
- try {
111
- const { AsyncLocalStorage } = await import('async_hooks')
112
- asyncLocalStorage = new AsyncLocalStorage<ExecutionContext>()
113
- } catch {
114
- // Not in Node.js environment, use global context only
115
- }
116
- }
117
-
118
146
  // Initialize synchronously if possible (for Node.js environments)
119
147
  if (typeof process !== 'undefined' && process.versions?.node) {
120
148
  import('async_hooks')
@@ -127,16 +155,80 @@ if (typeof process !== 'undefined' && process.versions?.node) {
127
155
  })
128
156
  }
129
157
 
158
+ // ============================================================================
159
+ // Environment Defaults
160
+ // ============================================================================
161
+
162
+ function getEnvContext(): ExecutionContext {
163
+ if (typeof process === 'undefined') return {}
164
+
165
+ const context: ExecutionContext = {}
166
+
167
+ // Model defaults
168
+ if (process.env['AI_MODEL']) {
169
+ context.model = process.env['AI_MODEL']
170
+ }
171
+
172
+ // Provider defaults
173
+ if (process.env['AI_PROVIDER']) {
174
+ context.provider = process.env['AI_PROVIDER']
175
+ } else if (process.env['ANTHROPIC_API_KEY'] && !process.env['OPENAI_API_KEY']) {
176
+ context.provider = 'anthropic'
177
+ } else if (process.env['OPENAI_API_KEY']) {
178
+ context.provider = 'openai'
179
+ } else if (process.env['CLOUDFLARE_API_TOKEN']) {
180
+ context.provider = 'cloudflare'
181
+ } else if (process.env['AWS_ACCESS_KEY_ID']) {
182
+ context.provider = 'bedrock'
183
+ }
184
+
185
+ return context
186
+ }
187
+
188
+ function getEnvBatchContext(): Partial<ExecutionContext> {
189
+ if (typeof process === 'undefined') return {}
190
+
191
+ const context: Partial<ExecutionContext> = {}
192
+
193
+ // Batch mode
194
+ if (process.env['AI_BATCH_MODE']) {
195
+ context.batchMode = process.env['AI_BATCH_MODE'] as BatchMode
196
+ }
197
+
198
+ // Flex threshold (when to start using flex processing)
199
+ if (process.env['AI_FLEX_THRESHOLD']) {
200
+ context.flexThreshold = parseInt(process.env['AI_FLEX_THRESHOLD'], 10)
201
+ }
202
+
203
+ // Batch threshold (when to switch from flex to full batch)
204
+ if (process.env['AI_BATCH_THRESHOLD']) {
205
+ context.batchThreshold = parseInt(process.env['AI_BATCH_THRESHOLD'], 10)
206
+ }
207
+
208
+ // Webhook URL
209
+ if (process.env['AI_BATCH_WEBHOOK_URL']) {
210
+ context.webhookUrl = process.env['AI_BATCH_WEBHOOK_URL']
211
+ }
212
+
213
+ return context
214
+ }
215
+
216
+ // ============================================================================
217
+ // Context Functions
218
+ // ============================================================================
219
+
130
220
  /**
131
221
  * Get the current execution context
132
- * Merges: environment defaults global context local context
222
+ * Merges: environment defaults -> global context -> local context
133
223
  */
134
224
  export function getContext(): ExecutionContext {
135
225
  const envContext = getEnvContext()
226
+ const envBatchContext = getEnvBatchContext()
136
227
  const localContext = asyncLocalStorage?.getStore()
137
228
 
138
229
  return {
139
230
  ...envContext,
231
+ ...envBatchContext,
140
232
  ...globalContext,
141
233
  ...localContext,
142
234
  }
@@ -173,56 +265,6 @@ export function withContext<T>(
173
265
  }
174
266
  }
175
267
 
176
- // ============================================================================
177
- // Environment Defaults
178
- // ============================================================================
179
-
180
- function getEnvContext(): ExecutionContext {
181
- if (typeof process === 'undefined') return {}
182
-
183
- const context: ExecutionContext = {}
184
-
185
- // Model defaults
186
- if (process.env.AI_MODEL) {
187
- context.model = process.env.AI_MODEL
188
- }
189
-
190
- // Provider defaults
191
- if (process.env.AI_PROVIDER) {
192
- context.provider = process.env.AI_PROVIDER as BatchProvider
193
- } else if (process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY) {
194
- context.provider = 'anthropic'
195
- } else if (process.env.OPENAI_API_KEY) {
196
- context.provider = 'openai'
197
- } else if (process.env.CLOUDFLARE_API_TOKEN) {
198
- context.provider = 'cloudflare'
199
- } else if (process.env.AWS_ACCESS_KEY_ID) {
200
- context.provider = 'bedrock'
201
- }
202
-
203
- // Batch mode
204
- if (process.env.AI_BATCH_MODE) {
205
- context.batchMode = process.env.AI_BATCH_MODE as BatchMode
206
- }
207
-
208
- // Flex threshold (when to start using flex processing)
209
- if (process.env.AI_FLEX_THRESHOLD) {
210
- context.flexThreshold = parseInt(process.env.AI_FLEX_THRESHOLD, 10)
211
- }
212
-
213
- // Batch threshold (when to switch from flex to full batch)
214
- if (process.env.AI_BATCH_THRESHOLD) {
215
- context.batchThreshold = parseInt(process.env.AI_BATCH_THRESHOLD, 10)
216
- }
217
-
218
- // Webhook URL
219
- if (process.env.AI_BATCH_WEBHOOK_URL) {
220
- context.webhookUrl = process.env.AI_BATCH_WEBHOOK_URL
221
- }
222
-
223
- return context
224
- }
225
-
226
268
  // ============================================================================
227
269
  // Context Helpers
228
270
  // ============================================================================
@@ -236,13 +278,17 @@ export function getModel(): string {
236
278
  }
237
279
 
238
280
  /**
239
- * Get the effective provider from context
281
+ * Get the effective provider from context (typed as BatchProvider)
240
282
  */
241
283
  export function getProvider(): BatchProvider {
242
284
  const ctx = getContext()
243
- return ctx.provider || 'openai'
285
+ return (ctx.provider || 'openai') as BatchProvider
244
286
  }
245
287
 
288
+ // ============================================================================
289
+ // Batch-Specific Context Helpers
290
+ // ============================================================================
291
+
246
292
  /**
247
293
  * Get the effective batch mode from context
248
294
  */