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.
- package/bin/exec.js +18 -10
- package/bin/exec.js.map +1 -1
- package/lib/AWS/Lambda/BucketEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/BucketEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/EventBridgeEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/EventBridgeEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/QueueEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/QueueEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/StreamEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/StreamEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/TableEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/TableEventSource.d.ts.map +1 -1
- package/lib/AWS/Lambda/TopicEventSource.d.ts +1 -1
- package/lib/AWS/Lambda/TopicEventSource.d.ts.map +1 -1
- package/lib/Apply.js +2 -2
- package/lib/Apply.js.map +1 -1
- package/lib/Cli/commands/_shared.d.ts +7 -1
- package/lib/Cli/commands/_shared.d.ts.map +1 -1
- package/lib/Cli/commands/_shared.js +1 -0
- package/lib/Cli/commands/_shared.js.map +1 -1
- package/lib/Cli/commands/cloudflare.d.ts +4 -1
- package/lib/Cli/commands/cloudflare.d.ts.map +1 -1
- package/lib/Cli/commands/cloudflare.js +274 -1
- package/lib/Cli/commands/cloudflare.js.map +1 -1
- package/lib/Cli/commands/login.d.ts +1 -1
- package/lib/Cli/commands/login.d.ts.map +1 -1
- package/lib/Cli/commands/login.js +45 -42
- package/lib/Cli/commands/login.js.map +1 -1
- package/lib/Cli/commands/logs.js +1 -1
- package/lib/Cli/commands/logs.js.map +1 -1
- package/lib/Cli/commands/state.js +1 -1
- package/lib/Cli/commands/state.js.map +1 -1
- package/lib/Cli/commands/tail.js +1 -1
- package/lib/Cli/commands/tail.js.map +1 -1
- package/lib/Cloudflare/AiGateway/AiGateway.d.ts +112 -1
- package/lib/Cloudflare/AiGateway/AiGateway.d.ts.map +1 -1
- package/lib/Cloudflare/AiGateway/AiGateway.js +114 -2
- package/lib/Cloudflare/AiGateway/AiGateway.js.map +1 -1
- package/lib/Cloudflare/AiGateway/AiGatewayBinding.d.ts +43 -10
- package/lib/Cloudflare/AiGateway/AiGatewayBinding.d.ts.map +1 -1
- package/lib/Cloudflare/AiGateway/AiGatewayBinding.js +38 -10
- package/lib/Cloudflare/AiGateway/AiGatewayBinding.js.map +1 -1
- package/lib/Cloudflare/AiGateway/LanguageModel.d.ts +35 -0
- package/lib/Cloudflare/AiGateway/LanguageModel.d.ts.map +1 -0
- package/lib/Cloudflare/AiGateway/LanguageModel.js +576 -0
- package/lib/Cloudflare/AiGateway/LanguageModel.js.map +1 -0
- package/lib/Cloudflare/AiGateway/index.d.ts +1 -0
- package/lib/Cloudflare/AiGateway/index.d.ts.map +1 -1
- package/lib/Cloudflare/AiGateway/index.js +1 -0
- package/lib/Cloudflare/AiGateway/index.js.map +1 -1
- package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts +40 -2
- package/lib/Cloudflare/ApiToken/AccountApiToken.d.ts.map +1 -1
- package/lib/Cloudflare/ApiToken/AccountApiToken.js +49 -6
- package/lib/Cloudflare/ApiToken/AccountApiToken.js.map +1 -1
- package/lib/Cloudflare/ApiToken/Common.d.ts +26 -3
- package/lib/Cloudflare/ApiToken/Common.d.ts.map +1 -1
- package/lib/Cloudflare/ApiToken/Common.js +8 -0
- package/lib/Cloudflare/ApiToken/Common.js.map +1 -1
- package/lib/Cloudflare/ApiToken/UserApiToken.d.ts +38 -2
- package/lib/Cloudflare/ApiToken/UserApiToken.d.ts.map +1 -1
- package/lib/Cloudflare/ApiToken/UserApiToken.js +47 -6
- package/lib/Cloudflare/ApiToken/UserApiToken.js.map +1 -1
- package/lib/Cloudflare/Browser/Browser.d.ts +121 -0
- package/lib/Cloudflare/Browser/Browser.d.ts.map +1 -0
- package/lib/Cloudflare/{BrowserRendering/BrowserRendering.js → Browser/Browser.js} +19 -26
- package/lib/Cloudflare/Browser/Browser.js.map +1 -0
- package/lib/Cloudflare/Browser/BrowserBinding.d.ts +55 -0
- package/lib/Cloudflare/Browser/BrowserBinding.d.ts.map +1 -0
- package/lib/Cloudflare/{BrowserRendering/BrowserRenderingBinding.js → Browser/BrowserBinding.js} +11 -11
- package/lib/Cloudflare/Browser/BrowserBinding.js.map +1 -0
- package/lib/Cloudflare/Browser/index.d.ts +3 -0
- package/lib/Cloudflare/Browser/index.d.ts.map +1 -0
- package/lib/Cloudflare/Browser/index.js +3 -0
- package/lib/Cloudflare/Browser/index.js.map +1 -0
- package/lib/Cloudflare/Container/ContainerBinding.d.ts +2 -1
- package/lib/Cloudflare/Container/ContainerBinding.d.ts.map +1 -1
- package/lib/Cloudflare/D1/D1Database.d.ts.map +1 -1
- package/lib/Cloudflare/D1/D1Database.js +2 -1
- package/lib/Cloudflare/D1/D1Database.js.map +1 -1
- package/lib/Cloudflare/Email/EmailRouting.d.ts +1 -1
- package/lib/Cloudflare/Email/EmailRouting.d.ts.map +1 -1
- package/lib/Cloudflare/Email/EmailRouting.js +1 -1
- package/lib/Cloudflare/Email/EmailRouting.js.map +1 -1
- package/lib/Cloudflare/Email/EmailRule.d.ts +1 -1
- package/lib/Cloudflare/Email/EmailRule.d.ts.map +1 -1
- package/lib/Cloudflare/Email/EmailRule.js +1 -1
- package/lib/Cloudflare/Email/EmailRule.js.map +1 -1
- package/lib/Cloudflare/Images/Images.d.ts +32 -23
- package/lib/Cloudflare/Images/Images.d.ts.map +1 -1
- package/lib/Cloudflare/Images/Images.js +10 -13
- package/lib/Cloudflare/Images/Images.js.map +1 -1
- package/lib/Cloudflare/Providers.d.ts.map +1 -1
- package/lib/Cloudflare/Providers.js +10 -3
- package/lib/Cloudflare/Providers.js.map +1 -1
- package/lib/Cloudflare/R2/R2Bucket.d.ts +1 -1
- package/lib/Cloudflare/R2/R2Bucket.d.ts.map +1 -1
- package/lib/Cloudflare/R2/R2Bucket.js +13 -7
- package/lib/Cloudflare/R2/R2Bucket.js.map +1 -1
- package/lib/Cloudflare/RateLimit/RateLimit.d.ts +132 -0
- package/lib/Cloudflare/RateLimit/RateLimit.d.ts.map +1 -0
- package/lib/Cloudflare/RateLimit/RateLimit.js +80 -0
- package/lib/Cloudflare/RateLimit/RateLimit.js.map +1 -0
- package/lib/Cloudflare/RateLimit/RateLimitBinding.d.ts +30 -0
- package/lib/Cloudflare/RateLimit/RateLimitBinding.d.ts.map +1 -0
- package/lib/Cloudflare/RateLimit/RateLimitBinding.js +50 -0
- package/lib/Cloudflare/RateLimit/RateLimitBinding.js.map +1 -0
- package/lib/Cloudflare/RateLimit/index.d.ts +3 -0
- package/lib/Cloudflare/RateLimit/index.d.ts.map +1 -0
- package/lib/Cloudflare/RateLimit/index.js +3 -0
- package/lib/Cloudflare/RateLimit/index.js.map +1 -0
- package/lib/Cloudflare/SecretsStore/Secret.d.ts +2 -1
- package/lib/Cloudflare/SecretsStore/Secret.d.ts.map +1 -1
- package/lib/Cloudflare/SecretsStore/Secret.js +7 -4
- package/lib/Cloudflare/SecretsStore/Secret.js.map +1 -1
- package/lib/Cloudflare/StateStore/State.d.ts.map +1 -1
- package/lib/Cloudflare/StateStore/State.js +82 -78
- package/lib/Cloudflare/StateStore/State.js.map +1 -1
- package/lib/Cloudflare/Tunnel/Tunnel.d.ts +27 -0
- package/lib/Cloudflare/Tunnel/Tunnel.d.ts.map +1 -1
- package/lib/Cloudflare/Tunnel/Tunnel.js +27 -0
- package/lib/Cloudflare/Tunnel/Tunnel.js.map +1 -1
- package/lib/Cloudflare/Tunnel/TunnelBinding.d.ts +48 -0
- package/lib/Cloudflare/Tunnel/TunnelBinding.d.ts.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelBinding.js +56 -0
- package/lib/Cloudflare/Tunnel/TunnelBinding.js.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelRead.d.ts +83 -0
- package/lib/Cloudflare/Tunnel/TunnelRead.d.ts.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelRead.js +79 -0
- package/lib/Cloudflare/Tunnel/TunnelRead.js.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelReadWrite.d.ts +70 -0
- package/lib/Cloudflare/Tunnel/TunnelReadWrite.d.ts.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelReadWrite.js +63 -0
- package/lib/Cloudflare/Tunnel/TunnelReadWrite.js.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelWrite.d.ts +92 -0
- package/lib/Cloudflare/Tunnel/TunnelWrite.d.ts.map +1 -0
- package/lib/Cloudflare/Tunnel/TunnelWrite.js +88 -0
- package/lib/Cloudflare/Tunnel/TunnelWrite.js.map +1 -0
- package/lib/Cloudflare/Tunnel/index.d.ts +4 -0
- package/lib/Cloudflare/Tunnel/index.d.ts.map +1 -1
- package/lib/Cloudflare/Tunnel/index.js +4 -0
- package/lib/Cloudflare/Tunnel/index.js.map +1 -1
- package/lib/Cloudflare/Vectorize/VectorizeIndex.js +1 -0
- package/lib/Cloudflare/Vectorize/VectorizeIndex.js.map +1 -1
- package/lib/Cloudflare/VpcService/VpcService.d.ts +1 -1
- package/lib/Cloudflare/VpcService/VpcService.d.ts.map +1 -1
- package/lib/Cloudflare/VpcService/VpcService.js.map +1 -1
- package/lib/Cloudflare/Workers/DurableObjectBridge.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/DurableObjectBridge.js +10 -1
- package/lib/Cloudflare/Workers/DurableObjectBridge.js.map +1 -1
- package/lib/Cloudflare/Workers/DynamicWorkerLoader.d.ts +119 -11
- package/lib/Cloudflare/Workers/DynamicWorkerLoader.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/DynamicWorkerLoader.js +88 -9
- package/lib/Cloudflare/Workers/DynamicWorkerLoader.js.map +1 -1
- package/lib/Cloudflare/Workers/InferEnv.d.ts +1 -1
- package/lib/Cloudflare/Workers/InferEnv.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js +15 -1
- package/lib/Cloudflare/Workers/LocalWorkerProvider.js.map +1 -1
- package/lib/Cloudflare/Workers/Rpc.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/Rpc.js +20 -2
- package/lib/Cloudflare/Workers/Rpc.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js +18 -2
- package/lib/Cloudflare/Workers/WorkerAsyncBindings.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts +5 -3
- package/lib/Cloudflare/Workers/WorkerBinding.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.js +1 -1
- package/lib/Cloudflare/Workers/WorkerBinding.js.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBridge.d.ts.map +1 -1
- package/lib/Cloudflare/Workers/WorkerBridge.js +20 -2
- package/lib/Cloudflare/Workers/WorkerBridge.js.map +1 -1
- package/lib/Cloudflare/Zaraz/ZarazConfig.d.ts +1 -1
- package/lib/Cloudflare/Zaraz/ZarazConfig.d.ts.map +1 -1
- package/lib/Cloudflare/Zaraz/ZarazConfig.js +1 -1
- package/lib/Cloudflare/Zaraz/ZarazConfig.js.map +1 -1
- package/lib/Cloudflare/Zone/Zone.d.ts +170 -0
- package/lib/Cloudflare/Zone/Zone.d.ts.map +1 -0
- package/lib/Cloudflare/Zone/Zone.js +180 -0
- package/lib/Cloudflare/Zone/Zone.js.map +1 -0
- package/lib/Cloudflare/Zone/index.d.ts +3 -0
- package/lib/Cloudflare/Zone/index.d.ts.map +1 -0
- package/lib/Cloudflare/Zone/index.js +3 -0
- package/lib/Cloudflare/Zone/index.js.map +1 -0
- package/lib/Cloudflare/Zone/lookup.d.ts +33 -0
- package/lib/Cloudflare/Zone/lookup.d.ts.map +1 -0
- package/lib/Cloudflare/{Zone.js → Zone/lookup.js} +2 -2
- package/lib/Cloudflare/Zone/lookup.js.map +1 -0
- package/lib/Cloudflare/index.d.ts +3 -1
- package/lib/Cloudflare/index.d.ts.map +1 -1
- package/lib/Cloudflare/index.js +3 -1
- package/lib/Cloudflare/index.js.map +1 -1
- package/lib/Output.js +2 -2
- package/lib/Output.js.map +1 -1
- package/lib/Plan.d.ts +2 -2
- package/lib/Plan.d.ts.map +1 -1
- package/lib/Plan.js +3 -3
- package/lib/Plan.js.map +1 -1
- package/lib/Platform.d.ts +5 -5
- package/lib/Platform.d.ts.map +1 -1
- package/lib/Platform.js.map +1 -1
- package/lib/RemovalPolicy.js +2 -2
- package/lib/RemovalPolicy.js.map +1 -1
- package/lib/Resource.d.ts +14 -1
- package/lib/Resource.d.ts.map +1 -1
- package/lib/Resource.js +3 -2
- package/lib/Resource.js.map +1 -1
- package/lib/Stack.d.ts.map +1 -1
- package/lib/Stack.js +6 -0
- package/lib/Stack.js.map +1 -1
- package/lib/State/InMemoryState.d.ts +2 -1
- package/lib/State/InMemoryState.d.ts.map +1 -1
- package/lib/State/InMemoryState.js +3 -3
- package/lib/State/InMemoryState.js.map +1 -1
- package/lib/State/LocalState.d.ts.map +1 -1
- package/lib/State/LocalState.js +5 -1
- package/lib/State/LocalState.js.map +1 -1
- package/lib/State/State.d.ts +2 -2
- package/lib/State/State.d.ts.map +1 -1
- package/lib/State/State.js.map +1 -1
- package/lib/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/src/Apply.ts +2 -2
- package/src/Cli/commands/_shared.ts +7 -1
- package/src/Cli/commands/cloudflare.ts +394 -1
- package/src/Cli/commands/login.ts +69 -60
- package/src/Cli/commands/logs.ts +1 -1
- package/src/Cli/commands/state.ts +1 -1
- package/src/Cli/commands/tail.ts +1 -1
- package/src/Cloudflare/AiGateway/AiGateway.ts +114 -2
- package/src/Cloudflare/AiGateway/AiGatewayBinding.ts +52 -10
- package/src/Cloudflare/AiGateway/LanguageModel.ts +907 -0
- package/src/Cloudflare/AiGateway/index.ts +1 -0
- package/src/Cloudflare/ApiToken/AccountApiToken.ts +60 -7
- package/src/Cloudflare/ApiToken/Common.ts +32 -3
- package/src/Cloudflare/ApiToken/UserApiToken.ts +58 -7
- package/src/Cloudflare/Browser/Browser.ts +140 -0
- package/src/Cloudflare/Browser/BrowserBinding.ts +128 -0
- package/src/Cloudflare/Browser/index.ts +11 -0
- package/src/Cloudflare/D1/D1Database.ts +6 -2
- package/src/Cloudflare/Email/EmailRouting.ts +1 -1
- package/src/Cloudflare/Email/EmailRule.ts +6 -6
- package/src/Cloudflare/Images/Images.ts +40 -27
- package/src/Cloudflare/Providers.ts +15 -3
- package/src/Cloudflare/R2/R2Bucket.ts +17 -9
- package/src/Cloudflare/RateLimit/RateLimit.ts +160 -0
- package/src/Cloudflare/RateLimit/RateLimitBinding.ts +90 -0
- package/src/Cloudflare/RateLimit/index.ts +2 -0
- package/src/Cloudflare/SecretsStore/Secret.ts +12 -6
- package/src/Cloudflare/StateStore/State.ts +113 -107
- package/src/Cloudflare/Tunnel/Tunnel.ts +27 -0
- package/src/Cloudflare/Tunnel/TunnelBinding.ts +114 -0
- package/src/Cloudflare/Tunnel/TunnelRead.ts +168 -0
- package/src/Cloudflare/Tunnel/TunnelReadWrite.ts +88 -0
- package/src/Cloudflare/Tunnel/TunnelWrite.ts +194 -0
- package/src/Cloudflare/Tunnel/index.ts +4 -0
- package/src/Cloudflare/Vectorize/VectorizeIndex.ts +2 -1
- package/src/Cloudflare/VpcService/VpcService.ts +4 -2
- package/src/Cloudflare/Workers/DurableObjectBridge.ts +10 -1
- package/src/Cloudflare/Workers/DynamicWorkerLoader.ts +139 -13
- package/src/Cloudflare/Workers/InferEnv.ts +19 -15
- package/src/Cloudflare/Workers/LocalWorkerProvider.ts +26 -3
- package/src/Cloudflare/Workers/Rpc.ts +38 -9
- package/src/Cloudflare/Workers/WorkerAsyncBindings.ts +16 -2
- package/src/Cloudflare/Workers/WorkerBinding.ts +6 -2
- package/src/Cloudflare/Workers/WorkerBridge.ts +20 -2
- package/src/Cloudflare/Zaraz/ZarazConfig.ts +1 -1
- package/src/Cloudflare/Zone/Zone.ts +349 -0
- package/src/Cloudflare/Zone/index.ts +2 -0
- package/src/Cloudflare/{Zone.ts → Zone/lookup.ts} +16 -3
- package/src/Cloudflare/index.ts +3 -1
- package/src/Output.ts +2 -2
- package/src/Plan.ts +4 -4
- package/src/Platform.ts +8 -12
- package/src/RemovalPolicy.ts +2 -2
- package/src/Resource.ts +18 -1
- package/src/Stack.ts +6 -0
- package/src/State/InMemoryState.ts +87 -85
- package/src/State/LocalState.ts +15 -1
- package/src/State/State.ts +5 -4
- package/lib/Cloudflare/BrowserRendering/BrowserRendering.d.ts +0 -116
- package/lib/Cloudflare/BrowserRendering/BrowserRendering.d.ts.map +0 -1
- package/lib/Cloudflare/BrowserRendering/BrowserRendering.js.map +0 -1
- package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.d.ts +0 -55
- package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.d.ts.map +0 -1
- package/lib/Cloudflare/BrowserRendering/BrowserRenderingBinding.js.map +0 -1
- package/lib/Cloudflare/BrowserRendering/index.d.ts +0 -3
- package/lib/Cloudflare/BrowserRendering/index.d.ts.map +0 -1
- package/lib/Cloudflare/BrowserRendering/index.js +0 -3
- package/lib/Cloudflare/BrowserRendering/index.js.map +0 -1
- package/lib/Cloudflare/Zone.d.ts +0 -14
- package/lib/Cloudflare/Zone.d.ts.map +0 -1
- package/lib/Cloudflare/Zone.js.map +0 -1
- package/src/Cloudflare/BrowserRendering/BrowserRendering.ts +0 -132
- package/src/Cloudflare/BrowserRendering/BrowserRenderingBinding.ts +0 -137
- 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
|
-
|
|
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
|
|
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
|
-
* @
|
|
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
|
-
*
|
|
95
|
-
*
|
|
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
|
}),
|