neondatabase/neon-functions

Déployez et gérez des gestionnaires HTTP Node.js longue durée à proximité de votre base de données Neon, pour des workloads exigeants comme des agents LLM, WebSockets, SSE, et des webhooks.

Qu'est-ce que neon-functions ?

Ce skill permet aux développeurs de définir, exécuter localement, déployer et gérer des fonctions Neon — des gestionnaires HTTP Node.js longue durée exécutées sur une branche Neon. Chaque fonction reçoit une URL HTTPS publique, s'exécute dans la même région que la base de données, et obtient automatiquement la variable d'environnement `DATABASE_URL` si la branche dispose de Postgres. Les fonctions Neon sont idéales pour les workloads qui nécessitent des sessions longues (agents LLM, génération d'images/vidéos), du streaming d'état (SSE, WebSockets), ou un calcul proche des données. Elles prennent en charge les handlers web standards (compatibles Workers/WinterTC, Hono), s'intègrent avec le CLI Neon, `neon.ts`, et l'API Neon, et sont actuellement en bêta publique dans les régions `us-east-2` et `eu-central-1`. Le skill guide l'utilisateur à travers la configuration (`neon.ts`), le développement local (`neon dev`), le déploiement (`neon deploy`), et la gestion des variables d'environnement, y compris les secrets et les variables injectées par Neon.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/neondatabase/agent-skills/tree/main/skills/neon-functions

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

PREMIEREMENT: Utilisez le skill parent neon pour une vue d'ensemble de Neon, la prise en main, les bonnes pratiques de développement, etc.

Si le skill neon n'est pas installé, récupérez-le depuis https://neon.com/docs/ai/skills/neon/SKILL.md ou installez-le avec :

npx skills add neondatabase/agent-skills --skill neon

Neon Functions

Ceci est une fonctionnalité en bêta publique, actuellement disponible dans les régions us-east-2 et eu-central-1.

Les Neon Functions sont des gestionnaires HTTP Node.js longue durée déployés sur une branche Neon. Chaque fonction reçoit une URL HTTPS publique, s'exécute dans la même région que votre base de données et — si la branche dispose de Postgres — reçoit automatiquement la variable DATABASE_URL. Vous les déployez et gérez via le même CLI Neon, neon.ts et API que vous utilisez déjà.

Utilisez ce skill pour aider l'utilisateur à définir, exécuter localement, déployer et gérer des fonctions à côté de leur base de données. Livrez une fonction déployée avec son URL d'invocation, une boucle locale fonctionnelle neon dev, ou une réponse précise issue de la documentation officielle de Neon.

Quand Utiliser

Utilisez Neon Functions lorsque le workload est un gestionnaire requête/réponse qui bénéficie de rester actif et proche des données :

  • Flux requête/réponse longs qui dépassent les limites des fonctions lambda. Les agents qui effectuent plusieurs appels LLM et invocations d'outils par requête, ou la génération d'images/vidéos, dépassent régulièrement les limites d'exécution de ~10-60 secondes et les fenêtres de streaming courtes des fonctions serverless traditionnelles. Les Neon Functions sont longue durée : le gestionnaire doit seulement commencer à répondre sous 15 minutes, et un flux ouvert reste actif tant que des octets continuent de circuler. Cela offre suffisamment de marge pour les workloads d'agents réels.
  • Streaming avec état sans ajouter Redis. Comme une fonction reste active pendant toute une requête, elle peut héberger un point de terminaison SSE ou un serveur WebSocket et maintenir la connexion ouverte dans le processus — pas besoin de magasin d'état externe (Redis, etc.) pour garder un flux cohérent. L'état au niveau du module (un pool pg, un compteur en mémoire) persiste entre les requêtes sur le même isolate.
  • Calcul devant être proche de Postgres. La fonction s'exécute dans la même région que la base de données de la branche, donc il n'y a pas d'aller-retour entre régions pour chaque requête. DATABASE_URL est injectée automatiquement.
  • Un backend qui se branche avec vos données. Chaque branche exécute sa propre version de la fonction à sa propre URL, avec sa propre base de données isolée (et son stockage, et sa passerelle). Les déploiements de prévisualisation, CI et environnements de développement obtiennent chacun un backend autonome — déployer sur une branche enfant n'affecte jamais la branche parent.
  • Webhooks, bots et travail post-réponse. Les gestionnaires de webhook qui se répartissent en plusieurs écritures DB, les bots Discord/WebSocket, et les suivis "fire-and-forget" via waitUntil (analytiques, journaux d'audit) sont tous adaptés.
  • Travail HTTP récurrent. Un Déclencheur de Fonction envoie une requête POST à la fonction selon un cron (type: "schedule"). Même gestionnaire fetch, même limite de 15 minutes pour le premier octet. Voir Déclencheurs de Fonction.

Si le workload est un site statique pur, ou quelque chose qui doit s'exécuter en dehors des régions supportées (us-east-2, eu-central-1) aujourd'hui, ce n'est pas encore l'outil adapté (voir Limites de Temporisation et d'Exécution et Disponibilité).

Ce Qu'il Fait

  • Longue durée et serverless — Conçu pour les serveurs WebSocket (voir Serveurs WebSocket), les points de terminaison SSE (voir Server-Sent Events (SSE)), les longs flux HTTP d'agents, et les API. Se réduit à zéro lorsqu'il est inactif.
  • Gestionnaire standard du Web — Une fonction est n'importe quelle exportation par défaut avec une méthode fetch(request) retournant une Response (compatible Workers/WinterTC). Une application Hono exporte exactement cette forme, donc export default app fonctionne tel quel. S'exécute sur Node.js 24, donc toutes les API Node sont disponibles.
  • Proche de votre base de données — S'exécute dans la région de la branche ; DATABASE_URL est injectée automatiquement lorsque la branche dispose de Postgres.
  • Brancheable — Chaque branche exécute sa propre version de la fonction à sa propre URL avec son propre état isolé.
  • Même CLI/API — Déployez et gérez via neon, neon.ts, ou l'API Neon.
  • Déclencheurs de Fonction — Neon envoie une requête POST à la fonction selon un cron. Voir Déclencheurs de Fonction.

Disponibilité

Vérifiez cette condition préalable avant toute configuration : les Neon Functions sont une fonctionnalité en bêta publique actuellement disponible dans les régions us-east-2 et eu-central-1. Confirmez que le projet Neon de l'utilisateur se trouve dans l'une de ces régions. L'utilisation des fonctions n'est pas facturée pendant la bêta publique.

Architecture : Où les Fonctions S'Intègrent

Neon (y compris les Fonctions) est un ensemble de primitives backend, pas un hébergement d'application complète. Hébergez votre application sur Vercel (ou Netlify, ou un autre hébergeur frontend/application) ; les Fonctions sont la partie longue durée et avec état de votre backend qui vit près de vos données. Elles se composent avec cette plateforme de deux manières :

  • Ajoutez une Fonction à une application full-stack. Votre application Next.js / TanStack Start sur Vercel (ou Netlify) gère l'UI, l'authentification (ex.: Neon Auth), et communique directement avec Lakebase Postgres et Object Storage. Lorsqu'un workload dépasse les limites serverless courtes de l'hôte — un serveur WebSocket ou SSE, ou un agent longue durée qui expirerait — déplacez uniquement cette partie vers une Neon Function. (Voir Fonctions comme Backend d'Agent pour le motif client-direct.)
  • Exécutez tout le plan de contrôle backend sur les Fonctions. Surtout lorsque le frontend est uniquement client — TanStack Router, React Router en mode client, et autres SPA hébergées sur Vercel ou Netlify — le client appelle les Fonctions directement. Construisez des API REST et des agents requête/réponse, hébergez des serveurs MCP, et exécutez tout ce qui nécessite un état ou qui doit être proche de Postgres et Object Storage.

Dans les deux cas, sécurisez une Fonction comme n'importe quelle API REST autonome : vérifiez un JWT ou une clé API en haut du gestionnaire (voir l'AVERTISSEMENT sous Fonctions comme Backend d'Agent). Parce qu'une Fonction est simplement votre backend, vous pouvez déplacer des éléments entre votre hébergeur et Neon — relocalisez un agent ou un serveur WebSocket avec état sur une Fonction lorsqu'il a besoin de plus de temps d'exécution, et inversement si nécessaire.

Configuration

Les Fonctions sont déclarées dans neon.ts (voir le skill neon pour le workflow axé sur les branches et les bases de neon.ts). Ajoutez @neon/config et déclarez les fonctions sous preview.functions, avec un slug comme clé :

// neon.ts
import { defineConfig } from "@neon/config/v1";

export default defineConfig({
  preview: {
    functions: {
      todos: {
        // slug : ^[a-z0-9]{1,20}$ — lettres minuscules/chiffres, pas de traits d'union
        name: "todo api", // étiquette d'affichage uniquement
        source: "src/index.ts", // fichier d'entrée, relatif à neon.ts
      },
    },
  },
});

Le slug est l'identité permanente de la fonction (il apparaît dans l'URL d'invocation et les commandes CLI) et ne peut pas être modifié après le premier déploiement. Utilisez name pour une étiquette lisible par l'humain.

Une fonction minimale — une application Hono qui interroge le Postgres de la branche via la DATABASE_URL injectée :

// src/index.ts
import { Hono } from "hono";
import { drizzle } from "drizzle-orm/node-postgres";
import { Pool } from "pg";
import { parseEnv } from "@neon/env";
import { attachDatabasePool } from "@neon/functions";
import config from "../neon";
import { todos } from "./db/schema";

const env = parseEnv(config);
const pool = new Pool({ connectionString: env.postgres.databaseUrl, max: 5 });
attachDatabasePool(pool);
const db = drizzle(pool);

const app = new Hono();
app.get("/", (c) => c.text("Neon + Hono + Drizzle"));
app.post("/todos", async (c) => {
  const { text } = await c.req.json<{ text: string }>();
  const [row] = await db.insert(todos).values({ text }).returning();
  return c.json(row, 201);
});
app.get("/todos", async (c) => c.json(await db.select().from(todos)));

export default app;

Créez le pool pg au niveau du module (réutilisé entre les requêtes sur le même isolate) et gardez max petit (ex. 5), car chaque isolate conserve son propre pool. Appelez attachDatabasePool(pool) pour qu'une déconnexion inactive ne soit pas une uncaughtException — voir Connexion à Postgres.

parseEnv(config) exige toutes les variables que la configuration implique. Une fonction qui ne communique qu'avec Postgres via l'URL poolée peut se limiter à cette seule clé — parseEnv valide alors et retourne uniquement ce qui a été demandé (les clés s'autocomplètent depuis votre neon.ts) :

const { postgres } = parseEnv(config, ["DATABASE_URL"]); // pas l'URL non poolée, auth, etc.
const pool = new Pool({ connectionString: postgres.databaseUrl, max: 5 });
attachDatabasePool(pool);

Développement Local et Déploiement

neon dev      # sert chaque fonction dans neon.ts avec rechargement à chaud ; injecte DATABASE_URL et autres
neon deploy --env <fichier>   # déploiement complet préféré depuis neon.ts ; --env est le fichier d'environnement de la Fonction

Gardez .env ou .env.local à jour avec chaque clé sous preview.functions.*.env. neon env pull écrit uniquement les variables gérées par Neon ; ajoutez les secrets de la Fonction à ce fichier, puis passez-le avec --env. neon deploy --env <fichier> charge ce fichier dans process.env à chaque fois, puis télécharge ces valeurs. Une valeur manquante est undefined et defineConfig lève une erreur. Omettez la clé de neon.ts si vous ne voulez pas l'écrire. Ne forcez jamais une valeur process.env manquante en une chaîne vide (cela télécharge "" et supprime la clé en ligne). Une affectation vide (KEY=) est aussi "". Utilisez process.env.X! quand TypeScript a besoin d'une assertion.

Pour déployer une seule fonction sans appliquer neon.ts : neon functions deploy <slug> --src src/index.ts (--src prend soit le fichier d'entrée, soit un répertoire contenant index.ts, index.mjs, ou index.js). Le --env de cette commande est KEY=VALUE (répétable), pas un chemin de fichier. Utilisez-le pour une mise à jour ciblée de l'environnement. Récupérez l'URL publique avec neon functions get <slug> (le champ invocation_url, de la forme https://<branch_id>-<slug>.compute.<cell>.us-east-2.aws.neon.tech). Gérez avec neon functions list|get|delete.

Quand neon checkout crée une nouvelle branche et qu'un neon.ts est présent, il applique la politique automatiquement. Cette création-application ne charge pas --env. Si l'environnement de la Fonction lit process.env, exécutez neon deploy --env <fichier> après le checkout (ajoutez --update-existing si le checkout a déjà créé la branche). Le checkout d'une branche existante ne redéploie pas ; exécutez neon deploy --env <fichier> explicitement.

Infrastructure en tant que Code Neon (neon.ts)

Le bloc preview.functions de la Configuration fait partie de neon.ts, le fichier d'infrastructure en tant que code de Neon — un seul fichier TypeScript déclare chaque fonction (son source, name d'affichage, et env) avec les autres services de la branche, dans le contrôle de version (voir le skill neon pour la référence complète). Traitez-le comme Terraform pour votre branche :

neon config status   # affiche la configuration en direct de la branche (fonctions déployées)
neon config plan     # simulation des différences que apply changerait
neon config apply --env <fichier>  # regroupe + déploie les fonctions déclarées (neon deploy est un alias ; passez --env quand l'environnement de la Fonction lit process.env)

Les fonctions sont limitées à la branche : chaque branche exécute son propre déploiement à sa propre URL. Lorsqu'un neon.ts est présent, neon checkout applique la politique lors de la création d'une branche. Cette création-application ne charge pas --env. Si l'environnement de la Fonction lit process.env, exécutez neon deploy --env <fichier> après le checkout. Le checkout d'une branche existante ne redéploie pas — exécutez neon deploy --env <fichier> pour appliquer les changements.

Le réglage du déploiement par branche (ex. runtime) se trouve dans la fermeture branch, avec le slug comme clé, afin qu'il puisse varier par branche sans modifier les fonctions existantes :

export default defineConfig({
  preview: {
    functions: { todos: { name: "todo api", source: "src/index.ts" } },
  },
  branch: (branch) => ({
    preview: { functions: { todos: { runtime: "nodejs24" } } },
  }),
});

Variables d'Environnement

Neon injecte les chaînes de connexion et les URL de service limitées à la branche au moment de l'exécution — vous ne les déclarez ni ne les passez au moment du déploiement :

VariableNotes
NEON_BRANCHLe nom de la branche (ex. main, preview/foo). Injecté sur chaque branche, y compris la branche par défaut.
DATABASE_URLChaîne de connexion poolée. Utilisez pour la plupart des requêtes. Présente uniquement si la branche dispose de Postgres.
DATABASE_URL_UNPOOLEDConnexion directe. Utilisez pour les migrations, LISTEN/NOTIFY, les transactions multi-aller-retour.
NEON_AUTH_BASE_URLPrésente lorsque Neon Auth est activé sur la branche.
NEON_DATA_API_URLPrésente lorsque l'API Données est activée sur la branche.

Les variables du stockage d'objets (AWS_*) et de la passerelle AI (NEON_AI_GATEWAY_*) sont également injectées lorsque ces services sont déclarés — voir les skills neon-object-storage et neon-ai-gateway.

neon env pull / neon-env run / neon dev émettent également NEON_BRANCH (et les chaînes de connexion) dans votre environnement de développement local, afin que les exécutions locales reflètent l'environnement d'exécution déployé.

Vos propres secrets sont par déploiement. Chemin préféré : déclarez-les dans neon.ts et exécutez neon deploy --env <fichier>. <fichier> est le fichier ignoré par git que env pull écrit déjà (.env si ce fichier existe, sinon .env.local). Env pull écrit uniquement les variables gérées par Neon ; ajoutez les secrets de la Fonction à ce fichier. Toutes les clés d'environnement de Fonction déclarées doivent être présentes. Omettez une clé de neon.ts si vous ne voulez pas l'écrire. undefined signifie que vous avez demandé à écrire la clé et que la valeur est manquante (defineConfig lève une erreur). Ne forcez jamais une valeur process.env manquante en une chaîne vide : cela télécharge "" et supprime la clé en ligne. Une affectation vide dans le fichier (KEY=) est aussi "". Si TypeScript a besoin d'une assertion, utilisez `process.env.

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

neondatabase/claimable-postgres

Provision instant temporary Postgres databases via Claimable Postgres by Neon (neon.new) with no login, signup, or credit card. Supports REST API, CLI, and SDK. Use when users ask for a quick Postgres environment, a throwaway DATABASE_URL for prototyping/tests, or "just give me a DB now". Triggers include: "quick postgres", "temporary postgres", "no signup database", "no credit card database", "instant DATABASE_URL", "npx neon-new", "neon.new", "neon.new API", "claimable postgres API".

neondatabase/neon

>-

neondatabase/neon-ai-gateway

>-

neondatabase/neon-object-storage

>-

neondatabase/neon-postgres

Guides and best practices for working with Neon Serverless Postgres. Covers setup, connection methods, branching, autoscaling, scale-to-zero, read replicas, connection pooling, Neon Auth, and the Neon CLI, MCP server, REST API, TypeScript SDK, and Python SDK. Use when users ask about "Neon setup", "connect to Neon", "Neon project", "DATABASE_URL", "serverless Postgres", "Neon CLI", "neonctl", "Neon MCP", "Neon Auth", "@neondatabase/serverless", "@neondatabase/neon-js", "scale to zero", "Neon autoscaling", "Neon read replica", or "Neon connection pooling".

neondatabase/neon-postgres-branches

>-

neondatabase/neon-postgres-egress-optimizer

Diagnose and fix excessive Postgres egress (network data transfer) in a codebase. Use when a user mentions high database bills, unexpected data transfer costs, network transfer charges, egress spikes, "why is my Neon bill so high", "database costs jumped", SELECT * optimization, query overfetching, reduce Neon costs, optimize database usage, or wants to reduce data sent from their database to their application. Also use when reviewing query patterns for cost efficiency, even if the user doesn't explicitly mention egress or data transfer.

Skills associés