opencodekit 0.15.4 → 0.15.6
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/dist/index.js +2 -2
- package/dist/template/.opencode/agent/explore.md +13 -12
- package/dist/template/.opencode/command/cloudflare.md +70 -0
- package/dist/template/.opencode/memory/observations/2026-01-19-learning-oh-my-opencode-slim-vs-opencodekit-templ.md +27 -0
- package/dist/template/.opencode/package.json +1 -1
- package/dist/template/.opencode/plugin/sessions.ts +38 -4
- package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
- package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
- package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
- package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
- package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
- package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
- package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
- package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
- package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
- package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
- package/dist/template/.opencode/tool/memory-read.ts +64 -44
- package/dist/template/.opencode/tool/memory-search.ts +9 -2
- package/dist/template/.opencode/tool/memory-update.ts +59 -47
- package/dist/template/.opencode/tool/observation.ts +16 -2
- package/package.json +1 -1
|
@@ -0,0 +1,682 @@
|
|
|
1
|
+
# Cloudflare Vectorize Skill
|
|
2
|
+
|
|
3
|
+
Expert guidance for Cloudflare Vectorize - globally distributed vector database for AI applications.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Vectorize is Cloudflare's vector database that enables building full-stack AI-powered applications with Workers. It stores and queries vector embeddings for semantic search, recommendations, classification, and anomaly detection.
|
|
8
|
+
|
|
9
|
+
**Key Features:**
|
|
10
|
+
- Globally distributed vector database
|
|
11
|
+
- Seamless integration with Workers AI
|
|
12
|
+
- Support for dimensions up to 1536 (32-bit float precision)
|
|
13
|
+
- Metadata filtering (up to 10 indexes per Vectorize index)
|
|
14
|
+
- Namespace support for index segmentation
|
|
15
|
+
- Three distance metrics: euclidean, cosine, dot-product
|
|
16
|
+
- Up to 5M vectors per index (V2)
|
|
17
|
+
|
|
18
|
+
**Status:** Generally Available (GA)
|
|
19
|
+
|
|
20
|
+
## Index Configuration
|
|
21
|
+
|
|
22
|
+
### Creating Indexes
|
|
23
|
+
|
|
24
|
+
Use `wrangler vectorize create` with required parameters:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Wrangler 3.71.0+ required for V2 indexes
|
|
28
|
+
npx wrangler@latest vectorize create <index-name> \
|
|
29
|
+
--dimensions=<number> \
|
|
30
|
+
--metric=<euclidean|cosine|dot-product>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**CRITICAL: Index configuration is immutable after creation. Cannot change dimensions or metric.**
|
|
34
|
+
|
|
35
|
+
#### Distance Metrics
|
|
36
|
+
|
|
37
|
+
| Metric | Best For | Score Interpretation |
|
|
38
|
+
|--------|----------|---------------------|
|
|
39
|
+
| `euclidean` | Absolute distance, spatial data | Lower = closer (0.0 = identical) |
|
|
40
|
+
| `cosine` | Text embeddings, semantic similarity | Higher = closer (1.0 = identical) |
|
|
41
|
+
| `dot-product` | Recommendation systems, normalized vectors | Higher = closer |
|
|
42
|
+
|
|
43
|
+
**Metric Selection:**
|
|
44
|
+
- Text/semantic search: `cosine` (most common)
|
|
45
|
+
- Image similarity: `euclidean`
|
|
46
|
+
- Pre-normalized vectors: `dot-product`
|
|
47
|
+
|
|
48
|
+
#### Naming Conventions
|
|
49
|
+
|
|
50
|
+
Index names must:
|
|
51
|
+
- Be lowercase and/or numeric ASCII
|
|
52
|
+
- Start with a letter
|
|
53
|
+
- Use dashes (-) instead of spaces
|
|
54
|
+
- Be < 32 characters
|
|
55
|
+
- Be descriptive: `production-doc-search`, `dev-recommendation-engine`
|
|
56
|
+
|
|
57
|
+
### Metadata Indexes
|
|
58
|
+
|
|
59
|
+
Enable filtering on metadata properties (up to 10 per index):
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# Create metadata index BEFORE inserting vectors
|
|
63
|
+
npx wrangler vectorize create-metadata-index <index-name> \
|
|
64
|
+
--property-name=<field-name> \
|
|
65
|
+
--type=<string|number|boolean>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Important:**
|
|
69
|
+
- Create metadata indexes BEFORE inserting vectors
|
|
70
|
+
- Existing vectors won't be indexed retroactively (must re-upsert)
|
|
71
|
+
- String fields: first 64 bytes indexed (UTF-8 boundary)
|
|
72
|
+
- Number fields: float64 precision
|
|
73
|
+
- Max 10 metadata indexes per Vectorize index
|
|
74
|
+
|
|
75
|
+
**Cardinality Considerations:**
|
|
76
|
+
- **High cardinality** (UUIDs, millisecond timestamps): Good for `$eq`, poor for range queries
|
|
77
|
+
- **Low cardinality** (enum values, status): Good for filters, less selective
|
|
78
|
+
- **Best practice**: Bucket high-cardinality data (e.g., round timestamps to 5-min windows)
|
|
79
|
+
|
|
80
|
+
### Management Commands
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# List metadata indexes
|
|
84
|
+
npx wrangler vectorize list-metadata-index <index-name>
|
|
85
|
+
|
|
86
|
+
# Delete metadata index
|
|
87
|
+
npx wrangler vectorize delete-metadata-index <index-name> --property-name=<field>
|
|
88
|
+
|
|
89
|
+
# Get index info (vector count, processed mutations)
|
|
90
|
+
npx wrangler vectorize info <index-name>
|
|
91
|
+
|
|
92
|
+
# List vector IDs (paginated, 1-1000 per page)
|
|
93
|
+
npx wrangler vectorize list-vectors <index-name> \
|
|
94
|
+
--count=100 \
|
|
95
|
+
--cursor=<pagination-cursor>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Worker Binding
|
|
99
|
+
|
|
100
|
+
### Configuration
|
|
101
|
+
|
|
102
|
+
**wrangler.jsonc:**
|
|
103
|
+
```jsonc
|
|
104
|
+
{
|
|
105
|
+
"$schema": "./node_modules/wrangler/config-schema.json",
|
|
106
|
+
"vectorize": [
|
|
107
|
+
{
|
|
108
|
+
"binding": "VECTORIZE",
|
|
109
|
+
"index_name": "production-index"
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**wrangler.toml:**
|
|
116
|
+
```toml
|
|
117
|
+
[[vectorize]]
|
|
118
|
+
binding = "VECTORIZE" # Available as env.VECTORIZE
|
|
119
|
+
index_name = "production-index"
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### TypeScript Types
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
export interface Env {
|
|
126
|
+
VECTORIZE: Vectorize;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Generate types after config changes
|
|
130
|
+
// npx wrangler types
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Vector Operations
|
|
134
|
+
|
|
135
|
+
### Vector Format
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
interface VectorizeVector {
|
|
139
|
+
id: string; // Unique identifier (max 64 bytes)
|
|
140
|
+
values: number[] | Float32Array | Float64Array; // Match index dimensions
|
|
141
|
+
namespace?: string; // Optional partition key (max 64 bytes)
|
|
142
|
+
metadata?: Record<string, string | number | boolean | null>; // Max 10 KiB
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Vector Values:**
|
|
147
|
+
- Array of numbers, Float32Array, or Float64Array
|
|
148
|
+
- Must match index dimensions exactly
|
|
149
|
+
- Stored as Float32 (Float64 converted on insert)
|
|
150
|
+
- Dense arrays only (no sparse vectors)
|
|
151
|
+
|
|
152
|
+
### Insert vs Upsert
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
// INSERT: Ignore duplicates (keeps first)
|
|
156
|
+
const inserted = await env.VECTORIZE.insert([
|
|
157
|
+
{
|
|
158
|
+
id: "1",
|
|
159
|
+
values: [0.12, 0.45, 0.67, ...],
|
|
160
|
+
metadata: { url: "/products/sku/123", category: "electronics" }
|
|
161
|
+
}
|
|
162
|
+
]);
|
|
163
|
+
|
|
164
|
+
// UPSERT: Overwrite existing (keeps last)
|
|
165
|
+
const upserted = await env.VECTORIZE.upsert([
|
|
166
|
+
{
|
|
167
|
+
id: "1",
|
|
168
|
+
values: [0.15, 0.48, 0.70, ...],
|
|
169
|
+
metadata: { url: "/products/sku/123", category: "electronics", updated: true }
|
|
170
|
+
}
|
|
171
|
+
]);
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Key Differences:**
|
|
175
|
+
- `insert()`: Duplicate IDs ignored, first insert wins
|
|
176
|
+
- `upsert()`: Overwrites completely (no merge), last upsert wins
|
|
177
|
+
- Both return `{ mutationId: string }`
|
|
178
|
+
- Asynchronous: Takes a few seconds to be queryable
|
|
179
|
+
|
|
180
|
+
**Batch Limits:**
|
|
181
|
+
- Workers: 1000 vectors per batch
|
|
182
|
+
- HTTP API: 5000 vectors per batch
|
|
183
|
+
- File upload: 100 MB max
|
|
184
|
+
|
|
185
|
+
### Querying
|
|
186
|
+
|
|
187
|
+
#### Basic Query
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
// Query vector: must match index dimensions
|
|
191
|
+
const queryVector: number[] = [0.13, 0.25, 0.44, ...];
|
|
192
|
+
|
|
193
|
+
const matches = await env.VECTORIZE.query(queryVector, {
|
|
194
|
+
topK: 5, // Default: 5, Max: 100 (or 20 with values/metadata)
|
|
195
|
+
returnValues: false, // Default: false
|
|
196
|
+
returnMetadata: "none", // "none" | "indexed" | "all"
|
|
197
|
+
namespace?: "user-123", // Optional namespace filter
|
|
198
|
+
filter?: { category: "electronics" } // Optional metadata filter
|
|
199
|
+
});
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Response:**
|
|
203
|
+
```typescript
|
|
204
|
+
interface VectorizeMatches {
|
|
205
|
+
count: number;
|
|
206
|
+
matches: Array<{
|
|
207
|
+
id: string;
|
|
208
|
+
score: number; // Distance score (interpretation depends on metric)
|
|
209
|
+
values?: number[]; // If returnValues: true
|
|
210
|
+
metadata?: Record<string, any>; // If returnMetadata != "none"
|
|
211
|
+
}>;
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
#### Query by ID
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
// Query using existing vector in index
|
|
219
|
+
const matches = await env.VECTORIZE.queryById("some-vector-id", {
|
|
220
|
+
topK: 5,
|
|
221
|
+
returnValues: true,
|
|
222
|
+
returnMetadata: "all"
|
|
223
|
+
});
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
#### Get Vectors by ID
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
// Retrieve specific vectors with values and metadata
|
|
230
|
+
const ids = ["11", "22", "33"];
|
|
231
|
+
const vectors = await env.VECTORIZE.getByIds(ids);
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Metadata Filtering
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
// Implicit $eq
|
|
238
|
+
const matches = await env.VECTORIZE.query(queryVector, {
|
|
239
|
+
topK: 10,
|
|
240
|
+
filter: { category: "electronics" }
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
// Explicit operators
|
|
244
|
+
const matches = await env.VECTORIZE.query(queryVector, {
|
|
245
|
+
filter: {
|
|
246
|
+
category: { $ne: "deprecated" },
|
|
247
|
+
price: { $gte: 10, $lt: 100 },
|
|
248
|
+
tags: { $in: ["featured", "sale"] },
|
|
249
|
+
discontinued: { $ne: true }
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// Nested metadata with dot notation
|
|
254
|
+
const matches = await env.VECTORIZE.query(queryVector, {
|
|
255
|
+
filter: { "product.brand": "acme" }
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
// Range query for prefix search (strings)
|
|
259
|
+
const matches = await env.VECTORIZE.query(queryVector, {
|
|
260
|
+
filter: {
|
|
261
|
+
category: { $gte: "elec", $lt: "eled" } // Matches "electronics"
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
**Operators:**
|
|
267
|
+
- `$eq`: Equals (implicit if no operator)
|
|
268
|
+
- `$ne`: Not equals
|
|
269
|
+
- `$in`: In array
|
|
270
|
+
- `$nin`: Not in array
|
|
271
|
+
- `$lt`, `$lte`: Less than (or equal)
|
|
272
|
+
- `$gt`, `$gte`: Greater than (or equal)
|
|
273
|
+
|
|
274
|
+
**Filter Constraints:**
|
|
275
|
+
- Max 2048 bytes (compact JSON)
|
|
276
|
+
- Keys: no empty, no dots, no `$` prefix, no double-quotes, max 512 chars
|
|
277
|
+
- Values: string, number, boolean, null
|
|
278
|
+
- Range queries: Can combine upper/lower bounds on same field
|
|
279
|
+
- Namespaces filtered before metadata
|
|
280
|
+
|
|
281
|
+
### Deletion
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
// Delete by IDs (asynchronous)
|
|
285
|
+
const deleted = await env.VECTORIZE.deleteByIds(["11", "22", "33"]);
|
|
286
|
+
// Returns: { mutationId: string }
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Index Inspection
|
|
290
|
+
|
|
291
|
+
```typescript
|
|
292
|
+
// Get index configuration
|
|
293
|
+
const details = await env.VECTORIZE.describe();
|
|
294
|
+
// Returns: { dimensions: number, metric: string, vectorCount?: number }
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Namespaces
|
|
298
|
+
|
|
299
|
+
Partition vectors within a single index by customer, tenant, or category.
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
// Insert with namespace
|
|
303
|
+
await env.VECTORIZE.insert([
|
|
304
|
+
{ id: "1", values: [...], namespace: "customer-abc" },
|
|
305
|
+
{ id: "2", values: [...], namespace: "customer-xyz" }
|
|
306
|
+
]);
|
|
307
|
+
|
|
308
|
+
// Query within namespace (applied before vector search)
|
|
309
|
+
const matches = await env.VECTORIZE.query(queryVector, {
|
|
310
|
+
namespace: "customer-abc"
|
|
311
|
+
});
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**Limits:**
|
|
315
|
+
- 50,000 namespaces (Paid) / 1,000 (Free)
|
|
316
|
+
- Max 64 bytes per namespace name
|
|
317
|
+
- Namespace filter applied before metadata filters
|
|
318
|
+
|
|
319
|
+
## Integration Patterns
|
|
320
|
+
|
|
321
|
+
### Workers AI Integration
|
|
322
|
+
|
|
323
|
+
```typescript
|
|
324
|
+
import { Ai } from '@cloudflare/ai';
|
|
325
|
+
|
|
326
|
+
export default {
|
|
327
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
328
|
+
const ai = new Ai(env.AI);
|
|
329
|
+
|
|
330
|
+
// Generate embedding
|
|
331
|
+
const userQuery = "what is a vector database";
|
|
332
|
+
const embeddings = await ai.run("@cf/baai/bge-base-en-v1.5", {
|
|
333
|
+
text: [userQuery]
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
// embeddings.data is number[][]
|
|
337
|
+
// Pass embeddings.data[0], NOT embeddings or embeddings.data
|
|
338
|
+
const matches = await env.VECTORIZE.query(embeddings.data[0], {
|
|
339
|
+
topK: 3,
|
|
340
|
+
returnMetadata: "all"
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
return Response.json({ matches });
|
|
344
|
+
}
|
|
345
|
+
};
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
**Common Embedding Models:**
|
|
349
|
+
- `@cf/baai/bge-base-en-v1.5`: 768 dimensions, English
|
|
350
|
+
- `@cf/baai/bge-large-en-v1.5`: 1024 dimensions, English
|
|
351
|
+
- `@cf/baai/bge-small-en-v1.5`: 384 dimensions, English
|
|
352
|
+
|
|
353
|
+
### OpenAI Integration
|
|
354
|
+
|
|
355
|
+
```typescript
|
|
356
|
+
import OpenAI from 'openai';
|
|
357
|
+
|
|
358
|
+
export default {
|
|
359
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
360
|
+
const openai = new OpenAI({ apiKey: env.OPENAI_KEY });
|
|
361
|
+
|
|
362
|
+
const userQuery = "semantic search query";
|
|
363
|
+
const response = await openai.embeddings.create({
|
|
364
|
+
model: "text-embedding-ada-002",
|
|
365
|
+
input: userQuery
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
// Pass response.data[0].embedding, NOT response
|
|
369
|
+
const matches = await env.VECTORIZE.query(response.data[0].embedding, {
|
|
370
|
+
topK: 5,
|
|
371
|
+
returnMetadata: "all"
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
return Response.json({ matches });
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
### RAG Pattern
|
|
380
|
+
|
|
381
|
+
```typescript
|
|
382
|
+
export default {
|
|
383
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
384
|
+
const { query } = await request.json();
|
|
385
|
+
|
|
386
|
+
// 1. Generate query embedding
|
|
387
|
+
const embeddings = await env.AI.run("@cf/baai/bge-base-en-v1.5", {
|
|
388
|
+
text: [query]
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
// 2. Search Vectorize
|
|
392
|
+
const matches = await env.VECTORIZE.query(embeddings.data[0], {
|
|
393
|
+
topK: 5,
|
|
394
|
+
returnMetadata: "all"
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
// 3. Fetch full documents from R2/D1/KV
|
|
398
|
+
const documents = await Promise.all(
|
|
399
|
+
matches.matches.map(async (match) => {
|
|
400
|
+
const key = match.metadata?.r2_key as string;
|
|
401
|
+
const obj = await env.R2_BUCKET.get(key);
|
|
402
|
+
return obj?.text();
|
|
403
|
+
})
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
// 4. Build context for LLM
|
|
407
|
+
const context = documents.filter(Boolean).join("\n\n");
|
|
408
|
+
|
|
409
|
+
// 5. Generate response with context
|
|
410
|
+
const llmResponse = await env.AI.run("@cf/meta/llama-3-8b-instruct", {
|
|
411
|
+
prompt: `Context: ${context}\n\nQuestion: ${query}\n\nAnswer:`
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
return Response.json({ answer: llmResponse, sources: matches.matches });
|
|
415
|
+
}
|
|
416
|
+
};
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
## CLI Operations
|
|
420
|
+
|
|
421
|
+
### Bulk Upload (NDJSON)
|
|
422
|
+
|
|
423
|
+
```bash
|
|
424
|
+
# File: embeddings.ndjson
|
|
425
|
+
# { "id": "1", "values": [0.1, 0.2, ...], "metadata": {"url": "/doc/1"}}
|
|
426
|
+
# { "id": "2", "values": [0.3, 0.4, ...], "metadata": {"url": "/doc/2"}}
|
|
427
|
+
|
|
428
|
+
npx wrangler vectorize insert <index-name> --file=embeddings.ndjson
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
**Rate Limits:**
|
|
432
|
+
- Max 5000 vectors per file (Cloudflare API rate limit)
|
|
433
|
+
- Use multiple files for larger batches
|
|
434
|
+
|
|
435
|
+
### Python HTTP API Example
|
|
436
|
+
|
|
437
|
+
```python
|
|
438
|
+
import requests
|
|
439
|
+
|
|
440
|
+
url = f"https://api.cloudflare.com/client/v4/accounts/{account_id}/vectorize/v2/indexes/{index_name}/insert"
|
|
441
|
+
headers = {"Authorization": f"Bearer {api_token}"}
|
|
442
|
+
|
|
443
|
+
with open('embeddings.ndjson', 'rb') as f:
|
|
444
|
+
resp = requests.post(url, headers=headers, files=dict(vectors=f))
|
|
445
|
+
print(resp.json())
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
## Performance Optimization
|
|
449
|
+
|
|
450
|
+
### Write Throughput
|
|
451
|
+
|
|
452
|
+
**Batching Strategy:**
|
|
453
|
+
- Vectorize batches up to 200K vectors OR 1000 operations per job
|
|
454
|
+
- Inserting 1 vector at a time = 1000 vectors per job = slow
|
|
455
|
+
- Inserting 2500 vectors at a time = 200K+ vectors per job = fast
|
|
456
|
+
|
|
457
|
+
**Example:**
|
|
458
|
+
```typescript
|
|
459
|
+
// BAD: 250,000 individual inserts = 250 jobs = ~1 hour
|
|
460
|
+
for (const vector of vectors) {
|
|
461
|
+
await env.VECTORIZE.insert([vector]);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// GOOD: 100 batches of 2,500 = 2-3 jobs = minutes
|
|
465
|
+
for (let i = 0; i < vectors.length; i += 2500) {
|
|
466
|
+
const batch = vectors.slice(i, i + 2500);
|
|
467
|
+
await env.VECTORIZE.insert(batch);
|
|
468
|
+
}
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
### Query Performance
|
|
472
|
+
|
|
473
|
+
**High-Precision vs. Approximate:**
|
|
474
|
+
- Default: Approximate scoring (faster, good trade-off)
|
|
475
|
+
- `returnValues: true`: High-precision scoring (slower, more accurate)
|
|
476
|
+
|
|
477
|
+
**topK Limits:**
|
|
478
|
+
- Default limit: 100 without values/metadata
|
|
479
|
+
- With `returnValues: true` or `returnMetadata: "all"`: Max 20
|
|
480
|
+
- Balance accuracy vs. latency
|
|
481
|
+
|
|
482
|
+
**Metadata Filter Performance:**
|
|
483
|
+
- Namespace filters applied first (fastest)
|
|
484
|
+
- High-cardinality range queries degrade performance
|
|
485
|
+
- Bucket high-cardinality values when possible
|
|
486
|
+
|
|
487
|
+
### Mutation Tracking
|
|
488
|
+
|
|
489
|
+
```bash
|
|
490
|
+
# Check if mutations are processed
|
|
491
|
+
npx wrangler vectorize info <index-name>
|
|
492
|
+
|
|
493
|
+
# Returns processedUpToMutation and processedUpToDatetime
|
|
494
|
+
# Compare with insert/upsert mutationId
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
## Limits (V2)
|
|
498
|
+
|
|
499
|
+
| Resource | Limit |
|
|
500
|
+
|----------|-------|
|
|
501
|
+
| Indexes per account | 50,000 (Paid) / 100 (Free) |
|
|
502
|
+
| Max dimensions | 1536 (32-bit float) |
|
|
503
|
+
| Max vector ID length | 64 bytes |
|
|
504
|
+
| Metadata per vector | 10 KiB |
|
|
505
|
+
| Max topK (no values/metadata) | 100 |
|
|
506
|
+
| Max topK (with values/metadata) | 20 |
|
|
507
|
+
| Insert batch size (Workers) | 1000 |
|
|
508
|
+
| Insert batch size (HTTP API) | 5000 |
|
|
509
|
+
| List vectors page size | 1000 |
|
|
510
|
+
| Max index name length | 64 bytes |
|
|
511
|
+
| Max vectors per index | 5,000,000 |
|
|
512
|
+
| Max namespaces | 50,000 (Paid) / 1000 (Free) |
|
|
513
|
+
| Max namespace length | 64 bytes |
|
|
514
|
+
| Max upload size | 100 MB |
|
|
515
|
+
| Max metadata indexes | 10 |
|
|
516
|
+
| Indexed metadata per field | 64 bytes (strings, UTF-8) |
|
|
517
|
+
|
|
518
|
+
## Common Patterns
|
|
519
|
+
|
|
520
|
+
### Multi-Tenant Architecture
|
|
521
|
+
|
|
522
|
+
```typescript
|
|
523
|
+
// Option 1: Separate indexes per tenant (if < 50K tenants)
|
|
524
|
+
const tenantIndex = env[`VECTORIZE_${tenantId.toUpperCase()}`];
|
|
525
|
+
|
|
526
|
+
// Option 2: Namespaces (up to 50K namespaces)
|
|
527
|
+
await env.VECTORIZE.insert([
|
|
528
|
+
{ id: "doc-1", values: [...], namespace: `tenant-${tenantId}` }
|
|
529
|
+
]);
|
|
530
|
+
|
|
531
|
+
const matches = await env.VECTORIZE.query(queryVector, {
|
|
532
|
+
namespace: `tenant-${tenantId}`
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
// Option 3: Metadata filtering (flexible but slower)
|
|
536
|
+
const matches = await env.VECTORIZE.query(queryVector, {
|
|
537
|
+
filter: { tenantId: tenantId }
|
|
538
|
+
});
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
### Semantic Search with Metadata
|
|
542
|
+
|
|
543
|
+
```typescript
|
|
544
|
+
// Index documents with rich metadata
|
|
545
|
+
await env.VECTORIZE.upsert([
|
|
546
|
+
{
|
|
547
|
+
id: doc.id,
|
|
548
|
+
values: embedding,
|
|
549
|
+
metadata: {
|
|
550
|
+
title: doc.title,
|
|
551
|
+
category: doc.category,
|
|
552
|
+
published: Math.floor(doc.date / 1000), // Unix timestamp
|
|
553
|
+
tags: doc.tags.join(","),
|
|
554
|
+
url: doc.url
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
]);
|
|
558
|
+
|
|
559
|
+
// Search with filters
|
|
560
|
+
const matches = await env.VECTORIZE.query(queryVector, {
|
|
561
|
+
topK: 10,
|
|
562
|
+
returnMetadata: "all",
|
|
563
|
+
filter: {
|
|
564
|
+
category: "tutorials",
|
|
565
|
+
published: { $gte: thirtyDaysAgo }
|
|
566
|
+
}
|
|
567
|
+
});
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
### Hybrid Search (Vector + Metadata)
|
|
571
|
+
|
|
572
|
+
```typescript
|
|
573
|
+
// 1. Create metadata indexes for common filters
|
|
574
|
+
// wrangler vectorize create-metadata-index my-index --property-name=category --type=string
|
|
575
|
+
// wrangler vectorize create-metadata-index my-index --property-name=published --type=number
|
|
576
|
+
|
|
577
|
+
// 2. Query with both semantic similarity and filters
|
|
578
|
+
const results = await env.VECTORIZE.query(queryVector, {
|
|
579
|
+
topK: 20,
|
|
580
|
+
returnMetadata: "all",
|
|
581
|
+
filter: {
|
|
582
|
+
category: { $in: ["tech", "science"] },
|
|
583
|
+
published: { $gte: lastMonth },
|
|
584
|
+
status: "published"
|
|
585
|
+
}
|
|
586
|
+
});
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
## Error Handling
|
|
590
|
+
|
|
591
|
+
```typescript
|
|
592
|
+
try {
|
|
593
|
+
const matches = await env.VECTORIZE.query(queryVector, { topK: 5 });
|
|
594
|
+
} catch (error) {
|
|
595
|
+
// Common errors:
|
|
596
|
+
// - Dimension mismatch
|
|
597
|
+
// - Invalid filter syntax
|
|
598
|
+
// - topK exceeds limits
|
|
599
|
+
// - Index not found/not bound
|
|
600
|
+
console.error("Vectorize query failed:", error);
|
|
601
|
+
|
|
602
|
+
// Fallback strategy
|
|
603
|
+
return Response.json({
|
|
604
|
+
error: "Search unavailable",
|
|
605
|
+
matches: []
|
|
606
|
+
}, { status: 503 });
|
|
607
|
+
}
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
## Best Practices
|
|
611
|
+
|
|
612
|
+
1. **Create metadata indexes BEFORE inserting vectors** - existing vectors not retroactively indexed
|
|
613
|
+
2. **Use upsert for updates** - insert ignores duplicates
|
|
614
|
+
3. **Batch operations** - 1000-2500 vectors per batch for optimal throughput
|
|
615
|
+
4. **Monitor mutations** - Use `wrangler vectorize info` to track processing
|
|
616
|
+
5. **Choose appropriate metric** - cosine for text, euclidean for images
|
|
617
|
+
6. **Design for cardinality** - Bucket high-cardinality metadata for better range queries
|
|
618
|
+
7. **Namespace for tenant isolation** - Faster than metadata filters
|
|
619
|
+
8. **Return metadata strategically** - Use "indexed" for speed, "all" when needed
|
|
620
|
+
9. **Validate dimensions** - Must match index configuration exactly
|
|
621
|
+
10. **Handle async operations** - Inserts/upserts take seconds to be queryable
|
|
622
|
+
|
|
623
|
+
## Common Mistakes
|
|
624
|
+
|
|
625
|
+
1. **Passing wrong data shape to query():**
|
|
626
|
+
- Workers AI: Pass `embeddings.data[0]`, not `embeddings`
|
|
627
|
+
- OpenAI: Pass `response.data[0].embedding`, not `response`
|
|
628
|
+
|
|
629
|
+
2. **Creating metadata indexes after inserting vectors** - Won't index existing vectors
|
|
630
|
+
|
|
631
|
+
3. **Using insert when upsert is needed** - Duplicates ignored with insert
|
|
632
|
+
|
|
633
|
+
4. **Not batching operations** - 1 vector per request is extremely slow
|
|
634
|
+
|
|
635
|
+
5. **Returning all values/metadata by default** - Impacts performance and topK limit
|
|
636
|
+
|
|
637
|
+
6. **High-cardinality range queries** - Use bucketing or discrete values
|
|
638
|
+
|
|
639
|
+
7. **Exceeding topK limits** - 20 with values/metadata, 100 without
|
|
640
|
+
|
|
641
|
+
8. **Forgetting to run wrangler types** - Missing TypeScript types after config changes
|
|
642
|
+
|
|
643
|
+
## Troubleshooting
|
|
644
|
+
|
|
645
|
+
### Vectors not appearing in queries
|
|
646
|
+
|
|
647
|
+
- Check mutation processed: `wrangler vectorize info <index>`
|
|
648
|
+
- Wait 5-10 seconds after insert/upsert
|
|
649
|
+
- Verify mutationId matches processedUpToMutation
|
|
650
|
+
|
|
651
|
+
### Dimension mismatch errors
|
|
652
|
+
|
|
653
|
+
- Ensure query vector length matches index dimensions exactly
|
|
654
|
+
- Check embedding model output dimensions
|
|
655
|
+
|
|
656
|
+
### Filter not working
|
|
657
|
+
|
|
658
|
+
- Verify metadata index created: `wrangler vectorize list-metadata-index <index>`
|
|
659
|
+
- Re-upsert vectors after creating metadata index
|
|
660
|
+
- Check filter syntax and operator constraints
|
|
661
|
+
|
|
662
|
+
### Performance issues
|
|
663
|
+
|
|
664
|
+
- Reduce topK if using returnValues or returnMetadata="all"
|
|
665
|
+
- Simplify metadata filters (avoid high-cardinality ranges)
|
|
666
|
+
- Use namespace filtering instead of metadata when possible
|
|
667
|
+
- Batch insert/upsert operations properly
|
|
668
|
+
|
|
669
|
+
## Resources
|
|
670
|
+
|
|
671
|
+
- [Official Docs](https://developers.cloudflare.com/vectorize/)
|
|
672
|
+
- [Client API Reference](https://developers.cloudflare.com/vectorize/reference/client-api/)
|
|
673
|
+
- [Metadata Filtering](https://developers.cloudflare.com/vectorize/reference/metadata-filtering/)
|
|
674
|
+
- [Limits](https://developers.cloudflare.com/vectorize/platform/limits/)
|
|
675
|
+
- [Workers AI Models](https://developers.cloudflare.com/workers-ai/models/#text-embeddings)
|
|
676
|
+
- [Wrangler Commands](https://developers.cloudflare.com/workers/wrangler/commands/#vectorize)
|
|
677
|
+
- [Discord: #vectorize](https://discord.cloudflare.com)
|
|
678
|
+
|
|
679
|
+
---
|
|
680
|
+
|
|
681
|
+
**Version:** V2 (GA) - Requires Wrangler 3.71.0+
|
|
682
|
+
**Last Updated:** 2025-01-11
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Cloudflare WAF Expert Skill Reference
|
|
2
|
+
|
|
3
|
+
**Expertise**: Cloudflare Web Application Firewall (WAF) configuration, custom rules, managed rulesets, rate limiting, attack detection, and API integration...
|
|
4
|
+
|
|
5
|
+
## In This Reference
|
|
6
|
+
|
|
7
|
+
- **[configuration.md](./configuration.md)** - Setup, deployment, configuration
|
|
8
|
+
- **[api.md](./api.md)** - API endpoints, methods, interfaces
|
|
9
|
+
- **[patterns.md](./patterns.md)** - Common patterns, use cases, examples
|
|
10
|
+
- **[gotchas.md](./gotchas.md)** - Troubleshooting, best practices, limitations
|
|
11
|
+
|
|
12
|
+
## See Also
|
|
13
|
+
|
|
14
|
+
- [Cloudflare Docs](https://developers.cloudflare.com/)
|