pi-cloudflare 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +67 -0
- package/bin/setup.mjs +103 -0
- package/dist/auth-flow.d.ts +15 -0
- package/dist/auth-flow.d.ts.map +1 -0
- package/dist/auth-flow.js +90 -0
- package/dist/auth-flow.js.map +1 -0
- package/dist/client.d.ts +18 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +47 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.d.ts +44 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +135 -0
- package/dist/oauth.js.map +1 -0
- package/dist/proxy.d.ts +29 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +39 -0
- package/dist/proxy.js.map +1 -0
- package/dist/servers.d.ts +19 -0
- package/dist/servers.d.ts.map +1 -0
- package/dist/servers.js +40 -0
- package/dist/servers.js.map +1 -0
- package/dist/token-store.d.ts +23 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +47 -0
- package/dist/token-store.js.map +1 -0
- package/package.json +67 -0
- package/skills/agents-sdk/SKILL.md +221 -0
- package/skills/agents-sdk/references/browse-the-web.md +63 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/client-sdk.md +110 -0
- package/skills/agents-sdk/references/codemode.md +110 -0
- package/skills/agents-sdk/references/configuration.md +72 -0
- package/skills/agents-sdk/references/durable-execution.md +51 -0
- package/skills/agents-sdk/references/email.md +146 -0
- package/skills/agents-sdk/references/human-in-the-loop.md +67 -0
- package/skills/agents-sdk/references/mcp.md +188 -0
- package/skills/agents-sdk/references/observability.md +44 -0
- package/skills/agents-sdk/references/queue-retries.md +79 -0
- package/skills/agents-sdk/references/routing.md +75 -0
- package/skills/agents-sdk/references/server-driven-messages.md +63 -0
- package/skills/agents-sdk/references/state-scheduling.md +171 -0
- package/skills/agents-sdk/references/streaming-chat.md +198 -0
- package/skills/agents-sdk/references/think.md +112 -0
- package/skills/agents-sdk/references/voice.md +68 -0
- package/skills/agents-sdk/references/webhooks-push.md +86 -0
- package/skills/agents-sdk/references/workflows.md +132 -0
- package/skills/cloudflare/SKILL.md +248 -0
- package/skills/cloudflare/references/agents-sdk/README.md +89 -0
- package/skills/cloudflare/references/agents-sdk/api.md +190 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +182 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +158 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +192 -0
- package/skills/cloudflare/references/ai-gateway/README.md +175 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +111 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +82 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +114 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +88 -0
- package/skills/cloudflare/references/ai-search/README.md +138 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +88 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +81 -0
- package/skills/cloudflare/references/ai-search/patterns.md +85 -0
- package/skills/cloudflare/references/analytics-engine/README.md +94 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +112 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +85 -0
- package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
- package/skills/cloudflare/references/api/README.md +66 -0
- package/skills/cloudflare/references/api/api.md +204 -0
- package/skills/cloudflare/references/api/configuration.md +160 -0
- package/skills/cloudflare/references/api/gotchas.md +225 -0
- package/skills/cloudflare/references/api/patterns.md +204 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +141 -0
- package/skills/cloudflare/references/api-shield/configuration.md +192 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +125 -0
- package/skills/cloudflare/references/api-shield/patterns.md +180 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +90 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +240 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +197 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +111 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +104 -0
- package/skills/cloudflare/references/artifacts/README.md +79 -0
- package/skills/cloudflare/references/artifacts/api.md +128 -0
- package/skills/cloudflare/references/artifacts/configuration.md +92 -0
- package/skills/cloudflare/references/bindings/README.md +122 -0
- package/skills/cloudflare/references/bindings/api.md +203 -0
- package/skills/cloudflare/references/bindings/configuration.md +188 -0
- package/skills/cloudflare/references/bindings/gotchas.md +208 -0
- package/skills/cloudflare/references/bindings/patterns.md +200 -0
- package/skills/cloudflare/references/bot-management/README.md +94 -0
- package/skills/cloudflare/references/bot-management/api.md +169 -0
- package/skills/cloudflare/references/bot-management/configuration.md +163 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +114 -0
- package/skills/cloudflare/references/bot-management/patterns.md +182 -0
- package/skills/cloudflare/references/browser-rendering/README.md +78 -0
- package/skills/cloudflare/references/browser-rendering/api.md +108 -0
- package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
- package/skills/cloudflare/references/browser-rendering/gotchas.md +88 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +91 -0
- package/skills/cloudflare/references/c3/README.md +111 -0
- package/skills/cloudflare/references/c3/api.md +71 -0
- package/skills/cloudflare/references/c3/configuration.md +81 -0
- package/skills/cloudflare/references/c3/gotchas.md +92 -0
- package/skills/cloudflare/references/c3/patterns.md +82 -0
- package/skills/cloudflare/references/cache-reserve/README.md +147 -0
- package/skills/cloudflare/references/cache-reserve/api.md +194 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +169 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +132 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +85 -0
- package/skills/cloudflare/references/containers/api.md +187 -0
- package/skills/cloudflare/references/containers/configuration.md +188 -0
- package/skills/cloudflare/references/containers/gotchas.md +178 -0
- package/skills/cloudflare/references/containers/patterns.md +202 -0
- package/skills/cloudflare/references/cron-triggers/README.md +99 -0
- package/skills/cloudflare/references/cron-triggers/api.md +196 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +180 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +199 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +190 -0
- package/skills/cloudflare/references/d1/README.md +133 -0
- package/skills/cloudflare/references/d1/api.md +196 -0
- package/skills/cloudflare/references/d1/configuration.md +191 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +189 -0
- package/skills/cloudflare/references/ddos/README.md +41 -0
- package/skills/cloudflare/references/ddos/api.md +164 -0
- package/skills/cloudflare/references/ddos/configuration.md +93 -0
- package/skills/cloudflare/references/ddos/gotchas.md +107 -0
- package/skills/cloudflare/references/ddos/patterns.md +174 -0
- package/skills/cloudflare/references/do-storage/README.md +75 -0
- package/skills/cloudflare/references/do-storage/api.md +102 -0
- package/skills/cloudflare/references/do-storage/configuration.md +112 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +150 -0
- package/skills/cloudflare/references/do-storage/patterns.md +194 -0
- package/skills/cloudflare/references/do-storage/testing.md +183 -0
- package/skills/cloudflare/references/durable-objects/README.md +185 -0
- package/skills/cloudflare/references/durable-objects/api.md +187 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +197 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +201 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +195 -0
- package/skills/cloudflare/references/email-routing/configuration.md +186 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +196 -0
- package/skills/cloudflare/references/email-routing/patterns.md +229 -0
- package/skills/cloudflare/references/email-workers/README.md +151 -0
- package/skills/cloudflare/references/email-workers/api.md +237 -0
- package/skills/cloudflare/references/email-workers/configuration.md +112 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +125 -0
- package/skills/cloudflare/references/email-workers/patterns.md +102 -0
- package/skills/cloudflare/references/flagship/README.md +59 -0
- package/skills/cloudflare/references/flagship/api.md +390 -0
- package/skills/cloudflare/references/flagship/configuration.md +202 -0
- package/skills/cloudflare/references/flagship/gotchas.md +178 -0
- package/skills/cloudflare/references/flagship/patterns.md +469 -0
- package/skills/cloudflare/references/graphql-api/README.md +147 -0
- package/skills/cloudflare/references/graphql-api/api.md +175 -0
- package/skills/cloudflare/references/graphql-api/configuration.md +118 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +110 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +225 -0
- package/skills/cloudflare/references/hyperdrive/README.md +82 -0
- package/skills/cloudflare/references/hyperdrive/api.md +143 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +159 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +190 -0
- package/skills/cloudflare/references/images/README.md +61 -0
- package/skills/cloudflare/references/images/api.md +96 -0
- package/skills/cloudflare/references/images/configuration.md +211 -0
- package/skills/cloudflare/references/images/gotchas.md +99 -0
- package/skills/cloudflare/references/images/patterns.md +115 -0
- package/skills/cloudflare/references/kv/README.md +89 -0
- package/skills/cloudflare/references/kv/api.md +160 -0
- package/skills/cloudflare/references/kv/configuration.md +144 -0
- package/skills/cloudflare/references/kv/gotchas.md +131 -0
- package/skills/cloudflare/references/kv/patterns.md +196 -0
- package/skills/cloudflare/references/miniflare/README.md +105 -0
- package/skills/cloudflare/references/miniflare/api.md +187 -0
- package/skills/cloudflare/references/miniflare/configuration.md +173 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +160 -0
- package/skills/cloudflare/references/miniflare/patterns.md +181 -0
- package/skills/cloudflare/references/network-interconnect/README.md +99 -0
- package/skills/cloudflare/references/network-interconnect/api.md +199 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +114 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +165 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +166 -0
- package/skills/cloudflare/references/observability/README.md +88 -0
- package/skills/cloudflare/references/observability/api.md +164 -0
- package/skills/cloudflare/references/observability/configuration.md +169 -0
- package/skills/cloudflare/references/observability/gotchas.md +115 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +88 -0
- package/skills/cloudflare/references/pages/api.md +204 -0
- package/skills/cloudflare/references/pages/configuration.md +201 -0
- package/skills/cloudflare/references/pages/gotchas.md +203 -0
- package/skills/cloudflare/references/pages/patterns.md +204 -0
- package/skills/cloudflare/references/pages-functions/README.md +98 -0
- package/skills/cloudflare/references/pages-functions/api.md +143 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +122 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +94 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +137 -0
- package/skills/cloudflare/references/pipelines/README.md +90 -0
- package/skills/cloudflare/references/pipelines/api.md +124 -0
- package/skills/cloudflare/references/pipelines/configuration.md +155 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +58 -0
- package/skills/cloudflare/references/pipelines/patterns.md +130 -0
- package/skills/cloudflare/references/pulumi/README.md +100 -0
- package/skills/cloudflare/references/pulumi/api.md +200 -0
- package/skills/cloudflare/references/pulumi/configuration.md +198 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +181 -0
- package/skills/cloudflare/references/pulumi/patterns.md +191 -0
- package/skills/cloudflare/references/queues/README.md +96 -0
- package/skills/cloudflare/references/queues/api.md +206 -0
- package/skills/cloudflare/references/queues/configuration.md +144 -0
- package/skills/cloudflare/references/queues/gotchas.md +206 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +95 -0
- package/skills/cloudflare/references/r2/api.md +200 -0
- package/skills/cloudflare/references/r2/configuration.md +165 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +193 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +75 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +122 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +98 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +55 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +122 -0
- package/skills/cloudflare/references/r2-sql/README.md +64 -0
- package/skills/cloudflare/references/r2-sql/api.md +121 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +50 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +39 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +118 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +65 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +158 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +137 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +133 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +174 -0
- package/skills/cloudflare/references/realtimekit/README.md +113 -0
- package/skills/cloudflare/references/realtimekit/api.md +212 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +203 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +169 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +223 -0
- package/skills/cloudflare/references/sandbox/README.md +96 -0
- package/skills/cloudflare/references/sandbox/api.md +198 -0
- package/skills/cloudflare/references/sandbox/configuration.md +143 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +194 -0
- package/skills/cloudflare/references/sandbox/patterns.md +201 -0
- package/skills/cloudflare/references/secrets-store/README.md +74 -0
- package/skills/cloudflare/references/secrets-store/api.md +200 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +185 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +207 -0
- package/skills/cloudflare/references/smart-placement/README.md +138 -0
- package/skills/cloudflare/references/smart-placement/api.md +183 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +196 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +174 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +183 -0
- package/skills/cloudflare/references/snippets/README.md +68 -0
- package/skills/cloudflare/references/snippets/api.md +198 -0
- package/skills/cloudflare/references/snippets/configuration.md +227 -0
- package/skills/cloudflare/references/snippets/gotchas.md +86 -0
- package/skills/cloudflare/references/snippets/patterns.md +135 -0
- package/skills/cloudflare/references/spectrum/README.md +52 -0
- package/skills/cloudflare/references/spectrum/api.md +181 -0
- package/skills/cloudflare/references/spectrum/configuration.md +194 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +145 -0
- package/skills/cloudflare/references/spectrum/patterns.md +196 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +199 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +162 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +114 -0
- package/skills/cloudflare/references/stream/api-live.md +195 -0
- package/skills/cloudflare/references/stream/api.md +199 -0
- package/skills/cloudflare/references/stream/configuration.md +141 -0
- package/skills/cloudflare/references/stream/gotchas.md +130 -0
- package/skills/cloudflare/references/stream/patterns.md +184 -0
- package/skills/cloudflare/references/tail-workers/README.md +89 -0
- package/skills/cloudflare/references/tail-workers/api.md +200 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +176 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +192 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +180 -0
- package/skills/cloudflare/references/terraform/README.md +102 -0
- package/skills/cloudflare/references/terraform/api.md +178 -0
- package/skills/cloudflare/references/terraform/configuration.md +197 -0
- package/skills/cloudflare/references/terraform/gotchas.md +150 -0
- package/skills/cloudflare/references/terraform/patterns.md +174 -0
- package/skills/cloudflare/references/tunnel/README.md +129 -0
- package/skills/cloudflare/references/tunnel/api.md +193 -0
- package/skills/cloudflare/references/tunnel/configuration.md +157 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +147 -0
- package/skills/cloudflare/references/tunnel/networking.md +168 -0
- package/skills/cloudflare/references/tunnel/patterns.md +192 -0
- package/skills/cloudflare/references/turn/README.md +82 -0
- package/skills/cloudflare/references/turn/api.md +239 -0
- package/skills/cloudflare/references/turn/configuration.md +179 -0
- package/skills/cloudflare/references/turn/gotchas.md +231 -0
- package/skills/cloudflare/references/turn/patterns.md +213 -0
- package/skills/cloudflare/references/turnstile/README.md +99 -0
- package/skills/cloudflare/references/turnstile/api.md +240 -0
- package/skills/cloudflare/references/turnstile/configuration.md +222 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +218 -0
- package/skills/cloudflare/references/turnstile/patterns.md +193 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +88 -0
- package/skills/cloudflare/references/vectorize/configuration.md +88 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +76 -0
- package/skills/cloudflare/references/vectorize/patterns.md +90 -0
- package/skills/cloudflare/references/waf/README.md +113 -0
- package/skills/cloudflare/references/waf/api.md +202 -0
- package/skills/cloudflare/references/waf/configuration.md +203 -0
- package/skills/cloudflare/references/waf/gotchas.md +204 -0
- package/skills/cloudflare/references/waf/patterns.md +197 -0
- package/skills/cloudflare/references/web-analytics/README.md +141 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +76 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +82 -0
- package/skills/cloudflare/references/web-analytics/integration.md +60 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +91 -0
- package/skills/cloudflare/references/workerd/README.md +78 -0
- package/skills/cloudflare/references/workerd/api.md +185 -0
- package/skills/cloudflare/references/workerd/configuration.md +183 -0
- package/skills/cloudflare/references/workerd/gotchas.md +139 -0
- package/skills/cloudflare/references/workerd/patterns.md +192 -0
- package/skills/cloudflare/references/workers/README.md +108 -0
- package/skills/cloudflare/references/workers/api.md +195 -0
- package/skills/cloudflare/references/workers/configuration.md +185 -0
- package/skills/cloudflare/references/workers/frameworks.md +197 -0
- package/skills/cloudflare/references/workers/gotchas.md +137 -0
- package/skills/cloudflare/references/workers/patterns.md +198 -0
- package/skills/cloudflare/references/workers-ai/README.md +197 -0
- package/skills/cloudflare/references/workers-ai/api.md +112 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +97 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +114 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +120 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +89 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +196 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +167 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +188 -0
- package/skills/cloudflare/references/workers-playground/README.md +127 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +163 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +132 -0
- package/skills/cloudflare/references/workers-vpc/README.md +127 -0
- package/skills/cloudflare/references/workers-vpc/api.md +202 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +147 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +167 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +209 -0
- package/skills/cloudflare/references/workflows/README.md +77 -0
- package/skills/cloudflare/references/workflows/api.md +218 -0
- package/skills/cloudflare/references/workflows/configuration.md +152 -0
- package/skills/cloudflare/references/workflows/gotchas.md +90 -0
- package/skills/cloudflare/references/workflows/patterns.md +175 -0
- package/skills/cloudflare/references/wrangler/README.md +135 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +197 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +197 -0
- package/skills/cloudflare/references/wrangler/patterns.md +209 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +121 -0
- package/skills/cloudflare/references/zaraz/README.md +111 -0
- package/skills/cloudflare/references/zaraz/api.md +112 -0
- package/skills/cloudflare/references/zaraz/configuration.md +90 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +81 -0
- package/skills/cloudflare/references/zaraz/patterns.md +74 -0
- package/skills/cloudflare-email-service/SKILL.md +103 -0
- package/skills/cloudflare-email-service/references/cli-and-mcp.md +125 -0
- package/skills/cloudflare-email-service/references/deliverability.md +285 -0
- package/skills/cloudflare-email-service/references/rest-api.md +184 -0
- package/skills/cloudflare-email-service/references/routing.md +199 -0
- package/skills/cloudflare-email-service/references/sending.md +252 -0
- package/skills/cloudflare-one/SKILL.md +176 -0
- package/skills/cloudflare-one-migrations/SKILL.md +110 -0
- package/skills/durable-objects/SKILL.md +186 -0
- package/skills/durable-objects/references/rules.md +295 -0
- package/skills/durable-objects/references/testing.md +264 -0
- package/skills/durable-objects/references/workers.md +346 -0
- package/skills/sandbox-migrate-to-next/SKILL.md +185 -0
- package/skills/sandbox-next/SKILL.md +91 -0
- package/skills/sandbox-next/references/api-quick-ref.md +94 -0
- package/skills/sandbox-next/references/examples.md +15 -0
- package/skills/sandbox-stable/SKILL.md +110 -0
- package/skills/turnstile-spin/README.md +51 -0
- package/skills/turnstile-spin/SKILL.md +330 -0
- package/skills/turnstile-spin/references/astro.md +199 -0
- package/skills/turnstile-spin/references/hugo.md +114 -0
- package/skills/turnstile-spin/references/nextjs-app.md +261 -0
- package/skills/turnstile-spin/references/nextjs-pages.md +82 -0
- package/skills/turnstile-spin/references/sveltekit.md +191 -0
- package/skills/turnstile-spin/references/vanilla-html.md +157 -0
- package/skills/turnstile-spin/scripts/auth-probe.sh +285 -0
- package/skills/turnstile-spin/scripts/persist-skill.sh +114 -0
- package/skills/turnstile-spin/scripts/validate.sh +137 -0
- package/skills/turnstile-spin/scripts/widget-create.sh +121 -0
- package/skills/turnstile-spin/tests/validation.md +62 -0
- package/skills/workers-best-practices/SKILL.md +127 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +467 -0
- package/skills/wrangler/SKILL.md +922 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Configuration
|
|
2
|
+
|
|
3
|
+
## Wrangler Setup
|
|
4
|
+
|
|
5
|
+
```jsonc
|
|
6
|
+
{
|
|
7
|
+
"name": "my-agents-app",
|
|
8
|
+
"durable_objects": {
|
|
9
|
+
"bindings": [
|
|
10
|
+
{"name": "MyAgent", "class_name": "MyAgent"}
|
|
11
|
+
]
|
|
12
|
+
},
|
|
13
|
+
"migrations": [
|
|
14
|
+
{"tag": "v1", "new_sqlite_classes": ["MyAgent"]}
|
|
15
|
+
],
|
|
16
|
+
"ai": {
|
|
17
|
+
"binding": "AI"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Environment Bindings
|
|
23
|
+
|
|
24
|
+
**Type-safe pattern:**
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
interface Env {
|
|
28
|
+
AI?: Ai; // Workers AI
|
|
29
|
+
MyAgent?: DurableObjectNamespace<MyAgent>;
|
|
30
|
+
ChatAgent?: DurableObjectNamespace<ChatAgent>;
|
|
31
|
+
DB?: D1Database; // D1 database
|
|
32
|
+
KV?: KVNamespace; // KV storage
|
|
33
|
+
R2?: R2Bucket; // R2 bucket
|
|
34
|
+
OPENAI_API_KEY?: string; // Secrets
|
|
35
|
+
GITHUB_CLIENT_ID?: string; // MCP OAuth credentials
|
|
36
|
+
GITHUB_CLIENT_SECRET?: string;
|
|
37
|
+
QUEUE?: Queue; // Queues
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Best practice:** Define all DO bindings in Env interface for type safety.
|
|
42
|
+
|
|
43
|
+
## Deployment
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Local dev
|
|
47
|
+
npx wrangler dev
|
|
48
|
+
|
|
49
|
+
# Deploy production
|
|
50
|
+
npx wrangler deploy
|
|
51
|
+
|
|
52
|
+
# Set secrets
|
|
53
|
+
npx wrangler secret put OPENAI_API_KEY
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Agent Routing
|
|
57
|
+
|
|
58
|
+
**Recommended: Use route helpers**
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { routeAgentRequest } from "agents";
|
|
62
|
+
|
|
63
|
+
export default {
|
|
64
|
+
fetch(request: Request, env: Env) {
|
|
65
|
+
return routeAgentRequest(request, env);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Helper routes requests to agents automatically based on URL patterns.
|
|
71
|
+
|
|
72
|
+
**Manual routing (advanced):**
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
export default {
|
|
76
|
+
async fetch(request: Request, env: Env) {
|
|
77
|
+
const url = new URL(request.url);
|
|
78
|
+
|
|
79
|
+
// Named ID (deterministic)
|
|
80
|
+
const id = env.MyAgent.idFromName("user-123");
|
|
81
|
+
|
|
82
|
+
// Random ID (from URL param)
|
|
83
|
+
// const id = env.MyAgent.idFromString(url.searchParams.get("id"));
|
|
84
|
+
|
|
85
|
+
const stub = env.MyAgent.get(id);
|
|
86
|
+
return stub.fetch(request);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Multi-agent setup:**
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
import { routeAgentRequest } from "agents";
|
|
95
|
+
|
|
96
|
+
export default {
|
|
97
|
+
fetch(request: Request, env: Env) {
|
|
98
|
+
const url = new URL(request.url);
|
|
99
|
+
|
|
100
|
+
// Route by path
|
|
101
|
+
if (url.pathname.startsWith("/chat")) {
|
|
102
|
+
return routeAgentRequest(request, env, "ChatAgent");
|
|
103
|
+
}
|
|
104
|
+
if (url.pathname.startsWith("/task")) {
|
|
105
|
+
return routeAgentRequest(request, env, "TaskAgent");
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return new Response("Not found", { status: 404 });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Email Routing
|
|
114
|
+
|
|
115
|
+
**Code setup:**
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
import { routeAgentEmail } from "agents";
|
|
119
|
+
|
|
120
|
+
export default {
|
|
121
|
+
fetch: (req: Request, env: Env) => routeAgentRequest(req, env),
|
|
122
|
+
email: (message: ForwardableEmailMessage, env: Env) => {
|
|
123
|
+
return routeAgentEmail(message, env);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**Dashboard setup:**
|
|
129
|
+
|
|
130
|
+
Configure email routing in Cloudflare dashboard:
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
Destination: Workers with Durable Objects
|
|
134
|
+
Worker: my-agents-app
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Then handle in agent:
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
export class EmailAgent extends Agent<Env> {
|
|
141
|
+
async onEmail(email: AgentEmail) {
|
|
142
|
+
const text = await email.text();
|
|
143
|
+
// Process email
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## AI Gateway (Optional)
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
// Enable caching/routing through AI Gateway
|
|
152
|
+
const response = await this.env.AI.run(
|
|
153
|
+
"@cf/meta/llama-3.1-8b-instruct",
|
|
154
|
+
{ prompt },
|
|
155
|
+
{
|
|
156
|
+
gateway: {
|
|
157
|
+
id: "my-gateway-id",
|
|
158
|
+
skipCache: false,
|
|
159
|
+
cacheTtl: 3600
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## MCP Configuration (Optional)
|
|
166
|
+
|
|
167
|
+
For exposing tools via Model Context Protocol:
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
// wrangler.jsonc - Add MCP OAuth secrets
|
|
171
|
+
{
|
|
172
|
+
"vars": {
|
|
173
|
+
"MCP_SERVER_URL": "https://mcp.example.com"
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Set secrets via CLI
|
|
178
|
+
// npx wrangler secret put GITHUB_CLIENT_ID
|
|
179
|
+
// npx wrangler secret put GITHUB_CLIENT_SECRET
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Then register in agent code (see api.md MCP section).
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Gotchas & Best Practices
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "setState() not syncing"
|
|
6
|
+
|
|
7
|
+
**Cause:** Mutating state directly or not calling `setState()` after modifications
|
|
8
|
+
**Solution:** Always use `setState()` with immutable updates:
|
|
9
|
+
```ts
|
|
10
|
+
// ❌ this.state.count++
|
|
11
|
+
// ✅ this.setState({...this.state, count: this.state.count + 1})
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
### "Message history grows unbounded (AIChatAgent)"
|
|
15
|
+
|
|
16
|
+
**Cause:** `this.messages` in `AIChatAgent` accumulates all messages indefinitely
|
|
17
|
+
**Solution:** Manually trim old messages periodically:
|
|
18
|
+
```ts
|
|
19
|
+
export class ChatAgent extends AIChatAgent<Env> {
|
|
20
|
+
async onChatMessage(onFinish) {
|
|
21
|
+
// Keep only last 50 messages
|
|
22
|
+
if (this.messages.length > 50) {
|
|
23
|
+
this.messages = this.messages.slice(-50);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return this.streamText({ model: openai("gpt-4"), messages: this.messages, onFinish });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### "SQL injection vulnerability"
|
|
32
|
+
|
|
33
|
+
**Cause:** Direct string interpolation in SQL queries
|
|
34
|
+
**Solution:** Use parameterized queries:
|
|
35
|
+
```ts
|
|
36
|
+
// ❌ this.sql`...WHERE id = '${userId}'`
|
|
37
|
+
// ✅ this.sql`...WHERE id = ${userId}`
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### "WebSocket connection timeout"
|
|
41
|
+
|
|
42
|
+
**Cause:** Not calling `conn.accept()` in `onConnect`
|
|
43
|
+
**Solution:** Always accept connections:
|
|
44
|
+
```ts
|
|
45
|
+
async onConnect(conn: Connection, ctx: ConnectionContext) { conn.accept(); conn.setState({userId: "123"}); }
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### "Schedule limit exceeded"
|
|
49
|
+
|
|
50
|
+
**Cause:** More than 1000 scheduled tasks per agent
|
|
51
|
+
**Solution:** Clean up old schedules and limit creation rate:
|
|
52
|
+
```ts
|
|
53
|
+
async checkSchedules() { if ((await this.getSchedules()).length > 800) console.warn("Near limit!"); }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### "AI Gateway unavailable"
|
|
57
|
+
|
|
58
|
+
**Cause:** AI service timeout or quota exceeded
|
|
59
|
+
**Solution:** Add error handling and fallbacks:
|
|
60
|
+
```ts
|
|
61
|
+
try {
|
|
62
|
+
return await this.env.AI.run(model, {prompt});
|
|
63
|
+
} catch (e) {
|
|
64
|
+
console.error("AI error:", e);
|
|
65
|
+
return {error: "Unavailable"};
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### "@callable method returns undefined"
|
|
70
|
+
|
|
71
|
+
**Cause:** Method doesn't return JSON-serializable value, or has non-serializable types
|
|
72
|
+
**Solution:** Ensure return values are plain objects/arrays/primitives:
|
|
73
|
+
```ts
|
|
74
|
+
// ❌ Returns class instance
|
|
75
|
+
@callable()
|
|
76
|
+
async getData() { return new Date(); }
|
|
77
|
+
|
|
78
|
+
// ✅ Returns serializable object
|
|
79
|
+
@callable()
|
|
80
|
+
async getData() { return { timestamp: Date.now() }; }
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### "Resumable stream not resuming"
|
|
84
|
+
|
|
85
|
+
**Cause:** Stream ID must be deterministic for resumption to work
|
|
86
|
+
**Solution:** Use AIChatAgent (automatic) or ensure consistent stream IDs:
|
|
87
|
+
```ts
|
|
88
|
+
// AIChatAgent handles this automatically
|
|
89
|
+
export class ChatAgent extends AIChatAgent<Env> {
|
|
90
|
+
// Resumption works out of the box
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### "MCP connection loss on hibernation"
|
|
95
|
+
|
|
96
|
+
**Cause:** MCP server connections don't survive hibernation
|
|
97
|
+
**Solution:** Re-register servers in `onStart()` or check connection status:
|
|
98
|
+
```ts
|
|
99
|
+
onStart() {
|
|
100
|
+
// Re-register MCP servers after hibernation
|
|
101
|
+
await this.mcp.registerServer("github", { url: env.MCP_URL, auth: {...} });
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### "Agent not found"
|
|
106
|
+
|
|
107
|
+
**Cause:** Durable Object binding missing or incorrect class name
|
|
108
|
+
**Solution:** Verify DO binding in wrangler.jsonc and class name matches
|
|
109
|
+
|
|
110
|
+
## Rate Limits & Quotas
|
|
111
|
+
|
|
112
|
+
| Resource/Limit | Value | Notes |
|
|
113
|
+
|----------------|-------|-------|
|
|
114
|
+
| CPU per request | 30s (std), 300s (max) | Set in wrangler.jsonc |
|
|
115
|
+
| Memory per instance | 128MB | Shared with WebSockets |
|
|
116
|
+
| Storage per agent | 10GB | SQLite storage |
|
|
117
|
+
| Scheduled tasks | 1000 per agent | Monitor with `getSchedules()` |
|
|
118
|
+
| WebSocket connections | Unlimited | Within memory limits |
|
|
119
|
+
| SQL columns | 100 | Per table |
|
|
120
|
+
| SQL row size | 2MB | Key + value |
|
|
121
|
+
| WebSocket message | 32MiB | Max size |
|
|
122
|
+
| DO requests/sec | ~1000 | Per unique DO instance; rate limit if needed |
|
|
123
|
+
| AI Gateway (Workers AI) | Model-specific | Check dashboard for limits |
|
|
124
|
+
| MCP requests | Depends on server | Implement retry/backoff |
|
|
125
|
+
|
|
126
|
+
## Best Practices
|
|
127
|
+
|
|
128
|
+
### State Management
|
|
129
|
+
- Use immutable updates: `setState({...this.state, key: newValue})`
|
|
130
|
+
- Trim unbounded arrays (messages, logs) periodically
|
|
131
|
+
- Store large data in SQL, not state
|
|
132
|
+
|
|
133
|
+
### SQL Usage
|
|
134
|
+
- Create tables in `onStart()`, not `onRequest()`
|
|
135
|
+
- Use parameterized queries: `` sql`WHERE id = ${id}` `` (NOT `` sql`WHERE id = '${id}'` ``)
|
|
136
|
+
- Index frequently queried columns
|
|
137
|
+
|
|
138
|
+
### Scheduling
|
|
139
|
+
- Monitor schedule count: `await this.getSchedules()`
|
|
140
|
+
- Cancel completed tasks to stay under 1000 limit
|
|
141
|
+
- Use cron strings for recurring tasks
|
|
142
|
+
|
|
143
|
+
### WebSockets
|
|
144
|
+
- Always call `conn.accept()` in `onConnect()`
|
|
145
|
+
- Handle client disconnects gracefully
|
|
146
|
+
- Broadcast to `this.connections` efficiently
|
|
147
|
+
|
|
148
|
+
### AI Integration
|
|
149
|
+
- Use `AIChatAgent` for chat interfaces (auto-streaming, resumption)
|
|
150
|
+
- Trim message history to avoid token limits
|
|
151
|
+
- Handle AI errors with try/catch and fallbacks
|
|
152
|
+
|
|
153
|
+
### Production Deployment
|
|
154
|
+
- **Rate limiting:** Implement request throttling for high-traffic agents (>1000 req/s)
|
|
155
|
+
- **Monitoring:** Log critical errors, track schedule count, monitor storage usage
|
|
156
|
+
- **Graceful degradation:** Handle AI service outages with fallbacks
|
|
157
|
+
- **Message trimming:** Enforce max history length (e.g., 100 messages) in AIChatAgent
|
|
158
|
+
- **MCP reliability:** Re-register servers on hibernation, implement retry logic
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# Patterns & Use Cases
|
|
2
|
+
|
|
3
|
+
## AI Chat w/Tools
|
|
4
|
+
|
|
5
|
+
**Server (AIChatAgent):**
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { AIChatAgent } from "@cloudflare/ai-chat";
|
|
9
|
+
import { openai } from "@ai-sdk/openai";
|
|
10
|
+
import { tool } from "ai";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
|
|
13
|
+
export class ChatAgent extends AIChatAgent<Env> {
|
|
14
|
+
async onChatMessage(onFinish) {
|
|
15
|
+
return this.streamText({
|
|
16
|
+
model: openai("gpt-4"),
|
|
17
|
+
messages: this.messages, // Auto-managed
|
|
18
|
+
tools: {
|
|
19
|
+
getWeather: tool({
|
|
20
|
+
description: "Get current weather",
|
|
21
|
+
parameters: z.object({ city: z.string() }),
|
|
22
|
+
execute: async ({ city }) => `Weather in ${city}: Sunny, 72°F`
|
|
23
|
+
}),
|
|
24
|
+
searchDocs: tool({
|
|
25
|
+
description: "Search documentation",
|
|
26
|
+
parameters: z.object({ query: z.string() }),
|
|
27
|
+
execute: async ({ query }) => JSON.stringify(
|
|
28
|
+
this.sql<{title, content}>`SELECT title, content FROM docs WHERE content LIKE ${'%' + query + '%'}`
|
|
29
|
+
)
|
|
30
|
+
})
|
|
31
|
+
},
|
|
32
|
+
onFinish,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Client (React):**
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
import { useAgent } from "agents/react";
|
|
42
|
+
import { useAgentChat } from "@cloudflare/ai-chat/react";
|
|
43
|
+
|
|
44
|
+
function ChatUI() {
|
|
45
|
+
const agent = useAgent({ agent: "ChatAgent" });
|
|
46
|
+
const { messages, input, handleInputChange, handleSubmit, isLoading } = useAgentChat({ agent });
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<div>
|
|
50
|
+
{messages.map(m => <div key={m.id}>{m.role}: {m.content}</div>)}
|
|
51
|
+
<form onSubmit={handleSubmit}>
|
|
52
|
+
<input value={input} onChange={handleInputChange} disabled={isLoading} />
|
|
53
|
+
<button disabled={isLoading}>Send</button>
|
|
54
|
+
</form>
|
|
55
|
+
</div>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Human-in-the-Loop (Client Tools)
|
|
61
|
+
|
|
62
|
+
Server defines tool, client executes:
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
// Server
|
|
66
|
+
export class ChatAgent extends AIChatAgent<Env> {
|
|
67
|
+
async onChatMessage(onFinish) {
|
|
68
|
+
return this.streamText({
|
|
69
|
+
model: openai("gpt-4"),
|
|
70
|
+
messages: this.messages,
|
|
71
|
+
tools: {
|
|
72
|
+
confirmAction: tool({
|
|
73
|
+
description: "Ask user to confirm",
|
|
74
|
+
parameters: z.object({ action: z.string() }),
|
|
75
|
+
execute: "client", // Client-side execution
|
|
76
|
+
})
|
|
77
|
+
},
|
|
78
|
+
onFinish,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Client
|
|
84
|
+
const { messages } = useAgentChat({
|
|
85
|
+
agent,
|
|
86
|
+
onToolCall: async (toolCall) => {
|
|
87
|
+
if (toolCall.toolName === "confirmAction") {
|
|
88
|
+
return { confirmed: window.confirm(`Confirm: ${toolCall.args.action}?`) };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Task Queue & Scheduled Processing
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
export class TaskAgent extends Agent<Env> {
|
|
98
|
+
onStart() {
|
|
99
|
+
this.schedule("*/5 * * * *", "processQueue", {}); // Every 5 min
|
|
100
|
+
this.schedule("0 0 * * *", "dailyCleanup", {}); // Daily
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async onRequest(req: Request) {
|
|
104
|
+
await this.queue("processVideo", { videoId: (await req.json()).videoId });
|
|
105
|
+
return Response.json({ queued: true });
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async processQueue() {
|
|
109
|
+
const tasks = await this.dequeue(10);
|
|
110
|
+
for (const task of tasks) {
|
|
111
|
+
if (task.name === "processVideo") await this.processVideo(task.data.videoId);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async dailyCleanup() {
|
|
116
|
+
this.sql`DELETE FROM logs WHERE created_at < ${Date.now() - 86400000}`;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Manual WebSocket Chat
|
|
122
|
+
|
|
123
|
+
Custom protocols (non-AI):
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
export class ChatAgent extends Agent<Env> {
|
|
127
|
+
async onConnect(conn: Connection, ctx: ConnectionContext) {
|
|
128
|
+
conn.accept();
|
|
129
|
+
conn.setState({userId: ctx.request.headers.get("X-User-ID") || "anon"});
|
|
130
|
+
conn.send(JSON.stringify({type: "history", messages: this.state.messages}));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async onMessage(conn: Connection, msg: WSMessage) {
|
|
134
|
+
const newMsg = {userId: conn.state.userId, text: JSON.parse(msg as string).text, timestamp: Date.now()};
|
|
135
|
+
this.setState({messages: [...this.state.messages, newMsg]});
|
|
136
|
+
this.connections.forEach(c => c.send(JSON.stringify(newMsg)));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Email Processing w/AI
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
export class EmailAgent extends Agent<Env> {
|
|
145
|
+
async onEmail(email: AgentEmail) {
|
|
146
|
+
const [text, from, subject] = [await email.text(), email.from, email.headers.get("subject") || ""];
|
|
147
|
+
this.sql`INSERT INTO emails (from_addr, subject, body) VALUES (${from}, ${subject}, ${text})`;
|
|
148
|
+
|
|
149
|
+
const { text: summary } = await generateText({
|
|
150
|
+
model: openai("gpt-4o-mini"), prompt: `Summarize: ${subject}\n\n${text}`
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
this.connections.forEach(c => c.send(JSON.stringify({type: "new_email", from, summary})));
|
|
154
|
+
if (summary.includes("urgent")) await this.schedule(0, "sendAutoReply", { to: from });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Real-time Collaboration
|
|
160
|
+
|
|
161
|
+
```ts
|
|
162
|
+
export class GameAgent extends Agent<Env> {
|
|
163
|
+
initialState = { players: [], gameStarted: false };
|
|
164
|
+
|
|
165
|
+
async onConnect(conn: Connection, ctx: ConnectionContext) {
|
|
166
|
+
conn.accept();
|
|
167
|
+
const playerId = ctx.request.headers.get("X-Player-ID") || crypto.randomUUID();
|
|
168
|
+
conn.setState({ playerId });
|
|
169
|
+
|
|
170
|
+
const newPlayer = { id: playerId, score: 0 };
|
|
171
|
+
this.setState({...this.state, players: [...this.state.players, newPlayer]});
|
|
172
|
+
this.connections.forEach(c => c.send(JSON.stringify({type: "player_joined", player: newPlayer})));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async onMessage(conn: Connection, msg: WSMessage) {
|
|
176
|
+
const m = JSON.parse(msg as string);
|
|
177
|
+
|
|
178
|
+
if (m.type === "move") {
|
|
179
|
+
this.setState({
|
|
180
|
+
...this.state,
|
|
181
|
+
players: this.state.players.map(p => p.id === conn.state.playerId ? {...p, score: p.score + m.points} : p)
|
|
182
|
+
});
|
|
183
|
+
this.connections.forEach(c => c.send(JSON.stringify({type: "player_moved", playerId: conn.state.playerId})));
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (m.type === "start" && this.state.players.length >= 2) {
|
|
187
|
+
this.setState({...this.state, gameStarted: true});
|
|
188
|
+
this.connections.forEach(c => c.send(JSON.stringify({type: "game_started"})));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
```
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# Cloudflare AI Gateway
|
|
2
|
+
|
|
3
|
+
Expert guidance for implementing Cloudflare AI Gateway - a universal gateway for AI model providers with analytics, caching, rate limiting, and routing capabilities.
|
|
4
|
+
|
|
5
|
+
## When to Use This Reference
|
|
6
|
+
|
|
7
|
+
- Setting up AI Gateway for any AI provider (OpenAI, Anthropic, Workers AI, etc.)
|
|
8
|
+
- Implementing caching, rate limiting, or request retry/fallback
|
|
9
|
+
- Configuring dynamic routing with A/B testing or model fallbacks
|
|
10
|
+
- Managing provider API keys securely with BYOK
|
|
11
|
+
- Adding security features (guardrails, DLP)
|
|
12
|
+
- Setting up observability with logging and custom metadata
|
|
13
|
+
- Debugging AI Gateway requests or optimizing configurations
|
|
14
|
+
|
|
15
|
+
## Quick Start
|
|
16
|
+
|
|
17
|
+
**What's your setup?**
|
|
18
|
+
|
|
19
|
+
- **Using Vercel AI SDK** → Pattern 1 (recommended) - see [sdk-integration.md](./sdk-integration.md)
|
|
20
|
+
- **Using OpenAI SDK** → Pattern 2 - see [sdk-integration.md](./sdk-integration.md)
|
|
21
|
+
- **Cloudflare Worker + Workers AI** → Pattern 3 - see [sdk-integration.md](./sdk-integration.md)
|
|
22
|
+
- **Direct HTTP (any language)** → Pattern 4 - see [configuration.md](./configuration.md)
|
|
23
|
+
- **Framework (LangChain, etc.)** → See [sdk-integration.md](./sdk-integration.md)
|
|
24
|
+
|
|
25
|
+
## Pattern 1: Vercel AI SDK (Recommended)
|
|
26
|
+
|
|
27
|
+
Most modern pattern using official `ai-gateway-provider` package with automatic fallbacks.
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { createAiGateway } from 'ai-gateway-provider';
|
|
31
|
+
import { createOpenAI } from '@ai-sdk/openai';
|
|
32
|
+
import { generateText } from 'ai';
|
|
33
|
+
|
|
34
|
+
const gateway = createAiGateway({
|
|
35
|
+
accountId: process.env.CF_ACCOUNT_ID,
|
|
36
|
+
gateway: process.env.CF_GATEWAY_ID,
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const openai = createOpenAI({
|
|
40
|
+
apiKey: process.env.OPENAI_API_KEY
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// Single model
|
|
44
|
+
const { text } = await generateText({
|
|
45
|
+
model: gateway(openai('gpt-4o')),
|
|
46
|
+
prompt: 'Hello'
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Automatic fallback array
|
|
50
|
+
const { text } = await generateText({
|
|
51
|
+
model: gateway([
|
|
52
|
+
openai('gpt-4o'), // Try first
|
|
53
|
+
anthropic('claude-sonnet-4-5'), // Fallback
|
|
54
|
+
]),
|
|
55
|
+
prompt: 'Hello'
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Install:** `npm install ai-gateway-provider ai @ai-sdk/openai @ai-sdk/anthropic`
|
|
60
|
+
|
|
61
|
+
## Pattern 2: OpenAI SDK
|
|
62
|
+
|
|
63
|
+
Drop-in replacement for OpenAI API with multi-provider support.
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
import OpenAI from 'openai';
|
|
67
|
+
|
|
68
|
+
const client = new OpenAI({
|
|
69
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
70
|
+
baseURL: `https://gateway.ai.cloudflare.com/v1/${accountId}/${gatewayId}/compat`,
|
|
71
|
+
defaultHeaders: {
|
|
72
|
+
'cf-aig-authorization': `Bearer ${cfToken}` // For authenticated gateways
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Switch providers by changing model format: {provider}/{model}
|
|
77
|
+
const response = await client.chat.completions.create({
|
|
78
|
+
model: 'openai/gpt-4o', // or 'anthropic/claude-sonnet-4-5'
|
|
79
|
+
messages: [{ role: 'user', content: 'Hello!' }]
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Pattern 3: Workers AI Binding
|
|
84
|
+
|
|
85
|
+
For Cloudflare Workers using Workers AI.
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
export default {
|
|
89
|
+
async fetch(request, env, ctx) {
|
|
90
|
+
const response = await env.AI.run(
|
|
91
|
+
'@cf/meta/llama-3-8b-instruct',
|
|
92
|
+
{ messages: [{ role: 'user', content: 'Hello!' }] },
|
|
93
|
+
{
|
|
94
|
+
gateway: {
|
|
95
|
+
id: 'my-gateway',
|
|
96
|
+
metadata: { userId: '123', team: 'engineering' }
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
return Response.json(response);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Headers Quick Reference
|
|
107
|
+
|
|
108
|
+
| Header | Purpose | Example | Notes |
|
|
109
|
+
|--------|---------|---------|-------|
|
|
110
|
+
| `cf-aig-authorization` | Gateway auth | `Bearer {token}` | Required for authenticated gateways |
|
|
111
|
+
| `cf-aig-metadata` | Tracking | `{"userId":"x"}` | Max 5 entries, flat structure |
|
|
112
|
+
| `cf-aig-cache-ttl` | Cache duration | `3600` | Seconds, min 60, max 2592000 (30 days) |
|
|
113
|
+
| `cf-aig-skip-cache` | Bypass cache | `true` | - |
|
|
114
|
+
| `cf-aig-cache-key` | Custom cache key | `my-key` | Must be unique per response |
|
|
115
|
+
| `cf-aig-collect-log` | Skip logging | `false` | Default: true |
|
|
116
|
+
| `cf-aig-cache-status` | Cache hit/miss | Response only | `HIT` or `MISS` |
|
|
117
|
+
|
|
118
|
+
## In This Reference
|
|
119
|
+
|
|
120
|
+
| File | Purpose |
|
|
121
|
+
|------|---------|
|
|
122
|
+
| [sdk-integration.md](./sdk-integration.md) | Vercel AI SDK, OpenAI SDK, Workers binding patterns |
|
|
123
|
+
| [configuration.md](./configuration.md) | Dashboard setup, wrangler, API tokens |
|
|
124
|
+
| [features.md](./features.md) | Caching, rate limits, guardrails, DLP, BYOK, unified billing |
|
|
125
|
+
| [dynamic-routing.md](./dynamic-routing.md) | Fallbacks, A/B testing, conditional routing |
|
|
126
|
+
| [troubleshooting.md](./troubleshooting.md) | Debugging, errors, observability, gotchas |
|
|
127
|
+
|
|
128
|
+
## Reading Order
|
|
129
|
+
|
|
130
|
+
| Task | Files |
|
|
131
|
+
|------|-------|
|
|
132
|
+
| First-time setup | README + [configuration.md](./configuration.md) |
|
|
133
|
+
| SDK integration | README + [sdk-integration.md](./sdk-integration.md) |
|
|
134
|
+
| Enable caching | README + [features.md](./features.md) |
|
|
135
|
+
| Setup fallbacks | README + [dynamic-routing.md](./dynamic-routing.md) |
|
|
136
|
+
| Debug errors | README + [troubleshooting.md](./troubleshooting.md) |
|
|
137
|
+
|
|
138
|
+
## Architecture
|
|
139
|
+
|
|
140
|
+
AI Gateway acts as a proxy between your application and AI providers:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
Your App → AI Gateway → AI Provider (OpenAI, Anthropic, etc.)
|
|
144
|
+
↓
|
|
145
|
+
Analytics, Caching, Rate Limiting, Logging
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Key URL patterns:**
|
|
149
|
+
- Unified API (OpenAI-compatible): `https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/compat/chat/completions`
|
|
150
|
+
- Provider-specific: `https://gateway.ai.cloudflare.com/v1/{account_id}/{gateway_id}/{provider}/{endpoint}`
|
|
151
|
+
- Dynamic routes: Use route name instead of model: `dynamic/{route-name}`
|
|
152
|
+
|
|
153
|
+
## Gateway Types
|
|
154
|
+
|
|
155
|
+
1. **Unauthenticated Gateway**: Open access (not recommended for production)
|
|
156
|
+
2. **Authenticated Gateway**: Requires `cf-aig-authorization` header with Cloudflare API token (recommended)
|
|
157
|
+
|
|
158
|
+
## Provider Authentication Options
|
|
159
|
+
|
|
160
|
+
1. **Unified Billing**: Use AI Gateway billing to pay for inference (keyless mode - no provider API key needed)
|
|
161
|
+
2. **BYOK (Store Keys)**: Store provider API keys in Cloudflare dashboard
|
|
162
|
+
3. **Request Headers**: Include provider API key in each request
|
|
163
|
+
|
|
164
|
+
## Related Skills
|
|
165
|
+
|
|
166
|
+
- [Workers AI](../workers-ai/README.md) - For `env.AI.run()` details
|
|
167
|
+
- [Agents SDK](../agents-sdk/README.md) - For stateful AI patterns
|
|
168
|
+
- [Vectorize](../vectorize/README.md) - For RAG patterns with embeddings
|
|
169
|
+
|
|
170
|
+
## Resources
|
|
171
|
+
|
|
172
|
+
- [Official Docs](https://developers.cloudflare.com/ai-gateway/)
|
|
173
|
+
- [API Reference](https://developers.cloudflare.com/api/resources/ai_gateway/)
|
|
174
|
+
- [Provider Guides](https://developers.cloudflare.com/ai-gateway/usage/providers/)
|
|
175
|
+
- [Discord Community](https://discord.cloudflare.com)
|