ai 6.0.33 → 6.0.34

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 (351) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/index.js +1 -1
  3. package/dist/index.mjs +1 -1
  4. package/dist/internal/index.js +1 -1
  5. package/dist/internal/index.mjs +1 -1
  6. package/docs/02-foundations/03-prompts.mdx +2 -2
  7. package/docs/03-ai-sdk-core/15-tools-and-tool-calling.mdx +1 -1
  8. package/docs/07-reference/01-ai-sdk-core/28-output.mdx +1 -1
  9. package/package.json +6 -4
  10. package/src/agent/agent.ts +116 -0
  11. package/src/agent/create-agent-ui-stream-response.test.ts +258 -0
  12. package/src/agent/create-agent-ui-stream-response.ts +50 -0
  13. package/src/agent/create-agent-ui-stream.ts +73 -0
  14. package/src/agent/index.ts +33 -0
  15. package/src/agent/infer-agent-tools.ts +7 -0
  16. package/src/agent/infer-agent-ui-message.test-d.ts +54 -0
  17. package/src/agent/infer-agent-ui-message.ts +11 -0
  18. package/src/agent/pipe-agent-ui-stream-to-response.ts +52 -0
  19. package/src/agent/tool-loop-agent-on-finish-callback.ts +31 -0
  20. package/src/agent/tool-loop-agent-on-step-finish-callback.ts +11 -0
  21. package/src/agent/tool-loop-agent-settings.ts +182 -0
  22. package/src/agent/tool-loop-agent.test-d.ts +114 -0
  23. package/src/agent/tool-loop-agent.test.ts +442 -0
  24. package/src/agent/tool-loop-agent.ts +114 -0
  25. package/src/embed/__snapshots__/embed-many.test.ts.snap +191 -0
  26. package/src/embed/__snapshots__/embed.test.ts.snap +81 -0
  27. package/src/embed/embed-many-result.ts +53 -0
  28. package/src/embed/embed-many.test.ts +653 -0
  29. package/src/embed/embed-many.ts +378 -0
  30. package/src/embed/embed-result.ts +50 -0
  31. package/src/embed/embed.test.ts +298 -0
  32. package/src/embed/embed.ts +211 -0
  33. package/src/embed/index.ts +4 -0
  34. package/src/error/index.ts +34 -0
  35. package/src/error/invalid-argument-error.ts +34 -0
  36. package/src/error/invalid-stream-part-error.ts +28 -0
  37. package/src/error/invalid-tool-approval-error.ts +26 -0
  38. package/src/error/invalid-tool-input-error.ts +33 -0
  39. package/src/error/no-image-generated-error.ts +39 -0
  40. package/src/error/no-object-generated-error.ts +70 -0
  41. package/src/error/no-output-generated-error.ts +26 -0
  42. package/src/error/no-speech-generated-error.ts +18 -0
  43. package/src/error/no-such-tool-error.ts +35 -0
  44. package/src/error/no-transcript-generated-error.ts +20 -0
  45. package/src/error/tool-call-not-found-for-approval-error.ts +32 -0
  46. package/src/error/tool-call-repair-error.ts +30 -0
  47. package/src/error/unsupported-model-version-error.ts +23 -0
  48. package/src/error/verify-no-object-generated-error.ts +27 -0
  49. package/src/generate-image/generate-image-result.ts +42 -0
  50. package/src/generate-image/generate-image.test.ts +1420 -0
  51. package/src/generate-image/generate-image.ts +360 -0
  52. package/src/generate-image/index.ts +18 -0
  53. package/src/generate-object/__snapshots__/generate-object.test.ts.snap +133 -0
  54. package/src/generate-object/__snapshots__/stream-object.test.ts.snap +297 -0
  55. package/src/generate-object/generate-object-result.ts +67 -0
  56. package/src/generate-object/generate-object.test-d.ts +49 -0
  57. package/src/generate-object/generate-object.test.ts +1191 -0
  58. package/src/generate-object/generate-object.ts +518 -0
  59. package/src/generate-object/index.ts +9 -0
  60. package/src/generate-object/inject-json-instruction.test.ts +181 -0
  61. package/src/generate-object/inject-json-instruction.ts +30 -0
  62. package/src/generate-object/output-strategy.ts +415 -0
  63. package/src/generate-object/parse-and-validate-object-result.ts +111 -0
  64. package/src/generate-object/repair-text.ts +12 -0
  65. package/src/generate-object/stream-object-result.ts +120 -0
  66. package/src/generate-object/stream-object.test-d.ts +74 -0
  67. package/src/generate-object/stream-object.test.ts +1950 -0
  68. package/src/generate-object/stream-object.ts +986 -0
  69. package/src/generate-object/validate-object-generation-input.ts +144 -0
  70. package/src/generate-speech/generate-speech-result.ts +30 -0
  71. package/src/generate-speech/generate-speech.test.ts +300 -0
  72. package/src/generate-speech/generate-speech.ts +190 -0
  73. package/src/generate-speech/generated-audio-file.ts +65 -0
  74. package/src/generate-speech/index.ts +3 -0
  75. package/src/generate-text/__snapshots__/generate-text.test.ts.snap +1872 -0
  76. package/src/generate-text/__snapshots__/stream-text.test.ts.snap +1255 -0
  77. package/src/generate-text/collect-tool-approvals.test.ts +553 -0
  78. package/src/generate-text/collect-tool-approvals.ts +116 -0
  79. package/src/generate-text/content-part.ts +25 -0
  80. package/src/generate-text/execute-tool-call.ts +129 -0
  81. package/src/generate-text/extract-reasoning-content.ts +17 -0
  82. package/src/generate-text/extract-text-content.ts +15 -0
  83. package/src/generate-text/generate-text-result.ts +168 -0
  84. package/src/generate-text/generate-text.test-d.ts +68 -0
  85. package/src/generate-text/generate-text.test.ts +7011 -0
  86. package/src/generate-text/generate-text.ts +1223 -0
  87. package/src/generate-text/generated-file.ts +70 -0
  88. package/src/generate-text/index.ts +57 -0
  89. package/src/generate-text/is-approval-needed.ts +29 -0
  90. package/src/generate-text/output-utils.ts +23 -0
  91. package/src/generate-text/output.test.ts +698 -0
  92. package/src/generate-text/output.ts +590 -0
  93. package/src/generate-text/parse-tool-call.test.ts +570 -0
  94. package/src/generate-text/parse-tool-call.ts +188 -0
  95. package/src/generate-text/prepare-step.ts +103 -0
  96. package/src/generate-text/prune-messages.test.ts +720 -0
  97. package/src/generate-text/prune-messages.ts +167 -0
  98. package/src/generate-text/reasoning-output.ts +20 -0
  99. package/src/generate-text/reasoning.ts +8 -0
  100. package/src/generate-text/response-message.ts +10 -0
  101. package/src/generate-text/run-tools-transformation.test.ts +1143 -0
  102. package/src/generate-text/run-tools-transformation.ts +420 -0
  103. package/src/generate-text/smooth-stream.test.ts +2101 -0
  104. package/src/generate-text/smooth-stream.ts +162 -0
  105. package/src/generate-text/step-result.ts +238 -0
  106. package/src/generate-text/stop-condition.ts +29 -0
  107. package/src/generate-text/stream-text-result.ts +463 -0
  108. package/src/generate-text/stream-text.test-d.ts +200 -0
  109. package/src/generate-text/stream-text.test.ts +19979 -0
  110. package/src/generate-text/stream-text.ts +2505 -0
  111. package/src/generate-text/to-response-messages.test.ts +922 -0
  112. package/src/generate-text/to-response-messages.ts +163 -0
  113. package/src/generate-text/tool-approval-request-output.ts +21 -0
  114. package/src/generate-text/tool-call-repair-function.ts +27 -0
  115. package/src/generate-text/tool-call.ts +47 -0
  116. package/src/generate-text/tool-error.ts +34 -0
  117. package/src/generate-text/tool-output-denied.ts +21 -0
  118. package/src/generate-text/tool-output.ts +7 -0
  119. package/src/generate-text/tool-result.ts +36 -0
  120. package/src/generate-text/tool-set.ts +14 -0
  121. package/src/global.ts +24 -0
  122. package/src/index.ts +50 -0
  123. package/src/logger/index.ts +6 -0
  124. package/src/logger/log-warnings.test.ts +351 -0
  125. package/src/logger/log-warnings.ts +119 -0
  126. package/src/middleware/__snapshots__/simulate-streaming-middleware.test.ts.snap +64 -0
  127. package/src/middleware/add-tool-input-examples-middleware.test.ts +476 -0
  128. package/src/middleware/add-tool-input-examples-middleware.ts +90 -0
  129. package/src/middleware/default-embedding-settings-middleware.test.ts +126 -0
  130. package/src/middleware/default-embedding-settings-middleware.ts +22 -0
  131. package/src/middleware/default-settings-middleware.test.ts +388 -0
  132. package/src/middleware/default-settings-middleware.ts +33 -0
  133. package/src/middleware/extract-json-middleware.test.ts +827 -0
  134. package/src/middleware/extract-json-middleware.ts +197 -0
  135. package/src/middleware/extract-reasoning-middleware.test.ts +1028 -0
  136. package/src/middleware/extract-reasoning-middleware.ts +238 -0
  137. package/src/middleware/index.ts +10 -0
  138. package/src/middleware/simulate-streaming-middleware.test.ts +911 -0
  139. package/src/middleware/simulate-streaming-middleware.ts +79 -0
  140. package/src/middleware/wrap-embedding-model.test.ts +358 -0
  141. package/src/middleware/wrap-embedding-model.ts +86 -0
  142. package/src/middleware/wrap-image-model.test.ts +423 -0
  143. package/src/middleware/wrap-image-model.ts +85 -0
  144. package/src/middleware/wrap-language-model.test.ts +518 -0
  145. package/src/middleware/wrap-language-model.ts +104 -0
  146. package/src/middleware/wrap-provider.test.ts +120 -0
  147. package/src/middleware/wrap-provider.ts +51 -0
  148. package/src/model/as-embedding-model-v3.test.ts +319 -0
  149. package/src/model/as-embedding-model-v3.ts +24 -0
  150. package/src/model/as-image-model-v3.test.ts +409 -0
  151. package/src/model/as-image-model-v3.ts +24 -0
  152. package/src/model/as-language-model-v3.test.ts +508 -0
  153. package/src/model/as-language-model-v3.ts +103 -0
  154. package/src/model/as-provider-v3.ts +36 -0
  155. package/src/model/as-speech-model-v3.test.ts +356 -0
  156. package/src/model/as-speech-model-v3.ts +24 -0
  157. package/src/model/as-transcription-model-v3.test.ts +529 -0
  158. package/src/model/as-transcription-model-v3.ts +24 -0
  159. package/src/model/resolve-model.test.ts +244 -0
  160. package/src/model/resolve-model.ts +126 -0
  161. package/src/prompt/call-settings.ts +148 -0
  162. package/src/prompt/content-part.ts +209 -0
  163. package/src/prompt/convert-to-language-model-prompt.test.ts +2018 -0
  164. package/src/prompt/convert-to-language-model-prompt.ts +442 -0
  165. package/src/prompt/create-tool-model-output.test.ts +508 -0
  166. package/src/prompt/create-tool-model-output.ts +34 -0
  167. package/src/prompt/data-content.test.ts +15 -0
  168. package/src/prompt/data-content.ts +134 -0
  169. package/src/prompt/index.ts +27 -0
  170. package/src/prompt/invalid-data-content-error.ts +29 -0
  171. package/src/prompt/invalid-message-role-error.ts +27 -0
  172. package/src/prompt/message-conversion-error.ts +28 -0
  173. package/src/prompt/message.ts +68 -0
  174. package/src/prompt/prepare-call-settings.test.ts +159 -0
  175. package/src/prompt/prepare-call-settings.ts +108 -0
  176. package/src/prompt/prepare-tools-and-tool-choice.test.ts +461 -0
  177. package/src/prompt/prepare-tools-and-tool-choice.ts +86 -0
  178. package/src/prompt/prompt.ts +43 -0
  179. package/src/prompt/split-data-url.ts +17 -0
  180. package/src/prompt/standardize-prompt.test.ts +82 -0
  181. package/src/prompt/standardize-prompt.ts +99 -0
  182. package/src/prompt/wrap-gateway-error.ts +29 -0
  183. package/src/registry/custom-provider.test.ts +211 -0
  184. package/src/registry/custom-provider.ts +155 -0
  185. package/src/registry/index.ts +7 -0
  186. package/src/registry/no-such-provider-error.ts +41 -0
  187. package/src/registry/provider-registry.test.ts +691 -0
  188. package/src/registry/provider-registry.ts +328 -0
  189. package/src/rerank/index.ts +2 -0
  190. package/src/rerank/rerank-result.ts +70 -0
  191. package/src/rerank/rerank.test.ts +516 -0
  192. package/src/rerank/rerank.ts +237 -0
  193. package/src/telemetry/assemble-operation-name.ts +21 -0
  194. package/src/telemetry/get-base-telemetry-attributes.ts +53 -0
  195. package/src/telemetry/get-tracer.ts +20 -0
  196. package/src/telemetry/noop-tracer.ts +69 -0
  197. package/src/telemetry/record-span.ts +63 -0
  198. package/src/telemetry/select-telemetry-attributes.ts +78 -0
  199. package/src/telemetry/select-temetry-attributes.test.ts +114 -0
  200. package/src/telemetry/stringify-for-telemetry.test.ts +114 -0
  201. package/src/telemetry/stringify-for-telemetry.ts +33 -0
  202. package/src/telemetry/telemetry-settings.ts +44 -0
  203. package/src/test/mock-embedding-model-v2.ts +35 -0
  204. package/src/test/mock-embedding-model-v3.ts +48 -0
  205. package/src/test/mock-image-model-v2.ts +28 -0
  206. package/src/test/mock-image-model-v3.ts +28 -0
  207. package/src/test/mock-language-model-v2.ts +72 -0
  208. package/src/test/mock-language-model-v3.ts +77 -0
  209. package/src/test/mock-provider-v2.ts +68 -0
  210. package/src/test/mock-provider-v3.ts +80 -0
  211. package/src/test/mock-reranking-model-v3.ts +25 -0
  212. package/src/test/mock-server-response.ts +69 -0
  213. package/src/test/mock-speech-model-v2.ts +24 -0
  214. package/src/test/mock-speech-model-v3.ts +24 -0
  215. package/src/test/mock-tracer.ts +156 -0
  216. package/src/test/mock-transcription-model-v2.ts +24 -0
  217. package/src/test/mock-transcription-model-v3.ts +24 -0
  218. package/src/test/mock-values.ts +4 -0
  219. package/src/test/not-implemented.ts +3 -0
  220. package/src/text-stream/create-text-stream-response.test.ts +38 -0
  221. package/src/text-stream/create-text-stream-response.ts +18 -0
  222. package/src/text-stream/index.ts +2 -0
  223. package/src/text-stream/pipe-text-stream-to-response.test.ts +38 -0
  224. package/src/text-stream/pipe-text-stream-to-response.ts +26 -0
  225. package/src/transcribe/index.ts +2 -0
  226. package/src/transcribe/transcribe-result.ts +60 -0
  227. package/src/transcribe/transcribe.test.ts +313 -0
  228. package/src/transcribe/transcribe.ts +173 -0
  229. package/src/types/embedding-model-middleware.ts +3 -0
  230. package/src/types/embedding-model.ts +18 -0
  231. package/src/types/image-model-middleware.ts +3 -0
  232. package/src/types/image-model-response-metadata.ts +16 -0
  233. package/src/types/image-model.ts +19 -0
  234. package/src/types/index.ts +29 -0
  235. package/src/types/json-value.ts +15 -0
  236. package/src/types/language-model-middleware.ts +3 -0
  237. package/src/types/language-model-request-metadata.ts +6 -0
  238. package/src/types/language-model-response-metadata.ts +21 -0
  239. package/src/types/language-model.ts +104 -0
  240. package/src/types/provider-metadata.ts +16 -0
  241. package/src/types/provider.ts +55 -0
  242. package/src/types/reranking-model.ts +6 -0
  243. package/src/types/speech-model-response-metadata.ts +21 -0
  244. package/src/types/speech-model.ts +6 -0
  245. package/src/types/transcription-model-response-metadata.ts +16 -0
  246. package/src/types/transcription-model.ts +9 -0
  247. package/src/types/usage.ts +200 -0
  248. package/src/types/warning.ts +7 -0
  249. package/src/ui/__snapshots__/append-response-messages.test.ts.snap +416 -0
  250. package/src/ui/__snapshots__/convert-to-model-messages.test.ts.snap +419 -0
  251. package/src/ui/__snapshots__/process-chat-text-response.test.ts.snap +142 -0
  252. package/src/ui/call-completion-api.ts +157 -0
  253. package/src/ui/chat-transport.ts +83 -0
  254. package/src/ui/chat.test-d.ts +233 -0
  255. package/src/ui/chat.test.ts +2695 -0
  256. package/src/ui/chat.ts +716 -0
  257. package/src/ui/convert-file-list-to-file-ui-parts.ts +36 -0
  258. package/src/ui/convert-to-model-messages.test.ts +2775 -0
  259. package/src/ui/convert-to-model-messages.ts +373 -0
  260. package/src/ui/default-chat-transport.ts +36 -0
  261. package/src/ui/direct-chat-transport.test.ts +446 -0
  262. package/src/ui/direct-chat-transport.ts +118 -0
  263. package/src/ui/http-chat-transport.test.ts +185 -0
  264. package/src/ui/http-chat-transport.ts +292 -0
  265. package/src/ui/index.ts +71 -0
  266. package/src/ui/last-assistant-message-is-complete-with-approval-responses.ts +44 -0
  267. package/src/ui/last-assistant-message-is-complete-with-tool-calls.test.ts +371 -0
  268. package/src/ui/last-assistant-message-is-complete-with-tool-calls.ts +39 -0
  269. package/src/ui/process-text-stream.test.ts +38 -0
  270. package/src/ui/process-text-stream.ts +16 -0
  271. package/src/ui/process-ui-message-stream.test.ts +8052 -0
  272. package/src/ui/process-ui-message-stream.ts +713 -0
  273. package/src/ui/text-stream-chat-transport.ts +23 -0
  274. package/src/ui/transform-text-to-ui-message-stream.test.ts +124 -0
  275. package/src/ui/transform-text-to-ui-message-stream.ts +27 -0
  276. package/src/ui/ui-messages.test.ts +48 -0
  277. package/src/ui/ui-messages.ts +534 -0
  278. package/src/ui/use-completion.ts +84 -0
  279. package/src/ui/validate-ui-messages.test.ts +1428 -0
  280. package/src/ui/validate-ui-messages.ts +476 -0
  281. package/src/ui-message-stream/create-ui-message-stream-response.test.ts +266 -0
  282. package/src/ui-message-stream/create-ui-message-stream-response.ts +32 -0
  283. package/src/ui-message-stream/create-ui-message-stream.test.ts +639 -0
  284. package/src/ui-message-stream/create-ui-message-stream.ts +124 -0
  285. package/src/ui-message-stream/get-response-ui-message-id.test.ts +55 -0
  286. package/src/ui-message-stream/get-response-ui-message-id.ts +24 -0
  287. package/src/ui-message-stream/handle-ui-message-stream-finish.test.ts +429 -0
  288. package/src/ui-message-stream/handle-ui-message-stream-finish.ts +135 -0
  289. package/src/ui-message-stream/index.ts +13 -0
  290. package/src/ui-message-stream/json-to-sse-transform-stream.ts +12 -0
  291. package/src/ui-message-stream/pipe-ui-message-stream-to-response.test.ts +90 -0
  292. package/src/ui-message-stream/pipe-ui-message-stream-to-response.ts +40 -0
  293. package/src/ui-message-stream/read-ui-message-stream.test.ts +122 -0
  294. package/src/ui-message-stream/read-ui-message-stream.ts +87 -0
  295. package/src/ui-message-stream/ui-message-chunks.test-d.ts +18 -0
  296. package/src/ui-message-stream/ui-message-chunks.ts +344 -0
  297. package/src/ui-message-stream/ui-message-stream-headers.ts +7 -0
  298. package/src/ui-message-stream/ui-message-stream-on-finish-callback.ts +32 -0
  299. package/src/ui-message-stream/ui-message-stream-response-init.ts +5 -0
  300. package/src/ui-message-stream/ui-message-stream-writer.ts +24 -0
  301. package/src/util/as-array.ts +3 -0
  302. package/src/util/async-iterable-stream.test.ts +241 -0
  303. package/src/util/async-iterable-stream.ts +94 -0
  304. package/src/util/consume-stream.ts +29 -0
  305. package/src/util/cosine-similarity.test.ts +57 -0
  306. package/src/util/cosine-similarity.ts +47 -0
  307. package/src/util/create-resolvable-promise.ts +30 -0
  308. package/src/util/create-stitchable-stream.test.ts +239 -0
  309. package/src/util/create-stitchable-stream.ts +112 -0
  310. package/src/util/data-url.ts +17 -0
  311. package/src/util/deep-partial.ts +84 -0
  312. package/src/util/detect-media-type.test.ts +670 -0
  313. package/src/util/detect-media-type.ts +184 -0
  314. package/src/util/download/download-function.ts +45 -0
  315. package/src/util/download/download.test.ts +69 -0
  316. package/src/util/download/download.ts +46 -0
  317. package/src/util/error-handler.ts +1 -0
  318. package/src/util/fix-json.test.ts +279 -0
  319. package/src/util/fix-json.ts +401 -0
  320. package/src/util/get-potential-start-index.test.ts +34 -0
  321. package/src/util/get-potential-start-index.ts +30 -0
  322. package/src/util/index.ts +11 -0
  323. package/src/util/is-deep-equal-data.test.ts +119 -0
  324. package/src/util/is-deep-equal-data.ts +48 -0
  325. package/src/util/is-non-empty-object.ts +5 -0
  326. package/src/util/job.ts +1 -0
  327. package/src/util/log-v2-compatibility-warning.ts +21 -0
  328. package/src/util/merge-abort-signals.test.ts +155 -0
  329. package/src/util/merge-abort-signals.ts +43 -0
  330. package/src/util/merge-objects.test.ts +118 -0
  331. package/src/util/merge-objects.ts +79 -0
  332. package/src/util/now.ts +4 -0
  333. package/src/util/parse-partial-json.test.ts +80 -0
  334. package/src/util/parse-partial-json.ts +30 -0
  335. package/src/util/prepare-headers.test.ts +51 -0
  336. package/src/util/prepare-headers.ts +14 -0
  337. package/src/util/prepare-retries.test.ts +10 -0
  338. package/src/util/prepare-retries.ts +47 -0
  339. package/src/util/retry-error.ts +41 -0
  340. package/src/util/retry-with-exponential-backoff.test.ts +446 -0
  341. package/src/util/retry-with-exponential-backoff.ts +154 -0
  342. package/src/util/serial-job-executor.test.ts +162 -0
  343. package/src/util/serial-job-executor.ts +36 -0
  344. package/src/util/simulate-readable-stream.test.ts +98 -0
  345. package/src/util/simulate-readable-stream.ts +39 -0
  346. package/src/util/split-array.test.ts +60 -0
  347. package/src/util/split-array.ts +20 -0
  348. package/src/util/value-of.ts +65 -0
  349. package/src/util/write-to-server-response.test.ts +266 -0
  350. package/src/util/write-to-server-response.ts +49 -0
  351. package/src/version.ts +5 -0
@@ -0,0 +1,401 @@
1
+ type State =
2
+ | 'ROOT'
3
+ | 'FINISH'
4
+ | 'INSIDE_STRING'
5
+ | 'INSIDE_STRING_ESCAPE'
6
+ | 'INSIDE_LITERAL'
7
+ | 'INSIDE_NUMBER'
8
+ | 'INSIDE_OBJECT_START'
9
+ | 'INSIDE_OBJECT_KEY'
10
+ | 'INSIDE_OBJECT_AFTER_KEY'
11
+ | 'INSIDE_OBJECT_BEFORE_VALUE'
12
+ | 'INSIDE_OBJECT_AFTER_VALUE'
13
+ | 'INSIDE_OBJECT_AFTER_COMMA'
14
+ | 'INSIDE_ARRAY_START'
15
+ | 'INSIDE_ARRAY_AFTER_VALUE'
16
+ | 'INSIDE_ARRAY_AFTER_COMMA';
17
+
18
+ // Implemented as a scanner with additional fixing
19
+ // that performs a single linear time scan pass over the partial JSON.
20
+ //
21
+ // The states should ideally match relevant states from the JSON spec:
22
+ // https://www.json.org/json-en.html
23
+ //
24
+ // Please note that invalid JSON is not considered/covered, because it
25
+ // is assumed that the resulting JSON will be processed by a standard
26
+ // JSON parser that will detect any invalid JSON.
27
+ export function fixJson(input: string): string {
28
+ const stack: State[] = ['ROOT'];
29
+ let lastValidIndex = -1;
30
+ let literalStart: number | null = null;
31
+
32
+ function processValueStart(char: string, i: number, swapState: State) {
33
+ {
34
+ switch (char) {
35
+ case '"': {
36
+ lastValidIndex = i;
37
+ stack.pop();
38
+ stack.push(swapState);
39
+ stack.push('INSIDE_STRING');
40
+ break;
41
+ }
42
+
43
+ case 'f':
44
+ case 't':
45
+ case 'n': {
46
+ lastValidIndex = i;
47
+ literalStart = i;
48
+ stack.pop();
49
+ stack.push(swapState);
50
+ stack.push('INSIDE_LITERAL');
51
+ break;
52
+ }
53
+
54
+ case '-': {
55
+ stack.pop();
56
+ stack.push(swapState);
57
+ stack.push('INSIDE_NUMBER');
58
+ break;
59
+ }
60
+ case '0':
61
+ case '1':
62
+ case '2':
63
+ case '3':
64
+ case '4':
65
+ case '5':
66
+ case '6':
67
+ case '7':
68
+ case '8':
69
+ case '9': {
70
+ lastValidIndex = i;
71
+ stack.pop();
72
+ stack.push(swapState);
73
+ stack.push('INSIDE_NUMBER');
74
+ break;
75
+ }
76
+
77
+ case '{': {
78
+ lastValidIndex = i;
79
+ stack.pop();
80
+ stack.push(swapState);
81
+ stack.push('INSIDE_OBJECT_START');
82
+ break;
83
+ }
84
+
85
+ case '[': {
86
+ lastValidIndex = i;
87
+ stack.pop();
88
+ stack.push(swapState);
89
+ stack.push('INSIDE_ARRAY_START');
90
+ break;
91
+ }
92
+ }
93
+ }
94
+ }
95
+
96
+ function processAfterObjectValue(char: string, i: number) {
97
+ switch (char) {
98
+ case ',': {
99
+ stack.pop();
100
+ stack.push('INSIDE_OBJECT_AFTER_COMMA');
101
+ break;
102
+ }
103
+ case '}': {
104
+ lastValidIndex = i;
105
+ stack.pop();
106
+ break;
107
+ }
108
+ }
109
+ }
110
+
111
+ function processAfterArrayValue(char: string, i: number) {
112
+ switch (char) {
113
+ case ',': {
114
+ stack.pop();
115
+ stack.push('INSIDE_ARRAY_AFTER_COMMA');
116
+ break;
117
+ }
118
+ case ']': {
119
+ lastValidIndex = i;
120
+ stack.pop();
121
+ break;
122
+ }
123
+ }
124
+ }
125
+
126
+ for (let i = 0; i < input.length; i++) {
127
+ const char = input[i];
128
+ const currentState = stack[stack.length - 1];
129
+
130
+ switch (currentState) {
131
+ case 'ROOT':
132
+ processValueStart(char, i, 'FINISH');
133
+ break;
134
+
135
+ case 'INSIDE_OBJECT_START': {
136
+ switch (char) {
137
+ case '"': {
138
+ stack.pop();
139
+ stack.push('INSIDE_OBJECT_KEY');
140
+ break;
141
+ }
142
+ case '}': {
143
+ lastValidIndex = i;
144
+ stack.pop();
145
+ break;
146
+ }
147
+ }
148
+ break;
149
+ }
150
+
151
+ case 'INSIDE_OBJECT_AFTER_COMMA': {
152
+ switch (char) {
153
+ case '"': {
154
+ stack.pop();
155
+ stack.push('INSIDE_OBJECT_KEY');
156
+ break;
157
+ }
158
+ }
159
+ break;
160
+ }
161
+
162
+ case 'INSIDE_OBJECT_KEY': {
163
+ switch (char) {
164
+ case '"': {
165
+ stack.pop();
166
+ stack.push('INSIDE_OBJECT_AFTER_KEY');
167
+ break;
168
+ }
169
+ }
170
+ break;
171
+ }
172
+
173
+ case 'INSIDE_OBJECT_AFTER_KEY': {
174
+ switch (char) {
175
+ case ':': {
176
+ stack.pop();
177
+ stack.push('INSIDE_OBJECT_BEFORE_VALUE');
178
+
179
+ break;
180
+ }
181
+ }
182
+ break;
183
+ }
184
+
185
+ case 'INSIDE_OBJECT_BEFORE_VALUE': {
186
+ processValueStart(char, i, 'INSIDE_OBJECT_AFTER_VALUE');
187
+ break;
188
+ }
189
+
190
+ case 'INSIDE_OBJECT_AFTER_VALUE': {
191
+ processAfterObjectValue(char, i);
192
+ break;
193
+ }
194
+
195
+ case 'INSIDE_STRING': {
196
+ switch (char) {
197
+ case '"': {
198
+ stack.pop();
199
+ lastValidIndex = i;
200
+ break;
201
+ }
202
+
203
+ case '\\': {
204
+ stack.push('INSIDE_STRING_ESCAPE');
205
+ break;
206
+ }
207
+
208
+ default: {
209
+ lastValidIndex = i;
210
+ }
211
+ }
212
+
213
+ break;
214
+ }
215
+
216
+ case 'INSIDE_ARRAY_START': {
217
+ switch (char) {
218
+ case ']': {
219
+ lastValidIndex = i;
220
+ stack.pop();
221
+ break;
222
+ }
223
+
224
+ default: {
225
+ lastValidIndex = i;
226
+ processValueStart(char, i, 'INSIDE_ARRAY_AFTER_VALUE');
227
+ break;
228
+ }
229
+ }
230
+ break;
231
+ }
232
+
233
+ case 'INSIDE_ARRAY_AFTER_VALUE': {
234
+ switch (char) {
235
+ case ',': {
236
+ stack.pop();
237
+ stack.push('INSIDE_ARRAY_AFTER_COMMA');
238
+ break;
239
+ }
240
+
241
+ case ']': {
242
+ lastValidIndex = i;
243
+ stack.pop();
244
+ break;
245
+ }
246
+
247
+ default: {
248
+ lastValidIndex = i;
249
+ break;
250
+ }
251
+ }
252
+
253
+ break;
254
+ }
255
+
256
+ case 'INSIDE_ARRAY_AFTER_COMMA': {
257
+ processValueStart(char, i, 'INSIDE_ARRAY_AFTER_VALUE');
258
+ break;
259
+ }
260
+
261
+ case 'INSIDE_STRING_ESCAPE': {
262
+ stack.pop();
263
+ lastValidIndex = i;
264
+
265
+ break;
266
+ }
267
+
268
+ case 'INSIDE_NUMBER': {
269
+ switch (char) {
270
+ case '0':
271
+ case '1':
272
+ case '2':
273
+ case '3':
274
+ case '4':
275
+ case '5':
276
+ case '6':
277
+ case '7':
278
+ case '8':
279
+ case '9': {
280
+ lastValidIndex = i;
281
+ break;
282
+ }
283
+
284
+ case 'e':
285
+ case 'E':
286
+ case '-':
287
+ case '.': {
288
+ break;
289
+ }
290
+
291
+ case ',': {
292
+ stack.pop();
293
+
294
+ if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {
295
+ processAfterArrayValue(char, i);
296
+ }
297
+
298
+ if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {
299
+ processAfterObjectValue(char, i);
300
+ }
301
+
302
+ break;
303
+ }
304
+
305
+ case '}': {
306
+ stack.pop();
307
+
308
+ if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {
309
+ processAfterObjectValue(char, i);
310
+ }
311
+
312
+ break;
313
+ }
314
+
315
+ case ']': {
316
+ stack.pop();
317
+
318
+ if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {
319
+ processAfterArrayValue(char, i);
320
+ }
321
+
322
+ break;
323
+ }
324
+
325
+ default: {
326
+ stack.pop();
327
+ break;
328
+ }
329
+ }
330
+
331
+ break;
332
+ }
333
+
334
+ case 'INSIDE_LITERAL': {
335
+ const partialLiteral = input.substring(literalStart!, i + 1);
336
+
337
+ if (
338
+ !'false'.startsWith(partialLiteral) &&
339
+ !'true'.startsWith(partialLiteral) &&
340
+ !'null'.startsWith(partialLiteral)
341
+ ) {
342
+ stack.pop();
343
+
344
+ if (stack[stack.length - 1] === 'INSIDE_OBJECT_AFTER_VALUE') {
345
+ processAfterObjectValue(char, i);
346
+ } else if (stack[stack.length - 1] === 'INSIDE_ARRAY_AFTER_VALUE') {
347
+ processAfterArrayValue(char, i);
348
+ }
349
+ } else {
350
+ lastValidIndex = i;
351
+ }
352
+
353
+ break;
354
+ }
355
+ }
356
+ }
357
+
358
+ let result = input.slice(0, lastValidIndex + 1);
359
+
360
+ for (let i = stack.length - 1; i >= 0; i--) {
361
+ const state = stack[i];
362
+
363
+ switch (state) {
364
+ case 'INSIDE_STRING': {
365
+ result += '"';
366
+ break;
367
+ }
368
+
369
+ case 'INSIDE_OBJECT_KEY':
370
+ case 'INSIDE_OBJECT_AFTER_KEY':
371
+ case 'INSIDE_OBJECT_AFTER_COMMA':
372
+ case 'INSIDE_OBJECT_START':
373
+ case 'INSIDE_OBJECT_BEFORE_VALUE':
374
+ case 'INSIDE_OBJECT_AFTER_VALUE': {
375
+ result += '}';
376
+ break;
377
+ }
378
+
379
+ case 'INSIDE_ARRAY_START':
380
+ case 'INSIDE_ARRAY_AFTER_COMMA':
381
+ case 'INSIDE_ARRAY_AFTER_VALUE': {
382
+ result += ']';
383
+ break;
384
+ }
385
+
386
+ case 'INSIDE_LITERAL': {
387
+ const partialLiteral = input.substring(literalStart!, input.length);
388
+
389
+ if ('true'.startsWith(partialLiteral)) {
390
+ result += 'true'.slice(partialLiteral.length);
391
+ } else if ('false'.startsWith(partialLiteral)) {
392
+ result += 'false'.slice(partialLiteral.length);
393
+ } else if ('null'.startsWith(partialLiteral)) {
394
+ result += 'null'.slice(partialLiteral.length);
395
+ }
396
+ }
397
+ }
398
+ }
399
+
400
+ return result;
401
+ }
@@ -0,0 +1,34 @@
1
+ import { getPotentialStartIndex } from './get-potential-start-index';
2
+ import { describe, it, expect } from 'vitest';
3
+
4
+ describe('getPotentialStartIndex', () => {
5
+ it('should return null when searchedText is empty', () => {
6
+ const result = getPotentialStartIndex('1234567890', '');
7
+ expect(result).toBeNull();
8
+ });
9
+
10
+ it('should return null when searchedText is not in text', () => {
11
+ const result = getPotentialStartIndex('1234567890', 'a');
12
+ expect(result).toBeNull();
13
+ });
14
+
15
+ it('should return index when searchedText is in text', () => {
16
+ const result = getPotentialStartIndex('1234567890', '1234567890');
17
+ expect(result).toBe(0);
18
+ });
19
+
20
+ it('should return index when searchedText might start in text', () => {
21
+ const result = getPotentialStartIndex('1234567890', '0123');
22
+ expect(result).toBe(9);
23
+ });
24
+
25
+ it('should return index when searchedText might start in text', () => {
26
+ const result = getPotentialStartIndex('1234567890', '90123');
27
+ expect(result).toBe(8);
28
+ });
29
+
30
+ it('should return index when searchedText might start in text', () => {
31
+ const result = getPotentialStartIndex('1234567890', '890123');
32
+ expect(result).toBe(7);
33
+ });
34
+ });
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Returns the index of the start of the searchedText in the text, or null if it
3
+ * is not found.
4
+ */
5
+ export function getPotentialStartIndex(
6
+ text: string,
7
+ searchedText: string,
8
+ ): number | null {
9
+ // Return null immediately if searchedText is empty.
10
+ if (searchedText.length === 0) {
11
+ return null;
12
+ }
13
+
14
+ // Check if the searchedText exists as a direct substring of text.
15
+ const directIndex = text.indexOf(searchedText);
16
+ if (directIndex !== -1) {
17
+ return directIndex;
18
+ }
19
+
20
+ // Otherwise, look for the largest suffix of "text" that matches
21
+ // a prefix of "searchedText". We go from the end of text inward.
22
+ for (let i = text.length - 1; i >= 0; i--) {
23
+ const suffix = text.substring(i);
24
+ if (searchedText.startsWith(suffix)) {
25
+ return i;
26
+ }
27
+ }
28
+
29
+ return null;
30
+ }
@@ -0,0 +1,11 @@
1
+ export type { AsyncIterableStream } from './async-iterable-stream';
2
+ export { consumeStream } from './consume-stream';
3
+ export { cosineSimilarity } from './cosine-similarity';
4
+ export { getTextFromDataUrl } from './data-url';
5
+ export type { DeepPartial } from './deep-partial';
6
+ export type { DownloadFunction as Experimental_DownloadFunction } from './download/download-function';
7
+ export { type ErrorHandler } from './error-handler';
8
+ export { isDeepEqualData } from './is-deep-equal-data';
9
+ export { parsePartialJson } from './parse-partial-json';
10
+ export { SerialJobExecutor } from './serial-job-executor';
11
+ export { simulateReadableStream } from './simulate-readable-stream';
@@ -0,0 +1,119 @@
1
+ import assert from 'node:assert';
2
+ import { isDeepEqualData } from './is-deep-equal-data';
3
+ import { it } from 'vitest';
4
+
5
+ it('should check if two primitives are equal', async () => {
6
+ let x = 1;
7
+ let y = 1;
8
+ let result = isDeepEqualData(x, y);
9
+ assert.equal(result, true);
10
+
11
+ x = 1;
12
+ y = 2;
13
+ result = isDeepEqualData(x, y);
14
+ assert.equal(result, false);
15
+ });
16
+
17
+ it('should return false for different types', async () => {
18
+ const obj = { a: 1 };
19
+ const num = 1;
20
+ const result = isDeepEqualData(obj, num);
21
+ assert.equal(result, false);
22
+ });
23
+
24
+ it('should return false for null values compared with objects', async () => {
25
+ const obj = { a: 1 };
26
+ const result = isDeepEqualData(obj, null);
27
+ assert.equal(result, false);
28
+ });
29
+
30
+ it('should identify two equal objects', async () => {
31
+ const obj1 = { a: 1, b: 2 };
32
+ const obj2 = { a: 1, b: 2 };
33
+ const result = isDeepEqualData(obj1, obj2);
34
+ assert.equal(result, true);
35
+ });
36
+
37
+ it('should identify two objects with different values', async () => {
38
+ const obj1 = { a: 1, b: 2 };
39
+ const obj2 = { a: 1, b: 3 };
40
+ const result = isDeepEqualData(obj1, obj2);
41
+ assert.equal(result, false);
42
+ });
43
+
44
+ it('should identify two objects with different number of keys', async () => {
45
+ const obj1 = { a: 1, b: 2 };
46
+ const obj2 = { a: 1, b: 2, c: 3 };
47
+ const result = isDeepEqualData(obj1, obj2);
48
+ assert.equal(result, false);
49
+ });
50
+
51
+ it('should handle nested objects', async () => {
52
+ const obj1 = { a: { c: 1 }, b: 2 };
53
+ const obj2 = { a: { c: 1 }, b: 2 };
54
+ const result = isDeepEqualData(obj1, obj2);
55
+ assert.equal(result, true);
56
+ });
57
+
58
+ it('should detect inequality in nested objects', async () => {
59
+ const obj1 = { a: { c: 1 }, b: 2 };
60
+ const obj2 = { a: { c: 2 }, b: 2 };
61
+ const result = isDeepEqualData(obj1, obj2);
62
+ assert.equal(result, false);
63
+ });
64
+
65
+ it('should compare arrays correctly', async () => {
66
+ const arr1 = [1, 2, 3];
67
+ const arr2 = [1, 2, 3];
68
+ const result = isDeepEqualData(arr1, arr2);
69
+ assert.equal(result, true);
70
+
71
+ const arr3 = [1, 2, 3];
72
+ const arr4 = [1, 2, 4];
73
+ const result2 = isDeepEqualData(arr3, arr4);
74
+ assert.equal(result2, false);
75
+ });
76
+
77
+ it('should return false for null comparison with object', () => {
78
+ const obj = { a: 1 };
79
+ const result = isDeepEqualData(obj, null);
80
+ assert.equal(result, false);
81
+ });
82
+
83
+ it('should distinguish between array and object with same enumerable properties', () => {
84
+ const obj = { 0: 'one', 1: 'two', length: 2 };
85
+ const arr = ['one', 'two'];
86
+ const result = isDeepEqualData(obj, arr);
87
+ assert.equal(result, false);
88
+ });
89
+
90
+ it('should return false when comparing objects with different prototypes', () => {
91
+ const obj1 = Object.create({ a: 1 });
92
+ const obj2 = Object.create(null);
93
+ obj1.b = 2;
94
+ obj2.b = 2;
95
+ const result = isDeepEqualData(obj1, obj2);
96
+ assert.equal(result, false);
97
+ });
98
+
99
+ it('should handle date object comparisons correctly', () => {
100
+ const date1 = new Date(2000, 0, 1);
101
+ const date2 = new Date(2000, 0, 1);
102
+ const date3 = new Date(2000, 0, 2);
103
+ assert.equal(isDeepEqualData(date1, date2), true);
104
+ assert.equal(isDeepEqualData(date1, date3), false);
105
+ });
106
+
107
+ it('should handle function comparisons', () => {
108
+ const func1 = () => {
109
+ console.log('hello');
110
+ };
111
+ const func2 = () => {
112
+ console.log('hello');
113
+ };
114
+ const func3 = () => {
115
+ console.log('world');
116
+ };
117
+ assert.equal(isDeepEqualData(func1, func2), false);
118
+ assert.equal(isDeepEqualData(func1, func3), false);
119
+ });
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Performs a deep-equal comparison of two parsed JSON objects.
3
+ *
4
+ * @param {any} obj1 - The first object to compare.
5
+ * @param {any} obj2 - The second object to compare.
6
+ * @returns {boolean} - Returns true if the two objects are deeply equal, false otherwise.
7
+ */
8
+ export function isDeepEqualData(obj1: any, obj2: any): boolean {
9
+ // Check for strict equality first
10
+ if (obj1 === obj2) return true;
11
+
12
+ // Check if either is null or undefined
13
+ if (obj1 == null || obj2 == null) return false;
14
+
15
+ // Check if both are objects
16
+ if (typeof obj1 !== 'object' && typeof obj2 !== 'object')
17
+ return obj1 === obj2;
18
+
19
+ // If they are not strictly equal, they both need to be Objects
20
+ if (obj1.constructor !== obj2.constructor) return false;
21
+
22
+ // Special handling for Date objects
23
+ if (obj1 instanceof Date && obj2 instanceof Date) {
24
+ return obj1.getTime() === obj2.getTime();
25
+ }
26
+
27
+ // Handle arrays: compare length and then perform a recursive deep comparison on each item
28
+ if (Array.isArray(obj1)) {
29
+ if (obj1.length !== obj2.length) return false;
30
+ for (let i = 0; i < obj1.length; i++) {
31
+ if (!isDeepEqualData(obj1[i], obj2[i])) return false;
32
+ }
33
+ return true; // All array elements matched
34
+ }
35
+
36
+ // Compare the set of keys in each object
37
+ const keys1 = Object.keys(obj1);
38
+ const keys2 = Object.keys(obj2);
39
+ if (keys1.length !== keys2.length) return false;
40
+
41
+ // Check each key-value pair recursively
42
+ for (const key of keys1) {
43
+ if (!keys2.includes(key)) return false;
44
+ if (!isDeepEqualData(obj1[key], obj2[key])) return false;
45
+ }
46
+
47
+ return true; // All keys and values matched
48
+ }
@@ -0,0 +1,5 @@
1
+ export function isNonEmptyObject(
2
+ object: Record<string, unknown> | undefined | null,
3
+ ): object is Record<string, unknown> {
4
+ return object != null && Object.keys(object).length > 0;
5
+ }
@@ -0,0 +1 @@
1
+ export type Job = () => Promise<void>;
@@ -0,0 +1,21 @@
1
+ import { logWarnings } from '../logger/log-warnings';
2
+
3
+ export function logV2CompatibilityWarning({
4
+ provider,
5
+ modelId,
6
+ }: {
7
+ provider: string;
8
+ modelId: string;
9
+ }): void {
10
+ logWarnings({
11
+ warnings: [
12
+ {
13
+ type: 'compatibility',
14
+ feature: 'specificationVersion',
15
+ details: `Using v2 specification compatibility mode. Some features may not be available.`,
16
+ },
17
+ ],
18
+ provider,
19
+ model: modelId,
20
+ });
21
+ }