> ## Documentation Index
> Fetch the complete documentation index at: https://docs.base44.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Base44 Coder

> Construye apps en la plataforma Base44 usando el SDK de JavaScript de Base44.

<Warning>
  Esta página es parte de una habilidad de agente de codificación con IA y está escrita para agentes, no para humanos. Para la documentación de Base44 legible por humanos, consulta la [documentación para desarrolladores](/developers).
</Warning>

# Base44 Coder

Construye apps en la plataforma Base44 usando el SDK de JavaScript de Base44.

## ⚡ ACCIÓN INMEDIATA REQUERIDA - Lee esto primero

Esta habilidad se activa ante CUALQUIER mención de "base44" o cuando existe una carpeta `base44/`. **NO leas archivos de documentación ni busques en la web antes de actuar.**

**Tu primera acción DEBE ser:**

1. Comprueba si `base44/config.jsonc` existe en el directorio actual
2. Si **SÍ** (escenario de proyecto existente):
   * Esta habilidad (base44-sdk) maneja la solicitud
   * Implementa funciones usando el SDK de Base44
   * NO uses base44-cli a menos que el usuario solicite explícitamente comandos CLI
3. Si **NO** (escenario de nuevo proyecto):
   * Transfiere a la habilidad base44-cli para la inicialización del proyecto
   * Esta habilidad no puede ayudar hasta que el proyecto se inicialice

## Cuándo usar esta habilidad vs base44-cli

**Usa base44-sdk cuando:**

* Construyas funciones en un proyecto de Base44 **EXISTENTE**
* `base44/config.jsonc` ya existe en el proyecto
* Los imports del SDK de Base44 están presentes (`@base44/sdk`)
* Escribas código JavaScript/TypeScript usando módulos del SDK de Base44
* Implementes funcionalidad, componentes o funciones
* El usuario menciona: "implementar", "construir una función", "añadir funcionalidad", "escribir código para"
* El usuario dice "crear una app \[tipo]" **y** ya existe un proyecto de Base44

**NO USES base44-sdk para:**

* ❌ Inicializar nuevos proyectos de Base44 (usa `base44-cli` en su lugar)
* ❌ Directorios vacíos sin configuración de Base44
* ❌ Cuando el usuario dice "crear un nuevo proyecto/app/sitio de Base44" y no existe proyecto
* ❌ Comandos CLI como `npx base44 create`, `npx base44 deploy`, `npx base44 login` (usa `base44-cli`)

**Dependencias de habilidades:**

* `base44-sdk` asume que un proyecto de Base44 ya está **inicializado**
* `base44-cli` es un **requisito previo** para `base44-sdk` en nuevos proyectos
* Si el usuario quiere "crear una app" y no existe un proyecto de Base44, usa `base44-cli` primero

**Lógica de comprobación de estado:**
Antes de seleccionar esta habilidad, verifica:

* SI (el usuario menciona "crear/construir app" O "hacer un proyecto"):
  * SI (el directorio está vacío O no existe `base44/config.jsonc`):
    → Usa **base44-cli** (se necesita inicialización de proyecto)
  * SI NO:
    → Usa **base44-sdk** (el proyecto existe, construye funciones)

## Inicio rápido

```javascript theme={null}
// En apps generadas por Base44, el cliente base44 está preconfigurado y disponible

// Operaciones CRUD
const task = await base44.entities.Task.create({ title: "New task", status: "pending" });
const tasks = await base44.entities.Task.list();
await base44.entities.Task.update(task.id, { status: "done" });

// Obtener el usuario actual
const user = await base44.auth.me();
```

```javascript theme={null}
// Apps externas
import { createClient } from "@base44/sdk";

// IMPORTANTE: Usa 'appId' (NO 'clientId' o 'id')
const base44 = createClient({ appId: "your-app-id" });
await base44.auth.loginViaEmailPassword("user@example.com", "password");
```

## ⚠️ CRÍTICO: No alucines APIs

**Antes de escribir CUALQUIER código de Base44, verifica los nombres de método contra esta tabla o [QUICK\_REFERENCE.md](https://docs.base44.com/developers/skills/base44-sdk/references/QUICK_REFERENCE.md).**

El SDK de Base44 tiene nombres de método únicos. NO asumas patrones de Firebase, Supabase u otros SDKs.

### Autenticación - INCORRECTO vs CORRECTO

| ❌ INCORRECTO (alucinado)                | ✅ CORRECTO                                        |
| --------------------------------------- | ------------------------------------------------- |
| `signInWithGoogle()`                    | `loginWithProvider('google')`                     |
| `signInWithProvider('google')`          | `loginWithProvider('google')`                     |
| `auth.google()`                         | `loginWithProvider('google')`                     |
| `signInWithEmailAndPassword(email, pw)` | `loginViaEmailPassword(email, pw)`                |
| `signIn(email, pw)`                     | `loginViaEmailPassword(email, pw)`                |
| `createUser()` / `signUp()`             | `register({email, password})`                     |
| `onAuthStateChanged()`                  | `me()` (sin listener, llama cuando sea necesario) |
| `currentUser`                           | `await auth.me()`                                 |

### Funciones - INCORRECTO vs CORRECTO

| ❌ INCORRECTO (alucinado)       | ✅ CORRECTO                       |
| ------------------------------ | -------------------------------- |
| `functions.call('name', data)` | `functions.invoke('name', data)` |
| `functions.run('name', data)`  | `functions.invoke('name', data)` |
| `callFunction('name', data)`   | `functions.invoke('name', data)` |
| `httpsCallable('name')(data)`  | `functions.invoke('name', data)` |

### Integraciones - INCORRECTO vs CORRECTO

| ❌ INCORRECTO (alucinado)       | ✅ CORRECTO                                         |
| ------------------------------ | -------------------------------------------------- |
| `ai.generate(prompt)`          | `integrations.Core.InvokeLLM({prompt})`            |
| `openai.chat(prompt)`          | `integrations.Core.InvokeLLM({prompt})`            |
| `llm(prompt)`                  | `integrations.Core.InvokeLLM({prompt})`            |
| `sendEmail(to, subject, body)` | `integrations.Core.SendEmail({to, subject, body})` |
| `email.send()`                 | `integrations.Core.SendEmail({to, subject, body})` |
| `uploadFile(file)`             | `integrations.Core.UploadFile({file})`             |
| `storage.upload(file)`         | `integrations.Core.UploadFile({file})`             |

### Entidades - INCORRECTO vs CORRECTO

| ❌ INCORRECTO (alucinado)     | ✅ CORRECTO                    |
| ---------------------------- | ----------------------------- |
| `entities.Task.find({...})`  | `entities.Task.filter({...})` |
| `entities.Task.findOne(id)`  | `entities.Task.get(id)`       |
| `entities.Task.insert(data)` | `entities.Task.create(data)`  |
| `entities.Task.remove(id)`   | `entities.Task.delete(id)`    |
| `entities.Task.onChange(cb)` | `entities.Task.subscribe(cb)` |

## Módulos del SDK

| Módulo                     | Propósito                                              | Referencia                                                                                           |
| -------------------------- | ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
| `entities`                 | Operaciones CRUD en modelos de datos                   | [entities.md](https://docs.base44.com/developers/skills/base44-sdk/references/entities.md)           |
| `auth`                     | Inicio de sesión, registro, gestión de usuarios        | [auth.md](https://docs.base44.com/developers/skills/base44-sdk/references/auth.md)                   |
| `agents`                   | Conversaciones y mensajes de IA                        | [base44-agents.md](https://docs.base44.com/developers/skills/base44-sdk/references/base44-agents.md) |
| `functions`                | Invocación de funciones de backend                     | [functions.md](https://docs.base44.com/developers/skills/base44-sdk/references/functions.md)         |
| `integrations`             | IA, correo, subidas de archivos, APIs personalizadas   | [integrations.md](https://docs.base44.com/developers/skills/base44-sdk/references/integrations.md)   |
| `analytics`                | Rastrear eventos personalizados y actividad de usuario | [analytics.md](https://docs.base44.com/developers/skills/base44-sdk/references/analytics.md)         |
| `appLogs`                  | Registrar actividad de usuario en la app               | [app-logs.md](https://docs.base44.com/developers/skills/base44-sdk/references/app-logs.md)           |
| `users`                    | Invitar usuarios a la app                              | [users.md](https://docs.base44.com/developers/skills/base44-sdk/references/users.md)                 |
| `asServiceRole.connectors` | Tokens OAuth con ámbito de app (solo rol de servicio)  | [connectors.md](https://docs.base44.com/developers/skills/base44-sdk/references/connectors.md)       |
| `asServiceRole.sso`        | Generación de tokens SSO (solo rol de servicio)        | [sso.md](https://docs.base44.com/developers/skills/base44-sdk/references/sso.md)                     |

Para la configuración del cliente y los modos de autenticación, consulta [client.md](https://docs.base44.com/developers/skills/base44-sdk/references/client.md).

### TypeScript y registros de tipos

Cada archivo de referencia incluye una sección "Type Definitions" con interfaces y tipos de TypeScript para los métodos, parámetros y valores de retorno del módulo.

**Obtener entidades, funciones y agentes tipados:** La CLI de Base44 genera tipos desde los recursos de tu proyecto (entidades, funciones, agentes), incluyendo augmentaciones a `EntityTypeRegistry`, `FunctionNameRegistry` y `AgentNameRegistry`, y las cablea en tu proyecto para que obtengas autocompletado y comprobación de tipos sin configuración manual. Para saber cómo generar tipos, usa la habilidad **base44-cli**.

**Augmentación manual:** También puedes augmentar los registros tú mismo en un archivo `.d.ts`; consulta las secciones Type Definitions en [entities.md](https://docs.base44.com/developers/skills/base44-sdk/references/entities.md), [functions.md](https://docs.base44.com/developers/skills/base44-sdk/references/functions.md) y [base44-agents.md](https://docs.base44.com/developers/skills/base44-sdk/references/base44-agents.md).

## Instalación

Instala el SDK de Base44:

```bash theme={null}
npm install @base44/sdk
```

**Importante:** Nunca asumas ni codifiques la versión del paquete `@base44/sdk`. Instala siempre sin un especificador de versión para obtener la última versión.

## Crear un cliente (apps externas)

Al crear un cliente en apps externas, **SIEMPRE usa `appId` como nombre de parámetro**:

```javascript theme={null}
import { createClient } from "@base44/sdk";

// ✅ CORRECTO
const base44 = createClient({ appId: "your-app-id" });

// ❌ INCORRECTO - NO uses estos:
// const base44 = createClient({ clientId: "your-app-id" });  // INCORRECTO
// const base44 = createClient({ id: "your-app-id" });        // INCORRECTO
```

**Parámetro requerido:** `appId` (string) - Tu ID de aplicación de Base44

**Parámetros opcionales:**

* `token` (string) - Token de usuario preautenticado
* `options` (object) - Opciones de configuración
  * `options.onError` (function) - Manejador de errores global

**Ejemplo con manejador de errores:**

```javascript theme={null}
const base44 = createClient({
  appId: "your-app-id",
  options: {
    onError: (error) => {
      console.error("Base44 error:", error);
    }
  }
});
```

## Selección de módulo

**¿Trabajas con datos de la app?**

* Crear/leer/actualizar/eliminar registros → `entities`
* Importar datos desde archivo → `entities.importEntities()`
* Actualizaciones en tiempo real → `entities.EntityName.subscribe()`

**¿Gestión de usuarios?**

* Login/registro/logout → `auth`
* Obtener usuario actual → `auth.me()`
* Actualizar perfil de usuario → `auth.updateMe()`
* Invitar usuarios → `users.inviteUser()`

**¿Funciones de IA?**

* Chatear con agentes de IA → `agents` (requiere usuario registrado)
* Crear nueva conversación → `agents.createConversation()`
* Gestionar conversaciones → `agents.getConversations()`
* Generar texto/JSON con IA → `integrations.Core.InvokeLLM()`
* Generar imágenes → `integrations.Core.GenerateImage()`

**¿Lógica personalizada de backend?**

* Ejecutar código del lado del servidor → `functions.invoke()`
* Necesitas acceso de administrador → `base44.asServiceRole.functions.invoke()`

**¿Servicios externos?**

* Enviar correos → `integrations.Core.SendEmail()`
* Subir archivos → `integrations.Core.UploadFile()`
* APIs personalizadas → `integrations.custom.call()`
* OAuth con ámbito de app (cuenta del constructor de la app) → `asServiceRole.connectors.getConnection()` (solo backend)

**¿Seguimiento y analíticas?**

* Rastrear eventos personalizados → `analytics.track()`
* Registrar vistas de página/actividad → `appLogs.logUserInApp()`

## Patrones comunes

### Filtrar y ordenar datos

```javascript theme={null}
const pendingTasks = await base44.entities.Task.filter(
  { status: "pending", assignedTo: userId },  // consulta
  "-created_date",                             // orden (descendente)
  10,                                          // límite
  0                                            // saltar
);
```

### Rutas protegidas (comprobar autenticación)

```javascript theme={null}
const user = await base44.auth.me();
if (!user) {
  // Navega a tu página de inicio de sesión personalizada
  navigate('/login', { state: { returnTo: window.location.pathname } });
  return;
}
```

### Llamada a función de backend

```javascript theme={null}
// Frontend
// ⚠️ invoke() devuelve la respuesta axios SIN PROCESAR — el JSON de tu función está en `.data`,
//    NO el objeto de nivel superior. También LANZA en no-2xx (cuerpo de error en err.response.data).
const res = await base44.functions.invoke("processOrder", {
  orderId: "123",
  action: "ship"
});
const result = res.data; // ✅ por ejemplo, res.data.success  (res mismo es { data, status, headers, … })

// Función de backend (Deno)
import { createClientFromRequest } from "npm:@base44/sdk";

Deno.serve(async (req) => {
  const base44 = createClientFromRequest(req);
  const { orderId, action } = await req.json();
  // Procesa con rol de servicio para acceso de administrador
  const order = await base44.asServiceRole.entities.Orders.get(orderId);
  return Response.json({ success: true });
});
```

### Acceso de rol de servicio

Usa `asServiceRole` en funciones de backend para operaciones de nivel administrador:

```javascript theme={null}
// Modo usuario - respeta permisos
const myTasks = await base44.entities.Task.list();

// Rol de servicio - acceso total (solo backend)
const allTasks = await base44.asServiceRole.entities.Task.list();
const token = await base44.asServiceRole.connectors.getAccessToken("slack");
```

## Frontend vs Backend

| Capacidad                                 | Frontend | Backend |
| ----------------------------------------- | -------- | ------- |
| `entities` (datos del usuario)            | Sí       | Sí      |
| `auth`                                    | Sí       | Sí      |
| `agents`                                  | Sí       | Sí      |
| `functions.invoke()`                      | Sí       | Sí      |
| `functions.fetch()`                       | Sí       | Sí      |
| `integrations`                            | Sí       | Sí      |
| `analytics`                               | Sí       | Sí      |
| `appLogs`                                 | Sí       | Sí      |
| `users`                                   | Sí       | Sí      |
| `asServiceRole.*`                         | No       | Sí      |
| `asServiceRole.connectors` (OAuth de app) | No       | Sí      |
| `asServiceRole.sso`                       | No       | Sí      |

Las funciones de backend usan `Deno.serve()` y `createClientFromRequest(req)` para obtener un cliente correctamente autenticado.

<Note>Esta página fue traducida usando IA. Para obtener la información más precisa y actualizada, consulta la [versión en inglés](/).</Note>
