ai-functions 2.1.3 → 2.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 (284) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +90 -1
  3. package/README.md +38 -0
  4. package/dist/ai-promise.d.ts +3 -3
  5. package/dist/ai-promise.d.ts.map +1 -1
  6. package/dist/ai-promise.js +135 -64
  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 +51 -858
  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.map +1 -1
  56. package/dist/budget.js +27 -14
  57. package/dist/budget.js.map +1 -1
  58. package/dist/cache.d.ts +23 -0
  59. package/dist/cache.d.ts.map +1 -1
  60. package/dist/cache.js +36 -15
  61. package/dist/cache.js.map +1 -1
  62. package/dist/context.d.ts +26 -8
  63. package/dist/context.d.ts.map +1 -1
  64. package/dist/context.js +64 -62
  65. package/dist/context.js.map +1 -1
  66. package/dist/digital-objects-registry.d.ts +229 -0
  67. package/dist/digital-objects-registry.d.ts.map +1 -0
  68. package/dist/digital-objects-registry.js +617 -0
  69. package/dist/digital-objects-registry.js.map +1 -0
  70. package/dist/embeddings.d.ts +2 -2
  71. package/dist/embeddings.d.ts.map +1 -1
  72. package/dist/errors.d.ts +22 -0
  73. package/dist/errors.d.ts.map +1 -0
  74. package/dist/errors.js +35 -0
  75. package/dist/errors.js.map +1 -0
  76. package/dist/eval/runner.d.ts +8 -0
  77. package/dist/eval/runner.d.ts.map +1 -1
  78. package/dist/eval/runner.js +41 -35
  79. package/dist/eval/runner.js.map +1 -1
  80. package/dist/eval-log/in-memory.d.ts +34 -0
  81. package/dist/eval-log/in-memory.d.ts.map +1 -0
  82. package/dist/eval-log/in-memory.js +84 -0
  83. package/dist/eval-log/in-memory.js.map +1 -0
  84. package/dist/eval-log/index.d.ts +29 -0
  85. package/dist/eval-log/index.d.ts.map +1 -0
  86. package/dist/eval-log/index.js +39 -0
  87. package/dist/eval-log/index.js.map +1 -0
  88. package/dist/eval-log/types.d.ts +101 -0
  89. package/dist/eval-log/types.d.ts.map +1 -0
  90. package/dist/eval-log/types.js +16 -0
  91. package/dist/eval-log/types.js.map +1 -0
  92. package/dist/function-registry.d.ts +176 -0
  93. package/dist/function-registry.d.ts.map +1 -0
  94. package/dist/function-registry.js +685 -0
  95. package/dist/function-registry.js.map +1 -0
  96. package/dist/generate.d.ts +9 -3
  97. package/dist/generate.d.ts.map +1 -1
  98. package/dist/generate.js +18 -18
  99. package/dist/generate.js.map +1 -1
  100. package/dist/index.d.ts +18 -11
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +35 -18
  103. package/dist/index.js.map +1 -1
  104. package/dist/logger.d.ts +118 -0
  105. package/dist/logger.d.ts.map +1 -0
  106. package/dist/logger.js +187 -0
  107. package/dist/logger.js.map +1 -0
  108. package/dist/middleware/budget.d.ts +84 -0
  109. package/dist/middleware/budget.d.ts.map +1 -0
  110. package/dist/middleware/budget.js +110 -0
  111. package/dist/middleware/budget.js.map +1 -0
  112. package/dist/middleware/cache.d.ts +103 -0
  113. package/dist/middleware/cache.d.ts.map +1 -0
  114. package/dist/middleware/cache.js +228 -0
  115. package/dist/middleware/cache.js.map +1 -0
  116. package/dist/middleware/embed-cache.d.ts +99 -0
  117. package/dist/middleware/embed-cache.d.ts.map +1 -0
  118. package/dist/middleware/embed-cache.js +128 -0
  119. package/dist/middleware/embed-cache.js.map +1 -0
  120. package/dist/middleware/index.d.ts +11 -0
  121. package/dist/middleware/index.d.ts.map +1 -0
  122. package/dist/middleware/index.js +11 -0
  123. package/dist/middleware/index.js.map +1 -0
  124. package/dist/middleware/trace.d.ts +103 -0
  125. package/dist/middleware/trace.d.ts.map +1 -0
  126. package/dist/middleware/trace.js +176 -0
  127. package/dist/middleware/trace.js.map +1 -0
  128. package/dist/primitives.d.ts +120 -1
  129. package/dist/primitives.d.ts.map +1 -1
  130. package/dist/primitives.js +398 -26
  131. package/dist/primitives.js.map +1 -1
  132. package/dist/retry.d.ts +66 -1
  133. package/dist/retry.d.ts.map +1 -1
  134. package/dist/retry.js +115 -8
  135. package/dist/retry.js.map +1 -1
  136. package/dist/sandbox.d.ts +36 -0
  137. package/dist/sandbox.d.ts.map +1 -0
  138. package/dist/sandbox.js +44 -0
  139. package/dist/sandbox.js.map +1 -0
  140. package/dist/schema.js +2 -2
  141. package/dist/schema.js.map +1 -1
  142. package/dist/telemetry.d.ts +128 -0
  143. package/dist/telemetry.d.ts.map +1 -0
  144. package/dist/telemetry.js +285 -0
  145. package/dist/telemetry.js.map +1 -0
  146. package/dist/template.d.ts.map +1 -1
  147. package/dist/template.js +6 -1
  148. package/dist/template.js.map +1 -1
  149. package/dist/tool-orchestration.d.ts +66 -4
  150. package/dist/tool-orchestration.d.ts.map +1 -1
  151. package/dist/tool-orchestration.js +123 -23
  152. package/dist/tool-orchestration.js.map +1 -1
  153. package/dist/type-guards.d.ts +28 -0
  154. package/dist/type-guards.d.ts.map +1 -0
  155. package/dist/type-guards.js +29 -0
  156. package/dist/type-guards.js.map +1 -0
  157. package/dist/types.d.ts +155 -19
  158. package/dist/types.d.ts.map +1 -1
  159. package/dist/types.js +36 -1
  160. package/dist/types.js.map +1 -1
  161. package/dist/wrap-for-v3.d.ts +80 -0
  162. package/dist/wrap-for-v3.d.ts.map +1 -0
  163. package/dist/wrap-for-v3.js +89 -0
  164. package/dist/wrap-for-v3.js.map +1 -0
  165. package/examples/00-quickstart.ts +232 -0
  166. package/examples/01-rag-chatbot.ts +212 -0
  167. package/examples/02-multi-agent-research.ts +290 -0
  168. package/examples/03-email-classification.ts +379 -0
  169. package/examples/04-content-moderation.ts +400 -0
  170. package/examples/05-document-extraction.ts +455 -0
  171. package/examples/06-streaming-chat-nextjs.ts +437 -0
  172. package/examples/07-cloudflare-worker.ts +483 -0
  173. package/examples/08-batch-processing.ts +491 -0
  174. package/examples/09-budget-constrained.ts +527 -0
  175. package/examples/10-tool-orchestration.ts +565 -0
  176. package/examples/11-retry-resilience.ts +403 -0
  177. package/examples/12-caching-strategies.ts +422 -0
  178. package/examples/README.md +145 -0
  179. package/package.json +29 -25
  180. package/src/ai-promise.ts +226 -140
  181. package/src/ai-schemas.ts +122 -0
  182. package/src/ai.ts +71 -1176
  183. package/src/batch/anthropic.ts +96 -161
  184. package/src/batch/bedrock.ts +203 -454
  185. package/src/batch/cloudflare.ts +99 -282
  186. package/src/batch/google.ts +91 -297
  187. package/src/batch/index.ts +4 -1
  188. package/src/batch/memory.ts +15 -10
  189. package/src/batch/openai.ts +65 -193
  190. package/src/batch/provider.ts +336 -0
  191. package/src/batch-map.ts +29 -24
  192. package/src/batch-queue.ts +200 -11
  193. package/src/budget.ts +31 -18
  194. package/src/cache.ts +45 -17
  195. package/src/context.ts +106 -77
  196. package/src/digital-objects-registry.ts +750 -0
  197. package/src/errors.ts +37 -0
  198. package/src/eval/runner.ts +60 -36
  199. package/src/eval-log/in-memory.ts +90 -0
  200. package/src/eval-log/index.ts +46 -0
  201. package/src/eval-log/types.ts +110 -0
  202. package/src/function-registry.ts +874 -0
  203. package/src/generate.ts +33 -28
  204. package/src/index.ts +122 -21
  205. package/src/logger.ts +232 -0
  206. package/src/middleware/budget.ts +171 -0
  207. package/src/middleware/cache.ts +299 -0
  208. package/src/middleware/embed-cache.ts +195 -0
  209. package/src/middleware/index.ts +23 -0
  210. package/src/middleware/trace.ts +248 -0
  211. package/src/primitives.ts +589 -62
  212. package/src/retry.ts +144 -18
  213. package/src/sandbox.ts +52 -0
  214. package/src/schema.ts +8 -8
  215. package/src/telemetry.ts +403 -0
  216. package/src/template.ts +8 -4
  217. package/src/tool-orchestration.ts +213 -48
  218. package/src/type-guards.ts +31 -0
  219. package/src/types.ts +186 -27
  220. package/src/wrap-for-v3.ts +105 -0
  221. package/test/ai-promise.test.ts +1080 -0
  222. package/test/ai-proxy.test.ts +1 -1
  223. package/test/batch-autosubmit-errors.test.ts +49 -37
  224. package/test/batch-blog-posts.test.ts +87 -129
  225. package/test/core-functions.test.ts +183 -579
  226. package/test/decide.test.ts +154 -322
  227. package/test/define.test.ts +211 -8
  228. package/test/digital-objects-registry.test.ts +760 -0
  229. package/test/embedding-cache-middleware.test.ts +140 -0
  230. package/test/fill-template.test.ts +89 -0
  231. package/test/generate-core.test.ts +140 -229
  232. package/test/implicit-batch.test.ts +22 -65
  233. package/test/retry-policy-integration.test.ts +117 -0
  234. package/test/sandbox-execution.test.ts +155 -0
  235. package/test/schema.test.ts +55 -19
  236. package/test/template.test.ts +1164 -0
  237. package/test/tool-orchestration.test.ts +270 -0
  238. package/test/wrap-for-v3.test.ts +612 -0
  239. package/vitest.config.js +6 -0
  240. package/vitest.config.ts +20 -0
  241. package/LICENSE +0 -21
  242. package/dist/rpc/auth.d.ts +0 -69
  243. package/dist/rpc/auth.d.ts.map +0 -1
  244. package/dist/rpc/auth.js +0 -136
  245. package/dist/rpc/auth.js.map +0 -1
  246. package/dist/rpc/client.d.ts +0 -62
  247. package/dist/rpc/client.d.ts.map +0 -1
  248. package/dist/rpc/client.js +0 -103
  249. package/dist/rpc/client.js.map +0 -1
  250. package/dist/rpc/deferred.d.ts +0 -60
  251. package/dist/rpc/deferred.d.ts.map +0 -1
  252. package/dist/rpc/deferred.js +0 -96
  253. package/dist/rpc/deferred.js.map +0 -1
  254. package/dist/rpc/index.d.ts +0 -22
  255. package/dist/rpc/index.d.ts.map +0 -1
  256. package/dist/rpc/index.js +0 -38
  257. package/dist/rpc/index.js.map +0 -1
  258. package/dist/rpc/local.d.ts +0 -42
  259. package/dist/rpc/local.d.ts.map +0 -1
  260. package/dist/rpc/local.js +0 -50
  261. package/dist/rpc/local.js.map +0 -1
  262. package/dist/rpc/server.d.ts +0 -165
  263. package/dist/rpc/server.d.ts.map +0 -1
  264. package/dist/rpc/server.js +0 -405
  265. package/dist/rpc/server.js.map +0 -1
  266. package/dist/rpc/session.d.ts +0 -32
  267. package/dist/rpc/session.d.ts.map +0 -1
  268. package/dist/rpc/session.js +0 -43
  269. package/dist/rpc/session.js.map +0 -1
  270. package/dist/rpc/transport.d.ts +0 -306
  271. package/dist/rpc/transport.d.ts.map +0 -1
  272. package/dist/rpc/transport.js +0 -731
  273. package/dist/rpc/transport.js.map +0 -1
  274. package/src/batch/anthropic.js +0 -256
  275. package/src/batch/bedrock.js +0 -584
  276. package/src/batch/cloudflare.js +0 -287
  277. package/src/batch/google.js +0 -359
  278. package/src/batch/index.js +0 -30
  279. package/src/batch/memory.js +0 -187
  280. package/src/batch/openai.js +0 -402
  281. package/src/eval/index.js +0 -7
  282. package/src/eval/models.js +0 -119
  283. package/src/eval/runner.js +0 -147
  284. package/test/schema.test.js +0 -96
package/dist/logger.js ADDED
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Configurable Logger for AI Functions
3
+ *
4
+ * Provides a pluggable logging interface that defaults to console but can be
5
+ * configured to use any logging implementation. This allows library consumers
6
+ * to integrate with their own logging infrastructure.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { configureLogger, getLogger } from 'ai-functions'
11
+ *
12
+ * // Use with default console logger
13
+ * const logger = getLogger()
14
+ * logger.warn('Something happened')
15
+ *
16
+ * // Configure a custom logger
17
+ * configureLogger({
18
+ * debug: (msg, ...args) => myLogger.debug(msg, ...args),
19
+ * info: (msg, ...args) => myLogger.info(msg, ...args),
20
+ * warn: (msg, ...args) => myLogger.warn(msg, ...args),
21
+ * error: (msg, ...args) => myLogger.error(msg, ...args),
22
+ * })
23
+ *
24
+ * // Disable logging entirely
25
+ * configureLogger(null)
26
+ * ```
27
+ *
28
+ * @packageDocumentation
29
+ */
30
+ // ============================================================================
31
+ // Logger State
32
+ // ============================================================================
33
+ /** Log level priority (lower = more verbose) */
34
+ const LOG_LEVELS = {
35
+ debug: 0,
36
+ info: 1,
37
+ warn: 2,
38
+ error: 3,
39
+ silent: 4,
40
+ };
41
+ /** Default console-based logger */
42
+ const defaultLogger = {
43
+ debug: (message, ...args) => console.debug(message, ...args),
44
+ info: (message, ...args) => console.info(message, ...args),
45
+ warn: (message, ...args) => console.warn(message, ...args),
46
+ error: (message, ...args) => console.error(message, ...args),
47
+ };
48
+ /** No-op logger for when logging is disabled */
49
+ const noopLogger = {
50
+ debug: () => { },
51
+ info: () => { },
52
+ warn: () => { },
53
+ error: () => { },
54
+ };
55
+ /** Current logger instance */
56
+ let currentLogger = defaultLogger;
57
+ /** Current minimum log level */
58
+ let currentLevel = 'warn';
59
+ // ============================================================================
60
+ // Configuration Functions
61
+ // ============================================================================
62
+ /**
63
+ * Configure the global logger for ai-functions.
64
+ *
65
+ * @param config - Logger configuration or just a logger instance
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * // Use a custom logger
70
+ * configureLogger({
71
+ * logger: {
72
+ * debug: (msg) => myLogger.debug(msg),
73
+ * info: (msg) => myLogger.info(msg),
74
+ * warn: (msg) => myLogger.warn(msg),
75
+ * error: (msg) => myLogger.error(msg),
76
+ * },
77
+ * level: 'info',
78
+ * })
79
+ *
80
+ * // Just set the log level
81
+ * configureLogger({ level: 'debug' })
82
+ *
83
+ * // Disable all logging
84
+ * configureLogger({ logger: null })
85
+ * // or
86
+ * configureLogger({ level: 'silent' })
87
+ *
88
+ * // Reset to defaults
89
+ * configureLogger({})
90
+ * ```
91
+ */
92
+ export function configureLogger(config) {
93
+ // Handle null (disable logging)
94
+ if (config === null) {
95
+ currentLogger = noopLogger;
96
+ return;
97
+ }
98
+ // Handle Logger directly
99
+ if (config && ('debug' in config || 'info' in config || 'warn' in config || 'error' in config)) {
100
+ // Check if it's a Logger (has at least one log method but no 'logger' or 'level' key)
101
+ if (!('logger' in config) && !('level' in config)) {
102
+ currentLogger = config;
103
+ return;
104
+ }
105
+ }
106
+ // Handle LoggerConfig
107
+ const loggerConfig = config;
108
+ if (loggerConfig.logger === null) {
109
+ currentLogger = noopLogger;
110
+ }
111
+ else if (loggerConfig.logger) {
112
+ currentLogger = loggerConfig.logger;
113
+ }
114
+ else if (config === undefined || Object.keys(config).length === 0) {
115
+ // Reset to default
116
+ currentLogger = defaultLogger;
117
+ currentLevel = 'warn';
118
+ return;
119
+ }
120
+ if (loggerConfig.level) {
121
+ currentLevel = loggerConfig.level;
122
+ }
123
+ }
124
+ /**
125
+ * Get the current logger instance.
126
+ *
127
+ * Returns a logger that respects the configured log level.
128
+ * Methods for levels below the configured minimum will be no-ops.
129
+ *
130
+ * @returns Logger instance with level filtering applied
131
+ *
132
+ * @example
133
+ * ```ts
134
+ * const logger = getLogger()
135
+ * logger.warn('This is a warning')
136
+ * logger.error('This is an error', { details: 'foo' })
137
+ * ```
138
+ */
139
+ export function getLogger() {
140
+ const minLevel = LOG_LEVELS[currentLevel] ?? LOG_LEVELS['warn'];
141
+ return {
142
+ debug: (message, ...args) => {
143
+ if (minLevel <= LOG_LEVELS['debug']) {
144
+ currentLogger.debug?.(message, ...args);
145
+ }
146
+ },
147
+ info: (message, ...args) => {
148
+ if (minLevel <= LOG_LEVELS['info']) {
149
+ currentLogger.info?.(message, ...args);
150
+ }
151
+ },
152
+ warn: (message, ...args) => {
153
+ if (minLevel <= LOG_LEVELS['warn']) {
154
+ currentLogger.warn?.(message, ...args);
155
+ }
156
+ },
157
+ error: (message, ...args) => {
158
+ if (minLevel <= LOG_LEVELS['error']) {
159
+ currentLogger.error?.(message, ...args);
160
+ }
161
+ },
162
+ };
163
+ }
164
+ /**
165
+ * Reset the logger to default configuration.
166
+ *
167
+ * Restores the console-based logger with 'warn' minimum level.
168
+ */
169
+ export function resetLogger() {
170
+ currentLogger = defaultLogger;
171
+ currentLevel = 'warn';
172
+ }
173
+ /**
174
+ * Get the current log level
175
+ */
176
+ export function getLogLevel() {
177
+ return currentLevel;
178
+ }
179
+ /**
180
+ * Set the minimum log level
181
+ *
182
+ * @param level - Minimum level to log ('debug' | 'info' | 'warn' | 'error' | 'silent')
183
+ */
184
+ export function setLogLevel(level) {
185
+ currentLevel = level;
186
+ }
187
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * budgetMiddleware — record token usage + cost into a {@link BudgetTracker}
3
+ *
4
+ * Replaces the post-hoc duck-typing in
5
+ * `services-as-software/src/v3/invoke/cost-estimate.ts` with a single
6
+ * AI-SDK-6 middleware: on `doGenerate` / `doStream` completion, read the
7
+ * `LanguageModelV3Usage` shape directly off the result and call
8
+ * `tracker.recordUsage(...)`. The pricing overlay is supplied via
9
+ * `customPricing` on the {@link BudgetTracker} (or we hand the tracker the
10
+ * pricing at construction time when the caller wants per-call isolation).
11
+ *
12
+ * Key V3 → BudgetTracker mapping detail: AI SDK 6 reports
13
+ * `usage.inputTokens.total` / `usage.outputTokens.total` as
14
+ * `number | undefined`. We coerce undefined → 0 so partial-streaming results
15
+ * (where the upstream provider didn't emit token counts) don't blow up the
16
+ * tracker. The `inputTokens.cacheRead` / `inputTokens.cacheWrite` breakdown
17
+ * is *not* propagated yet — round 13+ work to add prompt-cache awareness to
18
+ * BudgetTracker.
19
+ *
20
+ * Composition note: install **after** cache (so a cache hit still records
21
+ * the cost — the wrapped result is the same regardless of which layer
22
+ * served it) and **before** trace (so the trace event sees the final
23
+ * computed cost via the tracker).
24
+ *
25
+ * @packageDocumentation
26
+ */
27
+ import type { LanguageModelV3GenerateResult, LanguageModelV3Middleware } from '@ai-sdk/provider';
28
+ import type { BudgetTracker, ModelPricing } from '../budget.js';
29
+ /**
30
+ * Pricing overlay supplied to the middleware. Mirrors the
31
+ * `BudgetConfig.customPricing` shape — keyed on model id, value is the
32
+ * per-million USD rate. Sourced (in services-as-software) from the
33
+ * `language-models/data/models.json` catalog so Llama / DeepSeek / Mistral /
34
+ * Qwen / Grok / Perplexity Sonar all get their real per-token rate.
35
+ */
36
+ export type PricingOverlay = Record<string, ModelPricing>;
37
+ /** Options for {@link budgetMiddleware}. */
38
+ export interface BudgetMiddlewareOptions {
39
+ /**
40
+ * The {@link BudgetTracker} to record usage into. Required — the
41
+ * middleware never constructs its own tracker (the tracker holds budget
42
+ * limits + alert callbacks, which the caller owns).
43
+ */
44
+ tracker: BudgetTracker;
45
+ /**
46
+ * Pricing overlay (per-model rates). When supplied, takes precedence over
47
+ * the BudgetTracker's own default pricing for any matching model id. Pass
48
+ * the language-models catalog overlay here to extend pricing without
49
+ * mutating the tracker.
50
+ */
51
+ pricing?: PricingOverlay;
52
+ /**
53
+ * Optional override for the model id reported to the tracker. Defaults to
54
+ * `model.modelId` (the wrapped model's underlying id). Pass an alias
55
+ * (`'sonnet'`, `'opus'`) to bridge to the alias-based pricing tables.
56
+ */
57
+ modelIdOverride?: string;
58
+ }
59
+ /**
60
+ * Build a budget middleware for `wrapLanguageModel`. Records
61
+ * {@link LanguageModelV3Usage} into the supplied {@link BudgetTracker} on
62
+ * every successful `doGenerate` / `doStream` completion. Errors from the
63
+ * downstream model propagate unchanged — the tracker is only updated on
64
+ * success.
65
+ *
66
+ * For streaming calls, we accumulate the final `usage` from the `'finish'`
67
+ * stream part (per the V3 spec, the final `'finish'` event carries the
68
+ * authoritative usage shape) and record once on stream end.
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * import { wrapLanguageModel } from 'ai'
73
+ * import { BudgetTracker, budgetMiddleware } from 'ai-functions'
74
+ *
75
+ * const tracker = new BudgetTracker({ maxCost: 1.0 })
76
+ * const model = wrapLanguageModel({
77
+ * model: openai('gpt-4o'),
78
+ * middleware: budgetMiddleware({ tracker }),
79
+ * })
80
+ * ```
81
+ */
82
+ export declare function budgetMiddleware(options: BudgetMiddlewareOptions): LanguageModelV3Middleware;
83
+ export type { LanguageModelV3GenerateResult };
84
+ //# sourceMappingURL=budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/middleware/budget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EACV,6BAA6B,EAC7B,yBAAyB,EAI1B,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAM/D;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;AAEzD,4CAA4C;AAC5C,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,OAAO,EAAE,aAAa,CAAA;IACtB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAuCD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,yBAAyB,CAkC5F;AAID,YAAY,EAAE,6BAA6B,EAAE,CAAA"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * budgetMiddleware — record token usage + cost into a {@link BudgetTracker}
3
+ *
4
+ * Replaces the post-hoc duck-typing in
5
+ * `services-as-software/src/v3/invoke/cost-estimate.ts` with a single
6
+ * AI-SDK-6 middleware: on `doGenerate` / `doStream` completion, read the
7
+ * `LanguageModelV3Usage` shape directly off the result and call
8
+ * `tracker.recordUsage(...)`. The pricing overlay is supplied via
9
+ * `customPricing` on the {@link BudgetTracker} (or we hand the tracker the
10
+ * pricing at construction time when the caller wants per-call isolation).
11
+ *
12
+ * Key V3 → BudgetTracker mapping detail: AI SDK 6 reports
13
+ * `usage.inputTokens.total` / `usage.outputTokens.total` as
14
+ * `number | undefined`. We coerce undefined → 0 so partial-streaming results
15
+ * (where the upstream provider didn't emit token counts) don't blow up the
16
+ * tracker. The `inputTokens.cacheRead` / `inputTokens.cacheWrite` breakdown
17
+ * is *not* propagated yet — round 13+ work to add prompt-cache awareness to
18
+ * BudgetTracker.
19
+ *
20
+ * Composition note: install **after** cache (so a cache hit still records
21
+ * the cost — the wrapped result is the same regardless of which layer
22
+ * served it) and **before** trace (so the trace event sees the final
23
+ * computed cost via the tracker).
24
+ *
25
+ * @packageDocumentation
26
+ */
27
+ // ============================================================================
28
+ // Helpers
29
+ // ============================================================================
30
+ function coerceUsage(usage) {
31
+ if (!usage)
32
+ return { inputTokens: 0, outputTokens: 0 };
33
+ return {
34
+ inputTokens: usage.inputTokens?.total ?? 0,
35
+ outputTokens: usage.outputTokens?.total ?? 0,
36
+ };
37
+ }
38
+ function record(tracker, pricing, modelId, usage) {
39
+ const { inputTokens, outputTokens } = coerceUsage(usage);
40
+ if (inputTokens === 0 && outputTokens === 0)
41
+ return;
42
+ // The pricing overlay is wired in via the tracker's `customPricing`
43
+ // already (set at BudgetTracker construction time by the caller). When
44
+ // the caller wants per-call pricing override, they install
45
+ // `pricing[modelId]` ahead of time. We expose `pricing` here as a
46
+ // forward-looking hook so we can later add per-call pricing without a
47
+ // breaking change.
48
+ void pricing;
49
+ tracker.recordUsage({ inputTokens, outputTokens, model: modelId });
50
+ }
51
+ // ============================================================================
52
+ // Middleware
53
+ // ============================================================================
54
+ /**
55
+ * Build a budget middleware for `wrapLanguageModel`. Records
56
+ * {@link LanguageModelV3Usage} into the supplied {@link BudgetTracker} on
57
+ * every successful `doGenerate` / `doStream` completion. Errors from the
58
+ * downstream model propagate unchanged — the tracker is only updated on
59
+ * success.
60
+ *
61
+ * For streaming calls, we accumulate the final `usage` from the `'finish'`
62
+ * stream part (per the V3 spec, the final `'finish'` event carries the
63
+ * authoritative usage shape) and record once on stream end.
64
+ *
65
+ * @example
66
+ * ```ts
67
+ * import { wrapLanguageModel } from 'ai'
68
+ * import { BudgetTracker, budgetMiddleware } from 'ai-functions'
69
+ *
70
+ * const tracker = new BudgetTracker({ maxCost: 1.0 })
71
+ * const model = wrapLanguageModel({
72
+ * model: openai('gpt-4o'),
73
+ * middleware: budgetMiddleware({ tracker }),
74
+ * })
75
+ * ```
76
+ */
77
+ export function budgetMiddleware(options) {
78
+ const { tracker, pricing, modelIdOverride } = options;
79
+ return {
80
+ specificationVersion: 'v3',
81
+ async wrapGenerate({ doGenerate, model }) {
82
+ const result = await doGenerate();
83
+ const modelId = modelIdOverride ?? model.modelId;
84
+ record(tracker, pricing, modelId, result.usage);
85
+ return result;
86
+ },
87
+ async wrapStream({ doStream, model }) {
88
+ const result = await doStream();
89
+ const modelId = modelIdOverride ?? model.modelId;
90
+ let finalUsage;
91
+ const transformedStream = result.stream.pipeThrough(new TransformStream({
92
+ transform(chunk, controller) {
93
+ if (chunk.type === 'finish') {
94
+ finalUsage = chunk.usage;
95
+ }
96
+ controller.enqueue(chunk);
97
+ },
98
+ flush() {
99
+ record(tracker, pricing, modelId, finalUsage);
100
+ },
101
+ }));
102
+ const wrapped = {
103
+ ...result,
104
+ stream: transformedStream,
105
+ };
106
+ return wrapped;
107
+ },
108
+ };
109
+ }
110
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/middleware/budget.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AA+CH,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,SAAS,WAAW,CAAC,KAAuC;IAI1D,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;IACtD,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC;QAC1C,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC;KAC7C,CAAA;AACH,CAAC;AAED,SAAS,MAAM,CACb,OAAsB,EACtB,OAAmC,EACnC,OAAe,EACf,KAAuC;IAEvC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;IACxD,IAAI,WAAW,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC;QAAE,OAAM;IACnD,oEAAoE;IACpE,uEAAuE;IACvE,2DAA2D;IAC3D,kEAAkE;IAClE,sEAAsE;IACtE,mBAAmB;IACnB,KAAK,OAAO,CAAA;IACZ,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;AACpE,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgC;IAC/D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAA;IACrD,OAAO;QACL,oBAAoB,EAAE,IAAI;QAC1B,KAAK,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE;YACtC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;YACjC,MAAM,OAAO,GAAG,eAAe,IAAI,KAAK,CAAC,OAAO,CAAA;YAChD,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;YAC/C,OAAO,MAAM,CAAA;QACf,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE;YAClC,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,CAAA;YAC/B,MAAM,OAAO,GAAG,eAAe,IAAI,KAAK,CAAC,OAAO,CAAA;YAChD,IAAI,UAA4C,CAAA;YAChD,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CACjD,IAAI,eAAe,CAAuD;gBACxE,SAAS,CAAC,KAAK,EAAE,UAAU;oBACzB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC5B,UAAU,GAAG,KAAK,CAAC,KAAK,CAAA;oBAC1B,CAAC;oBACD,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAC3B,CAAC;gBACD,KAAK;oBACH,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;gBAC/C,CAAC;aACF,CAAC,CACH,CAAA;YACD,MAAM,OAAO,GAAgC;gBAC3C,GAAG,MAAM;gBACT,MAAM,EAAE,iBAAiB;aAC1B,CAAA;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * cacheMiddleware — content-addressable cache for `wrapLanguageModel`
3
+ *
4
+ * Implements the AI SDK cookbook's local-caching-middleware pattern
5
+ * (https://ai-sdk.dev/cookbook/node/local-caching-middleware) on top of the
6
+ * AI SDK 6 `LanguageModelV3Middleware` shape:
7
+ *
8
+ * - **Hit derivation:** content-hash of `{ prompt, modelId, responseFormat }`
9
+ * so a schema change (responseFormat.type === 'json' carries a `schema`
10
+ * JSONSchema7) invalidates the entry. Generation parameters (temperature,
11
+ * topP, etc.) are deliberately *not* part of the key for the eval-fixture
12
+ * use case — flipping temperature shouldn't blow up a 5x verify-time win.
13
+ * Callers who want strict keying should pass a custom `keyHash`.
14
+ *
15
+ * - **Stream support:** cached entries store the `LanguageModelV3StreamPart[]`
16
+ * array; `wrapStream` replays them via `simulateReadableStream` so consumers
17
+ * see the same chunked event sequence on a hit. (`wrapGenerate` is the
18
+ * common path; both share the same cache map.)
19
+ *
20
+ * - **TTL:** 24h default, configurable via `ttlMs`. Entries past TTL are
21
+ * evicted on access (lazy expiry — no background timer).
22
+ *
23
+ * - **Pluggable store:** in-memory default (Map-backed); `'disk'` writes to
24
+ * a JSON file at `.cache/v3-eval-cache.json` for cross-process fixture
25
+ * sharing. Disk reads/writes are best-effort — IO failures fall through
26
+ * to the wrapped model.
27
+ *
28
+ * - **Env gate:** honors `process.env.V3_EVAL_CACHE`. When unset/empty, the
29
+ * middleware short-circuits to a passthrough — useful for production where
30
+ * cache hits would be incorrect but the operator wants the same wrap chain.
31
+ * Set to `'1'` (or any truthy non-empty string) to enable.
32
+ *
33
+ * @packageDocumentation
34
+ */
35
+ import type { LanguageModelV3CallOptions, LanguageModelV3GenerateResult, LanguageModelV3Middleware, LanguageModelV3StreamPart } from '@ai-sdk/provider';
36
+ /** Cached payload — both generate result and stream chunks under one key. */
37
+ interface CacheEntry {
38
+ /** Result captured from `doGenerate`. Absent if the entry came from a stream call. */
39
+ generateResult?: LanguageModelV3GenerateResult;
40
+ /** Stream chunks captured from `doStream` (replayed via simulateReadableStream). */
41
+ streamChunks?: LanguageModelV3StreamPart[];
42
+ /** Insert epoch ms — drives TTL eviction. */
43
+ createdAt: number;
44
+ }
45
+ /** Pluggable cache store for cached LLM results. */
46
+ export interface CacheMiddlewareStore {
47
+ get(key: string): CacheEntry | undefined;
48
+ set(key: string, value: CacheEntry): void;
49
+ delete(key: string): void;
50
+ }
51
+ /** Options for {@link cacheMiddleware}. */
52
+ export interface CacheMiddlewareOptions {
53
+ /**
54
+ * Cache backend. `'memory'` uses a process-local Map; `'disk'` writes to
55
+ * `.cache/v3-eval-cache.json` for cross-process fixture sharing. A custom
56
+ * {@link CacheMiddlewareStore} can be passed instead.
57
+ *
58
+ * @default 'memory'
59
+ */
60
+ store?: 'memory' | 'disk' | CacheMiddlewareStore;
61
+ /**
62
+ * TTL in milliseconds. Entries older than `ttlMs` are evicted on access.
63
+ *
64
+ * @default 86_400_000 (24h)
65
+ */
66
+ ttlMs?: number;
67
+ /**
68
+ * Custom hash function for cache keys. Defaults to a stable hash of
69
+ * `{ prompt, modelId, responseFormat }`.
70
+ */
71
+ keyHash?: (params: LanguageModelV3CallOptions, modelId: string) => string;
72
+ /**
73
+ * Optional override for the env gate. When `false`, the middleware acts
74
+ * as a passthrough regardless of `V3_EVAL_CACHE`. When `true`, always
75
+ * caches. Defaults to `process.env.V3_EVAL_CACHE` truthy-check.
76
+ */
77
+ enabled?: boolean;
78
+ /** Optional custom path for the disk store (defaults to `.cache/v3-eval-cache.json`). */
79
+ diskPath?: string;
80
+ }
81
+ /**
82
+ * Build a cache middleware for `wrapLanguageModel`. Wraps `doGenerate` and
83
+ * `doStream`; on a hit replays the cached payload, on a miss invokes the
84
+ * downstream model and stores the result.
85
+ *
86
+ * Composition note: install **before** budget/trace so cache hits don't
87
+ * pay the downstream model cost (the trace/budget middleware still see the
88
+ * payload via the wrapped result they observe in their own `wrapGenerate`).
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * import { wrapLanguageModel } from 'ai'
93
+ * import { cacheMiddleware } from 'ai-functions'
94
+ *
95
+ * const model = wrapLanguageModel({
96
+ * model: openai('gpt-4o'),
97
+ * middleware: cacheMiddleware({ store: 'disk', ttlMs: 86_400_000 }),
98
+ * })
99
+ * ```
100
+ */
101
+ export declare function cacheMiddleware(options?: CacheMiddlewareOptions): LanguageModelV3Middleware;
102
+ export {};
103
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/middleware/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,KAAK,EACV,0BAA0B,EAC1B,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EAE1B,MAAM,kBAAkB,CAAA;AAOzB,6EAA6E;AAC7E,UAAU,UAAU;IAClB,sFAAsF;IACtF,cAAc,CAAC,EAAE,6BAA6B,CAAA;IAC9C,oFAAoF;IACpF,YAAY,CAAC,EAAE,yBAAyB,EAAE,CAAA;IAC1C,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,oDAAoD;AACpD,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAA;IACxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACzC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,oBAAoB,CAAA;IAChD;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,0BAA0B,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAA;IACzE;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAmHD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,yBAAyB,CAoE/F"}