@luanpdd/kit-mcp 1.33.0 → 1.34.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 +21 -21
- package/README.md +168 -168
- package/gates/agent-no-recursive-dispatch.md +84 -84
- package/kit/COMANDOS.md +138 -138
- package/kit/COMPATIBILITY.md +70 -70
- package/kit/README.md +76 -76
- package/kit/agents/advisor-researcher.md +109 -109
- package/kit/agents/ai-mutation-tester.md +289 -289
- package/kit/agents/assumptions-analyzer.md +110 -110
- package/kit/agents/audit-log-implementer.md +314 -314
- package/kit/agents/auditor-consistencia-isolamento.md +414 -414
- package/kit/agents/b2b-saas-architect.md +157 -157
- package/kit/agents/burn-rate-forecaster.md +153 -153
- package/kit/agents/cascading-failures-auditor.md +299 -299
- package/kit/agents/codebase-mapper.md +769 -769
- package/kit/agents/crm-pipeline-implementer.md +257 -257
- package/kit/agents/debugger.md +814 -814
- package/kit/agents/designer-ui.md +216 -216
- package/kit/agents/detector-tenant-quente.md +338 -338
- package/kit/agents/evolution-go-integrator.md +201 -201
- package/kit/agents/example-reviewer.md +22 -22
- package/kit/agents/executor.md +565 -565
- package/kit/agents/golden-signals-instrumenter.md +232 -232
- package/kit/agents/incident-investigator.md +238 -238
- package/kit/agents/integration-checker.md +203 -203
- package/kit/agents/invite-flow-implementer.md +190 -190
- package/kit/agents/legacy-characterizer.md +369 -369
- package/kit/agents/lgpd-compliance-auditor.md +296 -296
- package/kit/agents/load-shedding-instrumenter.md +290 -290
- package/kit/agents/multi-tenant-isolation-auditor.md +254 -254
- package/kit/agents/multi-tenant-rls-writer.md +341 -341
- package/kit/agents/nyquist-auditor.md +181 -181
- package/kit/agents/observability-coverage-auditor.md +316 -316
- package/kit/agents/observability-instrumenter.md +191 -191
- package/kit/agents/omm-auditor.md +291 -291
- package/kit/agents/org-onboarding-implementer.md +224 -224
- package/kit/agents/payload-capture-instrumenter.md +274 -274
- package/kit/agents/phase-researcher.md +697 -697
- package/kit/agents/plan-checker.md +275 -275
- package/kit/agents/planner.md +923 -923
- package/kit/agents/postmortem-writer.md +273 -273
- package/kit/agents/project-researcher.md +653 -653
- package/kit/agents/prr-conductor.md +287 -287
- package/kit/agents/refactor-safety-auditor.md +405 -405
- package/kit/agents/release-pipeline-auditor.md +364 -364
- package/kit/agents/research-synthesizer.md +246 -246
- package/kit/agents/roadmapper.md +678 -678
- package/kit/agents/schema-checker.md +160 -160
- package/kit/agents/seam-finder.md +360 -360
- package/kit/agents/shotgun-surgery-detector.md +350 -350
- package/kit/agents/slo-engineer.md +217 -217
- package/kit/agents/storytelling-analyst.md +300 -300
- package/kit/agents/supabase-architect.md +249 -249
- package/kit/agents/supabase-auth-bootstrapper.md +400 -400
- package/kit/agents/supabase-auth-hook-writer.md +418 -418
- package/kit/agents/supabase-branching-architect.md +563 -563
- package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -778
- package/kit/agents/supabase-column-privileges-writer.md +400 -400
- package/kit/agents/supabase-edge-fn-tester.md +288 -288
- package/kit/agents/supabase-edge-fn-writer.md +341 -341
- package/kit/agents/supabase-mfa-implementer.md +439 -439
- package/kit/agents/supabase-migration-writer.md +386 -386
- package/kit/agents/supabase-oauth-server-implementer.md +507 -507
- package/kit/agents/supabase-rbac-implementer.md +393 -393
- package/kit/agents/supabase-realtime-implementer.md +364 -364
- package/kit/agents/supabase-rls-hardener.md +522 -522
- package/kit/agents/supabase-rls-writer.md +324 -324
- package/kit/agents/supabase-roles-implementer.md +356 -356
- package/kit/agents/supabase-social-auth-implementer.md +451 -451
- package/kit/agents/supabase-sso-saml-architect.md +549 -549
- package/kit/agents/supabase-storage-implementer.md +407 -407
- package/kit/agents/super-admin-implementer.md +282 -282
- package/kit/agents/toil-auditor.md +268 -268
- package/kit/agents/ui-auditor.md +438 -438
- package/kit/agents/ui-checker.md +305 -305
- package/kit/agents/ui-researcher.md +356 -356
- package/kit/agents/user-profiler.md +176 -176
- package/kit/agents/validador-evolucao-schema.md +336 -336
- package/kit/agents/verifier.md +729 -729
- package/kit/commands/adicionar-backlog.md +75 -75
- package/kit/commands/adicionar-fase.md +42 -42
- package/kit/commands/adicionar-tarefa.md +45 -45
- package/kit/commands/adicionar-testes.md +41 -41
- package/kit/commands/ajuda.md +21 -21
- package/kit/commands/atualizar.md +37 -37
- package/kit/commands/auditar-cascading.md +111 -111
- package/kit/commands/auditar-marco.md +179 -179
- package/kit/commands/auditar-observabilidade-cobertura-workflow.md +121 -0
- package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
- package/kit/commands/auditar-refactor.md +219 -219
- package/kit/commands/auditar-release.md +109 -109
- package/kit/commands/auditar-uat.md +23 -23
- package/kit/commands/autonomo.md +40 -40
- package/kit/commands/branch-pr.md +24 -24
- package/kit/commands/burn-rate-status.md +408 -408
- package/kit/commands/capturar-payloads.md +193 -193
- package/kit/commands/caracterizar.md +212 -212
- package/kit/commands/concluir-marco.md +247 -247
- package/kit/commands/configuracoes.md +36 -36
- package/kit/commands/dados-distribuidos.md +188 -188
- package/kit/commands/definir-perfil.md +10 -10
- package/kit/commands/depurar.md +190 -190
- package/kit/commands/detectar-duplicacao.md +197 -197
- package/kit/commands/discutir-fase.md +131 -131
- package/kit/commands/encontrar-seams.md +136 -136
- package/kit/commands/entrar-discord.md +17 -17
- package/kit/commands/estatisticas.md +18 -18
- package/kit/commands/example-greeting.md +33 -33
- package/kit/commands/executar-fase.md +58 -58
- package/kit/commands/expresso.md +56 -56
- package/kit/commands/fase-ui.md +34 -34
- package/kit/commands/fazer.md +57 -57
- package/kit/commands/fio.md +125 -125
- package/kit/commands/fluxos-trabalho.md +64 -64
- package/kit/commands/forense.md +176 -176
- package/kit/commands/gerenciador.md +38 -38
- package/kit/commands/inserir-fase.md +31 -31
- package/kit/commands/legacy.md +263 -263
- package/kit/commands/limpeza.md +17 -17
- package/kit/commands/listar-hipoteses-fase.md +45 -45
- package/kit/commands/listar-workspaces.md +18 -18
- package/kit/commands/load-shedding.md +117 -117
- package/kit/commands/mapear-codebase.md +70 -70
- package/kit/commands/multi-tenant.md +163 -163
- package/kit/commands/nota.md +33 -33
- package/kit/commands/novo-marco.md +43 -43
- package/kit/commands/novo-projeto.md +41 -41
- package/kit/commands/novo-workspace.md +43 -43
- package/kit/commands/pausar-trabalho.md +37 -37
- package/kit/commands/perfil-usuario.md +45 -45
- package/kit/commands/pesquisar-fase.md +195 -195
- package/kit/commands/planejar-fase.md +67 -67
- package/kit/commands/planejar-lacunas.md +33 -33
- package/kit/commands/plantar-ideia.md +25 -25
- package/kit/commands/progresso.md +24 -24
- package/kit/commands/proximo.md +30 -30
- package/kit/commands/publicar.md +490 -490
- package/kit/commands/rapido.md +35 -35
- package/kit/commands/reaplicar-patches.md +124 -124
- package/kit/commands/refactor-seguro.md +321 -321
- package/kit/commands/relatorio-sessao.md +19 -19
- package/kit/commands/remover-fase.md +31 -31
- package/kit/commands/remover-workspace.md +26 -26
- package/kit/commands/resumo-marco.md +50 -50
- package/kit/commands/retomar-trabalho.md +40 -40
- package/kit/commands/revisar-backlog.md +60 -60
- package/kit/commands/revisar-ui.md +32 -32
- package/kit/commands/revisar.md +37 -37
- package/kit/commands/saude.md +21 -21
- package/kit/commands/setup-notion.md +93 -93
- package/kit/commands/storytelling.md +179 -179
- package/kit/commands/supabase.md +238 -238
- package/kit/commands/sync-main.md +68 -68
- package/kit/commands/validar-fase.md +35 -35
- package/kit/commands/verificar-tarefas.md +44 -44
- package/kit/commands/verificar-trabalho.md +64 -64
- package/kit/file-manifest.json +13 -11
- package/kit/framework/bin/lib/commands.cjs +959 -959
- package/kit/framework/bin/lib/config.cjs +442 -442
- package/kit/framework/bin/lib/core.cjs +1230 -1230
- package/kit/framework/bin/lib/frontmatter.cjs +336 -336
- package/kit/framework/bin/lib/init.cjs +1442 -1442
- package/kit/framework/bin/lib/milestone.cjs +252 -252
- package/kit/framework/bin/lib/model-profiles.cjs +68 -68
- package/kit/framework/bin/lib/phase.cjs +888 -888
- package/kit/framework/bin/lib/profile-output.cjs +952 -952
- package/kit/framework/bin/lib/profile-pipeline.cjs +539 -539
- package/kit/framework/bin/lib/roadmap.cjs +329 -329
- package/kit/framework/bin/lib/security.cjs +382 -382
- package/kit/framework/bin/lib/state.cjs +1031 -1031
- package/kit/framework/bin/lib/template.cjs +222 -222
- package/kit/framework/bin/lib/uat.cjs +282 -282
- package/kit/framework/bin/lib/verify.cjs +888 -888
- package/kit/framework/bin/lib/workstream.cjs +491 -491
- package/kit/framework/bin/tools.cjs +918 -918
- package/kit/framework/commands/workstreams.md +63 -63
- package/kit/framework/references/checkpoints.md +778 -778
- package/kit/framework/references/continuation-format.md +249 -249
- package/kit/framework/references/decimal-phase-calculation.md +64 -64
- package/kit/framework/references/git-integration.md +295 -295
- package/kit/framework/references/git-planning-commit.md +38 -38
- package/kit/framework/references/model-profile-resolution.md +36 -36
- package/kit/framework/references/model-profiles.md +139 -139
- package/kit/framework/references/phase-argument-parsing.md +61 -61
- package/kit/framework/references/planning-config.md +202 -202
- package/kit/framework/references/questioning.md +162 -162
- package/kit/framework/references/tdd.md +263 -263
- package/kit/framework/references/ui-brand.md +160 -160
- package/kit/framework/references/user-profiling.md +657 -657
- package/kit/framework/references/verification-patterns.md +612 -612
- package/kit/framework/references/workstream-flag.md +58 -58
- package/kit/framework/templates/DEBUG.md +164 -164
- package/kit/framework/templates/UAT.md +265 -265
- package/kit/framework/templates/UI-SPEC.md +100 -100
- package/kit/framework/templates/VALIDATION.md +76 -76
- package/kit/framework/templates/claude-md.md +122 -122
- package/kit/framework/templates/codebase/architecture.md +185 -185
- package/kit/framework/templates/codebase/concerns.md +205 -205
- package/kit/framework/templates/codebase/conventions.md +204 -204
- package/kit/framework/templates/codebase/integrations.md +192 -192
- package/kit/framework/templates/codebase/stack.md +158 -158
- package/kit/framework/templates/codebase/structure.md +199 -199
- package/kit/framework/templates/codebase/testing.md +301 -301
- package/kit/framework/templates/config.json +44 -44
- package/kit/framework/templates/context.md +352 -352
- package/kit/framework/templates/continue-here.md +78 -78
- package/kit/framework/templates/copilot-instructions.md +7 -7
- package/kit/framework/templates/debug-subagent-prompt.md +91 -91
- package/kit/framework/templates/dev-preferences.md +20 -20
- package/kit/framework/templates/discovery.md +146 -146
- package/kit/framework/templates/discussion-log.md +63 -63
- package/kit/framework/templates/milestone-archive.md +123 -123
- package/kit/framework/templates/milestone.md +115 -115
- package/kit/framework/templates/phase-prompt.md +610 -610
- package/kit/framework/templates/planner-subagent-prompt.md +117 -117
- package/kit/framework/templates/project.md +186 -186
- package/kit/framework/templates/requirements.md +231 -231
- package/kit/framework/templates/research-project/ARCHITECTURE.md +204 -204
- package/kit/framework/templates/research-project/FEATURES.md +147 -147
- package/kit/framework/templates/research-project/PITFALLS.md +200 -200
- package/kit/framework/templates/research-project/STACK.md +120 -120
- package/kit/framework/templates/research-project/SUMMARY.md +170 -170
- package/kit/framework/templates/research.md +419 -419
- package/kit/framework/templates/retrospective.md +54 -54
- package/kit/framework/templates/roadmap.md +202 -202
- package/kit/framework/templates/state.md +176 -176
- package/kit/framework/templates/summary-complex.md +59 -59
- package/kit/framework/templates/summary-minimal.md +41 -41
- package/kit/framework/templates/summary-standard.md +48 -48
- package/kit/framework/templates/summary.md +209 -209
- package/kit/framework/templates/user-profile.md +146 -146
- package/kit/framework/templates/user-setup.md +256 -256
- package/kit/framework/templates/verification-report.md +258 -258
- package/kit/framework/workflows/add-phase.md +112 -112
- package/kit/framework/workflows/add-tests.md +351 -351
- package/kit/framework/workflows/add-todo.md +158 -158
- package/kit/framework/workflows/audit-milestone.md +340 -340
- package/kit/framework/workflows/audit-uat.md +109 -109
- package/kit/framework/workflows/autonomous.md +891 -891
- package/kit/framework/workflows/check-todos.md +177 -177
- package/kit/framework/workflows/cleanup.md +152 -152
- package/kit/framework/workflows/complete-milestone.md +696 -696
- package/kit/framework/workflows/diagnose-issues.md +231 -231
- package/kit/framework/workflows/discovery-phase.md +289 -289
- package/kit/framework/workflows/discuss-phase-assumptions.md +653 -653
- package/kit/framework/workflows/discuss-phase.md +784 -784
- package/kit/framework/workflows/do.md +104 -104
- package/kit/framework/workflows/execute-phase.md +838 -838
- package/kit/framework/workflows/execute-plan.md +510 -510
- package/kit/framework/workflows/fast.md +102 -102
- package/kit/framework/workflows/forensics.md +265 -265
- package/kit/framework/workflows/health.md +181 -181
- package/kit/framework/workflows/help.md +619 -619
- package/kit/framework/workflows/insert-phase.md +130 -130
- package/kit/framework/workflows/list-phase-assumptions.md +178 -178
- package/kit/framework/workflows/list-workspaces.md +56 -56
- package/kit/framework/workflows/manager.md +362 -362
- package/kit/framework/workflows/map-codebase.md +377 -377
- package/kit/framework/workflows/milestone-summary.md +223 -223
- package/kit/framework/workflows/new-milestone.md +486 -486
- package/kit/framework/workflows/new-project.md +1159 -1159
- package/kit/framework/workflows/new-workspace.md +237 -237
- package/kit/framework/workflows/next.md +97 -97
- package/kit/framework/workflows/node-repair.md +92 -92
- package/kit/framework/workflows/note.md +156 -156
- package/kit/framework/workflows/pause-work.md +176 -176
- package/kit/framework/workflows/plan-milestone-gaps.md +273 -273
- package/kit/framework/workflows/plan-phase.md +765 -765
- package/kit/framework/workflows/plant-seed.md +169 -169
- package/kit/framework/workflows/pr-branch.md +129 -129
- package/kit/framework/workflows/profile-user.md +450 -450
- package/kit/framework/workflows/progress.md +507 -507
- package/kit/framework/workflows/quick.md +757 -757
- package/kit/framework/workflows/remove-phase.md +155 -155
- package/kit/framework/workflows/remove-workspace.md +90 -90
- package/kit/framework/workflows/research-phase.md +82 -82
- package/kit/framework/workflows/resume-project.md +326 -326
- package/kit/framework/workflows/review.md +228 -228
- package/kit/framework/workflows/session-report.md +146 -146
- package/kit/framework/workflows/settings.md +283 -283
- package/kit/framework/workflows/ship.md +228 -228
- package/kit/framework/workflows/stats.md +60 -60
- package/kit/framework/workflows/transition.md +671 -671
- package/kit/framework/workflows/ui-phase.md +302 -302
- package/kit/framework/workflows/ui-review.md +165 -165
- package/kit/framework/workflows/update.md +323 -323
- package/kit/framework/workflows/validate-phase.md +174 -174
- package/kit/framework/workflows/verify-phase.md +252 -252
- package/kit/framework/workflows/verify-work.md +637 -637
- package/kit/hooks/check-update.js +118 -118
- package/kit/hooks/context-monitor.js +163 -163
- package/kit/hooks/kit-attribution-reminder.cjs +92 -92
- package/kit/hooks/kit-router.cjs +137 -137
- package/kit/hooks/prompt-guard.js +103 -103
- package/kit/hooks/statusline.js +125 -125
- package/kit/hooks/workflow-guard.js +101 -101
- package/kit/settings.json +45 -45
- package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
- package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
- package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
- package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
- package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
- package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
- package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
- package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
- package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
- package/kit/skills/example-skill/SKILL.md +42 -42
- package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
- package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
- package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
- package/kit/skills/legacy-extract-class/SKILL.md +203 -203
- package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
- package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
- package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
- package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
- package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
- package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
- package/kit/skills/member-invite-flow/SKILL.md +305 -305
- package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
- package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
- package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
- package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
- package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
- package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
- package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
- package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
- package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
- package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
- package/kit/skills/supabase-auth-hardening/SKILL.md +674 -674
- package/kit/skills/supabase-auth-hooks/SKILL.md +875 -875
- package/kit/skills/supabase-auth-methods/SKILL.md +486 -486
- package/kit/skills/supabase-auth-sessions/SKILL.md +579 -579
- package/kit/skills/supabase-auth-ssr/SKILL.md +306 -306
- package/kit/skills/supabase-branching-workflow/SKILL.md +544 -544
- package/kit/skills/supabase-ci-cd-github-actions/SKILL.md +880 -880
- package/kit/skills/supabase-column-level-security/SKILL.md +426 -426
- package/kit/skills/supabase-config-toml-remotes/SKILL.md +807 -807
- package/kit/skills/supabase-custom-claims-rbac/SKILL.md +472 -472
- package/kit/skills/supabase-edge-functions/SKILL.md +330 -330
- package/kit/skills/supabase-edge-functions-auth/SKILL.md +309 -309
- package/kit/skills/supabase-edge-functions-limits/SKILL.md +302 -302
- package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +279 -279
- package/kit/skills/supabase-edge-functions-testing/SKILL.md +277 -277
- package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +357 -357
- package/kit/skills/supabase-enterprise-sso-saml/SKILL.md +545 -545
- package/kit/skills/supabase-jwt-signing-keys/SKILL.md +399 -399
- package/kit/skills/supabase-mfa/SKILL.md +488 -488
- package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
- package/kit/skills/supabase-migrations/SKILL.md +297 -297
- package/kit/skills/supabase-oauth-server/SKILL.md +537 -537
- package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
- package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
- package/kit/skills/supabase-realtime/SKILL.md +460 -460
- package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
- package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
- package/kit/skills/supabase-social-oauth/SKILL.md +480 -480
- package/kit/skills/supabase-third-party-auth/SKILL.md +450 -450
- package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
- package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
- package/kit/skills/ui-anti-padroes-ia/SKILL.md +261 -261
- package/kit/skills/ui-contexto-produto/SKILL.md +248 -248
- package/kit/skills/ui-cor-estrategia/SKILL.md +213 -213
- package/kit/skills/ui-critica-auditoria/SKILL.md +260 -260
- package/kit/skills/ui-motion-funcional/SKILL.md +264 -264
- package/kit/skills/ui-ritmo-espacial/SKILL.md +259 -259
- package/kit/skills/ui-tipografia/SKILL.md +211 -211
- package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
- package/kit/workflows/auditar-observabilidade-cobertura.workflow.js +250 -0
- package/package.json +65 -63
- package/src/core/kit.js +333 -216
- package/src/core/reflect.js +247 -247
- package/src/core/registry.js +123 -112
- package/src/core/reverse-sync.js +448 -372
- package/src/core/sync.js +477 -437
- package/src/core/watch.js +121 -121
- package/src/mcp-server/index.js +794 -794
|
@@ -1,357 +1,357 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: supabase-edge-runtime-builtins
|
|
3
|
-
description: Use ao usar built-ins do Edge Runtime Supabase — Supabase.ai.Session (embeddings/LLM), file system S3FS /s3 + /tmp, regional via x-region, WebSockets Deno.upgradeWebSocket, Wasm via static_files.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Supabase — Edge Runtime Built-ins · 2026
|
|
7
|
-
|
|
8
|
-
## Quando usar
|
|
9
|
-
|
|
10
|
-
Carrega quando:
|
|
11
|
-
|
|
12
|
-
- "embeddings em Edge Function", "Supabase.ai.Session", "gte-small"
|
|
13
|
-
- "LLM em Edge Function" (Ollama, Llamafile, AI_INFERENCE_API_HOST)
|
|
14
|
-
- "persistent storage Edge Function", "/s3/ mount", "S3FS"
|
|
15
|
-
- "rodar Edge Function em região específica", "x-region", "FunctionRegion"
|
|
16
|
-
- "WebSocket em Edge Function", "Deno.upgradeWebSocket"
|
|
17
|
-
- "Wasm em Edge Function", "static_files config.toml", "wasm-bindgen"
|
|
18
|
-
- "Edge Function regional latency"
|
|
19
|
-
|
|
20
|
-
> Pré-requisito: [`supabase-edge-functions`](../supabase-edge-functions/SKILL.md).
|
|
21
|
-
|
|
22
|
-
## 1. `Supabase.ai.Session` — modelo built-in
|
|
23
|
-
|
|
24
|
-
### Embeddings com gte-small (zero deps)
|
|
25
|
-
|
|
26
|
-
```ts
|
|
27
|
-
import 'jsr:@supabase/functions-js@2/edge-runtime.d.ts'
|
|
28
|
-
|
|
29
|
-
const model = new Supabase.ai.Session('gte-small')
|
|
30
|
-
|
|
31
|
-
Deno.serve(async (req) => {
|
|
32
|
-
const { text } = await req.json()
|
|
33
|
-
// PT-BR: gte-small → 384 dimensões, English-only, max 512 tokens
|
|
34
|
-
const embedding = await model.run(text, { mean_pool: true, normalize: true })
|
|
35
|
-
return Response.json({ embedding }) // array de 384 floats
|
|
36
|
-
})
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
Use com pgvector — vector(384). Ver [`supabase-pgvector-rag`](../supabase-pgvector-rag/SKILL.md).
|
|
40
|
-
|
|
41
|
-
### LLM via Ollama (self-hosted)
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
# 1. instalar Ollama localmente / em VM
|
|
45
|
-
ollama pull mistral
|
|
46
|
-
ollama serve
|
|
47
|
-
|
|
48
|
-
# 2. setar secret apontando para o servidor
|
|
49
|
-
supabase secrets set AI_INFERENCE_API_HOST=http://ollama-host:11434
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
```ts
|
|
53
|
-
const session = new Supabase.ai.Session('mistral')
|
|
54
|
-
|
|
55
|
-
Deno.serve(async (req) => {
|
|
56
|
-
const { prompt } = await req.json()
|
|
57
|
-
// PT-BR: stream para baixa latência percebida
|
|
58
|
-
const stream = await session.run(prompt, { stream: true, mode: 'ollama' })
|
|
59
|
-
|
|
60
|
-
return new Response(
|
|
61
|
-
new ReadableStream({
|
|
62
|
-
async start(controller) {
|
|
63
|
-
const encoder = new TextEncoder()
|
|
64
|
-
for await (const chunk of stream) {
|
|
65
|
-
controller.enqueue(encoder.encode(chunk.response ?? ''))
|
|
66
|
-
}
|
|
67
|
-
controller.close()
|
|
68
|
-
},
|
|
69
|
-
}),
|
|
70
|
-
{ headers: { 'Content-Type': 'text/event-stream', Connection: 'keep-alive' } },
|
|
71
|
-
)
|
|
72
|
-
})
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### LLM via Llamafile (OpenAI-compatível)
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
supabase secrets set AI_INFERENCE_API_HOST=http://llamafile-host:8080
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
```ts
|
|
82
|
-
const session = new Supabase.ai.Session('LLaMA_CPP') // model name não importa — depende do .llamafile rodando
|
|
83
|
-
|
|
84
|
-
const output = await session.run(
|
|
85
|
-
{
|
|
86
|
-
messages: [
|
|
87
|
-
{ role: 'system', content: 'You are a helpful assistant.' },
|
|
88
|
-
{ role: 'user', content: prompt },
|
|
89
|
-
],
|
|
90
|
-
},
|
|
91
|
-
{ mode: 'openaicompatible', stream: false },
|
|
92
|
-
)
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
Performance local de Ollama é **muito menor** que servidor com GPU dedicada. Para produção, use VM com GPU ou aguarde Supabase hosted LLM API (early access).
|
|
96
|
-
|
|
97
|
-
## 2. File System — Persistente (S3FS) + Ephemeral (/tmp)
|
|
98
|
-
|
|
99
|
-
### Ephemeral `/tmp` (default — reset por invocação)
|
|
100
|
-
|
|
101
|
-
```ts
|
|
102
|
-
Deno.serve(async (req) => {
|
|
103
|
-
if (req.headers.get('content-type') !== 'application/zip') {
|
|
104
|
-
return new Response('zip required', { status: 400 })
|
|
105
|
-
}
|
|
106
|
-
const uploadId = crypto.randomUUID()
|
|
107
|
-
await Deno.writeFile(`/tmp/${uploadId}.zip`, req.body!)
|
|
108
|
-
// PT-BR: processa em background para não exceder memória
|
|
109
|
-
EdgeRuntime.waitUntil(processZip(uploadId))
|
|
110
|
-
return Response.json({ uploadId })
|
|
111
|
-
})
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Limites: Free 256 MB, Paid 512 MB.
|
|
115
|
-
|
|
116
|
-
### Persistent S3FS — mount qualquer S3-compatible bucket
|
|
117
|
-
|
|
118
|
-
Secrets necessários (`supabase secrets set ...`):
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
S3FS_ENDPOINT_URL=https://<project>.supabase.co/storage/v1/s3
|
|
122
|
-
S3FS_REGION=us-east-1
|
|
123
|
-
S3FS_ACCESS_KEY_ID=...
|
|
124
|
-
S3FS_SECRET_ACCESS_KEY=...
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
Para Supabase Storage S3, gerar access key em [Storage > S3 Connection](https://supabase.com/docs/guides/storage/s3/authentication).
|
|
128
|
-
|
|
129
|
-
```ts
|
|
130
|
-
// Leitura
|
|
131
|
-
const csv = await Deno.readFile('/s3/uploads/results.csv')
|
|
132
|
-
|
|
133
|
-
// Escrita
|
|
134
|
-
await Deno.writeTextFile('/s3/exports/report-2026.txt', 'hello')
|
|
135
|
-
|
|
136
|
-
// Criar subdiretório
|
|
137
|
-
await Deno.mkdir('/s3/uploads/2026-05')
|
|
138
|
-
|
|
139
|
-
// Listar
|
|
140
|
-
for await (const entry of Deno.readDir('/s3/uploads')) {
|
|
141
|
-
console.log(entry.name)
|
|
142
|
-
}
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
Mount path: `/s3/<bucket-name>/<key>`. Sem limites Supabase específicos (limites do S3 backend aplicam).
|
|
146
|
-
|
|
147
|
-
### Sync File APIs — só na inicialização
|
|
148
|
-
|
|
149
|
-
```ts
|
|
150
|
-
// ✓ ok — durante script init
|
|
151
|
-
const config = JSON.parse(Deno.readTextFileSync('/s3/config/app.json'))
|
|
152
|
-
|
|
153
|
-
Deno.serve(async (req) => {
|
|
154
|
-
// ⚠ ERRO — Deno.statSync blocklisted em callback
|
|
155
|
-
// Deno.statSync('/tmp/x')
|
|
156
|
-
|
|
157
|
-
// ✓ certo — usar versão async
|
|
158
|
-
const info = await Deno.stat('/tmp/x')
|
|
159
|
-
})
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
APIs sync (`Deno.readFileSync`, `statSync`, `mkdirSync`, etc.) **só durante initial script evaluation**. Em handlers/setTimeout/etc — sempre async.
|
|
163
|
-
|
|
164
|
-
## 3. Regional Invocation
|
|
165
|
-
|
|
166
|
-
Edge Functions executam na região mais próxima ao caller por default. Para forçar região específica (útil quando função é DB-heavy e DB é regional):
|
|
167
|
-
|
|
168
|
-
### Via SDK
|
|
169
|
-
|
|
170
|
-
```ts
|
|
171
|
-
import { FunctionRegion } from 'npm:@supabase/supabase-js@2.95.0'
|
|
172
|
-
|
|
173
|
-
await supabase.functions.invoke('bulk-import', {
|
|
174
|
-
body: payload,
|
|
175
|
-
region: FunctionRegion.SaEast1, // São Paulo
|
|
176
|
-
})
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
### Via header (qualquer cliente HTTP)
|
|
180
|
-
|
|
181
|
-
```bash
|
|
182
|
-
curl -X POST https://<ref>.supabase.co/functions/v1/bulk-import \
|
|
183
|
-
-H 'apikey: sb_publishable_...' \
|
|
184
|
-
-H 'x-region: sa-east-1' \
|
|
185
|
-
-d '{...}'
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### Quando header não disponível (CORS, webhooks) — query param
|
|
189
|
-
|
|
190
|
-
```
|
|
191
|
-
https://<ref>.supabase.co/functions/v1/bulk-import?forceFunctionRegion=sa-east-1
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
### Regiões disponíveis (14 total)
|
|
195
|
-
|
|
196
|
-
| Cluster | Regiões |
|
|
197
|
-
|---|---|
|
|
198
|
-
| América do Sul | `sa-east-1` (São Paulo) |
|
|
199
|
-
| América do Norte | `ca-central-1`, `us-east-1`, `us-west-1`, `us-west-2` |
|
|
200
|
-
| Europa | `eu-central-1`, `eu-west-1`, `eu-west-2`, `eu-west-3` |
|
|
201
|
-
| Ásia-Pacífico | `ap-northeast-1`, `ap-northeast-2`, `ap-south-1`, `ap-southeast-1`, `ap-southeast-2` |
|
|
202
|
-
|
|
203
|
-
### Verificar região da execução
|
|
204
|
-
|
|
205
|
-
```ts
|
|
206
|
-
console.log('executed in:', Deno.env.get('SB_REGION'))
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
Response header `x-sb-edge-region` indica para o caller.
|
|
210
|
-
|
|
211
|
-
**Caveat:** com `x-region` explícito, requests **não** failover automático em outage da região. Considere fallback para default region em SDK wrapper.
|
|
212
|
-
|
|
213
|
-
## 4. WebSockets
|
|
214
|
-
|
|
215
|
-
```toml
|
|
216
|
-
# supabase/config.toml — REQUIRED para WebSocket local
|
|
217
|
-
[edge_runtime]
|
|
218
|
-
policy = "per_worker"
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
```ts
|
|
222
|
-
// supabase/functions/realtime-chat/index.ts
|
|
223
|
-
import { createClient } from 'npm:@supabase/supabase-js@2.95.0'
|
|
224
|
-
|
|
225
|
-
const SECRET = JSON.parse(Deno.env.get('SUPABASE_SECRET_KEYS')!)
|
|
226
|
-
const supabase = createClient(Deno.env.get('SUPABASE_URL')!, SECRET['default'])
|
|
227
|
-
|
|
228
|
-
Deno.serve(async (req) => {
|
|
229
|
-
const upgrade = req.headers.get('upgrade') ?? ''
|
|
230
|
-
if (upgrade.toLowerCase() !== 'websocket') {
|
|
231
|
-
return new Response('expected websocket upgrade', { status: 400 })
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// PT-BR: browser WebSocket não permite custom headers → JWT via query param
|
|
235
|
-
const jwt = new URL(req.url).searchParams.get('jwt') ?? ''
|
|
236
|
-
const { data, error } = await supabase.auth.getUser(jwt)
|
|
237
|
-
if (error || !data.user) return new Response('unauthorized', { status: 403 })
|
|
238
|
-
|
|
239
|
-
const { socket, response } = Deno.upgradeWebSocket(req)
|
|
240
|
-
|
|
241
|
-
socket.onopen = () => console.log('socket opened', { user: data.user!.id })
|
|
242
|
-
socket.onmessage = (e) => {
|
|
243
|
-
socket.send(JSON.stringify({ echo: e.data, at: Date.now() }))
|
|
244
|
-
}
|
|
245
|
-
socket.onerror = (e) => console.log('socket error:', (e as ErrorEvent).message)
|
|
246
|
-
socket.onclose = () => console.log('socket closed')
|
|
247
|
-
|
|
248
|
-
return response
|
|
249
|
-
})
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
```toml
|
|
253
|
-
[functions.realtime-chat]
|
|
254
|
-
verify_jwt = false # JWT validado via query param no handler
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
Deploy: `supabase functions deploy realtime-chat --no-verify-jwt`.
|
|
258
|
-
|
|
259
|
-
**Alternativa autenticação:** subprotocol no header `Sec-WebSocket-Protocol: jwt-<token>` — parse no handler.
|
|
260
|
-
|
|
261
|
-
### Outbound WebSocket (proxy/relay)
|
|
262
|
-
|
|
263
|
-
Edge Function pode abrir WebSocket para outro server e fazer relay (ex: OpenAI Realtime API). Padrão duplo: inbound `Deno.upgradeWebSocket` + outbound `new WebSocket('wss://...')`.
|
|
264
|
-
|
|
265
|
-
## 5. Wasm modules
|
|
266
|
-
|
|
267
|
-
### Setup Rust + wasm-bindgen
|
|
268
|
-
|
|
269
|
-
```bash
|
|
270
|
-
# Dentro da pasta da função
|
|
271
|
-
cd supabase/functions/wasm-add
|
|
272
|
-
cargo new --lib add-wasm
|
|
273
|
-
# Editar Cargo.toml com wasm-bindgen dep + crate-type = ["cdylib"]
|
|
274
|
-
# Editar src/lib.rs com #[wasm_bindgen] add function
|
|
275
|
-
wasm-pack build --target deno
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
```toml
|
|
279
|
-
# supabase/config.toml — CLI 2.7.0+
|
|
280
|
-
[functions.wasm-add]
|
|
281
|
-
static_files = ["./functions/wasm-add/add-wasm/pkg/*"]
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
```ts
|
|
285
|
-
// supabase/functions/wasm-add/index.ts
|
|
286
|
-
import init, { add } from './add-wasm/pkg/add_wasm.js'
|
|
287
|
-
|
|
288
|
-
await init() // PT-BR: Deno 2.1+ vai simplificar isso
|
|
289
|
-
|
|
290
|
-
Deno.serve(async (req) => {
|
|
291
|
-
const { a, b } = await req.json()
|
|
292
|
-
return Response.json({ sum: add(a, b) })
|
|
293
|
-
})
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
**Caveat:** `static_files` **não funciona** com `--use-api`. Precisa Docker no build: `supabase functions deploy wasm-add` (sem `--use-api`).
|
|
297
|
-
|
|
298
|
-
### Casos de uso
|
|
299
|
-
|
|
300
|
-
- Image processing pesado (`magick-wasm`)
|
|
301
|
-
- Crypto custom (libsodium)
|
|
302
|
-
- Computações intensivas portadas de C/Rust
|
|
303
|
-
- WebAssembly puro evitando JS overhead
|
|
304
|
-
|
|
305
|
-
## 6. Env vars runtime (read-only)
|
|
306
|
-
|
|
307
|
-
| Variável | O que é |
|
|
308
|
-
|---|---|
|
|
309
|
-
| `SB_REGION` | AWS region da invocação (ex: `us-east-1`) |
|
|
310
|
-
| `SB_EXECUTION_ID` | UUID do isolate atual |
|
|
311
|
-
| `DENO_DEPLOYMENT_ID` | `{project_ref}_{function_id}_{version}` — útil para `build_id` em traces |
|
|
312
|
-
|
|
313
|
-
Usar como atributos canônicos em [`structured-events`](../structured-events/SKILL.md) / [`distributed-tracing`](../distributed-tracing/SKILL.md).
|
|
314
|
-
|
|
315
|
-
```ts
|
|
316
|
-
import { trace } from 'npm:@opentelemetry/api@1.9.0'
|
|
317
|
-
|
|
318
|
-
Deno.serve(async (req) => {
|
|
319
|
-
const span = trace.getActiveSpan()
|
|
320
|
-
span?.setAttributes({
|
|
321
|
-
'sb.region': Deno.env.get('SB_REGION')!,
|
|
322
|
-
'sb.execution_id': Deno.env.get('SB_EXECUTION_ID')!,
|
|
323
|
-
'build_id': Deno.env.get('DENO_DEPLOYMENT_ID')!,
|
|
324
|
-
})
|
|
325
|
-
// ...
|
|
326
|
-
})
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
## Anti-patterns
|
|
330
|
-
|
|
331
|
-
### AR1 — Heavy LLM em Edge Function user-facing
|
|
332
|
-
Wall clock free 150s, paid 400s, CPU 2s/request. LLM grande estoura. Para inference síncrona pesada, considere job queue + worker dedicado (`pg_cron` → `pgmq` → Edge → external).
|
|
333
|
-
|
|
334
|
-
### AR2 — `/s3/` sem S3FS env vars
|
|
335
|
-
Mount path requer 4 env vars. Sem elas, write retorna `EACCES`. Validar `supabase secrets list` antes de deploy.
|
|
336
|
-
|
|
337
|
-
### AR3 — WebSocket sem `per_worker` local
|
|
338
|
-
Local fecha conexão em 1s. Sempre `policy = "per_worker"` em `config.toml` para WebSocket dev.
|
|
339
|
-
|
|
340
|
-
### AR4 — `x-region` em endpoint com failover esperado
|
|
341
|
-
Header desliga roteamento automático. Use apenas quando latência regional > tolerância para outages.
|
|
342
|
-
|
|
343
|
-
### AR5 — Wasm com `--use-api` deploy
|
|
344
|
-
`static_files` requer Docker no bundle. Falha silenciosamente em API deploy.
|
|
345
|
-
|
|
346
|
-
### AR6 — `Supabase.ai.Session` para textos > 512 tokens (gte-small)
|
|
347
|
-
gte-small trunca para 512 tokens; embeddings podem perder precisão. Para textos longos, chunk antes ou use modelo maior (Ollama com all-minilm/embeddings).
|
|
348
|
-
|
|
349
|
-
## Ver também
|
|
350
|
-
|
|
351
|
-
- [`supabase-edge-functions`](../supabase-edge-functions/SKILL.md) — base
|
|
352
|
-
- [`supabase-edge-functions-limits`](../supabase-edge-functions-limits/SKILL.md) — limits para AI/Wasm
|
|
353
|
-
- [`supabase-pgvector-rag`](../supabase-pgvector-rag/SKILL.md) — embeddings em DB
|
|
354
|
-
- [`supabase-storage`](../supabase-storage/SKILL.md) — alternativa user-managed
|
|
355
|
-
- [`supabase-realtime`](../supabase-realtime/SKILL.md) — quando preferir Realtime broadcast vs WebSocket custom
|
|
356
|
-
- [`structured-events`](../structured-events/SKILL.md) — atributos canônicos `sb.region`, `build_id`
|
|
357
|
-
- [`llm-as-dependency`](../llm-as-dependency/SKILL.md) — adapter pattern para Supabase.ai
|
|
1
|
+
---
|
|
2
|
+
name: supabase-edge-runtime-builtins
|
|
3
|
+
description: Use ao usar built-ins do Edge Runtime Supabase — Supabase.ai.Session (embeddings/LLM), file system S3FS /s3 + /tmp, regional via x-region, WebSockets Deno.upgradeWebSocket, Wasm via static_files.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Supabase — Edge Runtime Built-ins · 2026
|
|
7
|
+
|
|
8
|
+
## Quando usar
|
|
9
|
+
|
|
10
|
+
Carrega quando:
|
|
11
|
+
|
|
12
|
+
- "embeddings em Edge Function", "Supabase.ai.Session", "gte-small"
|
|
13
|
+
- "LLM em Edge Function" (Ollama, Llamafile, AI_INFERENCE_API_HOST)
|
|
14
|
+
- "persistent storage Edge Function", "/s3/ mount", "S3FS"
|
|
15
|
+
- "rodar Edge Function em região específica", "x-region", "FunctionRegion"
|
|
16
|
+
- "WebSocket em Edge Function", "Deno.upgradeWebSocket"
|
|
17
|
+
- "Wasm em Edge Function", "static_files config.toml", "wasm-bindgen"
|
|
18
|
+
- "Edge Function regional latency"
|
|
19
|
+
|
|
20
|
+
> Pré-requisito: [`supabase-edge-functions`](../supabase-edge-functions/SKILL.md).
|
|
21
|
+
|
|
22
|
+
## 1. `Supabase.ai.Session` — modelo built-in
|
|
23
|
+
|
|
24
|
+
### Embeddings com gte-small (zero deps)
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import 'jsr:@supabase/functions-js@2/edge-runtime.d.ts'
|
|
28
|
+
|
|
29
|
+
const model = new Supabase.ai.Session('gte-small')
|
|
30
|
+
|
|
31
|
+
Deno.serve(async (req) => {
|
|
32
|
+
const { text } = await req.json()
|
|
33
|
+
// PT-BR: gte-small → 384 dimensões, English-only, max 512 tokens
|
|
34
|
+
const embedding = await model.run(text, { mean_pool: true, normalize: true })
|
|
35
|
+
return Response.json({ embedding }) // array de 384 floats
|
|
36
|
+
})
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Use com pgvector — vector(384). Ver [`supabase-pgvector-rag`](../supabase-pgvector-rag/SKILL.md).
|
|
40
|
+
|
|
41
|
+
### LLM via Ollama (self-hosted)
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 1. instalar Ollama localmente / em VM
|
|
45
|
+
ollama pull mistral
|
|
46
|
+
ollama serve
|
|
47
|
+
|
|
48
|
+
# 2. setar secret apontando para o servidor
|
|
49
|
+
supabase secrets set AI_INFERENCE_API_HOST=http://ollama-host:11434
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
const session = new Supabase.ai.Session('mistral')
|
|
54
|
+
|
|
55
|
+
Deno.serve(async (req) => {
|
|
56
|
+
const { prompt } = await req.json()
|
|
57
|
+
// PT-BR: stream para baixa latência percebida
|
|
58
|
+
const stream = await session.run(prompt, { stream: true, mode: 'ollama' })
|
|
59
|
+
|
|
60
|
+
return new Response(
|
|
61
|
+
new ReadableStream({
|
|
62
|
+
async start(controller) {
|
|
63
|
+
const encoder = new TextEncoder()
|
|
64
|
+
for await (const chunk of stream) {
|
|
65
|
+
controller.enqueue(encoder.encode(chunk.response ?? ''))
|
|
66
|
+
}
|
|
67
|
+
controller.close()
|
|
68
|
+
},
|
|
69
|
+
}),
|
|
70
|
+
{ headers: { 'Content-Type': 'text/event-stream', Connection: 'keep-alive' } },
|
|
71
|
+
)
|
|
72
|
+
})
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### LLM via Llamafile (OpenAI-compatível)
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
supabase secrets set AI_INFERENCE_API_HOST=http://llamafile-host:8080
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
const session = new Supabase.ai.Session('LLaMA_CPP') // model name não importa — depende do .llamafile rodando
|
|
83
|
+
|
|
84
|
+
const output = await session.run(
|
|
85
|
+
{
|
|
86
|
+
messages: [
|
|
87
|
+
{ role: 'system', content: 'You are a helpful assistant.' },
|
|
88
|
+
{ role: 'user', content: prompt },
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
{ mode: 'openaicompatible', stream: false },
|
|
92
|
+
)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Performance local de Ollama é **muito menor** que servidor com GPU dedicada. Para produção, use VM com GPU ou aguarde Supabase hosted LLM API (early access).
|
|
96
|
+
|
|
97
|
+
## 2. File System — Persistente (S3FS) + Ephemeral (/tmp)
|
|
98
|
+
|
|
99
|
+
### Ephemeral `/tmp` (default — reset por invocação)
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
Deno.serve(async (req) => {
|
|
103
|
+
if (req.headers.get('content-type') !== 'application/zip') {
|
|
104
|
+
return new Response('zip required', { status: 400 })
|
|
105
|
+
}
|
|
106
|
+
const uploadId = crypto.randomUUID()
|
|
107
|
+
await Deno.writeFile(`/tmp/${uploadId}.zip`, req.body!)
|
|
108
|
+
// PT-BR: processa em background para não exceder memória
|
|
109
|
+
EdgeRuntime.waitUntil(processZip(uploadId))
|
|
110
|
+
return Response.json({ uploadId })
|
|
111
|
+
})
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Limites: Free 256 MB, Paid 512 MB.
|
|
115
|
+
|
|
116
|
+
### Persistent S3FS — mount qualquer S3-compatible bucket
|
|
117
|
+
|
|
118
|
+
Secrets necessários (`supabase secrets set ...`):
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
S3FS_ENDPOINT_URL=https://<project>.supabase.co/storage/v1/s3
|
|
122
|
+
S3FS_REGION=us-east-1
|
|
123
|
+
S3FS_ACCESS_KEY_ID=...
|
|
124
|
+
S3FS_SECRET_ACCESS_KEY=...
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Para Supabase Storage S3, gerar access key em [Storage > S3 Connection](https://supabase.com/docs/guides/storage/s3/authentication).
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
// Leitura
|
|
131
|
+
const csv = await Deno.readFile('/s3/uploads/results.csv')
|
|
132
|
+
|
|
133
|
+
// Escrita
|
|
134
|
+
await Deno.writeTextFile('/s3/exports/report-2026.txt', 'hello')
|
|
135
|
+
|
|
136
|
+
// Criar subdiretório
|
|
137
|
+
await Deno.mkdir('/s3/uploads/2026-05')
|
|
138
|
+
|
|
139
|
+
// Listar
|
|
140
|
+
for await (const entry of Deno.readDir('/s3/uploads')) {
|
|
141
|
+
console.log(entry.name)
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Mount path: `/s3/<bucket-name>/<key>`. Sem limites Supabase específicos (limites do S3 backend aplicam).
|
|
146
|
+
|
|
147
|
+
### Sync File APIs — só na inicialização
|
|
148
|
+
|
|
149
|
+
```ts
|
|
150
|
+
// ✓ ok — durante script init
|
|
151
|
+
const config = JSON.parse(Deno.readTextFileSync('/s3/config/app.json'))
|
|
152
|
+
|
|
153
|
+
Deno.serve(async (req) => {
|
|
154
|
+
// ⚠ ERRO — Deno.statSync blocklisted em callback
|
|
155
|
+
// Deno.statSync('/tmp/x')
|
|
156
|
+
|
|
157
|
+
// ✓ certo — usar versão async
|
|
158
|
+
const info = await Deno.stat('/tmp/x')
|
|
159
|
+
})
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
APIs sync (`Deno.readFileSync`, `statSync`, `mkdirSync`, etc.) **só durante initial script evaluation**. Em handlers/setTimeout/etc — sempre async.
|
|
163
|
+
|
|
164
|
+
## 3. Regional Invocation
|
|
165
|
+
|
|
166
|
+
Edge Functions executam na região mais próxima ao caller por default. Para forçar região específica (útil quando função é DB-heavy e DB é regional):
|
|
167
|
+
|
|
168
|
+
### Via SDK
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
import { FunctionRegion } from 'npm:@supabase/supabase-js@2.95.0'
|
|
172
|
+
|
|
173
|
+
await supabase.functions.invoke('bulk-import', {
|
|
174
|
+
body: payload,
|
|
175
|
+
region: FunctionRegion.SaEast1, // São Paulo
|
|
176
|
+
})
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Via header (qualquer cliente HTTP)
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
curl -X POST https://<ref>.supabase.co/functions/v1/bulk-import \
|
|
183
|
+
-H 'apikey: sb_publishable_...' \
|
|
184
|
+
-H 'x-region: sa-east-1' \
|
|
185
|
+
-d '{...}'
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Quando header não disponível (CORS, webhooks) — query param
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
https://<ref>.supabase.co/functions/v1/bulk-import?forceFunctionRegion=sa-east-1
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Regiões disponíveis (14 total)
|
|
195
|
+
|
|
196
|
+
| Cluster | Regiões |
|
|
197
|
+
|---|---|
|
|
198
|
+
| América do Sul | `sa-east-1` (São Paulo) |
|
|
199
|
+
| América do Norte | `ca-central-1`, `us-east-1`, `us-west-1`, `us-west-2` |
|
|
200
|
+
| Europa | `eu-central-1`, `eu-west-1`, `eu-west-2`, `eu-west-3` |
|
|
201
|
+
| Ásia-Pacífico | `ap-northeast-1`, `ap-northeast-2`, `ap-south-1`, `ap-southeast-1`, `ap-southeast-2` |
|
|
202
|
+
|
|
203
|
+
### Verificar região da execução
|
|
204
|
+
|
|
205
|
+
```ts
|
|
206
|
+
console.log('executed in:', Deno.env.get('SB_REGION'))
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Response header `x-sb-edge-region` indica para o caller.
|
|
210
|
+
|
|
211
|
+
**Caveat:** com `x-region` explícito, requests **não** failover automático em outage da região. Considere fallback para default region em SDK wrapper.
|
|
212
|
+
|
|
213
|
+
## 4. WebSockets
|
|
214
|
+
|
|
215
|
+
```toml
|
|
216
|
+
# supabase/config.toml — REQUIRED para WebSocket local
|
|
217
|
+
[edge_runtime]
|
|
218
|
+
policy = "per_worker"
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
```ts
|
|
222
|
+
// supabase/functions/realtime-chat/index.ts
|
|
223
|
+
import { createClient } from 'npm:@supabase/supabase-js@2.95.0'
|
|
224
|
+
|
|
225
|
+
const SECRET = JSON.parse(Deno.env.get('SUPABASE_SECRET_KEYS')!)
|
|
226
|
+
const supabase = createClient(Deno.env.get('SUPABASE_URL')!, SECRET['default'])
|
|
227
|
+
|
|
228
|
+
Deno.serve(async (req) => {
|
|
229
|
+
const upgrade = req.headers.get('upgrade') ?? ''
|
|
230
|
+
if (upgrade.toLowerCase() !== 'websocket') {
|
|
231
|
+
return new Response('expected websocket upgrade', { status: 400 })
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// PT-BR: browser WebSocket não permite custom headers → JWT via query param
|
|
235
|
+
const jwt = new URL(req.url).searchParams.get('jwt') ?? ''
|
|
236
|
+
const { data, error } = await supabase.auth.getUser(jwt)
|
|
237
|
+
if (error || !data.user) return new Response('unauthorized', { status: 403 })
|
|
238
|
+
|
|
239
|
+
const { socket, response } = Deno.upgradeWebSocket(req)
|
|
240
|
+
|
|
241
|
+
socket.onopen = () => console.log('socket opened', { user: data.user!.id })
|
|
242
|
+
socket.onmessage = (e) => {
|
|
243
|
+
socket.send(JSON.stringify({ echo: e.data, at: Date.now() }))
|
|
244
|
+
}
|
|
245
|
+
socket.onerror = (e) => console.log('socket error:', (e as ErrorEvent).message)
|
|
246
|
+
socket.onclose = () => console.log('socket closed')
|
|
247
|
+
|
|
248
|
+
return response
|
|
249
|
+
})
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
```toml
|
|
253
|
+
[functions.realtime-chat]
|
|
254
|
+
verify_jwt = false # JWT validado via query param no handler
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
Deploy: `supabase functions deploy realtime-chat --no-verify-jwt`.
|
|
258
|
+
|
|
259
|
+
**Alternativa autenticação:** subprotocol no header `Sec-WebSocket-Protocol: jwt-<token>` — parse no handler.
|
|
260
|
+
|
|
261
|
+
### Outbound WebSocket (proxy/relay)
|
|
262
|
+
|
|
263
|
+
Edge Function pode abrir WebSocket para outro server e fazer relay (ex: OpenAI Realtime API). Padrão duplo: inbound `Deno.upgradeWebSocket` + outbound `new WebSocket('wss://...')`.
|
|
264
|
+
|
|
265
|
+
## 5. Wasm modules
|
|
266
|
+
|
|
267
|
+
### Setup Rust + wasm-bindgen
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
# Dentro da pasta da função
|
|
271
|
+
cd supabase/functions/wasm-add
|
|
272
|
+
cargo new --lib add-wasm
|
|
273
|
+
# Editar Cargo.toml com wasm-bindgen dep + crate-type = ["cdylib"]
|
|
274
|
+
# Editar src/lib.rs com #[wasm_bindgen] add function
|
|
275
|
+
wasm-pack build --target deno
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
```toml
|
|
279
|
+
# supabase/config.toml — CLI 2.7.0+
|
|
280
|
+
[functions.wasm-add]
|
|
281
|
+
static_files = ["./functions/wasm-add/add-wasm/pkg/*"]
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
```ts
|
|
285
|
+
// supabase/functions/wasm-add/index.ts
|
|
286
|
+
import init, { add } from './add-wasm/pkg/add_wasm.js'
|
|
287
|
+
|
|
288
|
+
await init() // PT-BR: Deno 2.1+ vai simplificar isso
|
|
289
|
+
|
|
290
|
+
Deno.serve(async (req) => {
|
|
291
|
+
const { a, b } = await req.json()
|
|
292
|
+
return Response.json({ sum: add(a, b) })
|
|
293
|
+
})
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**Caveat:** `static_files` **não funciona** com `--use-api`. Precisa Docker no build: `supabase functions deploy wasm-add` (sem `--use-api`).
|
|
297
|
+
|
|
298
|
+
### Casos de uso
|
|
299
|
+
|
|
300
|
+
- Image processing pesado (`magick-wasm`)
|
|
301
|
+
- Crypto custom (libsodium)
|
|
302
|
+
- Computações intensivas portadas de C/Rust
|
|
303
|
+
- WebAssembly puro evitando JS overhead
|
|
304
|
+
|
|
305
|
+
## 6. Env vars runtime (read-only)
|
|
306
|
+
|
|
307
|
+
| Variável | O que é |
|
|
308
|
+
|---|---|
|
|
309
|
+
| `SB_REGION` | AWS region da invocação (ex: `us-east-1`) |
|
|
310
|
+
| `SB_EXECUTION_ID` | UUID do isolate atual |
|
|
311
|
+
| `DENO_DEPLOYMENT_ID` | `{project_ref}_{function_id}_{version}` — útil para `build_id` em traces |
|
|
312
|
+
|
|
313
|
+
Usar como atributos canônicos em [`structured-events`](../structured-events/SKILL.md) / [`distributed-tracing`](../distributed-tracing/SKILL.md).
|
|
314
|
+
|
|
315
|
+
```ts
|
|
316
|
+
import { trace } from 'npm:@opentelemetry/api@1.9.0'
|
|
317
|
+
|
|
318
|
+
Deno.serve(async (req) => {
|
|
319
|
+
const span = trace.getActiveSpan()
|
|
320
|
+
span?.setAttributes({
|
|
321
|
+
'sb.region': Deno.env.get('SB_REGION')!,
|
|
322
|
+
'sb.execution_id': Deno.env.get('SB_EXECUTION_ID')!,
|
|
323
|
+
'build_id': Deno.env.get('DENO_DEPLOYMENT_ID')!,
|
|
324
|
+
})
|
|
325
|
+
// ...
|
|
326
|
+
})
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
## Anti-patterns
|
|
330
|
+
|
|
331
|
+
### AR1 — Heavy LLM em Edge Function user-facing
|
|
332
|
+
Wall clock free 150s, paid 400s, CPU 2s/request. LLM grande estoura. Para inference síncrona pesada, considere job queue + worker dedicado (`pg_cron` → `pgmq` → Edge → external).
|
|
333
|
+
|
|
334
|
+
### AR2 — `/s3/` sem S3FS env vars
|
|
335
|
+
Mount path requer 4 env vars. Sem elas, write retorna `EACCES`. Validar `supabase secrets list` antes de deploy.
|
|
336
|
+
|
|
337
|
+
### AR3 — WebSocket sem `per_worker` local
|
|
338
|
+
Local fecha conexão em 1s. Sempre `policy = "per_worker"` em `config.toml` para WebSocket dev.
|
|
339
|
+
|
|
340
|
+
### AR4 — `x-region` em endpoint com failover esperado
|
|
341
|
+
Header desliga roteamento automático. Use apenas quando latência regional > tolerância para outages.
|
|
342
|
+
|
|
343
|
+
### AR5 — Wasm com `--use-api` deploy
|
|
344
|
+
`static_files` requer Docker no bundle. Falha silenciosamente em API deploy.
|
|
345
|
+
|
|
346
|
+
### AR6 — `Supabase.ai.Session` para textos > 512 tokens (gte-small)
|
|
347
|
+
gte-small trunca para 512 tokens; embeddings podem perder precisão. Para textos longos, chunk antes ou use modelo maior (Ollama com all-minilm/embeddings).
|
|
348
|
+
|
|
349
|
+
## Ver também
|
|
350
|
+
|
|
351
|
+
- [`supabase-edge-functions`](../supabase-edge-functions/SKILL.md) — base
|
|
352
|
+
- [`supabase-edge-functions-limits`](../supabase-edge-functions-limits/SKILL.md) — limits para AI/Wasm
|
|
353
|
+
- [`supabase-pgvector-rag`](../supabase-pgvector-rag/SKILL.md) — embeddings em DB
|
|
354
|
+
- [`supabase-storage`](../supabase-storage/SKILL.md) — alternativa user-managed
|
|
355
|
+
- [`supabase-realtime`](../supabase-realtime/SKILL.md) — quando preferir Realtime broadcast vs WebSocket custom
|
|
356
|
+
- [`structured-events`](../structured-events/SKILL.md) — atributos canônicos `sb.region`, `build_id`
|
|
357
|
+
- [`llm-as-dependency`](../llm-as-dependency/SKILL.md) — adapter pattern para Supabase.ai
|