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,63 @@
|
|
|
1
|
+
# Server-Driven Messages (Trigger Patterns)
|
|
2
|
+
|
|
3
|
+
Fetch https://developers.cloudflare.com/agents/api-reference/trigger-patterns/ for complete documentation.
|
|
4
|
+
|
|
5
|
+
Patterns for server-initiated LLM turns in `AIChatAgent` — from schedules, webhooks, email, or other agents.
|
|
6
|
+
|
|
7
|
+
## `saveMessages` — Trigger an LLM Turn
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
await this.saveMessages((existingMessages) => [
|
|
11
|
+
...existingMessages,
|
|
12
|
+
{ role: "user", content: "Check for new notifications" }
|
|
13
|
+
]);
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
`saveMessages` persists the messages AND triggers `onChatMessage`.
|
|
17
|
+
|
|
18
|
+
## `persistMessages` — Save Without Triggering
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
await this.persistMessages([
|
|
22
|
+
...this.messages,
|
|
23
|
+
{ role: "assistant", content: "System note: checked at " + new Date() }
|
|
24
|
+
]);
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## `waitUntilStable`
|
|
28
|
+
|
|
29
|
+
**Always call before `saveMessages` from non-chat contexts** (schedules, webhooks, email):
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
async checkNotifications(payload: unknown, schedule: Schedule) {
|
|
33
|
+
await this.waitUntilStable({ timeout: 30_000 });
|
|
34
|
+
await this.saveMessages((msgs) => [
|
|
35
|
+
...msgs,
|
|
36
|
+
{ role: "user", content: "Run scheduled notification check" }
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## `onChatResponse`
|
|
42
|
+
|
|
43
|
+
Runs after each LLM turn completes. Use for chaining:
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
async onChatResponse(result: ChatResponseResult) {
|
|
47
|
+
if (result.type === "finish" && needsFollowUp(result)) {
|
|
48
|
+
await this.saveMessages((msgs) => [
|
|
49
|
+
...msgs,
|
|
50
|
+
{ role: "user", content: "Continue with next step" }
|
|
51
|
+
]);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Client Status
|
|
57
|
+
|
|
58
|
+
```tsx
|
|
59
|
+
const { isStreaming, isServerStreaming } = useAgentChat({ agent });
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- `isStreaming` — true during any streaming (user-initiated or server-initiated)
|
|
63
|
+
- `isServerStreaming` — true only during server-initiated streams
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# State & Scheduling
|
|
2
|
+
|
|
3
|
+
Fetch https://developers.cloudflare.com/agents/api-reference/store-and-sync-state/ and https://developers.cloudflare.com/agents/api-reference/schedule-tasks/ for complete documentation.
|
|
4
|
+
|
|
5
|
+
## State Management
|
|
6
|
+
|
|
7
|
+
State persists to SQLite and broadcasts to connected clients automatically.
|
|
8
|
+
|
|
9
|
+
### Define Typed State
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
type State = {
|
|
13
|
+
count: number;
|
|
14
|
+
items: string[];
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export class MyAgent extends Agent<Env, State> {
|
|
18
|
+
initialState: State = { count: 0, items: [] };
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Read and Update
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// Read (lazy-loaded from SQLite)
|
|
26
|
+
const count = this.state.count;
|
|
27
|
+
|
|
28
|
+
// Write (sync, persists, broadcasts)
|
|
29
|
+
this.setState({ count: this.state.count + 1 });
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Validation Hook
|
|
33
|
+
|
|
34
|
+
`validateStateChange()` runs synchronously before state persists. Throw to reject the update.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
validateStateChange(nextState: State, source: Connection | "server") {
|
|
38
|
+
if (nextState.count < 0) {
|
|
39
|
+
throw new Error("Count cannot be negative");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Execution Order
|
|
45
|
+
|
|
46
|
+
1. `validateStateChange(nextState, source)` - sync, gating
|
|
47
|
+
2. State persisted to SQLite
|
|
48
|
+
3. State broadcast to connected clients
|
|
49
|
+
4. `onStateUpdate(nextState, source)` - async via `ctx.waitUntil`, non-gating
|
|
50
|
+
|
|
51
|
+
### Client-Side Sync (React)
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
import { useAgent } from "agents/react";
|
|
55
|
+
|
|
56
|
+
function App() {
|
|
57
|
+
const [state, setLocalState] = useState<State>({ count: 0 });
|
|
58
|
+
|
|
59
|
+
const agent = useAgent<State>({
|
|
60
|
+
agent: "MyAgent",
|
|
61
|
+
name: "instance-1",
|
|
62
|
+
onStateUpdate: (newState) => setLocalState(newState)
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return <button onClick={() => agent.setState({ count: state.count + 1 })}>
|
|
66
|
+
Count: {state.count}
|
|
67
|
+
</button>;
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## SQL API
|
|
72
|
+
|
|
73
|
+
Direct SQLite access for custom queries:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
// Create table
|
|
77
|
+
this.sql`
|
|
78
|
+
CREATE TABLE IF NOT EXISTS items (
|
|
79
|
+
id TEXT PRIMARY KEY,
|
|
80
|
+
name TEXT,
|
|
81
|
+
created_at INTEGER DEFAULT (unixepoch())
|
|
82
|
+
)
|
|
83
|
+
`;
|
|
84
|
+
|
|
85
|
+
// Insert
|
|
86
|
+
this.sql`INSERT INTO items (id, name) VALUES (${id}, ${name})`;
|
|
87
|
+
|
|
88
|
+
// Query with types
|
|
89
|
+
const items = this.sql<{ id: string; name: string }>`
|
|
90
|
+
SELECT * FROM items WHERE name LIKE ${`%${search}%`}
|
|
91
|
+
`;
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Scheduling
|
|
95
|
+
|
|
96
|
+
### Schedule Types
|
|
97
|
+
|
|
98
|
+
| Mode | Syntax | Use Case |
|
|
99
|
+
|------|--------|----------|
|
|
100
|
+
| Delay | `this.schedule(60, ...)` | Run in 60 seconds |
|
|
101
|
+
| Date | `this.schedule(new Date(...), ...)` | Run at specific time |
|
|
102
|
+
| Cron | `this.schedule("0 8 * * *", ...)` | Recurring schedule |
|
|
103
|
+
| Interval | `this.scheduleEvery(30, ...)` | Fixed interval (every 30s) |
|
|
104
|
+
|
|
105
|
+
### Examples
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// Delay (seconds)
|
|
109
|
+
await this.schedule(60, "checkStatus", { id: "abc123" });
|
|
110
|
+
|
|
111
|
+
// Specific date
|
|
112
|
+
await this.schedule(new Date("2025-12-25T00:00:00Z"), "sendGreeting", { to: "user" });
|
|
113
|
+
|
|
114
|
+
// Cron (recurring)
|
|
115
|
+
await this.schedule("0 9 * * 1-5", "weekdayReport", {});
|
|
116
|
+
|
|
117
|
+
// Fixed interval (every 30 seconds, overlap prevention built-in)
|
|
118
|
+
await this.scheduleEvery(30, "pollUpdates");
|
|
119
|
+
await this.scheduleEvery(300, "syncData", { source: "api" });
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Handler
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
async sendGreeting(payload: { to: string }, schedule: Schedule) {
|
|
126
|
+
console.log(`Sending greeting to ${payload.to}`);
|
|
127
|
+
// Cron schedules auto-reschedule; one-time schedules are deleted
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Manage Schedules
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
const schedules = this.getSchedules();
|
|
135
|
+
const crons = this.getSchedules({ type: "cron" });
|
|
136
|
+
await this.cancelSchedule(schedule.id);
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Retry on Schedules
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
await this.schedule(60, "task", payload, { retry: { maxAttempts: 3 } });
|
|
143
|
+
await this.scheduleEvery(30, "poll", undefined, { retry: { maxAttempts: 2 } });
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Lifecycle Callbacks
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
export class MyAgent extends Agent<Env, State> {
|
|
150
|
+
async onStart() {
|
|
151
|
+
// Agent started or woke from hibernation
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
onConnect(conn: Connection, ctx: ConnectionContext) {
|
|
155
|
+
// WebSocket connected
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
onMessage(conn: Connection, message: WSMessage) {
|
|
159
|
+
// WebSocket message (non-RPC)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
onStateUpdate(state: State, source: Connection | "server") {
|
|
163
|
+
// State changed (async, non-blocking)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
onError(error: unknown) {
|
|
167
|
+
// Error handler
|
|
168
|
+
throw error; // Re-throw to propagate
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
```
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Streaming Chat with AIChatAgent
|
|
2
|
+
|
|
3
|
+
Fetch https://developers.cloudflare.com/agents/api-reference/chat-agents/ for complete documentation.
|
|
4
|
+
|
|
5
|
+
`AIChatAgent` from `@cloudflare/ai-chat` provides streaming chat with automatic message persistence and resumable streams.
|
|
6
|
+
|
|
7
|
+
## Basic Chat Agent
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
import { AIChatAgent } from "@cloudflare/ai-chat";
|
|
11
|
+
import { streamText, convertToModelMessages } from "ai";
|
|
12
|
+
import { openai } from "@ai-sdk/openai";
|
|
13
|
+
|
|
14
|
+
export class Chat extends AIChatAgent<Env> {
|
|
15
|
+
async onChatMessage(onFinish, options) {
|
|
16
|
+
const result = streamText({
|
|
17
|
+
model: openai("gpt-4o"),
|
|
18
|
+
system: "You are a helpful assistant.",
|
|
19
|
+
messages: await convertToModelMessages(this.messages),
|
|
20
|
+
abortSignal: options?.abortSignal,
|
|
21
|
+
onFinish
|
|
22
|
+
});
|
|
23
|
+
return result.toUIMessageStreamResponse();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Important:** Always pass `abortSignal` and `onFinish` — they enable proper cleanup and message persistence.
|
|
29
|
+
|
|
30
|
+
## With Tools
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import { tool } from "ai";
|
|
34
|
+
import { z } from "zod";
|
|
35
|
+
|
|
36
|
+
const tools = {
|
|
37
|
+
getWeather: tool({
|
|
38
|
+
description: "Get weather for a location",
|
|
39
|
+
parameters: z.object({ location: z.string() }),
|
|
40
|
+
execute: async ({ location }) => `Weather in ${location}: 72°F, sunny`
|
|
41
|
+
})
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export class Chat extends AIChatAgent<Env> {
|
|
45
|
+
async onChatMessage(onFinish, options) {
|
|
46
|
+
const result = streamText({
|
|
47
|
+
model: openai("gpt-4o"),
|
|
48
|
+
messages: await convertToModelMessages(this.messages),
|
|
49
|
+
tools,
|
|
50
|
+
abortSignal: options?.abortSignal,
|
|
51
|
+
onFinish
|
|
52
|
+
});
|
|
53
|
+
return result.toUIMessageStreamResponse();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## With Workers AI (no API keys)
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { createWorkersAI } from "workers-ai-provider";
|
|
62
|
+
|
|
63
|
+
export class Chat extends AIChatAgent<Env> {
|
|
64
|
+
async onChatMessage(onFinish, options) {
|
|
65
|
+
const workersai = createWorkersAI({ binding: this.env.AI });
|
|
66
|
+
const result = streamText({
|
|
67
|
+
model: workersai("@cf/meta/llama-4-scout-17b-16e-instruct"),
|
|
68
|
+
messages: await convertToModelMessages(this.messages),
|
|
69
|
+
abortSignal: options?.abortSignal,
|
|
70
|
+
onFinish
|
|
71
|
+
});
|
|
72
|
+
return result.toUIMessageStreamResponse();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Custom UI Message Stream
|
|
78
|
+
|
|
79
|
+
For more control, use `createUIMessageStream`:
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
import { createUIMessageStream, createUIMessageStreamResponse } from "ai";
|
|
83
|
+
|
|
84
|
+
export class Chat extends AIChatAgent<Env> {
|
|
85
|
+
async onChatMessage(onFinish) {
|
|
86
|
+
const stream = createUIMessageStream({
|
|
87
|
+
execute: async ({ writer }) => {
|
|
88
|
+
const result = streamText({
|
|
89
|
+
model: openai("gpt-4o"),
|
|
90
|
+
messages: await convertToModelMessages(this.messages),
|
|
91
|
+
onFinish
|
|
92
|
+
});
|
|
93
|
+
writer.merge(result.toUIMessageStream());
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return createUIMessageStreamResponse({ stream });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Resumable Streaming
|
|
102
|
+
|
|
103
|
+
Streams automatically resume if client disconnects and reconnects:
|
|
104
|
+
|
|
105
|
+
1. Chunks buffered to SQLite during streaming
|
|
106
|
+
2. On reconnect, buffered chunks sent immediately
|
|
107
|
+
3. Live streaming continues from where it left off
|
|
108
|
+
|
|
109
|
+
**Enabled by default.** To disable:
|
|
110
|
+
|
|
111
|
+
```tsx
|
|
112
|
+
const { messages } = useAgentChat({ agent, resume: false });
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## React Client
|
|
116
|
+
|
|
117
|
+
```tsx
|
|
118
|
+
import { useAgent } from "agents/react";
|
|
119
|
+
import { useAgentChat } from "@cloudflare/ai-chat/react";
|
|
120
|
+
|
|
121
|
+
function ChatUI() {
|
|
122
|
+
const agent = useAgent({
|
|
123
|
+
agent: "Chat",
|
|
124
|
+
name: "my-chat-session"
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
const {
|
|
128
|
+
messages,
|
|
129
|
+
input,
|
|
130
|
+
handleInputChange,
|
|
131
|
+
handleSubmit,
|
|
132
|
+
status
|
|
133
|
+
} = useAgentChat({ agent });
|
|
134
|
+
|
|
135
|
+
return (
|
|
136
|
+
<div>
|
|
137
|
+
{messages.map((m) => (
|
|
138
|
+
<div key={m.id}>
|
|
139
|
+
<strong>{m.role}:</strong> {m.content}
|
|
140
|
+
</div>
|
|
141
|
+
))}
|
|
142
|
+
|
|
143
|
+
<form onSubmit={handleSubmit}>
|
|
144
|
+
<input
|
|
145
|
+
value={input}
|
|
146
|
+
onChange={handleInputChange}
|
|
147
|
+
disabled={status === "streaming"}
|
|
148
|
+
/>
|
|
149
|
+
<button type="submit">Send</button>
|
|
150
|
+
</form>
|
|
151
|
+
</div>
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Streaming RPC Methods
|
|
157
|
+
|
|
158
|
+
For non-chat streaming, use `@callable({ streaming: true })`:
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
import { Agent, callable, StreamingResponse } from "agents";
|
|
162
|
+
|
|
163
|
+
export class MyAgent extends Agent<Env> {
|
|
164
|
+
@callable({ streaming: true })
|
|
165
|
+
async streamData(stream: StreamingResponse, query: string) {
|
|
166
|
+
for (let i = 0; i < 10; i++) {
|
|
167
|
+
stream.send(`Result ${i}: ${query}`);
|
|
168
|
+
await sleep(100);
|
|
169
|
+
}
|
|
170
|
+
stream.close();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Client receives streamed messages via WebSocket RPC.
|
|
176
|
+
|
|
177
|
+
## Key Properties
|
|
178
|
+
|
|
179
|
+
| Property | Purpose |
|
|
180
|
+
|----------|---------|
|
|
181
|
+
| `this.messages` | All persisted messages |
|
|
182
|
+
| `maxPersistedMessages` | Limit stored messages (prune oldest) |
|
|
183
|
+
| `messageConcurrency` | `"queue"` (default), `"latest"`, `"merge"`, `"drop"` |
|
|
184
|
+
| `chatRecovery` | `"persist"` (default) or `"continue"` on reconnect |
|
|
185
|
+
| `waitForMcpConnections` | Wait for MCP servers before first turn |
|
|
186
|
+
|
|
187
|
+
## Status Values
|
|
188
|
+
|
|
189
|
+
`useAgentChat` status:
|
|
190
|
+
|
|
191
|
+
| Status | Meaning |
|
|
192
|
+
|--------|---------|
|
|
193
|
+
| `ready` | Idle, ready for input |
|
|
194
|
+
| `streaming` | Response streaming |
|
|
195
|
+
| `submitted` | Request sent, waiting |
|
|
196
|
+
| `error` | Error occurred |
|
|
197
|
+
|
|
198
|
+
Also: `isStreaming`, `isServerStreaming` for distinguishing user vs server-initiated streams.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Think (Experimental)
|
|
2
|
+
|
|
3
|
+
Fetch https://developers.cloudflare.com/agents/api-reference/think/ for complete documentation.
|
|
4
|
+
|
|
5
|
+
`@cloudflare/think` — a higher-level chat agent class that handles the `streamText` loop, tool execution, and message persistence for you. You provide `getModel()` and `getSystemPrompt()`; Think handles the rest.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @cloudflare/think
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Minimal Agent
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { Think } from "@cloudflare/think";
|
|
15
|
+
import { createWorkersAI } from "workers-ai-provider";
|
|
16
|
+
import { routeAgentRequest } from "agents";
|
|
17
|
+
|
|
18
|
+
export class MyAgent extends Think<Env> {
|
|
19
|
+
getModel() {
|
|
20
|
+
return createWorkersAI({ binding: this.env.AI })("@cf/meta/llama-4-scout-17b-16e-instruct");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
getSystemPrompt() {
|
|
24
|
+
return "You are a helpful assistant.";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export default {
|
|
29
|
+
fetch: (req, env) => routeAgentRequest(req, env)
|
|
30
|
+
};
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Wrangler Config
|
|
34
|
+
|
|
35
|
+
```jsonc
|
|
36
|
+
{
|
|
37
|
+
"compatibility_flags": ["nodejs_compat", "experimental"],
|
|
38
|
+
"durable_objects": {
|
|
39
|
+
"bindings": [{ "name": "MyAgent", "class_name": "MyAgent" }]
|
|
40
|
+
},
|
|
41
|
+
"migrations": [{ "tag": "v1", "new_sqlite_classes": ["MyAgent"] }],
|
|
42
|
+
"ai": { "binding": "AI" }
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Note:** Think requires the `experimental` compatibility flag.
|
|
47
|
+
|
|
48
|
+
## Custom Tools
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import { tool } from "ai";
|
|
52
|
+
import { z } from "zod";
|
|
53
|
+
|
|
54
|
+
export class MyAgent extends Think<Env> {
|
|
55
|
+
getTools() {
|
|
56
|
+
return {
|
|
57
|
+
getWeather: tool({
|
|
58
|
+
description: "Get weather",
|
|
59
|
+
parameters: z.object({ city: z.string() }),
|
|
60
|
+
execute: async ({ city }) => `72°F in ${city}`
|
|
61
|
+
})
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Lifecycle Hooks
|
|
68
|
+
|
|
69
|
+
| Hook | When | Use for |
|
|
70
|
+
|------|------|---------|
|
|
71
|
+
| `configureSession()` | Agent starts | Set up memory, context providers |
|
|
72
|
+
| `beforeTurn(ctx)` | Before each LLM call | Per-turn model/tools/system prompt; return `TurnConfig` |
|
|
73
|
+
| `onChunk(chunk)` | Each streaming chunk | Progress tracking |
|
|
74
|
+
| `onChatResponse(result)` | After LLM turn completes | Chaining, follow-up `saveMessages` |
|
|
75
|
+
| `onChatError(error)` | On LLM error | Error handling |
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
async beforeTurn(ctx: TurnContext): Promise<TurnConfig> {
|
|
79
|
+
if (ctx.continuation) {
|
|
80
|
+
return { model: cheaperModel };
|
|
81
|
+
}
|
|
82
|
+
return {};
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Sub-Agents
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
const child = this.subAgent(SpecialistAgent, "specialist-1");
|
|
90
|
+
await child.chat("Analyze this data...", (chunk) => {
|
|
91
|
+
// stream callback
|
|
92
|
+
});
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Client
|
|
96
|
+
|
|
97
|
+
Same React hooks as `AIChatAgent`:
|
|
98
|
+
|
|
99
|
+
```tsx
|
|
100
|
+
const agent = useAgent({ agent: "MyAgent", name: "session-1" });
|
|
101
|
+
const { messages, input, handleInputChange, handleSubmit } = useAgentChat({ agent });
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Think vs AIChatAgent
|
|
105
|
+
|
|
106
|
+
| | Think | AIChatAgent |
|
|
107
|
+
|-|-------|-------------|
|
|
108
|
+
| `streamText` loop | Built-in | You write it |
|
|
109
|
+
| Tool execution | Automatic | You wire it |
|
|
110
|
+
| Customization | Override hooks | Full control in `onChatMessage` |
|
|
111
|
+
| Built-in tools | Workspace, execute, browser | None |
|
|
112
|
+
| Compatibility flag | Requires `experimental` | Standard |
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Voice (Experimental)
|
|
2
|
+
|
|
3
|
+
Fetch https://developers.cloudflare.com/agents/api-reference/voice/ for complete documentation.
|
|
4
|
+
|
|
5
|
+
`@cloudflare/voice` — real-time speech-to-text and text-to-speech for agents. Audio streams over WebSocket.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @cloudflare/voice
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Server
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { Agent } from "agents";
|
|
15
|
+
import { withVoice, WorkersAITTS, WorkersAINova3STT } from "@cloudflare/voice";
|
|
16
|
+
|
|
17
|
+
export class VoiceAgent extends withVoice(Agent)<Env> {
|
|
18
|
+
transcriber = new WorkersAINova3STT(this);
|
|
19
|
+
tts = new WorkersAITTS(this);
|
|
20
|
+
|
|
21
|
+
async onTurn(transcript: string, context: VoiceTurnContext) {
|
|
22
|
+
const result = streamText({
|
|
23
|
+
model: createWorkersAI({ binding: this.env.AI })("@cf/meta/llama-4-scout-17b-16e-instruct"),
|
|
24
|
+
messages: [
|
|
25
|
+
{ role: "system", content: "You are a voice assistant." },
|
|
26
|
+
...context.conversationHistory,
|
|
27
|
+
{ role: "user", content: transcript }
|
|
28
|
+
]
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
for await (const chunk of result.textStream) {
|
|
32
|
+
if (context.signal.aborted) break;
|
|
33
|
+
context.speak(chunk);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Lifecycle Hooks
|
|
40
|
+
|
|
41
|
+
| Hook | Purpose |
|
|
42
|
+
|------|---------|
|
|
43
|
+
| `onTurn(transcript, ctx)` | Handle transcribed speech (required) |
|
|
44
|
+
| `beforeCallStart(conn)` | Auth/validation before call starts |
|
|
45
|
+
| `onCallStart(conn)` | Call connected |
|
|
46
|
+
| `onCallEnd(conn)` | Call disconnected |
|
|
47
|
+
| `onInterrupt()` | User interrupted agent speech |
|
|
48
|
+
|
|
49
|
+
## Client (React)
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import { useVoiceAgent } from "@cloudflare/voice/react";
|
|
53
|
+
|
|
54
|
+
function VoiceUI() {
|
|
55
|
+
const { isConnected, isSpeaking, connect, disconnect } = useVoiceAgent({
|
|
56
|
+
agent: "VoiceAgent",
|
|
57
|
+
name: "session-1"
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
return <button onClick={isConnected ? disconnect : connect}>
|
|
61
|
+
{isConnected ? "End Call" : "Start Call"}
|
|
62
|
+
</button>;
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## STT/TTS Providers
|
|
67
|
+
|
|
68
|
+
Workers AI (default), Deepgram, ElevenLabs — install the provider package and swap the `transcriber`/`tts` properties.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Webhooks & Push Notifications
|
|
2
|
+
|
|
3
|
+
## Webhooks
|
|
4
|
+
|
|
5
|
+
Fetch https://developers.cloudflare.com/agents/api-reference/webhooks/ for complete documentation.
|
|
6
|
+
|
|
7
|
+
Route external webhooks to agent instances via `onRequest`:
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
export default {
|
|
11
|
+
async fetch(req: Request, env: Env) {
|
|
12
|
+
const url = new URL(req.url);
|
|
13
|
+
if (url.pathname.startsWith("/webhooks/")) {
|
|
14
|
+
const entityId = url.pathname.split("/")[2];
|
|
15
|
+
const agent = getAgentByName(env.MyAgent, entityId);
|
|
16
|
+
return agent.fetch(req);
|
|
17
|
+
}
|
|
18
|
+
return routeAgentRequest(req, env);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
In the agent:
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
export class MyAgent extends Agent<Env, State> {
|
|
27
|
+
async onRequest(request: Request) {
|
|
28
|
+
const signature = request.headers.get("X-Signature");
|
|
29
|
+
if (!verifySignature(signature, await request.text(), this.env.WEBHOOK_SECRET)) {
|
|
30
|
+
return new Response("Unauthorized", { status: 401 });
|
|
31
|
+
}
|
|
32
|
+
const payload = JSON.parse(await request.text());
|
|
33
|
+
this.queue("processWebhook", payload);
|
|
34
|
+
return new Response("OK", { status: 202 });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Tips:** Respond quickly (200/202), verify signatures, deduplicate with stored event IDs, use `queue()` for async processing.
|
|
40
|
+
|
|
41
|
+
## Push Notifications
|
|
42
|
+
|
|
43
|
+
Fetch https://developers.cloudflare.com/agents/api-reference/push-notifications/ for complete documentation.
|
|
44
|
+
|
|
45
|
+
Web Push via VAPID from agents. Store subscriptions in agent state, send via `web-push`.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npm install web-push
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
import webpush from "web-push";
|
|
53
|
+
|
|
54
|
+
export class NotifyAgent extends Agent<Env, State> {
|
|
55
|
+
@callable()
|
|
56
|
+
async subscribe(subscription: PushSubscription) {
|
|
57
|
+
this.setState({
|
|
58
|
+
...this.state,
|
|
59
|
+
subscriptions: [...this.state.subscriptions, subscription]
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async sendReminder(payload: { message: string }, schedule: Schedule) {
|
|
64
|
+
for (const sub of this.state.subscriptions) {
|
|
65
|
+
try {
|
|
66
|
+
await webpush.sendNotification(sub, JSON.stringify({
|
|
67
|
+
title: "Reminder",
|
|
68
|
+
body: payload.message
|
|
69
|
+
}), {
|
|
70
|
+
vapidDetails: {
|
|
71
|
+
subject: "mailto:you@example.com",
|
|
72
|
+
publicKey: this.env.VAPID_PUBLIC_KEY,
|
|
73
|
+
privateKey: this.env.VAPID_PRIVATE_KEY
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
} catch (err) {
|
|
77
|
+
if (err.statusCode === 404 || err.statusCode === 410) {
|
|
78
|
+
// Remove expired subscription
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
VAPID keys: generate with `npx web-push generate-vapid-keys`, store as secrets.
|