ai-functions 2.1.3 → 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 (277) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +55 -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 +116 -0
  93. package/dist/function-registry.d.ts.map +1 -0
  94. package/dist/function-registry.js +546 -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/schema.js +2 -2
  137. package/dist/schema.js.map +1 -1
  138. package/dist/telemetry.d.ts +128 -0
  139. package/dist/telemetry.d.ts.map +1 -0
  140. package/dist/telemetry.js +285 -0
  141. package/dist/telemetry.js.map +1 -0
  142. package/dist/template.d.ts.map +1 -1
  143. package/dist/template.js +6 -1
  144. package/dist/template.js.map +1 -1
  145. package/dist/tool-orchestration.d.ts +66 -4
  146. package/dist/tool-orchestration.d.ts.map +1 -1
  147. package/dist/tool-orchestration.js +123 -23
  148. package/dist/tool-orchestration.js.map +1 -1
  149. package/dist/type-guards.d.ts +28 -0
  150. package/dist/type-guards.d.ts.map +1 -0
  151. package/dist/type-guards.js +29 -0
  152. package/dist/type-guards.js.map +1 -0
  153. package/dist/types.d.ts +135 -17
  154. package/dist/types.d.ts.map +1 -1
  155. package/dist/types.js +36 -1
  156. package/dist/types.js.map +1 -1
  157. package/dist/wrap-for-v3.d.ts +80 -0
  158. package/dist/wrap-for-v3.d.ts.map +1 -0
  159. package/dist/wrap-for-v3.js +89 -0
  160. package/dist/wrap-for-v3.js.map +1 -0
  161. package/examples/00-quickstart.ts +232 -0
  162. package/examples/01-rag-chatbot.ts +212 -0
  163. package/examples/02-multi-agent-research.ts +290 -0
  164. package/examples/03-email-classification.ts +379 -0
  165. package/examples/04-content-moderation.ts +400 -0
  166. package/examples/05-document-extraction.ts +455 -0
  167. package/examples/06-streaming-chat-nextjs.ts +437 -0
  168. package/examples/07-cloudflare-worker.ts +483 -0
  169. package/examples/08-batch-processing.ts +491 -0
  170. package/examples/09-budget-constrained.ts +527 -0
  171. package/examples/10-tool-orchestration.ts +565 -0
  172. package/examples/11-retry-resilience.ts +403 -0
  173. package/examples/12-caching-strategies.ts +422 -0
  174. package/examples/README.md +145 -0
  175. package/package.json +28 -25
  176. package/src/ai-promise.ts +226 -140
  177. package/src/ai-schemas.ts +122 -0
  178. package/src/ai.ts +69 -1176
  179. package/src/batch/anthropic.ts +96 -161
  180. package/src/batch/bedrock.ts +203 -454
  181. package/src/batch/cloudflare.ts +99 -282
  182. package/src/batch/google.ts +91 -297
  183. package/src/batch/index.ts +4 -1
  184. package/src/batch/memory.ts +15 -10
  185. package/src/batch/openai.ts +65 -193
  186. package/src/batch/provider.ts +336 -0
  187. package/src/batch-map.ts +29 -24
  188. package/src/batch-queue.ts +200 -11
  189. package/src/budget.ts +31 -18
  190. package/src/cache.ts +45 -17
  191. package/src/context.ts +106 -77
  192. package/src/digital-objects-registry.ts +750 -0
  193. package/src/errors.ts +37 -0
  194. package/src/eval/runner.ts +60 -36
  195. package/src/eval-log/in-memory.ts +90 -0
  196. package/src/eval-log/index.ts +46 -0
  197. package/src/eval-log/types.ts +110 -0
  198. package/src/function-registry.ts +671 -0
  199. package/src/generate.ts +33 -28
  200. package/src/index.ts +119 -21
  201. package/src/logger.ts +232 -0
  202. package/src/middleware/budget.ts +171 -0
  203. package/src/middleware/cache.ts +299 -0
  204. package/src/middleware/embed-cache.ts +195 -0
  205. package/src/middleware/index.ts +23 -0
  206. package/src/middleware/trace.ts +248 -0
  207. package/src/primitives.ts +589 -62
  208. package/src/retry.ts +144 -18
  209. package/src/schema.ts +8 -8
  210. package/src/telemetry.ts +403 -0
  211. package/src/template.ts +8 -4
  212. package/src/tool-orchestration.ts +213 -48
  213. package/src/type-guards.ts +31 -0
  214. package/src/types.ts +164 -25
  215. package/src/wrap-for-v3.ts +105 -0
  216. package/test/ai-promise.test.ts +1080 -0
  217. package/test/ai-proxy.test.ts +1 -1
  218. package/test/batch-autosubmit-errors.test.ts +49 -37
  219. package/test/batch-blog-posts.test.ts +87 -129
  220. package/test/core-functions.test.ts +183 -579
  221. package/test/decide.test.ts +154 -322
  222. package/test/define.test.ts +211 -8
  223. package/test/digital-objects-registry.test.ts +760 -0
  224. package/test/embedding-cache-middleware.test.ts +140 -0
  225. package/test/generate-core.test.ts +140 -229
  226. package/test/implicit-batch.test.ts +22 -65
  227. package/test/retry-policy-integration.test.ts +117 -0
  228. package/test/schema.test.ts +55 -19
  229. package/test/template.test.ts +1164 -0
  230. package/test/tool-orchestration.test.ts +270 -0
  231. package/test/wrap-for-v3.test.ts +612 -0
  232. package/vitest.config.js +6 -0
  233. package/vitest.config.ts +20 -0
  234. package/LICENSE +0 -21
  235. package/dist/rpc/auth.d.ts +0 -69
  236. package/dist/rpc/auth.d.ts.map +0 -1
  237. package/dist/rpc/auth.js +0 -136
  238. package/dist/rpc/auth.js.map +0 -1
  239. package/dist/rpc/client.d.ts +0 -62
  240. package/dist/rpc/client.d.ts.map +0 -1
  241. package/dist/rpc/client.js +0 -103
  242. package/dist/rpc/client.js.map +0 -1
  243. package/dist/rpc/deferred.d.ts +0 -60
  244. package/dist/rpc/deferred.d.ts.map +0 -1
  245. package/dist/rpc/deferred.js +0 -96
  246. package/dist/rpc/deferred.js.map +0 -1
  247. package/dist/rpc/index.d.ts +0 -22
  248. package/dist/rpc/index.d.ts.map +0 -1
  249. package/dist/rpc/index.js +0 -38
  250. package/dist/rpc/index.js.map +0 -1
  251. package/dist/rpc/local.d.ts +0 -42
  252. package/dist/rpc/local.d.ts.map +0 -1
  253. package/dist/rpc/local.js +0 -50
  254. package/dist/rpc/local.js.map +0 -1
  255. package/dist/rpc/server.d.ts +0 -165
  256. package/dist/rpc/server.d.ts.map +0 -1
  257. package/dist/rpc/server.js +0 -405
  258. package/dist/rpc/server.js.map +0 -1
  259. package/dist/rpc/session.d.ts +0 -32
  260. package/dist/rpc/session.d.ts.map +0 -1
  261. package/dist/rpc/session.js +0 -43
  262. package/dist/rpc/session.js.map +0 -1
  263. package/dist/rpc/transport.d.ts +0 -306
  264. package/dist/rpc/transport.d.ts.map +0 -1
  265. package/dist/rpc/transport.js +0 -731
  266. package/dist/rpc/transport.js.map +0 -1
  267. package/src/batch/anthropic.js +0 -256
  268. package/src/batch/bedrock.js +0 -584
  269. package/src/batch/cloudflare.js +0 -287
  270. package/src/batch/google.js +0 -359
  271. package/src/batch/index.js +0 -30
  272. package/src/batch/memory.js +0 -187
  273. package/src/batch/openai.js +0 -402
  274. package/src/eval/index.js +0 -7
  275. package/src/eval/models.js +0 -119
  276. package/src/eval/runner.js +0 -147
  277. package/test/schema.test.js +0 -96
@@ -0,0 +1,128 @@
1
+ /**
2
+ * embeddingCacheMiddleware — content-addressable cache for `wrapEmbeddingModel`
3
+ *
4
+ * Embedding-side analogue of {@link cacheMiddleware}. Wraps `doEmbed` and
5
+ * caches the resulting embeddings keyed on
6
+ * `{ values, modelId, providerOptions }` so a re-embed of the same value
7
+ * batch with the same model returns the cached vectors without hitting the
8
+ * provider.
9
+ *
10
+ * **Why a separate middleware instead of reusing `cacheMiddleware`?**
11
+ * AI SDK 6 splits language-model and embedding-model surfaces:
12
+ * `LanguageModelV3Middleware` exposes `wrapGenerate` / `wrapStream` against
13
+ * `LanguageModelV3CallOptions`, while `EmbeddingModelV3Middleware` exposes
14
+ * `wrapEmbed` against `EmbeddingModelV3CallOptions`. The cache shape
15
+ * (per-value vector vs. per-prompt completion payload) is also different —
16
+ * embeddings cache batched arrays, generations cache single result objects.
17
+ *
18
+ * - **Hit derivation:** stable hash of `{ values, modelId, providerOptions }`.
19
+ * `values` is the array as-passed (caller can pre-normalise if they want
20
+ * case/whitespace insensitivity). Generation knobs don't apply.
21
+ *
22
+ * - **Batch semantics:** the cache key is the *whole* batch. A subset hit
23
+ * doesn't trigger a partial-fill — that's a more invasive shape change
24
+ * (the legacy `EmbeddingCache.getMany` did per-text caching, but it was
25
+ * only used in the example and added 100+ LOC of bookkeeping). Callers
26
+ * that want per-text caching should use stable per-text batches.
27
+ *
28
+ * - **TTL:** 24h default, configurable. Lazy expiry on access.
29
+ *
30
+ * - **Pluggable store:** in-memory default (Map-backed); custom store
31
+ * honored as-is. Disk persistence is intentionally not provided here —
32
+ * embedding payloads (large `number[][]`) make on-disk JSON a bad fit;
33
+ * callers who want it should pass a custom store.
34
+ *
35
+ * - **Env gate:** honors `process.env.V3_EVAL_CACHE` for parity with
36
+ * `cacheMiddleware`. Override via the `enabled` option.
37
+ *
38
+ * @packageDocumentation
39
+ */
40
+ import { hashKey } from '../cache.js';
41
+ // ============================================================================
42
+ // Stores
43
+ // ============================================================================
44
+ class MemoryStore {
45
+ map = new Map();
46
+ get(key) {
47
+ return this.map.get(key);
48
+ }
49
+ set(key, value) {
50
+ this.map.set(key, value);
51
+ }
52
+ delete(key) {
53
+ this.map.delete(key);
54
+ }
55
+ }
56
+ // ============================================================================
57
+ // Helpers
58
+ // ============================================================================
59
+ const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;
60
+ function defaultKeyHash(params, modelId) {
61
+ return hashKey({
62
+ values: params.values,
63
+ modelId,
64
+ providerOptions: params.providerOptions,
65
+ });
66
+ }
67
+ function envGateEnabled() {
68
+ const v = process.env['V3_EVAL_CACHE'];
69
+ return typeof v === 'string' && v.length > 0;
70
+ }
71
+ function isExpired(entry, ttlMs) {
72
+ return Date.now() - entry.createdAt > ttlMs;
73
+ }
74
+ // ============================================================================
75
+ // Middleware
76
+ // ============================================================================
77
+ /**
78
+ * Build an embedding-cache middleware for `wrapEmbeddingModel`.
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * import { wrapEmbeddingModel } from 'ai'
83
+ * import { embeddingCacheMiddleware } from 'ai-functions'
84
+ *
85
+ * const model = wrapEmbeddingModel({
86
+ * model: openai.embedding('text-embedding-3-small'),
87
+ * middleware: embeddingCacheMiddleware({ ttlMs: 86_400_000 }),
88
+ * })
89
+ * ```
90
+ */
91
+ export function embeddingCacheMiddleware(options = {}) {
92
+ const ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
93
+ const keyHash = options.keyHash ?? defaultKeyHash;
94
+ const store = options.store === undefined || options.store === 'memory' ? new MemoryStore() : options.store;
95
+ const enabled = options.enabled ?? envGateEnabled();
96
+ return {
97
+ specificationVersion: 'v3',
98
+ async wrapEmbed({ doEmbed, params, model }) {
99
+ if (!enabled)
100
+ return doEmbed();
101
+ const key = keyHash(params, model.modelId);
102
+ const cached = store.get(key);
103
+ if (cached !== undefined) {
104
+ if (isExpired(cached, ttlMs)) {
105
+ store.delete(key);
106
+ }
107
+ else {
108
+ // Replay shape matches EmbeddingModelV3Result. Provider-side
109
+ // metadata (response headers, body, usage) is intentionally absent
110
+ // on a hit — callers reading those should disable the cache.
111
+ const replay = {
112
+ embeddings: cached.embeddings,
113
+ warnings: cached.warnings,
114
+ };
115
+ return replay;
116
+ }
117
+ }
118
+ const result = await doEmbed();
119
+ store.set(key, {
120
+ embeddings: result.embeddings,
121
+ warnings: result.warnings,
122
+ createdAt: Date.now(),
123
+ });
124
+ return result;
125
+ },
126
+ };
127
+ }
128
+ //# sourceMappingURL=embed-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed-cache.js","sourceRoot":"","sources":["../../src/middleware/embed-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Middleware barrel — composable AI SDK 6 `LanguageModelV3Middleware`
3
+ * primitives for `wrapLanguageModel`.
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ export { cacheMiddleware, type CacheMiddlewareOptions, type CacheMiddlewareStore } from './cache.js';
8
+ export { embeddingCacheMiddleware, type EmbedCacheMiddlewareOptions, type EmbedCacheMiddlewareStore, } from './embed-cache.js';
9
+ export { budgetMiddleware, type BudgetMiddlewareOptions, type PricingOverlay } from './budget.js';
10
+ export { traceMiddleware, type TraceEvent, type TraceEventKind, type TraceMiddlewareOptions, } from './trace.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEpG,OAAO,EACL,wBAAwB,EACxB,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,GAC/B,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjG,OAAO,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,sBAAsB,GAC5B,MAAM,YAAY,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Middleware barrel — composable AI SDK 6 `LanguageModelV3Middleware`
3
+ * primitives for `wrapLanguageModel`.
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ export { cacheMiddleware } from './cache.js';
8
+ export { embeddingCacheMiddleware, } from './embed-cache.js';
9
+ export { budgetMiddleware } from './budget.js';
10
+ export { traceMiddleware, } from './trace.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAA0D,MAAM,YAAY,CAAA;AAEpG,OAAO,EACL,wBAAwB,GAGzB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,gBAAgB,EAAqD,MAAM,aAAa,CAAA;AAEjG,OAAO,EACL,eAAe,GAIhB,MAAM,YAAY,CAAA"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * traceMiddleware — emit per-call trace events for `wrapLanguageModel`
3
+ *
4
+ * Wraps `doGenerate` / `doStream` and emits a {@link TraceEvent} on every
5
+ * completion. The sink is opaque (caller supplies `emit`) so this primitive
6
+ * works equally well piping into:
7
+ *
8
+ * - the v3 cascade-walker InvocationEvent stream (round 16+ work to add
9
+ * `'persona-trace'` / `'cascade-trace'` to the union),
10
+ * - an {@link import('../eval-log/index.js').EvalLogStore} for fixture
11
+ * replay,
12
+ * - OpenTelemetry / Datadog / Honeycomb adapters that map the event into
13
+ * a span.
14
+ *
15
+ * **Emit-error tolerance:** if the supplied `emit` throws, we *swallow* the
16
+ * error (with a one-time `console.warn`) so a flaky trace sink can never
17
+ * break the wrapped LLM call. This matches the Evalite v0.19 trace
18
+ * middleware behaviour.
19
+ *
20
+ * Composition note: install **last** so the event sees the final outcome
21
+ * (post-cache, post-budget). The event's `costUsd` field is best-effort —
22
+ * the trace middleware doesn't have direct access to the budget tracker, so
23
+ * the caller can pass a `getCostUsd` resolver if they want costs in the
24
+ * event payload.
25
+ *
26
+ * @packageDocumentation
27
+ */
28
+ import type { LanguageModelV3Middleware, LanguageModelV3Usage } from '@ai-sdk/provider';
29
+ /**
30
+ * Discriminator for the originating call site. Callers inject this via the
31
+ * `kind` option so a single sink can fan events into different downstream
32
+ * streams (persona panel vs. cascade walker vs. ad-hoc test).
33
+ */
34
+ export type TraceEventKind = 'persona-trace' | 'cascade-trace' | 'eval-trace' | string;
35
+ /**
36
+ * Trace event payload emitted on every wrapped call completion.
37
+ *
38
+ * Field design notes:
39
+ * - `prompt` / `response` are stringified for cheap downstream storage
40
+ * (the structured `LanguageModelV3Prompt` / `LanguageModelV3Content[]`
41
+ * shapes are intentionally flattened).
42
+ * - `usage` is the raw V3 shape (with the cache breakdown) — the
43
+ * EvalLogStore consumer flattens it into total counts.
44
+ * - `costUsd` is optional because the trace middleware doesn't compute
45
+ * cost itself; callers either pass a resolver or compute downstream
46
+ * from `usage`.
47
+ */
48
+ export interface TraceEvent {
49
+ kind: TraceEventKind;
50
+ model: string;
51
+ prompt: string;
52
+ response: string;
53
+ usage: LanguageModelV3Usage | undefined;
54
+ costUsd?: number;
55
+ durationMs: number;
56
+ /** Optional caller-supplied tags for downstream filtering. */
57
+ tags?: Record<string, string>;
58
+ }
59
+ /** Options for {@link traceMiddleware}. */
60
+ export interface TraceMiddlewareOptions {
61
+ /**
62
+ * Opaque sink. Errors thrown from `emit` are swallowed (with a one-time
63
+ * `console.warn`) so a flaky sink never breaks the wrapped LLM call.
64
+ */
65
+ emit: (event: TraceEvent) => void | Promise<void>;
66
+ /**
67
+ * Discriminator threaded into the event's `kind` field. Defaults to
68
+ * `'eval-trace'`.
69
+ */
70
+ kind?: TraceEventKind;
71
+ /**
72
+ * Optional cost resolver. When supplied, called with the V3 usage shape
73
+ * and the modelId; result is set on `event.costUsd`. Useful when the
74
+ * caller has a side-channel pricing table (the budgetMiddleware's
75
+ * tracker) and wants costs in the trace event itself.
76
+ */
77
+ getCostUsd?: (modelId: string, usage: LanguageModelV3Usage | undefined) => number;
78
+ /** Optional caller-supplied tags merged into every emitted event. */
79
+ tags?: Record<string, string>;
80
+ }
81
+ /**
82
+ * Build a trace middleware for `wrapLanguageModel`. Emits a
83
+ * {@link TraceEvent} on every successful `doGenerate` / `doStream`
84
+ * completion. Errors from `emit` are swallowed (one-time warn) so a flaky
85
+ * trace sink can never break the wrapped LLM call.
86
+ *
87
+ * @example
88
+ * ```ts
89
+ * import { wrapLanguageModel } from 'ai'
90
+ * import { traceMiddleware, getEvalLogStore } from 'ai-functions'
91
+ *
92
+ * const store = getEvalLogStore()
93
+ * const model = wrapLanguageModel({
94
+ * model: openai('gpt-4o'),
95
+ * middleware: traceMiddleware({
96
+ * kind: 'cascade-trace',
97
+ * emit: (event) => store.record({ ...event, costUsd: event.costUsd ?? 0 }),
98
+ * }),
99
+ * })
100
+ * ```
101
+ */
102
+ export declare function traceMiddleware(options: TraceMiddlewareOptions): LanguageModelV3Middleware;
103
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/middleware/trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAGV,yBAAyB,EAGzB,oBAAoB,EACrB,MAAM,kBAAkB,CAAA;AAMzB;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,eAAe,GAAG,YAAY,GAAG,MAAM,CAAA;AAEtF;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,oBAAoB,GAAG,SAAS,CAAA;IACvC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC9B;AAED,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD;;;OAGG;IACH,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,SAAS,KAAK,MAAM,CAAA;IACjF,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC9B;AAwED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,yBAAyB,CA4D1F"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * traceMiddleware — emit per-call trace events for `wrapLanguageModel`
3
+ *
4
+ * Wraps `doGenerate` / `doStream` and emits a {@link TraceEvent} on every
5
+ * completion. The sink is opaque (caller supplies `emit`) so this primitive
6
+ * works equally well piping into:
7
+ *
8
+ * - the v3 cascade-walker InvocationEvent stream (round 16+ work to add
9
+ * `'persona-trace'` / `'cascade-trace'` to the union),
10
+ * - an {@link import('../eval-log/index.js').EvalLogStore} for fixture
11
+ * replay,
12
+ * - OpenTelemetry / Datadog / Honeycomb adapters that map the event into
13
+ * a span.
14
+ *
15
+ * **Emit-error tolerance:** if the supplied `emit` throws, we *swallow* the
16
+ * error (with a one-time `console.warn`) so a flaky trace sink can never
17
+ * break the wrapped LLM call. This matches the Evalite v0.19 trace
18
+ * middleware behaviour.
19
+ *
20
+ * Composition note: install **last** so the event sees the final outcome
21
+ * (post-cache, post-budget). The event's `costUsd` field is best-effort —
22
+ * the trace middleware doesn't have direct access to the budget tracker, so
23
+ * the caller can pass a `getCostUsd` resolver if they want costs in the
24
+ * event payload.
25
+ *
26
+ * @packageDocumentation
27
+ */
28
+ // ============================================================================
29
+ // Helpers
30
+ // ============================================================================
31
+ /**
32
+ * Flatten the structured V3 prompt into a single string for cheap storage.
33
+ * Walks system / user / assistant / tool messages and concatenates their
34
+ * text parts. Non-text parts (files, tool results) are summarised with a
35
+ * short marker so the trace doesn't grow unboundedly.
36
+ */
37
+ function stringifyPrompt(params) {
38
+ const out = [];
39
+ for (const msg of params.prompt) {
40
+ if (msg.role === 'system') {
41
+ out.push(`[system] ${msg.content}`);
42
+ continue;
43
+ }
44
+ if (typeof msg.content === 'string') {
45
+ out.push(`[${msg.role}] ${msg.content}`);
46
+ continue;
47
+ }
48
+ if (Array.isArray(msg.content)) {
49
+ const parts = [];
50
+ for (const part of msg.content) {
51
+ if (part.type === 'text')
52
+ parts.push(part.text);
53
+ else
54
+ parts.push(`[${part.type}]`);
55
+ }
56
+ out.push(`[${msg.role}] ${parts.join(' ')}`);
57
+ }
58
+ }
59
+ return out.join('\n');
60
+ }
61
+ /**
62
+ * Flatten the V3 generate result content into a single string. Walks the
63
+ * `content` array (text, reasoning, tool-call, etc.) and concatenates text
64
+ * parts; non-text parts get short summaries.
65
+ */
66
+ function stringifyContent(content) {
67
+ const parts = [];
68
+ for (const part of content) {
69
+ if (part.type === 'text')
70
+ parts.push(part.text);
71
+ else if (part.type === 'reasoning')
72
+ parts.push(`[reasoning] ${part.text}`);
73
+ else
74
+ parts.push(`[${part.type}]`);
75
+ }
76
+ return parts.join('');
77
+ }
78
+ let _hasWarnedEmit = false;
79
+ async function safeEmit(emit, event) {
80
+ try {
81
+ await emit(event);
82
+ }
83
+ catch (err) {
84
+ if (!_hasWarnedEmit) {
85
+ _hasWarnedEmit = true;
86
+ // eslint-disable-next-line no-console
87
+ console.warn(`[ai-functions/traceMiddleware] emit() threw — subsequent emit errors will be silenced. ${err instanceof Error ? err.message : String(err)}`);
88
+ }
89
+ }
90
+ }
91
+ // ============================================================================
92
+ // Middleware
93
+ // ============================================================================
94
+ /**
95
+ * Build a trace middleware for `wrapLanguageModel`. Emits a
96
+ * {@link TraceEvent} on every successful `doGenerate` / `doStream`
97
+ * completion. Errors from `emit` are swallowed (one-time warn) so a flaky
98
+ * trace sink can never break the wrapped LLM call.
99
+ *
100
+ * @example
101
+ * ```ts
102
+ * import { wrapLanguageModel } from 'ai'
103
+ * import { traceMiddleware, getEvalLogStore } from 'ai-functions'
104
+ *
105
+ * const store = getEvalLogStore()
106
+ * const model = wrapLanguageModel({
107
+ * model: openai('gpt-4o'),
108
+ * middleware: traceMiddleware({
109
+ * kind: 'cascade-trace',
110
+ * emit: (event) => store.record({ ...event, costUsd: event.costUsd ?? 0 }),
111
+ * }),
112
+ * })
113
+ * ```
114
+ */
115
+ export function traceMiddleware(options) {
116
+ const { emit, kind = 'eval-trace', getCostUsd, tags } = options;
117
+ return {
118
+ specificationVersion: 'v3',
119
+ async wrapGenerate({ doGenerate, params, model }) {
120
+ const start = Date.now();
121
+ const result = await doGenerate();
122
+ const durationMs = Date.now() - start;
123
+ const modelId = model.modelId;
124
+ const event = {
125
+ kind,
126
+ model: modelId,
127
+ prompt: stringifyPrompt(params),
128
+ response: stringifyContent(result.content),
129
+ usage: result.usage,
130
+ durationMs,
131
+ ...(getCostUsd !== undefined ? { costUsd: getCostUsd(modelId, result.usage) } : {}),
132
+ ...(tags !== undefined ? { tags } : {}),
133
+ };
134
+ await safeEmit(emit, event);
135
+ return result;
136
+ },
137
+ async wrapStream({ doStream, params, model }) {
138
+ const start = Date.now();
139
+ const result = await doStream();
140
+ const modelId = model.modelId;
141
+ let finalUsage;
142
+ const collected = [];
143
+ const transformedStream = result.stream.pipeThrough(new TransformStream({
144
+ transform(chunk, controller) {
145
+ if (chunk.type === 'text-delta')
146
+ collected.push(chunk.delta);
147
+ else if (chunk.type === 'finish')
148
+ finalUsage = chunk.usage;
149
+ controller.enqueue(chunk);
150
+ },
151
+ flush() {
152
+ const durationMs = Date.now() - start;
153
+ const event = {
154
+ kind,
155
+ model: modelId,
156
+ prompt: stringifyPrompt(params),
157
+ response: collected.join(''),
158
+ usage: finalUsage,
159
+ durationMs,
160
+ ...(getCostUsd !== undefined ? { costUsd: getCostUsd(modelId, finalUsage) } : {}),
161
+ ...(tags !== undefined ? { tags } : {}),
162
+ };
163
+ // Fire-and-forget — TransformStream.flush is sync; we don't
164
+ // await safeEmit so a slow sink doesn't block stream close.
165
+ void safeEmit(emit, event);
166
+ },
167
+ }));
168
+ const wrapped = {
169
+ ...result,
170
+ stream: transformedStream,
171
+ };
172
+ return wrapped;
173
+ },
174
+ };
175
+ }
176
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/middleware/trace.ts"],"names":[],"mappings":"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"}
@@ -32,7 +32,8 @@
32
32
  */
33
33
  import { AIPromise } from './ai-promise.js';
34
34
  import type { SimpleSchema } from './schema.js';
35
- import type { HumanChannel } from './types.js';
35
+ import type { AgenticFunctionDefinition, CodeFunctionDefinition, DefinedFunction, FunctionRegistry, GenerativeFunctionDefinition, HumanChannel, HumanFunctionDefinition } from './types.js';
36
+ import { defineFunction } from './function-registry.js';
36
37
  export type GenerateType = 'text' | 'json' | 'code' | 'list' | 'lists' | 'markdown' | 'yaml' | 'diagram' | 'slides' | 'boolean' | 'summary' | 'extract';
37
38
  export interface GenerateOptions {
38
39
  /** Model to use */
@@ -306,4 +307,122 @@ export declare const review: ((strings: TemplateStringsArray, ...values: unknown
306
307
  feedback: string;
307
308
  approved?: boolean;
308
309
  }>>);
310
+ /**
311
+ * Auto-define a function based on its name and arguments, or define with explicit definition
312
+ *
313
+ * When called with (name, args), uses AI to analyze and determine:
314
+ * - What type of function it should be (code, generative, agentic, human)
315
+ * - What it should return
316
+ * - How it should be implemented
317
+ *
318
+ * When called with a FunctionDefinition, creates the function directly.
319
+ *
320
+ * @example
321
+ * ```ts
322
+ * // Auto-define from name and example args
323
+ * const planTrip = await define('planTrip', { destination: 'Tokyo', travelers: 2 })
324
+ *
325
+ * // Or define explicitly
326
+ * const summarize = define.generative({
327
+ * name: 'summarize',
328
+ * args: { text: 'Text to summarize' },
329
+ * output: 'string',
330
+ * })
331
+ *
332
+ * // Or with full definition
333
+ * const fn = defineFunction({
334
+ * type: 'generative',
335
+ * name: 'translate',
336
+ * args: { text: 'Text', lang: 'Target language' },
337
+ * output: 'string',
338
+ * })
339
+ * ```
340
+ */
341
+ declare function autoDefineImpl(name: string, args: Record<string, unknown>): Promise<DefinedFunction>;
342
+ /**
343
+ * Define functions - auto-define or use typed helpers
344
+ */
345
+ export declare const define: typeof autoDefineImpl & {
346
+ /**
347
+ * Define a **deterministic** code function (a handler — no LLM at call time).
348
+ *
349
+ * Supply a `handler` (canonical) or an inline `code` body. To have a model
350
+ * *author* code instead, use {@link generateCode} or `define.generative`.
351
+ */
352
+ code: <TOutput, TInput>(definition: Omit<CodeFunctionDefinition<TOutput, TInput>, "type">) => DefinedFunction<TOutput, TInput>;
353
+ /**
354
+ * Define a generative function
355
+ */
356
+ generative: <TOutput, TInput>(definition: Omit<GenerativeFunctionDefinition<TOutput, TInput>, "type">) => DefinedFunction<TOutput, TInput>;
357
+ /**
358
+ * Define an agentic function
359
+ */
360
+ agentic: <TOutput, TInput>(definition: Omit<AgenticFunctionDefinition<TOutput, TInput>, "type">) => DefinedFunction<TOutput, TInput>;
361
+ /**
362
+ * Define a human-in-the-loop function
363
+ */
364
+ human: <TOutput, TInput>(definition: Omit<HumanFunctionDefinition<TOutput, TInput>, "type">) => DefinedFunction<TOutput, TInput>;
365
+ };
366
+ /**
367
+ * Type for the AI proxy with auto-define capability
368
+ */
369
+ export interface AIProxy {
370
+ /** Function registry */
371
+ functions: FunctionRegistry;
372
+ /** Define functions */
373
+ define: typeof define;
374
+ /** Define a function with full definition */
375
+ defineFunction: typeof defineFunction;
376
+ /** Dynamic function calls */
377
+ [key: string]: unknown;
378
+ }
379
+ /**
380
+ * Create a smart AI client that auto-defines functions on first call
381
+ *
382
+ * @example
383
+ * ```ts
384
+ * const ai = createSmartAI()
385
+ *
386
+ * // First call - auto-defines the function
387
+ * const trip = await ai.planTrip({
388
+ * destination: 'Tokyo',
389
+ * dates: { start: '2024-03-01', end: '2024-03-10' },
390
+ * travelers: 2,
391
+ * })
392
+ *
393
+ * // Second call - uses cached definition (in-memory)
394
+ * const trip2 = await ai.planTrip({
395
+ * destination: 'Paris',
396
+ * dates: { start: '2024-06-01', end: '2024-06-07' },
397
+ * travelers: 4,
398
+ * })
399
+ *
400
+ * // Access registry and define
401
+ * console.log(ai.functions.list()) // ['planTrip']
402
+ * ai.define.generative({ name: 'summarize', ... })
403
+ * ```
404
+ */
405
+ export declare function createSmartAI(): AIProxy;
406
+ /**
407
+ * Default AI proxy instance with auto-define capability.
408
+ *
409
+ * This is the smart proxy `aiProxy` (re-exported from index.ts as `aiProxy`).
410
+ * It is intentionally distinct from the `ai` template-tag primitive above —
411
+ * see `ai` (line ~354) for the template function used like `ai\`...\``.
412
+ *
413
+ * @example
414
+ * ```ts
415
+ * import { aiProxy } from 'ai-functions'
416
+ *
417
+ * // Auto-define and call
418
+ * const result = await aiProxy.summarize({ text: 'Long article...' })
419
+ *
420
+ * // Access functions registry
421
+ * aiProxy.functions.list()
422
+ *
423
+ * // Define explicitly
424
+ * aiProxy.define.generative({ name: 'translate', ... })
425
+ * ```
426
+ */
427
+ export declare const aiProxy: AIProxy;
309
428
  //# sourceMappingURL=primitives.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../src/primitives.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../src/primitives.ts"],"names":[],"mappings":"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"}