alchemy 2.0.0-beta.46 → 2.0.0-beta.48

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 (295) hide show
  1. package/bin/exec.js +18 -10
  2. package/bin/exec.js.map +1 -1
  3. package/lib/AWS/Lambda/BucketEventSource.d.ts +1 -1
  4. package/lib/AWS/Lambda/BucketEventSource.d.ts.map +1 -1
  5. package/lib/AWS/Lambda/EventBridgeEventSource.d.ts +1 -1
  6. package/lib/AWS/Lambda/EventBridgeEventSource.d.ts.map +1 -1
  7. package/lib/AWS/Lambda/QueueEventSource.d.ts +1 -1
  8. package/lib/AWS/Lambda/QueueEventSource.d.ts.map +1 -1
  9. package/lib/AWS/Lambda/StreamEventSource.d.ts +1 -1
  10. package/lib/AWS/Lambda/StreamEventSource.d.ts.map +1 -1
  11. package/lib/AWS/Lambda/TableEventSource.d.ts +1 -1
  12. package/lib/AWS/Lambda/TableEventSource.d.ts.map +1 -1
  13. package/lib/AWS/Lambda/TopicEventSource.d.ts +1 -1
  14. package/lib/AWS/Lambda/TopicEventSource.d.ts.map +1 -1
  15. package/lib/Apply.js +2 -2
  16. package/lib/Apply.js.map +1 -1
  17. package/lib/Cli/commands/_shared.d.ts +7 -1
  18. package/lib/Cli/commands/_shared.d.ts.map +1 -1
  19. package/lib/Cli/commands/_shared.js +1 -0
  20. package/lib/Cli/commands/_shared.js.map +1 -1
  21. package/lib/Cli/commands/cloudflare.d.ts +4 -1
  22. package/lib/Cli/commands/cloudflare.d.ts.map +1 -1
  23. package/lib/Cli/commands/cloudflare.js +274 -1
  24. package/lib/Cli/commands/cloudflare.js.map +1 -1
  25. package/lib/Cli/commands/login.d.ts +1 -1
  26. package/lib/Cli/commands/login.d.ts.map +1 -1
  27. package/lib/Cli/commands/login.js +45 -42
  28. package/lib/Cli/commands/login.js.map +1 -1
  29. package/lib/Cli/commands/logs.js +1 -1
  30. package/lib/Cli/commands/logs.js.map +1 -1
  31. package/lib/Cli/commands/state.js +1 -1
  32. package/lib/Cli/commands/state.js.map +1 -1
  33. package/lib/Cli/commands/tail.js +1 -1
  34. package/lib/Cli/commands/tail.js.map +1 -1
  35. package/lib/Cloudflare/AiGateway/AiGateway.d.ts +112 -1
  36. package/lib/Cloudflare/AiGateway/AiGateway.d.ts.map +1 -1
  37. package/lib/Cloudflare/AiGateway/AiGateway.js +114 -2
  38. package/lib/Cloudflare/AiGateway/AiGateway.js.map +1 -1
  39. package/lib/Cloudflare/AiGateway/AiGatewayBinding.d.ts +43 -10
  40. package/lib/Cloudflare/AiGateway/AiGatewayBinding.d.ts.map +1 -1
  41. package/lib/Cloudflare/AiGateway/AiGatewayBinding.js +38 -10
  42. package/lib/Cloudflare/AiGateway/AiGatewayBinding.js.map +1 -1
  43. package/lib/Cloudflare/AiGateway/LanguageModel.d.ts +35 -0
  44. package/lib/Cloudflare/AiGateway/LanguageModel.d.ts.map +1 -0
  45. package/lib/Cloudflare/AiGateway/LanguageModel.js +576 -0
  46. package/lib/Cloudflare/AiGateway/LanguageModel.js.map +1 -0
  47. package/lib/Cloudflare/AiGateway/index.d.ts +1 -0
  48. package/lib/Cloudflare/AiGateway/index.d.ts.map +1 -1
  49. package/lib/Cloudflare/AiGateway/index.js +1 -0
  50. package/lib/Cloudflare/AiGateway/index.js.map +1 -1
  51. package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts +40 -2
  52. package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts.map +1 -1
  53. package/lib/Cloudflare/ApiToken/AccountApiToken.js +49 -6
  54. package/lib/Cloudflare/ApiToken/AccountApiToken.js.map +1 -1
  55. package/lib/Cloudflare/ApiToken/Common.d.ts +26 -3
  56. package/lib/Cloudflare/ApiToken/Common.d.ts.map +1 -1
  57. package/lib/Cloudflare/ApiToken/Common.js +8 -0
  58. package/lib/Cloudflare/ApiToken/Common.js.map +1 -1
  59. package/lib/Cloudflare/ApiToken/UserApiToken.d.ts +38 -2
  60. package/lib/Cloudflare/ApiToken/UserApiToken.d.ts.map +1 -1
  61. package/lib/Cloudflare/ApiToken/UserApiToken.js +47 -6
  62. package/lib/Cloudflare/ApiToken/UserApiToken.js.map +1 -1
  63. package/lib/Cloudflare/Browser/Browser.d.ts +121 -0
  64. package/lib/Cloudflare/Browser/Browser.d.ts.map +1 -0
  65. package/lib/Cloudflare/{BrowserRendering/BrowserRendering.js → Browser/Browser.js} +19 -26
  66. package/lib/Cloudflare/Browser/Browser.js.map +1 -0
  67. package/lib/Cloudflare/Browser/BrowserBinding.d.ts +55 -0
  68. package/lib/Cloudflare/Browser/BrowserBinding.d.ts.map +1 -0
  69. package/lib/Cloudflare/{BrowserRendering/BrowserRenderingBinding.js → Browser/BrowserBinding.js} +11 -11
  70. package/lib/Cloudflare/Browser/BrowserBinding.js.map +1 -0
  71. package/lib/Cloudflare/Browser/index.d.ts +3 -0
  72. package/lib/Cloudflare/Browser/index.d.ts.map +1 -0
  73. package/lib/Cloudflare/Browser/index.js +3 -0
  74. package/lib/Cloudflare/Browser/index.js.map +1 -0
  75. package/lib/Cloudflare/Container/ContainerBinding.d.ts +2 -1
  76. package/lib/Cloudflare/Container/ContainerBinding.d.ts.map +1 -1
  77. package/lib/Cloudflare/D1/D1Database.d.ts.map +1 -1
  78. package/lib/Cloudflare/D1/D1Database.js +2 -1
  79. package/lib/Cloudflare/D1/D1Database.js.map +1 -1
  80. package/lib/Cloudflare/Email/EmailRouting.d.ts +1 -1
  81. package/lib/Cloudflare/Email/EmailRouting.d.ts.map +1 -1
  82. package/lib/Cloudflare/Email/EmailRouting.js +1 -1
  83. package/lib/Cloudflare/Email/EmailRouting.js.map +1 -1
  84. package/lib/Cloudflare/Email/EmailRule.d.ts +1 -1
  85. package/lib/Cloudflare/Email/EmailRule.d.ts.map +1 -1
  86. package/lib/Cloudflare/Email/EmailRule.js +1 -1
  87. package/lib/Cloudflare/Email/EmailRule.js.map +1 -1
  88. package/lib/Cloudflare/Images/Images.d.ts +32 -23
  89. package/lib/Cloudflare/Images/Images.d.ts.map +1 -1
  90. package/lib/Cloudflare/Images/Images.js +10 -13
  91. package/lib/Cloudflare/Images/Images.js.map +1 -1
  92. package/lib/Cloudflare/Providers.d.ts.map +1 -1
  93. package/lib/Cloudflare/Providers.js +10 -3
  94. package/lib/Cloudflare/Providers.js.map +1 -1
  95. package/lib/Cloudflare/R2/R2Bucket.d.ts +1 -1
  96. package/lib/Cloudflare/R2/R2Bucket.d.ts.map +1 -1
  97. package/lib/Cloudflare/R2/R2Bucket.js +13 -7
  98. package/lib/Cloudflare/R2/R2Bucket.js.map +1 -1
  99. package/lib/Cloudflare/RateLimit/RateLimit.d.ts +132 -0
  100. package/lib/Cloudflare/RateLimit/RateLimit.d.ts.map +1 -0
  101. package/lib/Cloudflare/RateLimit/RateLimit.js +80 -0
  102. package/lib/Cloudflare/RateLimit/RateLimit.js.map +1 -0
  103. package/lib/Cloudflare/RateLimit/RateLimitBinding.d.ts +30 -0
  104. package/lib/Cloudflare/RateLimit/RateLimitBinding.d.ts.map +1 -0
  105. package/lib/Cloudflare/RateLimit/RateLimitBinding.js +50 -0
  106. package/lib/Cloudflare/RateLimit/RateLimitBinding.js.map +1 -0
  107. package/lib/Cloudflare/RateLimit/index.d.ts +3 -0
  108. package/lib/Cloudflare/RateLimit/index.d.ts.map +1 -0
  109. package/lib/Cloudflare/RateLimit/index.js +3 -0
  110. package/lib/Cloudflare/RateLimit/index.js.map +1 -0
  111. package/lib/Cloudflare/SecretsStore/Secret.d.ts +2 -1
  112. package/lib/Cloudflare/SecretsStore/Secret.d.ts.map +1 -1
  113. package/lib/Cloudflare/SecretsStore/Secret.js +7 -4
  114. package/lib/Cloudflare/SecretsStore/Secret.js.map +1 -1
  115. package/lib/Cloudflare/StateStore/State.d.ts.map +1 -1
  116. package/lib/Cloudflare/StateStore/State.js +82 -78
  117. package/lib/Cloudflare/StateStore/State.js.map +1 -1
  118. package/lib/Cloudflare/Tunnel/Tunnel.d.ts +27 -0
  119. package/lib/Cloudflare/Tunnel/Tunnel.d.ts.map +1 -1
  120. package/lib/Cloudflare/Tunnel/Tunnel.js +27 -0
  121. package/lib/Cloudflare/Tunnel/Tunnel.js.map +1 -1
  122. package/lib/Cloudflare/Tunnel/TunnelBinding.d.ts +48 -0
  123. package/lib/Cloudflare/Tunnel/TunnelBinding.d.ts.map +1 -0
  124. package/lib/Cloudflare/Tunnel/TunnelBinding.js +56 -0
  125. package/lib/Cloudflare/Tunnel/TunnelBinding.js.map +1 -0
  126. package/lib/Cloudflare/Tunnel/TunnelRead.d.ts +83 -0
  127. package/lib/Cloudflare/Tunnel/TunnelRead.d.ts.map +1 -0
  128. package/lib/Cloudflare/Tunnel/TunnelRead.js +79 -0
  129. package/lib/Cloudflare/Tunnel/TunnelRead.js.map +1 -0
  130. package/lib/Cloudflare/Tunnel/TunnelReadWrite.d.ts +70 -0
  131. package/lib/Cloudflare/Tunnel/TunnelReadWrite.d.ts.map +1 -0
  132. package/lib/Cloudflare/Tunnel/TunnelReadWrite.js +63 -0
  133. package/lib/Cloudflare/Tunnel/TunnelReadWrite.js.map +1 -0
  134. package/lib/Cloudflare/Tunnel/TunnelWrite.d.ts +92 -0
  135. package/lib/Cloudflare/Tunnel/TunnelWrite.d.ts.map +1 -0
  136. package/lib/Cloudflare/Tunnel/TunnelWrite.js +88 -0
  137. package/lib/Cloudflare/Tunnel/TunnelWrite.js.map +1 -0
  138. package/lib/Cloudflare/Tunnel/index.d.ts +4 -0
  139. package/lib/Cloudflare/Tunnel/index.d.ts.map +1 -1
  140. package/lib/Cloudflare/Tunnel/index.js +4 -0
  141. package/lib/Cloudflare/Tunnel/index.js.map +1 -1
  142. package/lib/Cloudflare/Vectorize/VectorizeIndex.js +1 -0
  143. package/lib/Cloudflare/Vectorize/VectorizeIndex.js.map +1 -1
  144. package/lib/Cloudflare/VpcService/VpcService.d.ts +1 -1
  145. package/lib/Cloudflare/VpcService/VpcService.d.ts.map +1 -1
  146. package/lib/Cloudflare/VpcService/VpcService.js.map +1 -1
  147. package/lib/Cloudflare/Workers/DurableObjectBridge.d.ts.map +1 -1
  148. package/lib/Cloudflare/Workers/DurableObjectBridge.js +10 -1
  149. package/lib/Cloudflare/Workers/DurableObjectBridge.js.map +1 -1
  150. package/lib/Cloudflare/Workers/DynamicWorkerLoader.d.ts +119 -11
  151. package/lib/Cloudflare/Workers/DynamicWorkerLoader.d.ts.map +1 -1
  152. package/lib/Cloudflare/Workers/DynamicWorkerLoader.js +88 -9
  153. package/lib/Cloudflare/Workers/DynamicWorkerLoader.js.map +1 -1
  154. package/lib/Cloudflare/Workers/InferEnv.d.ts +1 -1
  155. package/lib/Cloudflare/Workers/InferEnv.d.ts.map +1 -1
  156. package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
  157. package/lib/Cloudflare/Workers/LocalWorkerProvider.js +15 -1
  158. package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
  159. package/lib/Cloudflare/Workers/Rpc.d.ts.map +1 -1
  160. package/lib/Cloudflare/Workers/Rpc.js +20 -2
  161. package/lib/Cloudflare/Workers/Rpc.js.map +1 -1
  162. package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts.map +1 -1
  163. package/lib/Cloudflare/Workers/WorkerAsyncBindings.js +18 -2
  164. package/lib/Cloudflare/Workers/WorkerAsyncBindings.js.map +1 -1
  165. package/lib/Cloudflare/Workers/WorkerBinding.d.ts +5 -3
  166. package/lib/Cloudflare/Workers/WorkerBinding.d.ts.map +1 -1
  167. package/lib/Cloudflare/Workers/WorkerBinding.js +1 -1
  168. package/lib/Cloudflare/Workers/WorkerBinding.js.map +1 -1
  169. package/lib/Cloudflare/Workers/WorkerBridge.d.ts.map +1 -1
  170. package/lib/Cloudflare/Workers/WorkerBridge.js +20 -2
  171. package/lib/Cloudflare/Workers/WorkerBridge.js.map +1 -1
  172. package/lib/Cloudflare/Zaraz/ZarazConfig.d.ts +1 -1
  173. package/lib/Cloudflare/Zaraz/ZarazConfig.d.ts.map +1 -1
  174. package/lib/Cloudflare/Zaraz/ZarazConfig.js +1 -1
  175. package/lib/Cloudflare/Zaraz/ZarazConfig.js.map +1 -1
  176. package/lib/Cloudflare/Zone/Zone.d.ts +170 -0
  177. package/lib/Cloudflare/Zone/Zone.d.ts.map +1 -0
  178. package/lib/Cloudflare/Zone/Zone.js +180 -0
  179. package/lib/Cloudflare/Zone/Zone.js.map +1 -0
  180. package/lib/Cloudflare/Zone/index.d.ts +3 -0
  181. package/lib/Cloudflare/Zone/index.d.ts.map +1 -0
  182. package/lib/Cloudflare/Zone/index.js +3 -0
  183. package/lib/Cloudflare/Zone/index.js.map +1 -0
  184. package/lib/Cloudflare/Zone/lookup.d.ts +33 -0
  185. package/lib/Cloudflare/Zone/lookup.d.ts.map +1 -0
  186. package/lib/Cloudflare/{Zone.js → Zone/lookup.js} +2 -2
  187. package/lib/Cloudflare/Zone/lookup.js.map +1 -0
  188. package/lib/Cloudflare/index.d.ts +3 -1
  189. package/lib/Cloudflare/index.d.ts.map +1 -1
  190. package/lib/Cloudflare/index.js +3 -1
  191. package/lib/Cloudflare/index.js.map +1 -1
  192. package/lib/Output.js +2 -2
  193. package/lib/Output.js.map +1 -1
  194. package/lib/Plan.d.ts +2 -2
  195. package/lib/Plan.d.ts.map +1 -1
  196. package/lib/Plan.js +3 -3
  197. package/lib/Plan.js.map +1 -1
  198. package/lib/Platform.d.ts +5 -5
  199. package/lib/Platform.d.ts.map +1 -1
  200. package/lib/Platform.js.map +1 -1
  201. package/lib/RemovalPolicy.js +2 -2
  202. package/lib/RemovalPolicy.js.map +1 -1
  203. package/lib/Resource.d.ts +14 -1
  204. package/lib/Resource.d.ts.map +1 -1
  205. package/lib/Resource.js +3 -2
  206. package/lib/Resource.js.map +1 -1
  207. package/lib/Stack.d.ts.map +1 -1
  208. package/lib/Stack.js +6 -0
  209. package/lib/Stack.js.map +1 -1
  210. package/lib/State/InMemoryState.d.ts +2 -1
  211. package/lib/State/InMemoryState.d.ts.map +1 -1
  212. package/lib/State/InMemoryState.js +3 -3
  213. package/lib/State/InMemoryState.js.map +1 -1
  214. package/lib/State/LocalState.d.ts.map +1 -1
  215. package/lib/State/LocalState.js +5 -1
  216. package/lib/State/LocalState.js.map +1 -1
  217. package/lib/State/State.d.ts +2 -2
  218. package/lib/State/State.d.ts.map +1 -1
  219. package/lib/State/State.js.map +1 -1
  220. package/lib/tsconfig.test.tsbuildinfo +1 -1
  221. package/package.json +7 -7
  222. package/src/Apply.ts +2 -2
  223. package/src/Cli/commands/_shared.ts +7 -1
  224. package/src/Cli/commands/cloudflare.ts +394 -1
  225. package/src/Cli/commands/login.ts +69 -60
  226. package/src/Cli/commands/logs.ts +1 -1
  227. package/src/Cli/commands/state.ts +1 -1
  228. package/src/Cli/commands/tail.ts +1 -1
  229. package/src/Cloudflare/AiGateway/AiGateway.ts +114 -2
  230. package/src/Cloudflare/AiGateway/AiGatewayBinding.ts +52 -10
  231. package/src/Cloudflare/AiGateway/LanguageModel.ts +907 -0
  232. package/src/Cloudflare/AiGateway/index.ts +1 -0
  233. package/src/Cloudflare/ApiToken/AccountApiToken.ts +60 -7
  234. package/src/Cloudflare/ApiToken/Common.ts +32 -3
  235. package/src/Cloudflare/ApiToken/UserApiToken.ts +58 -7
  236. package/src/Cloudflare/Browser/Browser.ts +140 -0
  237. package/src/Cloudflare/Browser/BrowserBinding.ts +128 -0
  238. package/src/Cloudflare/Browser/index.ts +11 -0
  239. package/src/Cloudflare/D1/D1Database.ts +6 -2
  240. package/src/Cloudflare/Email/EmailRouting.ts +1 -1
  241. package/src/Cloudflare/Email/EmailRule.ts +6 -6
  242. package/src/Cloudflare/Images/Images.ts +40 -27
  243. package/src/Cloudflare/Providers.ts +15 -3
  244. package/src/Cloudflare/R2/R2Bucket.ts +17 -9
  245. package/src/Cloudflare/RateLimit/RateLimit.ts +160 -0
  246. package/src/Cloudflare/RateLimit/RateLimitBinding.ts +90 -0
  247. package/src/Cloudflare/RateLimit/index.ts +2 -0
  248. package/src/Cloudflare/SecretsStore/Secret.ts +12 -6
  249. package/src/Cloudflare/StateStore/State.ts +113 -107
  250. package/src/Cloudflare/Tunnel/Tunnel.ts +27 -0
  251. package/src/Cloudflare/Tunnel/TunnelBinding.ts +114 -0
  252. package/src/Cloudflare/Tunnel/TunnelRead.ts +168 -0
  253. package/src/Cloudflare/Tunnel/TunnelReadWrite.ts +88 -0
  254. package/src/Cloudflare/Tunnel/TunnelWrite.ts +194 -0
  255. package/src/Cloudflare/Tunnel/index.ts +4 -0
  256. package/src/Cloudflare/Vectorize/VectorizeIndex.ts +2 -1
  257. package/src/Cloudflare/VpcService/VpcService.ts +4 -2
  258. package/src/Cloudflare/Workers/DurableObjectBridge.ts +10 -1
  259. package/src/Cloudflare/Workers/DynamicWorkerLoader.ts +139 -13
  260. package/src/Cloudflare/Workers/InferEnv.ts +19 -15
  261. package/src/Cloudflare/Workers/LocalWorkerProvider.ts +26 -3
  262. package/src/Cloudflare/Workers/Rpc.ts +38 -9
  263. package/src/Cloudflare/Workers/WorkerAsyncBindings.ts +16 -2
  264. package/src/Cloudflare/Workers/WorkerBinding.ts +6 -2
  265. package/src/Cloudflare/Workers/WorkerBridge.ts +20 -2
  266. package/src/Cloudflare/Zaraz/ZarazConfig.ts +1 -1
  267. package/src/Cloudflare/Zone/Zone.ts +349 -0
  268. package/src/Cloudflare/Zone/index.ts +2 -0
  269. package/src/Cloudflare/{Zone.ts → Zone/lookup.ts} +16 -3
  270. package/src/Cloudflare/index.ts +3 -1
  271. package/src/Output.ts +2 -2
  272. package/src/Plan.ts +4 -4
  273. package/src/Platform.ts +8 -12
  274. package/src/RemovalPolicy.ts +2 -2
  275. package/src/Resource.ts +18 -1
  276. package/src/Stack.ts +6 -0
  277. package/src/State/InMemoryState.ts +87 -85
  278. package/src/State/LocalState.ts +15 -1
  279. package/src/State/State.ts +5 -4
  280. package/lib/Cloudflare/BrowserRendering/BrowserRendering.d.ts +0 -116
  281. package/lib/Cloudflare/BrowserRendering/BrowserRendering.d.ts.map +0 -1
  282. package/lib/Cloudflare/BrowserRendering/BrowserRendering.js.map +0 -1
  283. package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.d.ts +0 -55
  284. package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.d.ts.map +0 -1
  285. package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.js.map +0 -1
  286. package/lib/Cloudflare/BrowserRendering/index.d.ts +0 -3
  287. package/lib/Cloudflare/BrowserRendering/index.d.ts.map +0 -1
  288. package/lib/Cloudflare/BrowserRendering/index.js +0 -3
  289. package/lib/Cloudflare/BrowserRendering/index.js.map +0 -1
  290. package/lib/Cloudflare/Zone.d.ts +0 -14
  291. package/lib/Cloudflare/Zone.d.ts.map +0 -1
  292. package/lib/Cloudflare/Zone.js.map +0 -1
  293. package/src/Cloudflare/BrowserRendering/BrowserRendering.ts +0 -132
  294. package/src/Cloudflare/BrowserRendering/BrowserRenderingBinding.ts +0 -137
  295. package/src/Cloudflare/BrowserRendering/index.ts +0 -11
@@ -231,7 +231,11 @@ export const isAiGateway = (value: unknown): value is AiGateway =>
231
231
  * governance across AI provider requests.
232
232
  *
233
233
  * AI Gateway gives your application a stable gateway ID and account-scoped
234
- * endpoint that can route model requests through Cloudflare.
234
+ * endpoint that can route model requests through Cloudflare. Once bound to a
235
+ * Worker, `aiGateway.model({...})` returns an `effect/unstable/ai`
236
+ * `LanguageModel` Layer so you use the standard `generateText` / `streamText`
237
+ * APIs — provider-agnostic, with caching, rate limiting, retries, and a
238
+ * unified request log handled by the gateway.
235
239
  *
236
240
  * @section Creating a Gateway
237
241
  * @example Basic gateway
@@ -260,6 +264,113 @@ export const isAiGateway = (value: unknown): value is AiGateway =>
260
264
  * logManagementStrategy: "STOP_INSERTING",
261
265
  * });
262
266
  * ```
267
+ *
268
+ * @section Binding into a Worker
269
+ * @example Bind the gateway and provide the runtime layer
270
+ * `AiGateway.bind(gateway)` returns a typed, Effect-native client during the
271
+ * Worker's Init phase. Provide `Cloudflare.AiGatewayBindingLive` once at the
272
+ * bottom of the Init layer chain so every `bind(...)` resolves at runtime.
273
+ * ```typescript
274
+ * import * as Cloudflare from "alchemy/Cloudflare";
275
+ * import * as Effect from "effect/Effect";
276
+ * import { Gateway } from "./AiGateway.ts";
277
+ *
278
+ * export default class Api extends Cloudflare.Worker<Api>()(
279
+ * "Api",
280
+ * { main: import.meta.path },
281
+ * Effect.gen(function* () {
282
+ * const aiGateway = yield* Cloudflare.AiGateway.bind(Gateway);
283
+ *
284
+ * return {
285
+ * fetch: Effect.gen(function* () {
286
+ * // …routes
287
+ * }),
288
+ * };
289
+ * }).pipe(Effect.provide(Cloudflare.AiGatewayBindingLive)),
290
+ * ) {}
291
+ * ```
292
+ *
293
+ * @section Building a LanguageModel
294
+ * @example `aiGateway.model(...)` -> Effect AI `LanguageModel`
295
+ * Call `aiGateway.model({...})` with a Workers AI model id. It returns a
296
+ * `Layer<LanguageModel, never, RuntimeContext>` directly — no API key and no
297
+ * `Layer.unwrap`, since the binding handles auth and the gateway URL. Build it
298
+ * in the Init phase; construction is pure.
299
+ * ```typescript
300
+ * const aiGateway = yield* Cloudflare.AiGateway.bind(Gateway);
301
+ *
302
+ * const languageModel = aiGateway.model({
303
+ * client: aiGateway,
304
+ * model: "@cf/meta/llama-3.1-8b-instruct",
305
+ * parameters: { temperature: 0.7, maxTokens: 1024 },
306
+ * });
307
+ * ```
308
+ *
309
+ * @section Generating Text
310
+ * @example Generate text on a route
311
+ * Provide the `languageModel` layer to the handler and call
312
+ * `LanguageModel.generateText` like any other Effect. `Effect.orDie` collapses
313
+ * `AiError` to a defect (a 500); use `Effect.catchTag("AiError", …)` for typed
314
+ * handling instead.
315
+ * ```typescript
316
+ * import { LanguageModel } from "effect/unstable/ai";
317
+ * import * as HttpServerResponse from "effect/unstable/http/HttpServerResponse";
318
+ *
319
+ * fetch: Effect.gen(function* () {
320
+ * const response = yield* LanguageModel.generateText({
321
+ * prompt: "Say hello.",
322
+ * }).pipe(Effect.orDie);
323
+ * return yield* HttpServerResponse.json({
324
+ * text: response.text,
325
+ * usage: {
326
+ * inputTokens: response.usage.inputTokens.total,
327
+ * outputTokens: response.usage.outputTokens.total,
328
+ * },
329
+ * });
330
+ * }).pipe(Effect.provide(languageModel));
331
+ * ```
332
+ *
333
+ * @section Streaming Text
334
+ * @example Stream tokens as Server-Sent Events
335
+ * `LanguageModel.streamText` returns a `Stream` of typed response parts.
336
+ * `Stream.provide(languageModel)` keeps the model available for the whole
337
+ * stream lifetime; pipe through `Sse.encode` for an SSE response.
338
+ * ```typescript
339
+ * import { LanguageModel } from "effect/unstable/ai";
340
+ * import * as Stream from "effect/Stream";
341
+ * import * as Sse from "effect/unstable/encoding/Sse";
342
+ * import * as HttpServerResponse from "effect/unstable/http/HttpServerResponse";
343
+ *
344
+ * const stream = LanguageModel.streamText({ prompt }).pipe(
345
+ * Stream.provide(languageModel),
346
+ * Sse.encode,
347
+ * );
348
+ * return HttpServerResponse.stream(stream, {
349
+ * headers: {
350
+ * "content-type": "text/event-stream",
351
+ * "cache-control": "no-cache",
352
+ * "x-accel-buffering": "no",
353
+ * },
354
+ * });
355
+ * ```
356
+ *
357
+ * @section Tuning the Gateway
358
+ * @example Production-grade caching, rate limits, and DLP
359
+ * Every prop maps to an in-place update — no replacement, no downtime.
360
+ * ```typescript
361
+ * export const Gateway = Cloudflare.AiGateway("Gateway", {
362
+ * id: "prod-gateway",
363
+ * cacheTtl: 300,
364
+ * cacheInvalidateOnUpdate: true,
365
+ * rateLimitingInterval: 60,
366
+ * rateLimitingLimit: 100,
367
+ * rateLimitingTechnique: "sliding",
368
+ * collectLogs: true,
369
+ * logManagement: 100_000,
370
+ * logManagementStrategy: "DELETE_OLDEST",
371
+ * authentication: true,
372
+ * });
373
+ * ```
263
374
  */
264
375
  export const AiGateway = Resource<AiGateway>("Cloudflare.AiGateway")({
265
376
  /**
@@ -337,7 +448,8 @@ export const AiGatewayProvider = () =>
337
448
  rateLimitingLimit: nullIfZero(gateway.rateLimitingLimit),
338
449
  rateLimitingTechnique: gateway.rateLimitingTechnique ?? "fixed",
339
450
  authentication: gateway.authentication ?? false,
340
- dlp: gateway.dlp ?? undefined,
451
+ // Distilled widened generated string enums to open unions (`string & {}`).
452
+ dlp: (gateway.dlp ?? undefined) as AiGatewayDlp | undefined,
341
453
  isDefault: gateway.isDefault ?? false,
342
454
  logManagement: gateway.logManagement ?? 100_000,
343
455
  logManagementStrategy:
@@ -3,15 +3,18 @@
3
3
  import * as Data from "effect/Data";
4
4
  import * as Effect from "effect/Effect";
5
5
  import * as Layer from "effect/Layer";
6
+ import type { LanguageModel } from "effect/unstable/ai/LanguageModel";
6
7
  import * as Binding from "../../Binding.ts";
7
8
  import type { ResourceLike } from "../../Resource.ts";
8
9
  import type { RuntimeContext } from "../../RuntimeContext.ts";
9
10
  import { isWorker, WorkerEnvironment } from "../Workers/Worker.ts";
10
11
  import type { AiGateway as AiGatewayResource } from "./AiGateway.ts";
12
+ import {
13
+ makeLanguageModelLayer,
14
+ type LanguageModelOptions,
15
+ } from "./LanguageModel.ts";
11
16
 
12
- /**
13
- * Error raised by AI Gateway runtime operations.
14
- */
17
+ // Error raised by AI Gateway runtime operations.
15
18
  export class AiGatewayError extends Data.TaggedError("AiGatewayError")<{
16
19
  /**
17
20
  * Human-readable runtime error message.
@@ -39,6 +42,12 @@ export interface AiGatewayClient {
39
42
  * Effect resolving to the raw AI Gateway runtime binding.
40
43
  */
41
44
  gateway: Effect.Effect<AiGateway, never, RuntimeContext>;
45
+ /**
46
+ * Effect resolving to the gateway id (the resource attribute, captured at
47
+ * bind time). Useful when calling `ai.run(model, inputs, { gateway: { id } })`
48
+ * — the in-account path for first-party services like Workers AI.
49
+ */
50
+ id: Effect.Effect<string, never, RuntimeContext>;
42
51
  /**
43
52
  * Update metadata on an existing AI Gateway log entry.
44
53
  */
@@ -65,17 +74,27 @@ export interface AiGatewayClient {
65
74
  data: Parameters<AiGateway["run"]>[0],
66
75
  options?: Parameters<AiGateway["run"]>[1],
67
76
  ): Effect.Effect<Response, AiGatewayError, RuntimeContext>;
77
+
78
+ model(
79
+ options: LanguageModelOptions,
80
+ ): Layer.Layer<LanguageModel, never, RuntimeContext>;
68
81
  }
69
82
 
70
83
  /**
71
- * Binding service that turns an {@link AiGatewayResource} resource into a typed
72
- * {@link AiGatewayClient} for Worker runtime code.
84
+ * Binding service that turns an {@link AiGatewayResource} resource
85
+ * into a typed {@link AiGatewayClient} for Worker runtime code. Wraps
86
+ * the Cloudflare AI Gateway runtime binding so each operation returns
87
+ * an Effect tagged with {@link AiGatewayError}, exposes the raw
88
+ * Workers AI handle for `ai.run(...)`, and provides a `model(options)`
89
+ * factory that produces an `effect/unstable/ai` `LanguageModel`
90
+ * `Layer`.
73
91
  *
74
- * @section Calling AI Gateway
75
- * Bind the gateway during the Worker's init phase, then use `run` or `getUrl`
76
- * from request handlers.
92
+ * @binding
77
93
  *
94
+ * @section Calling AI Gateway
78
95
  * @example Run through a gateway
96
+ * Bind the gateway during the Worker's init phase, then use `run` or
97
+ * `getUrl` from request handlers.
79
98
  * ```typescript
80
99
  * const aiGateway = yield* Cloudflare.AiGatewayBinding.bind(gateway);
81
100
  *
@@ -91,8 +110,29 @@ export interface AiGatewayClient {
91
110
  * };
92
111
  * ```
93
112
  *
94
- * Provide {@link AiGatewayBindingLive} in the worker's runtime layer to
95
- * resolve the underlying Cloudflare AI binding at request time.
113
+ * @section Driving Effect AI through the gateway
114
+ * @example `aiGateway.model(...)` -> Effect AI `LanguageModel`
115
+ * `model(options)` produces a `Layer<LanguageModel, never,
116
+ * RuntimeContext>` that translates `LanguageModel.generateText` /
117
+ * `streamText` calls (including tool calls and structured outputs)
118
+ * into `ai.run(...)` against the bound Workers AI model, routed
119
+ * through the gateway.
120
+ * ```typescript
121
+ * const aiGateway = yield* Cloudflare.AiGatewayBinding.bind(gateway);
122
+ *
123
+ * const languageModel = aiGateway.model({
124
+ * client: aiGateway,
125
+ * model: "@cf/meta/llama-3.1-8b-instruct",
126
+ * parameters: { temperature: 0.7, maxTokens: 1024 },
127
+ * });
128
+ *
129
+ * const response = yield* AiLanguageModel.generateText({ prompt }).pipe(
130
+ * Effect.provide(languageModel),
131
+ * );
132
+ * ```
133
+ *
134
+ * Provide {@link AiGatewayBindingLive} in the worker's runtime layer
135
+ * to resolve the underlying Cloudflare AI binding at request time.
96
136
  */
97
137
  export class AiGatewayBinding extends Binding.Service<
98
138
  AiGatewayBinding,
@@ -129,11 +169,13 @@ export const AiGatewayBindingLive = Layer.effect(
129
169
  return {
130
170
  raw: ai,
131
171
  gateway: runtimeGateway,
172
+ id: gatewayIdAccessor,
132
173
  patchLog: (logId, data) =>
133
174
  use((gateway) => gateway.patchLog(logId, data)),
134
175
  getLog: (logId) => use((gateway) => gateway.getLog(logId)),
135
176
  getUrl: (provider) => use((gateway) => gateway.getUrl(provider)),
136
177
  run: (data, options) => use((gateway) => gateway.run(data, options)),
178
+ model: (options) => makeLanguageModelLayer(options),
137
179
  } satisfies AiGatewayClient;
138
180
  });
139
181
  }),