Guida

Chiamare l'AI dal server

Molti progetti di Fattibile usano l'AI (testi, immagini, analisi). Il modo sicuro è sempre lo stesso: il sito chiede a una Edge Function, che controlla chi è l'utente, scala un credito e chiama l'AI con la chiave segreta, che non arriva mai al browser.

In ogni scheda trovi solo le "Istruzioni per l'AI" di quel progetto: vanno messe al posto delle istruzioni di esempio nel codice qui sotto.

La funzione completa

Sostituisci il testo di ISTRUZIONI con quello della scheda. Se la scheda dice che l'AI "risponde in JSON", cambia l'ultima riga come indicato nel commento.

Edge Function che chiama Claude

La Edge Function che riceve la richiesta dell'utente, scala un credito e chiede il risultato a Claude. La chiave dell'AI resta segreta sul server.

// supabase/functions/nome-funzione/index.ts
import Anthropic from "npm:@anthropic-ai/sdk";
import { createClient } from "npm:@supabase/supabase-js";

const claude = new Anthropic({ apiKey: Deno.env.get("ANTHROPIC_API_KEY")! });
const admin = createClient(
  Deno.env.get("SUPABASE_URL")!,
  Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!,
);
const cors = {
  "Access-Control-Allow-Origin": "*",
  "Access-Control-Allow-Headers": "authorization, x-client-info, apikey, content-type",
};

const ISTRUZIONI = `INCOLLA QUI LE ISTRUZIONI PER L'AI DELLA SCHEDA.`;

Deno.serve(async (req) => {
  if (req.method === "OPTIONS") return new Response("ok", { headers: cors });

  // Chi sta chiamando? Lo dice il token dell'utente collegato
  const token = req.headers.get("Authorization")?.replace("Bearer ", "") ?? "";
  const { data: { user } } = await admin.auth.getUser(token);
  if (!user) return new Response("Accesso richiesto", { status: 401, headers: cors });

  // Scala un credito: se sono finiti, si ferma qui
  const { data: ok } = await admin.rpc("usa_credito", { utente: user.id });
  if (!ok) return new Response("Crediti finiti", { status: 402, headers: cors });

  const { richiesta } = await req.json();
  const risposta = await claude.beta.messages.create({
    model: "claude-opus-5",
    max_tokens: 16000,
    betas: ["server-side-fallback-2026-07-01"],
    fallbacks: "default", // se il modello rifiuta, ripiega da solo su un altro
    system: ISTRUZIONI,
    messages: [{ role: "user", content: richiesta }],
  });
  if (risposta.stop_reason === "refusal") {
    await admin.rpc("aggiungi_crediti", { utente: user.id, quanti: 1 }); // rimborso
    return new Response("Richiesta non accettata", { status: 422, headers: cors });
  }

  const testo = risposta.content
    .filter((b) => b.type === "text")
    .map((b) => b.text)
    .join("");
  return Response.json({ testo }, { headers: cors });   // se l'AI risponde in JSON: Response.json(JSON.parse(testo), ...)
});

Perché è fatta così

- La chiave ANTHROPIC_API_KEY sta nei segreti della Edge Function: se fosse nel sito, chiunque potrebbe usarla a tue spese.
- Il credito si scala prima della chiamata: se l'utente ne ha zero, non si spende nulla.
- Se l'AI rifiuta la richiesta (stop_reason "refusal"), il credito viene restituito e l'utente riceve un messaggio chiaro.
- Le istruzioni fisse (system prompt) dicono all'AI come comportarsi e cosa NON fare (inventare dati, dare consigli medici...): sono la parte più importante da scrivere bene.
- Con l'abbonamento, al posto di usa_credito si controllano piano e limiti del mese (vedi la guida "Profili, piano e crediti").

La frase da dare all'AI

Chiamate all'AI sicure

Da copiare in Lovable, Bolt o nello strumento che usi, dopo le frasi della scheda.

Per ogni funzione che usa l'intelligenza artificiale crea una Edge Function di Supabase che:
1. legge l'utente dal token di accesso e rifiuta chi non è collegato;
2. scala un credito con la funzione usa_credito (o controlla il piano, se il progetto è ad abbonamento);
3. chiama Claude con le istruzioni fisse indicate nella scheda, usando la chiave ANTHROPIC_API_KEY salvata nei segreti;
4. se l'AI rifiuta o c'è un errore, restituisce il credito e mostra un messaggio chiaro in italiano;
5. non espone mai la chiave dell'AI nel codice del sito.
System prompt
Le istruzioni fisse che dai all'AI prima della richiesta dell'utente, per dirle come comportarsi.
Edge Function
Un piccolo programma che gira sui server di Supabase, dove si possono usare chiavi segrete.
Crediti
Un gettone da spendere per ogni uso: si comprano a pacchetti e il sistema li scala da solo.