App Builder de Teable trabaja sobre tus Tablas existentes de Teable: tus Tablas y Campos conforman el esquema, y la IA los lee directamente al generar la interfaz y la lógica.Por tanto, antes de empezar a crear, define claramente el modelo de datos. Cuanto más precisos sean los tipos de Campo, los enlaces y las rutas de lectura y escritura, mayor será la calidad de lo que produzca la IA.
Aunque ya tengas preparado el modelo de datos, evita comenzar directamente por la interfaz. Primero, realiza una fase de planificación con la IA.Di algo como: «Todavía no escribamos código; hagamos un plan». Describe el problema que quieres resolver, los usuarios de destino y el conjunto aproximado de funciones. Deja que la IA redacte una propuesta estructurada. Revísala, ajústala y no empieces a crear hasta que estés de acuerdo con el plan.
Dedicar unos minutos más a alinear la dirección al principio ahorra horas de trabajo posterior.
No intentes incluir todas las funciones en una sola instrucción. Describe primero la función principal, consigue una versión mínima que funcione y añade después un elemento cada vez: una interacción, un ajuste de estilo o una parte de la lógica.Verifica cada cambio antes de continuar. Si algo se rompe, solo tendrás que revertir un cambio pequeño en lugar de comenzar de nuevo.
Las descripciones como «hazlo más bonito» o «haz que las interacciones resulten más naturales» apenas proporcionan información a la IA.Las instrucciones eficaces son concretas: qué página, qué área, qué comportamiento quieres y qué no quieres. Adjuntar capturas de pantalla o interfaces de referencia resulta muy útil.
Trata tu instrucción como un encargo para una persona inteligente que no sabe nada de tu proyecto. Cuanto más precisas sean las indicaciones, más se acercará el resultado a lo que imaginabas.
Cuando la aplicación se comporte de forma inesperada, evita decirle a la IA que «simplemente lo arregle». Las instrucciones de corrección imprecisas hacen que la IA aplique parches a ciegas, lo que a menudo introduce nuevos errores.Es preferible seguir dos pasos:
1
Pedir primero un análisis a la IA
Describe los síntomas y pide a la IA que enumere las causas probables y los posibles enfoques sin modificar todavía el código.
2
Elegir un enfoque e implementarlo
Decide qué explicación parece más probable e indica a la IA que siga ese camino.
Si fallan varios intentos de corrección consecutivos, vuelve a la última versión que funcionaba y empieza de nuevo. Suele ser más rápido que acumular parches.
Cada conversación con la IA produce cambios. El ritmo recomendado es terminar un módulo funcional, confirmar que funciona y continuar después. No trabajes simultáneamente en varias funciones sin terminar.¿Un cambio posterior ha roto algo? Vuelve a la última versión estable e inténtalo de nuevo con una instrucción más clara.
El entorno de ejecución de App Builder (entorno aislado, vista previa y compilación) está basado en Next.js y actualmente no admite otros entornos de desarrollo de interfaces, como Astro, Vite, Create React App, Vue o Svelte, entre otros.Si pides a la IA que use un entorno de desarrollo distinto de Next.js, es posible que no se niegue de forma sistemática e incluso que intente generar el código correspondiente. Sin embargo, como el entorno subyacente no es compatible, la vista previa no llegará a iniciarse: permanecerá indefinidamente en «La vista previa se está iniciando…» y las conversaciones seguirán consumiendo Créditos durante ese tiempo.
Si necesitas usar un framework distinto de Next.js, te recomendamos que desarrolles en tu propio entorno local y te conectes a tus datos mediante la API de Teable.
Actualmente, la API de Teable está limitada a 10 QPS (10 solicitudes por segundo). Las aplicaciones generadas por App Builder pueden encontrar errores 429 durante el uso normal si no se optimiza la gestión de solicitudes. Nuestro equipo de ingeniería trabaja activamente para optimizar el rendimiento de la API y es posible que modifiquemos este límite en el futuro.
Existen cuatro estrategias generales para solucionar este problema:
Almacenamiento en caché
Reduce las solicitudes duplicadas
Paginación y procesamiento por lotes
Reduce la carga de cada solicitud
Antirrebote y limitación
Reduce la frecuencia de las solicitudes
Compatibilidad de representación
Reduce los errores de la vista previa
Cada sección siguiente enumera situaciones habituales, la solución y una instrucción de referencia que puedes reutilizar.Almacenamiento en caché: reduce las solicitudes duplicadas
Las páginas y los paneles con muchos elementos visuales pueden generar demasiadas solicitudes al cargarse
Situación: Una página de panel contiene varios gráficos, tarjetas de estadísticas y listas, y cada uno consulta una Tabla diferente. O bien la página sirve principalmente para mostrar información, pero cada visita sigue llamando directamente a la API. En ambos casos, la simultaneidad durante la carga de la página puede dispararse, y los picos de tráfico tienen más probabilidades de provocar errores 429.Solución: Da prioridad a patrones de representación que aprovechen la caché. Almacena los datos en la memoria de la aplicación después de cargarlos —un TTL de 1 a 3 minutos es un buen punto de partida— y reutilízalos en visitas posteriores. Aplica carga diferida a los componentes situados por debajo de la parte visible de la página para escalonar las solicitudes. Si la página continúa volviendo a obtener los datos en cada visita, pide explícitamente a la IA que refuerce la estrategia de caché.
Instrucción de referencia: «Esta página contiene muchos elementos visuales. Da prioridad a un enfoque de representación que aproveche la caché. Almacena los datos localmente después de cargar la página con un TTL de 1 minuto, no vuelvas a solicitar la API dentro del periodo del TTL y retrasa 500 ms los componentes situados por debajo de la parte visible de la página».
Varios componentes consultan la misma Tabla
Situación: Tres componentes de una misma página necesitan datos de la misma Tabla y cada uno envía su propia solicitud, aunque una sola habría sido suficiente.Solución: Centraliza la obtención de datos para que el mismo conjunto se cargue una sola vez y se comparta entre los componentes.
Instrucción de referencia: «Si varios componentes necesitan datos de la misma Tabla, obtenlos una sola vez y compártelos entre todos. No envíes solicitudes duplicadas».
Nueva obtención de datos al navegar entre páginas
Situación: Los usuarios avanzan y retroceden entre páginas. Cada vez que vuelven se realiza una obtención nueva, aunque nada haya cambiado.Solución: Dentro del TTL de la caché, reutiliza los datos cargados anteriormente en lugar de volver a solicitarlos.
Instrucción de referencia: «Cuando un usuario vuelva a una página, si ha transcurrido menos de 1 minuto desde la última carga, usa los datos almacenados en caché. No vuelvas a solicitar la API».
Listas desplegables que cargan enormes listas de opciones
Situación: Una lista desplegable muestra como opciones todos los Registros de una Tabla. Cuando hay muchos Registros, esa única solicitud ya supone una carga elevada.Solución: Conviértela en un selector con búsqueda: obtén únicamente los Registros coincidentes después de que el usuario escriba. También puedes almacenar en caché la lista de opciones.
Instrucción de referencia: «Las listas desplegables no deben cargar todas las opciones de antemano. Cámbialas por una búsqueda de palabras clave que obtenga los Registros coincidentes mientras se escribe y aplica antirrebote».
Selectores en cascada que encadenan solicitudes
Situación: Elegir un Campo desencadena la carga de las opciones del nivel siguiente. Las cascadas de varios niveles acumulan varias solicitudes por interacción.Solución: Precarga una vez los datos relacionados y fíltralos localmente, o almacena en caché los datos de la cascada después de la primera carga.
Instrucción de referencia: «Almacena localmente en caché los datos de las opciones de los selectores en cascada después de cargarlos. Cuando el usuario cambie una opción superior, filtra la caché en lugar de volver a solicitar los datos».
Las nuevas representaciones desencadenan solicitudes duplicadas
Situación: Una gestión de estado deficiente hace que los componentes vuelvan a obtener datos con cada representación.Solución: Desencadena la obtención de datos en eventos concretos —el montaje inicial o una acción explícita del usuario—, no en cada representación. Usa la caché como medida de seguridad.
Instrucción de referencia: «Obtén los datos únicamente en la primera carga de la página o cuando haya acciones explícitas del usuario. No vuelvas a obtenerlos con cada representación; usa los datos de la caché».
Paginación y procesamiento por lotes: reduce la carga de cada solicitud
Listas o Tablas sin paginación
Situación: Cargar todos los Registros a la vez produce una avalancha de llamadas a la API cuando crece el conjunto de datos.Solución: Pagina los datos. Obtén únicamente los de la página actual.
Instrucción de referencia: «Muestra 20 filas por página. Carga la página siguiente únicamente cuando el usuario navegue hasta ella. No cargues todo a la vez».
Obtención por fila de datos enlazados (N+1)
Situación: Después de cargar una lista, obtienes uno por uno los detalles de la Tabla enlazada correspondientes a cada Registro. Cargar 50 proyectos y después consultar 50 responsables genera 50 solicitudes adicionales al instante.Solución: Obtén todos los datos enlazados en un único lote, no fila por fila.
Instrucción de referencia: «Al cargar una lista, obtén por lotes todos los datos enlazados en una sola solicitud. No recorras los Registros para obtener su información enlazada de forma individual».
Escrituras por fila durante actualizaciones masivas
Situación: Se actualizan de forma masiva varios Registros enviando una solicitud de actualización por Registro en lugar de una única solicitud por lotes.Solución: Usa la API de actualización por lotes para enviar todos los cambios en una sola llamada.
Instrucción de referencia: «Para operaciones masivas, combina los cambios de varios Registros en una sola solicitud por lotes. No envíes una actualización por Registro».
Llamadas a la API dentro de bucles
Situación: Un bucle for procesa los Registros uno por uno y llama a la API en cada iteración.Solución: Recopila primero todos los ID y envía después una única solicitud por lotes.
Instrucción de referencia: «No llames a la API dentro de un bucle. Recopila primero todos los ID necesarios y envía después una única solicitud por lotes».
Antirrebote y limitación: reduce la frecuencia de las solicitudes
Búsquedas o filtros sin antirrebote
Situación: Cada pulsación de tecla en un cuadro de búsqueda envía una solicitud. Escribir una consulta de 4 caracteres produce 4 solicitudes.Solución: Aplica antirrebote a la entrada: espera entre 300 y 500 ms después de que el usuario deje de escribir antes de enviar la solicitud.
Instrucción de referencia: «Aplica antirrebote a la entrada de búsqueda. Envía una solicitud únicamente 300 ms después de que el usuario deje de escribir. No envíes solicitudes mientras escribe».
Acciones de usuario rápidas y repetidas
Situación: Clics rápidos y repetidos en Enviar, cambios sucesivos de filtros o una paginación veloz: cada acción envía una solicitud de inmediato.Solución: Aplica antirrebote o limitación. Deshabilita los botones de envío hasta que termine la solicitud para evitar envíos duplicados.
Instrucción de referencia: «Deshabilita el botón de envío después de hacer clic y vuelve a habilitarlo cuando se resuelva la solicitud. Aplica antirrebote a los cambios de filtro para que los cambios rápidos producidos durante 300 ms envíen una sola solicitud».
Guardado automático de formularios demasiado agresivo
Situación: Cada cambio de Campo se guarda inmediatamente. Completar un formulario puede provocar una docena de escrituras.Solución: Cambia al guardado explícito mediante un botón o aplica antirrebote al guardado automático para que se ejecute una sola vez después de una pausa durante la edición.
Instrucción de referencia: «No guardes después de cada cambio de Campo. Guarda al hacer clic explícitamente en el botón o guarda automáticamente una vez cuando el usuario haya dejado de editar durante 2 segundos».
Intervalos de consulta demasiado breves
Situación: Los datos se actualizan cada pocos segundos, lo que genera un tráfico sostenido de alta frecuencia.Solución: Amplía el intervalo de consulta a un valor razonable —30 segundos o más— o cambia a la actualización manual.
Instrucción de referencia: «Establece el intervalo de actualización automática en 60 segundos. Añade un botón de actualización manual para que los usuarios puedan obtener los datos más recientes cuando los necesiten».
Varios componentes realizan consultas periódicas de forma independiente
Situación: Varios componentes de una página configuran su propio temporizador de consulta. La carga combinada supera fácilmente el límite.Solución: Centraliza las consultas periódicas. Realiza una obtención periódica y distribuye el resultado a todos los componentes que lo necesiten.
Instrucción de referencia: «No permitas que cada componente configure su propio temporizador de consulta. Usa un único mecanismo de actualización que obtenga todos los datos de forma programada y los distribuya a los componentes».
Compatibilidad de representación: reduce los errores de la vista previa
Los gráficos, mapas o componentes exclusivos del navegador fallan en la vista previa
Situación: La página usa gráficos, mapas o bibliotecas que dependen de window, medidas del DOM u otras API exclusivas del navegador, y la vista previa muestra errores, una pantalla en blanco o discrepancias de hidratación.Solución: A menudo resulta más seguro cargar estos componentes en el navegador en lugar de representarlos directamente en el servidor. Si persisten los problemas de la vista previa, pide explícitamente a la IA que los cambie a un patrón de carga exclusivo del navegador.
Instrucción de referencia: «Este componente depende del entorno del navegador. Cárgalo únicamente en el cliente para evitar errores de representación o discrepancias de hidratación en la vista previa».
La IA puede cometer errores. Comprueba las respuestas.
Última modificación el 4 de septiembre de 2026
¿Esta página le ayudó?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Teable","colors":{"primary":"#131415","light":"#131415","dark":"#F9FAFB"},"logo":{"light":"https://mintcdn.com/teablecn/Sov59EnEPMakaGyj/images/teable-logo-full.png?fit=max\u0026auto=format\u0026n=Sov59EnEPMakaGyj\u0026q=85\u0026s=24e1fe49258a9a8f76eaec5792623926","dark":"https://mintcdn.com/teablecn/Sov59EnEPMakaGyj/images/teable-logo-full-dark.png?fit=max\u0026auto=format\u0026n=Sov59EnEPMakaGyj\u0026q=85\u0026s=be076104208b417182461b52d697a124","href":"https://teable.ai"},"favicon":"https://mintcdn.com/teablecn/MGUqMJ8iafwbPo_j/images/teable-logo.png?fit=max\u0026auto=format\u0026n=MGUqMJ8iafwbPo_j\u0026q=85\u0026s=bd76b377e5d2b5c43bd18f20ddb0c6ad","seo":{"metatags":{"og:image":"https://teable.ai/assets/images/og-image.png","twitter:site":"@teableio","twitter:card":"summary_large_image","canonical":"https://help.teable.ai","description":"Teable is an AI-powered database and app builder. Build apps, automate workflows, and manage data with ease.","keywords":"database, app builder, AI, no-code, low-code, Airtable alternative, PostgreSQL, automation"},"indexing":"all"},"metadata":{"timestamp":true},"styling":{"latex":false},"navigation":{"languages":[{"language":"en","banner":{"content":"🚀 Run AI tasks on a schedule. See our [changelog](/en/changelog#oct-15-2026) for details.","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Support"}]},"href":"en/basic/ai/overview"},{"language":"zh","banner":{"content":"🚀 让 AI 按计划执行任务。查看[更新日志](/zh/changelog#2026-10-15)了解详情。","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"支持"}]},"href":"zh/basic/ai/overview"},{"language":"ru","banner":{"content":"🚀 Запускайте задачи ИИ по расписанию. Подробнее в [журнале изменений](/ru/changelog#15-октября-2026-г).","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Поддержка"}]},"href":"ru/basic/ai/overview"},{"language":"de","banner":{"content":"🚀 KI-Aufgaben nach Zeitplan ausführen. Mehr im [Changelog](/de/changelog#15-oktober-2026).","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Support"}]},"href":"de/basic/ai/overview"},{"language":"fr","banner":{"content":"🚀 Exécutez des tâches IA selon un planning. Consultez le [journal des modifications](/fr/changelog#15-octobre-2026).","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Assistance"}]},"href":"fr/basic/ai/overview"},{"language":"es","banner":{"content":"🚀 Ejecuta tareas de IA de forma programada. Consulta el [registro de cambios](/es/changelog#15-oct-2026).","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Soporte"}]},"href":"es/basic/ai/overview"},{"language":"it","banner":{"content":"🚀 Esegui le attività IA secondo un programma. Leggi il [registro delle modifiche](/it/changelog#15-ott-2026).","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Supporto"}]},"href":"it/basic/ai/overview"},{"language":"ja","banner":{"content":"🚀 AI タスクをスケジュールに沿って実行。詳しくは[更新履歴](/ja/changelog#2026年10月15日)をご覧ください。","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"サポート"}]},"href":"ja/basic/ai/overview"},{"language":"tr","banner":{"content":"🚀 Yapay zeka görevlerini zamanlayın. Ayrıntılar için [değişiklik günlüğüne](/tr/changelog#15-ekim-2026) bakın.","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Destek"}]},"href":"tr/basic/ai/overview"},{"language":"uk","banner":{"content":"🚀 Запускайте завдання ШІ за розкладом. Докладніше в [журналі змін](/uk/changelog#15-жовтня-2026).","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Підтримка"}]},"href":"uk/basic/ai/overview"},{"language":"ar","banner":{"content":"🚀 شغّل مهام الذكاء الاصطناعي وفق جدول زمني. راجع [سجل التغييرات](/ar/changelog#15-أكتوبر-2026) للتفاصيل.","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"الدعم"}]},"href":"ar/basic/ai/overview"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"teablecn","hasAudioNarration":false,"actualSubdomain":"teablecn","customDomains":["help.teable.ai"],"gitSource":{"type":"github","owner":"teableio","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad5e445a1e26a9e5608f8b2","collectionId":"5bf2fc4b-4712-4773-b5c7-ed05e48a6138","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad5e445a1e26a9e5608f8b2"},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6ad5e445a1e26a9e5608f8b2","clientVersion":"0.0.3894","searchFilterCounts":[{"language":"ar","tag":"واجهة API","count":737},{"language":"de","tag":"API","count":737},{"language":"en","tag":"API","count":737},{"language":"es","tag":"API","count":737},{"language":"fr","tag":"API","count":737},{"language":"it","tag":"API","count":737},{"language":"ja","tag":"API","count":737},{"language":"ru","tag":"API","count":737},{"language":"tr","tag":"API","count":737},{"language":"uk","tag":"API","count":737},{"language":"zh","tag":"API 文档","count":737},{"language":"ar","tag":"مرجع واجهة API","count":726},{"language":"de","tag":"API-Referenz","count":726},{"language":"en","tag":"API Reference","count":726},{"language":"es","tag":"Referencia de la API","count":726},{"language":"fr","tag":"Référence de l’API","count":726},{"language":"it","tag":"Riferimento API","count":726},{"language":"ja","tag":"APIリファレンス","count":726},{"language":"ru","tag":"Справочник API","count":726},{"language":"tr","tag":"API Referansı","count":726},{"language":"uk","tag":"Довідник API","count":726},{"language":"zh","tag":"API Reference","count":726},{"language":"ar","tag":"admin","count":145},{"language":"de","tag":"admin","count":145},{"language":"en","tag":"admin","count":145},{"language":"es","tag":"admin","count":145},{"language":"fr","tag":"admin","count":145},{"language":"it","tag":"admin","count":145},{"language":"ja","tag":"admin","count":145},{"language":"ru","tag":"admin","count":145},{"language":"tr","tag":"admin","count":145},{"language":"uk","tag":"admin","count":145},{"language":"zh","tag":"admin","count":145},{"language":"zh","tag":"功能文档","count":113},{"language":"ar","tag":"الوثائق","count":111},{"language":"de","tag":"Dokumentation","count":111},{"language":"en","tag":"Docs","count":111},{"language":"es","tag":"Documentación","count":111},{"language":"fr","tag":"Documentation","count":111},{"language":"it","tag":"Documentazione","count":111},{"language":"ja","tag":"ドキュメント","count":111},{"language":"ru","tag":"Документация","count":111},{"language":"tr","tag":"Dokümanlar","count":111},{"language":"uk","tag":"Документація","count":111},{"language":"ar","tag":"space","count":45},{"language":"de","tag":"space","count":45},{"language":"en","tag":"space","count":45},{"language":"es","tag":"space","count":45},{"language":"fr","tag":"space","count":45},{"language":"it","tag":"space","count":45},{"language":"ja","tag":"space","count":45},{"language":"ru","tag":"space","count":45},{"language":"tr","tag":"space","count":45},{"language":"uk","tag":"space","count":45},{"language":"zh","tag":"space","count":45},{"language":"ar","tag":"المشروع","count":44},{"language":"de","tag":"Projekt","count":44},{"language":"en","tag":"Project","count":44},{"language":"es","tag":"Proyecto","count":44},{"language":"fr","tag":"Projet","count":44},{"language":"it","tag":"Progetto","count":44},{"language":"ja","tag":"プロジェクト","count":44},{"language":"ru","tag":"Проект","count":44},{"language":"tr","tag":"Proje","count":44},{"language":"uk","tag":"Проєкт","count":44},{"language":"zh","tag":"项目","count":44},{"language":"ar","tag":"project","count":39},{"language":"de","tag":"project","count":39},{"language":"en","tag":"project","count":39},{"language":"es","tag":"project","count":39},{"language":"fr","tag":"project","count":39},{"language":"it","tag":"project","count":39},{"language":"ja","tag":"project","count":39},{"language":"ru","tag":"project","count":39},{"language":"tr","tag":"project","count":39},{"language":"uk","tag":"project","count":39},{"language":"zh","tag":"project","count":39},{"language":"tr","tag":"Alan","count":35},{"language":"ar","tag":"الأتمتة","count":34},{"language":"de","tag":"Automatisierung","count":34},{"language":"en","tag":"Automation","count":34},{"language":"es","tag":"Automatización","count":34},{"language":"fr","tag":"Automatisation","count":34},{"language":"it","tag":"Automazione","count":34},{"language":"ja","tag":"オートメーション","count":34},{"language":"ru","tag":"Автоматизация","count":34},{"language":"tr","tag":"Otomasyon","count":34},{"language":"uk","tag":"Автоматизація","count":34},{"language":"zh","tag":"自动化","count":34},{"language":"ar","tag":"الحقل","count":30},{"language":"ar","tag":"automation","count":30},{"language":"de","tag":"Feld","count":30},{"language":"de","tag":"automation","count":30},{"language":"en","tag":"Field","count":30},{"language":"en","tag":"automation","count":30},{"language":"es","tag":"Campo","count":30},{"language":"es","tag":"automation","count":30},{"language":"fr","tag":"Champ","count":30},{"language":"fr","tag":"automation","count":30},{"language":"it","tag":"Campo","count":30},{"language":"it","tag":"automation","count":30},{"language":"ja","tag":"フィールド","count":30},{"language":"ja","tag":"automation","count":30},{"language":"ru","tag":"Поле","count":30},{"language":"ru","tag":"automation","count":30},{"language":"tr","tag":"automation","count":30},{"language":"uk","tag":"Поле","count":30},{"language":"uk","tag":"automation","count":30},{"language":"zh","tag":"字段","count":30},{"language":"zh","tag":"automation","count":30}]},"assistantConfig":{},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-branches-v2-autocommit","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-branches-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"teamspace","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"client-snapshot-docs-config","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".nav-logo{width:108px;height:28px;object-fit:contain}#changelog-date-picker{position:fixed;left:50%;bottom:calc(16px + env(safe-area-inset-bottom));z-index:20;display:flex;align-items:center;gap:6px;padding:8px 14px;transform:translateX(-50%);border:1px solid rgba(17,17,17,.18);border-radius:999px;background:rgb(var(--background-light, 255 255 255));box-shadow:0 4px 16px rgba(17,17,17,.12);color:#111;font-size:14px;font-weight:500;line-height:20px;white-space:nowrap}#changelog-date-picker select{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer;font-size:16px}#changelog-date-picker:focus-within{outline:2px solid rgb(var(--primary));outline-offset:2px}.dark #changelog-date-picker{border-color:rgba(255,255,255,.25);background:#18181b;box-shadow:0 4px 16px rgba(0,0,0,.5);color:#f3f4f6}#header:has(+#content[data-page-href$=\"/changelog\"]) #page-title,:has(>svg[style*=arrow-left-from-line]){display:none!important}.eyebrow{display:none!important}#header:has(+#content[data-page-href$=\"/changelog\"]){height:0!important;margin:0!important;min-height:0!important;padding:0!important}#header:has(+#content[data-page-href$=\"/changelog\"])>*{margin:0!important}#header:has(+#content[data-page-href$=\"/changelog\"]) #page-context-menu{margin:0!important;position:absolute!important;right:0!important;top:0!important;z-index:10}#content[data-page-href$=\"/changelog\"]{margin-top:0!important}#content[data-page-href$=\"/changelog\"]>.update-container:first-of-type{padding-top:0!important}#content[data-page-href$=\"/changelog\"] .update-container [data-component-part=update-content]>h1:first-child{margin-top:0!important}html:not(.dark){--primary:19 20 21;--primary-light:19 20 21;--primary-dark:19 20 21}.dark{--primary:249 250 251;--primary-light:249 250 251;--primary-dark:249 250 251}#banner{background:rgb(var(--primary))!important}@layer utilities{html:not(.dark) #banner,html:not(.dark) #banner *{color:#f9fafb!important}html:not(.dark) #banner a{color:#f9fafb!important;text-decoration-color:rgba(249,250,251,.7)!important}.dark #banner,.dark #banner *,.dark #banner a{color:#131415!important}.dark #banner a{text-decoration-color:rgba(19,20,21,.35)!important}}[data-component-part=update-label]{background:rgba(17,17,17,.08)!important;color:#111!important;border:1px solid rgba(17,17,17,.18)}.dark [data-component-part=update-label]{background:rgba(255,255,255,.1)!important;color:#f3f4f6!important;border-color:rgba(255,255,255,.25)}html[data-current-path$=\"/changelog\"] #table-of-contents .toc-item[data-active-deepest]>a,html[data-current-path$=\"/changelog\"] #table-of-contents .toc-item[data-active]>a,html[data-current-path$=\"/changelog\"] #table-of-contents .toc-item[data-changelog-active=true]>a{color:rgb(var(--primary))!important;font-weight:600}html[data-current-path$=\"/changelog\"] #table-of-contents .toc-item[data-active-deepest]::before,html[data-current-path$=\"/changelog\"] #table-of-contents .toc-item[data-active]::before,html[data-current-path$=\"/changelog\"] #table-of-contents .toc-item[data-changelog-active=true]::before{content:\"\";position:absolute;left:-12px;top:6px;bottom:6px;width:3px;border-radius:999px;background:rgb(var(--primary))}html.dark[data-current-path$=\"/changelog\"] #table-of-contents .toc-item[data-active-deepest]>a,html.dark[data-current-path$=\"/changelog\"] #table-of-contents .toc-item[data-active]>a,html.dark[data-current-path$=\"/changelog\"] #table-of-contents .toc-item[data-changelog-active=true]>a{color:rgb(var(--primary))!important}.callout[data-callout-type=note]{border-color:rgba(96,165,250,.45)!important;background:rgba(239,246,255,.9)!important}.callout[data-callout-type=note] [data-component-part=callout-icon] svg{color:#3b82f6!important}.callout[data-callout-type=note] [data-component-part=callout-content]{color:#1e40af!important}.callout[data-callout-type=note] [data-component-part=callout-content] a,.callout[data-callout-type=note] [data-component-part=callout-content] code,.callout[data-callout-type=note] [data-component-part=callout-content] li,.callout[data-callout-type=note] [data-component-part=callout-content] p,.callout[data-callout-type=note] [data-component-part=callout-content] span,.callout[data-callout-type=note] [data-component-part=callout-content] strong{color:inherit!important}.dark .callout[data-callout-type=note]{border-color:rgba(96,165,250,.35)!important;background:rgba(30,58,138,.22)!important}.dark .callout[data-callout-type=note] [data-component-part=callout-icon] svg{color:#93c5fd!important}.dark .callout[data-callout-type=note] [data-component-part=callout-content]{color:#dbeafe!important}.docs-screenshot{display:block;height:auto;max-width:100%;margin:1.5rem auto;overflow:hidden;vertical-align:middle;border:1px solid rgba(15,23,42,.08);border-radius:14px;width:auto}.dark .docs-screenshot{border-color:rgba(255,255,255,.12)}.docs-inline-icon{display:inline-block;width:1.4em;height:1.4em;margin:0 .1em;vertical-align:-.35em}.dark .docs-inline-icon{filter:invert(1)}@media (max-width:640px){.docs-screenshot{margin:1.25rem auto;border-radius:12px}}@media (min-width:1024px){#localization-select-trigger{position:fixed!important;bottom:16px!important;right:16px!important;left:auto!important;z-index:50!important}}"}],"page":{"pagePath":"es/basic/ai/app-builder-practical-guide","slug":"/es/basic/ai/app-builder-practical-guide","pageMetadata":{"title":"Prácticas recomendadas de App Builder","description":"Consejos y patrones prácticos para aprovechar al máximo App Builder de Teable.","href":"/es/basic/ai/app-builder-practical-guide"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Consejos y patrones prácticos para aprovechar al máximo App Builder de Teable.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,em:`em`,p:`p`,strong:`strong`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,Heading,Note,Step,Steps,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`consejos-de-creación`,children:`Consejos de creación`}),`\n`,_jsx(Heading,{level:`3`,id:`1-define-primero-los-datos`,children:`1. Define primero los datos`}),`\n`,_jsxs(_components.p,{children:[`App Builder de Teable trabaja sobre tus Tablas existentes de Teable: `,_jsx(_components.strong,{children:`tus Tablas y Campos conforman el esquema`}),`, y la IA los lee directamente al generar la interfaz y la lógica.`]}),`\n`,_jsx(_components.p,{children:`Por tanto, antes de empezar a crear, define claramente el modelo de datos. Cuanto más precisos sean los tipos de Campo, los enlaces y las rutas de lectura y escritura, mayor será la calidad de lo que produzca la IA.`}),`\n`,_jsx(Heading,{level:`3`,id:`2-planifica-antes-de-crear`,children:`2. Planifica antes de crear`}),`\n`,_jsx(_components.p,{children:`Aunque ya tengas preparado el modelo de datos, evita comenzar directamente por la interfaz. Primero, realiza una fase de planificación con la IA.`}),`\n`,_jsxs(_components.p,{children:[`Di algo como: `,_jsx(_components.em,{children:`«Todavía no escribamos código; hagamos un plan»`}),`. Describe el problema que quieres resolver, los usuarios de destino y el conjunto aproximado de funciones. Deja que la IA redacte una propuesta estructurada. Revísala, ajústala y no empieces a crear hasta que estés de acuerdo con el plan.`]}),`\n`,_jsx(Tip,{children:`Dedicar unos minutos más a alinear la dirección al principio ahorra horas de trabajo posterior.`}),`\n`,_jsx(Heading,{level:`3`,id:`3-empieza-por-algo-pequeño`,children:`3. Empieza por algo pequeño`}),`\n`,_jsx(_components.p,{children:`No intentes incluir todas las funciones en una sola instrucción. Describe primero la función principal, consigue una versión mínima que funcione y añade después un elemento cada vez: una interacción, un ajuste de estilo o una parte de la lógica.`}),`\n`,_jsx(_components.p,{children:`Verifica cada cambio antes de continuar. Si algo se rompe, solo tendrás que revertir un cambio pequeño en lugar de comenzar de nuevo.`}),`\n`,_jsx(Heading,{level:`3`,id:`4-sé-concreto-no-abstracto`,children:`4. Sé concreto, no abstracto`}),`\n`,_jsxs(_components.p,{children:[`Las descripciones como `,_jsx(_components.em,{children:`«hazlo más bonito»`}),` o `,_jsx(_components.em,{children:`«haz que las interacciones resulten más naturales»`}),` apenas proporcionan información a la IA.`]}),`\n`,_jsxs(_components.p,{children:[`Las instrucciones eficaces son concretas: `,_jsx(_components.strong,{children:`qué página, qué área, qué comportamiento quieres y qué no quieres`}),`. Adjuntar capturas de pantalla o interfaces de referencia resulta muy útil.`]}),`\n`,_jsx(Tip,{children:`Trata tu instrucción como un encargo para una persona inteligente que no sabe nada de tu proyecto. Cuanto más precisas sean las indicaciones, más se acercará el resultado a lo que imaginabas.`}),`\n`,_jsx(Heading,{level:`3`,id:`5-diagnostica-antes-de-corregir`,children:`5. Diagnostica antes de corregir`}),`\n`,_jsxs(_components.p,{children:[`Cuando la aplicación se comporte de forma inesperada, evita decirle a la IA que `,_jsx(_components.em,{children:`«simplemente lo arregle»`}),`. Las instrucciones de corrección imprecisas hacen que la IA aplique parches a ciegas, lo que a menudo introduce nuevos errores.`]}),`\n`,_jsx(_components.p,{children:`Es preferible seguir dos pasos:`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Pedir primero un análisis a la IA`,children:_jsx(_components.p,{children:`Describe los síntomas y pide a la IA que enumere las causas probables y los posibles enfoques sin modificar todavía el código.`})}),_jsx(Step,{title:`Elegir un enfoque e implementarlo`,children:_jsx(_components.p,{children:`Decide qué explicación parece más probable e indica a la IA que siga ese camino.`})})]}),`\n`,_jsx(Warning,{children:`Si fallan varios intentos de corrección consecutivos, vuelve a la última versión que funcionaba y empieza de nuevo. Suele ser más rápido que acumular parches.`}),`\n`,_jsx(Heading,{level:`3`,id:`6-aprovecha-la-reversión-de-versiones`,children:`6. Aprovecha la reversión de versiones`}),`\n`,_jsxs(_components.p,{children:[`Cada conversación con la IA produce cambios. El ritmo recomendado es terminar un módulo funcional, confirmar que funciona y continuar después. `,_jsx(_components.strong,{children:`No trabajes simultáneamente en varias funciones sin terminar.`})]}),`\n`,_jsx(_components.p,{children:`¿Un cambio posterior ha roto algo? Vuelve a la última versión estable e inténtalo de nuevo con una instrucción más clara.`}),`\n`,_jsx(Heading,{level:`2`,id:`preguntas-frecuentes`,children:`Preguntas frecuentes`}),`\n`,_jsx(Heading,{level:`3`,id:`app-builder-solo-admite-next-js`,children:`App Builder solo admite Next.js`}),`\n`,_jsxs(_components.p,{children:[`El entorno de ejecución de App Builder (entorno aislado, vista previa y compilación) está basado en `,_jsx(_components.strong,{children:`Next.js`}),` y actualmente `,_jsx(_components.strong,{children:`no admite`}),` otros entornos de desarrollo de interfaces, como Astro, Vite, Create React App, Vue o Svelte, entre otros.`]}),`\n`,_jsxs(_components.p,{children:[`Si pides a la IA que use un entorno de desarrollo distinto de Next.js, es posible que no se niegue de forma sistemática e incluso que intente generar el código correspondiente. Sin embargo, como el entorno subyacente no es compatible, `,_jsx(_components.strong,{children:`la vista previa no llegará a iniciarse`}),`: permanecerá indefinidamente en «La vista previa se está iniciando…» y las conversaciones seguirán consumiendo Créditos durante ese tiempo.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Si necesitas usar un framework distinto de Next.js, te recomendamos que desarrolles en tu propio entorno local y te conectes a tus datos mediante la API de Teable.`})}),`\n`,_jsx(Heading,{level:`3`,id:`gestionar-errores-429`,children:`Gestionar errores 429`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Actualmente, la API de Teable está limitada a `,_jsx(_components.strong,{children:`10 QPS`}),` (10 solicitudes por segundo). Las aplicaciones generadas por App Builder pueden encontrar errores 429 durante el uso normal si no se optimiza la gestión de solicitudes. Nuestro equipo de ingeniería trabaja activamente para optimizar el rendimiento de la API y es posible que modifiquemos este límite en el futuro.`]})}),`\n`,_jsx(_components.p,{children:`Existen cuatro estrategias generales para solucionar este problema:`}),`\n`,_jsxs(CardGroup,{cols:4,children:[_jsx(Card,{title:`Almacenamiento en caché`,icon:`database`,children:_jsx(_components.p,{children:`Reduce las solicitudes duplicadas`})}),_jsx(Card,{title:`Paginación y procesamiento por lotes`,icon:`layer-group`,children:_jsx(_components.p,{children:`Reduce la carga de cada solicitud`})}),_jsx(Card,{title:`Antirrebote y limitación`,icon:`gauge-high`,children:_jsx(_components.p,{children:`Reduce la frecuencia de las solicitudes`})}),_jsx(Card,{title:`Compatibilidad de representación`,icon:`window-restore`,children:_jsx(_components.p,{children:`Reduce los errores de la vista previa`})})]}),`\n`,_jsx(_components.p,{children:`Cada sección siguiente enumera situaciones habituales, la solución y una instrucción de referencia que puedes reutilizar.`}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Almacenamiento en caché: reduce las solicitudes duplicadas`})}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`Las páginas y los paneles con muchos elementos visuales pueden generar demasiadas solicitudes al cargarse`,icon:`bolt`,id:`las-paginas-y-los-paneles-con-muchos-elementos-visuales-pueden-generar-demasiadas-solicitudes-al-cargarse`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Una página de panel contiene varios gráficos, tarjetas de estadísticas y listas, y cada uno consulta una Tabla diferente. O bien la página sirve principalmente para mostrar información, pero cada visita sigue llamando directamente a la API. En ambos casos, la simultaneidad durante la carga de la página puede dispararse, y los picos de tráfico tienen más probabilidades de provocar errores 429.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Da prioridad a patrones de representación que aprovechen la caché. Almacena los datos en la memoria de la aplicación después de cargarlos —un TTL de 1 a 3 minutos es un buen punto de partida— y reutilízalos en visitas posteriores. Aplica carga diferida a los componentes situados por debajo de la parte visible de la página para escalonar las solicitudes. Si la página continúa volviendo a obtener los datos en cada visita, pide explícitamente a la IA que refuerce la estrategia de caché.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Esta página contiene muchos elementos visuales. Da prioridad a un enfoque de representación que aproveche la caché. Almacena los datos localmente después de cargar la página con un TTL de 1 minuto, no vuelvas a solicitar la API dentro del periodo del TTL y retrasa 500 ms los componentes situados por debajo de la parte visible de la página».`]})})]}),_jsxs(Accordion,{title:`Varios componentes consultan la misma Tabla`,icon:`copy`,id:`varios-componentes-consultan-la-misma-tabla`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Tres componentes de una misma página necesitan datos de la misma Tabla y cada uno envía su propia solicitud, aunque una sola habría sido suficiente.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Centraliza la obtención de datos para que el mismo conjunto se cargue una sola vez y se comparta entre los componentes.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Si varios componentes necesitan datos de la misma Tabla, obtenlos una sola vez y compártelos entre todos. No envíes solicitudes duplicadas».`]})})]}),_jsxs(Accordion,{title:`Nueva obtención de datos al navegar entre páginas`,icon:`arrows-rotate`,id:`nueva-obtencion-de-datos-al-navegar-entre-paginas`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Los usuarios avanzan y retroceden entre páginas. Cada vez que vuelven se realiza una obtención nueva, aunque nada haya cambiado.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Dentro del TTL de la caché, reutiliza los datos cargados anteriormente en lugar de volver a solicitarlos.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Cuando un usuario vuelva a una página, si ha transcurrido menos de 1 minuto desde la última carga, usa los datos almacenados en caché. No vuelvas a solicitar la API».`]})})]}),_jsxs(Accordion,{title:`Listas desplegables que cargan enormes listas de opciones`,icon:`list`,id:`listas-desplegables-que-cargan-enormes-listas-de-opciones`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Una lista desplegable muestra como opciones todos los Registros de una Tabla. Cuando hay muchos Registros, esa única solicitud ya supone una carga elevada.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Conviértela en un selector con búsqueda: obtén únicamente los Registros coincidentes después de que el usuario escriba. También puedes almacenar en caché la lista de opciones.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Las listas desplegables no deben cargar todas las opciones de antemano. Cámbialas por una búsqueda de palabras clave que obtenga los Registros coincidentes mientras se escribe y aplica antirrebote».`]})})]}),_jsxs(Accordion,{title:`Selectores en cascada que encadenan solicitudes`,icon:`sitemap`,id:`selectores-en-cascada-que-encadenan-solicitudes`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Elegir un Campo desencadena la carga de las opciones del nivel siguiente. Las cascadas de varios niveles acumulan varias solicitudes por interacción.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Precarga una vez los datos relacionados y fíltralos localmente, o almacena en caché los datos de la cascada después de la primera carga.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Almacena localmente en caché los datos de las opciones de los selectores en cascada después de cargarlos. Cuando el usuario cambie una opción superior, filtra la caché en lugar de volver a solicitar los datos».`]})})]}),_jsxs(Accordion,{title:`Las nuevas representaciones desencadenan solicitudes duplicadas`,icon:`repeat`,id:`las-nuevas-representaciones-desencadenan-solicitudes-duplicadas`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Una gestión de estado deficiente hace que los componentes vuelvan a obtener datos con cada representación.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Desencadena la obtención de datos en eventos concretos —el montaje inicial o una acción explícita del usuario—, no en cada representación. Usa la caché como medida de seguridad.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Obtén los datos únicamente en la primera carga de la página o cuando haya acciones explícitas del usuario. No vuelvas a obtenerlos con cada representación; usa los datos de la caché».`]})})]})]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Paginación y procesamiento por lotes: reduce la carga de cada solicitud`})}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`Listas o Tablas sin paginación`,icon:`table-list`,id:`listas-o-tablas-sin-paginacion`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Cargar todos los Registros a la vez produce una avalancha de llamadas a la API cuando crece el conjunto de datos.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Pagina los datos. Obtén únicamente los de la página actual.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Muestra 20 filas por página. Carga la página siguiente únicamente cuando el usuario navegue hasta ella. No cargues todo a la vez».`]})})]}),_jsxs(Accordion,{title:`Obtención por fila de datos enlazados (N+1)`,icon:`link`,id:`obtencion-por-fila-de-datos-enlazados-n-1`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Después de cargar una lista, obtienes uno por uno los detalles de la Tabla enlazada correspondientes a cada Registro. Cargar 50 proyectos y después consultar 50 responsables genera 50 solicitudes adicionales al instante.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Obtén todos los datos enlazados en un único lote, no fila por fila.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Al cargar una lista, obtén por lotes todos los datos enlazados en una sola solicitud. No recorras los Registros para obtener su información enlazada de forma individual».`]})})]}),_jsxs(Accordion,{title:`Escrituras por fila durante actualizaciones masivas`,icon:`pen-to-square`,id:`escrituras-por-fila-durante-actualizaciones-masivas`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Se actualizan de forma masiva varios Registros enviando una solicitud de actualización por Registro en lugar de una única solicitud por lotes.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Usa la API de actualización por lotes para enviar todos los cambios en una sola llamada.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Para operaciones masivas, combina los cambios de varios Registros en una sola solicitud por lotes. No envíes una actualización por Registro».`]})})]}),_jsxs(Accordion,{title:`Llamadas a la API dentro de bucles`,icon:`rotate`,id:`llamadas-a-la-api-dentro-de-bucles`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Un bucle `,_jsx(_components.code,{children:`for`}),` procesa los Registros uno por uno y llama a la API en cada iteración.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Recopila primero todos los ID y envía después una única solicitud por lotes.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «No llames a la API dentro de un bucle. Recopila primero todos los ID necesarios y envía después una única solicitud por lotes».`]})})]})]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Antirrebote y limitación: reduce la frecuencia de las solicitudes`})}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`Búsquedas o filtros sin antirrebote`,icon:`magnifying-glass`,id:`busquedas-o-filtros-sin-antirrebote`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Cada pulsación de tecla en un cuadro de búsqueda envía una solicitud. Escribir una consulta de 4 caracteres produce 4 solicitudes.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Aplica antirrebote a la entrada: espera entre 300 y 500 ms después de que el usuario deje de escribir antes de enviar la solicitud.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Aplica antirrebote a la entrada de búsqueda. Envía una solicitud únicamente 300 ms después de que el usuario deje de escribir. No envíes solicitudes mientras escribe».`]})})]}),_jsxs(Accordion,{title:`Acciones de usuario rápidas y repetidas`,icon:`hand-pointer`,id:`acciones-de-usuario-rapidas-y-repetidas`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Clics rápidos y repetidos en Enviar, cambios sucesivos de filtros o una paginación veloz: cada acción envía una solicitud de inmediato.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Aplica antirrebote o limitación. Deshabilita los botones de envío hasta que termine la solicitud para evitar envíos duplicados.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Deshabilita el botón de envío después de hacer clic y vuelve a habilitarlo cuando se resuelva la solicitud. Aplica antirrebote a los cambios de filtro para que los cambios rápidos producidos durante 300 ms envíen una sola solicitud».`]})})]}),_jsxs(Accordion,{title:`Guardado automático de formularios demasiado agresivo`,icon:`floppy-disk`,id:`guardado-automatico-de-formularios-demasiado-agresivo`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Cada cambio de Campo se guarda inmediatamente. Completar un formulario puede provocar una docena de escrituras.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Cambia al guardado explícito mediante un botón o aplica antirrebote al guardado automático para que se ejecute una sola vez después de una pausa durante la edición.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «No guardes después de cada cambio de Campo. Guarda al hacer clic explícitamente en el botón o guarda automáticamente una vez cuando el usuario haya dejado de editar durante 2 segundos».`]})})]}),_jsxs(Accordion,{title:`Intervalos de consulta demasiado breves`,icon:`clock`,id:`intervalos-de-consulta-demasiado-breves`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Los datos se actualizan cada pocos segundos, lo que genera un tráfico sostenido de alta frecuencia.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Amplía el intervalo de consulta a un valor razonable —30 segundos o más— o cambia a la actualización manual.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Establece el intervalo de actualización automática en 60 segundos. Añade un botón de actualización manual para que los usuarios puedan obtener los datos más recientes cuando los necesiten».`]})})]}),_jsxs(Accordion,{title:`Varios componentes realizan consultas periódicas de forma independiente`,icon:`timer`,id:`varios-componentes-realizan-consultas-periodicas-de-forma-independiente`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: Varios componentes de una página configuran su propio temporizador de consulta. La carga combinada supera fácilmente el límite.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: Centraliza las consultas periódicas. Realiza una obtención periódica y distribuye el resultado a todos los componentes que lo necesiten.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «No permitas que cada componente configure su propio temporizador de consulta. Usa un único mecanismo de actualización que obtenga todos los datos de forma programada y los distribuya a los componentes».`]})})]})]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Compatibilidad de representación: reduce los errores de la vista previa`})}),`\n`,_jsx(AccordionGroup,{children:_jsxs(Accordion,{title:`Los gráficos, mapas o componentes exclusivos del navegador fallan en la vista previa`,icon:`chart-line`,id:`los-graficos-mapas-o-componentes-exclusivos-del-navegador-fallan-en-la-vista-previa`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Situación`}),`: La página usa gráficos, mapas o bibliotecas que dependen de `,_jsx(_components.code,{children:`window`}),`, medidas del DOM u otras API exclusivas del navegador, y la vista previa muestra errores, una pantalla en blanco o discrepancias de hidratación.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Solución`}),`: A menudo resulta más seguro cargar estos componentes en el navegador en lugar de representarlos directamente en el servidor. Si persisten los problemas de la vista previa, pide explícitamente a la IA que los cambie a un patrón de carga exclusivo del navegador.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Instrucción de referencia`}),`: «Este componente depende del entorno del navegador. Cárgalo únicamente en el cliente para evitar errores de representación o discrepancias de hidratación en la vista previa».`]})})]})}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`La IA puede cometer errores. Comprueba las respuestas.`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Prácticas recomendadas de App Builder","description":"Consejos y patrones prácticos para aprovechar al máximo App Builder de Teable.","href":"/es/basic/ai/app-builder-practical-guide"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Consejos de creación","slug":"consejos-de-creación","depth":2,"children":[{"title":"1. Define primero los datos","slug":"1-define-primero-los-datos","depth":3,"children":[]},{"title":"2. Planifica antes de crear","slug":"2-planifica-antes-de-crear","depth":3,"children":[]},{"title":"3. Empieza por algo pequeño","slug":"3-empieza-por-algo-pequeño","depth":3,"children":[]},{"title":"4. Sé concreto, no abstracto","slug":"4-sé-concreto-no-abstracto","depth":3,"children":[]},{"title":"5. Diagnostica antes de corregir","slug":"5-diagnostica-antes-de-corregir","depth":3,"children":[]},{"title":"6. Aprovecha la reversión de versiones","slug":"6-aprovecha-la-reversión-de-versiones","depth":3,"children":[]}]},{"title":"Preguntas frecuentes","slug":"preguntas-frecuentes","depth":2,"children":[{"title":"App Builder solo admite Next.js","slug":"app-builder-solo-admite-next-js","depth":3,"children":[]},{"title":"Gestionar errores 429","slug":"gestionar-errores-429","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/teablecn/71cbb75c3a7d5380/changelog-toc.js","/_mintlify/custom/teablecn/80db1a1b20421dd5/language-route.js"],"subdomain":"teablecn","siteName":"Teable","title":"Prácticas recomendadas de App Builder - Teable","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/en/basic/ai/app-builder-practical-guide","matchLevel":1},"zh":{"href":"/zh/basic/ai/app-builder-practical-guide","matchLevel":1},"ru":{"href":"/ru/basic/ai/app-builder-practical-guide","matchLevel":1},"de":{"href":"/de/basic/ai/app-builder-practical-guide","matchLevel":1},"fr":{"href":"/fr/basic/ai/app-builder-practical-guide","matchLevel":1},"es":{"href":"/es/basic/ai/app-builder-practical-guide","matchLevel":0},"it":{"href":"/it/basic/ai/app-builder-practical-guide","matchLevel":1},"ja":{"href":"/ja/basic/ai/app-builder-practical-guide","matchLevel":1},"tr":{"href":"/tr/basic/ai/app-builder-practical-guide","matchLevel":1},"uk":{"href":"/uk/basic/ai/app-builder-practical-guide","matchLevel":1},"ar":{"href":"/ar/basic/ai/app-builder-practical-guide","matchLevel":1}}},"lastModified":"2026-09-04T11:50:10.705Z","gitLastModified":"2026-09-04T11:47:25.000Z","originalFileLocation":"es/basic/ai/app-builder-practical-guide.mdx","locale":"es"},"headHtml":"\u003cmeta data-mint-head name=\"description\" content=\"Consejos y patrones prácticos para aprovechar al máximo App Builder de Teable.\">\u003cmeta data-mint-head name=\"keywords\" content=\"database, app builder, AI, no-code, low-code, Airtable alternative, PostgreSQL, automation\">\u003cmeta data-mint-head name=\"application-name\" content=\"Teable\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/teablecn/rUjbOrtkw4E-Xgfe/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/teablecn/rUjbOrtkw4E-Xgfe/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/teablecn/rUjbOrtkw4E-Xgfe/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/teablecn/rUjbOrtkw4E-Xgfe/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/teablecn/rUjbOrtkw4E-Xgfe/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/teablecn/rUjbOrtkw4E-Xgfe/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/teablecn/rUjbOrtkw4E-Xgfe/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/teablecn/rUjbOrtkw4E-Xgfe/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/teablecn/rUjbOrtkw4E-Xgfe/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Prácticas recomendadas de App Builder - Teable\">\u003cmeta data-mint-head property=\"og:description\" content=\"Consejos y patrones prácticos para aprovechar al máximo App Builder de Teable.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Teable\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://help.teable.ai/es/basic/ai/app-builder-practical-guide\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://teable.ai/assets/images/og-image.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Prácticas recomendadas de App Builder - Teable\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Consejos y patrones prácticos para aprovechar al máximo App Builder de Teable.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://teable.ai/assets/images/og-image.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/teablecn/rUjbOrtkw4E-Xgfe/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Teable\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#131415\">\u003clink data-mint-head rel=\"canonical\" href=\"https://help.teable.ai/es/basic/ai/app-builder-practical-guide\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/es/basic/ai/app-builder-practical-guide.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://help.teable.ai/es/basic/ai/app-builder-practical-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://help.teable.ai/en/basic/ai/app-builder-practical-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://help.teable.ai/zh/basic/ai/app-builder-practical-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ru\" href=\"https://help.teable.ai/ru/basic/ai/app-builder-practical-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"de\" href=\"https://help.teable.ai/de/basic/ai/app-builder-practical-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"fr\" href=\"https://help.teable.ai/fr/basic/ai/app-builder-practical-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"it\" href=\"https://help.teable.ai/it/basic/ai/app-builder-practical-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://help.teable.ai/ja/basic/ai/app-builder-practical-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"tr\" href=\"https://help.teable.ai/tr/basic/ai/app-builder-practical-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"uk\" href=\"https://help.teable.ai/uk/basic/ai/app-builder-practical-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ar\" href=\"https://help.teable.ai/ar/basic/ai/app-builder-practical-guide\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://help.teable.ai/en/basic/ai/app-builder-practical-guide\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://help.teable.ai/#organization\",\"name\":\"Teable\",\"url\":\"https://help.teable.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/teablecn/Sov59EnEPMakaGyj/images/teable-logo-full.png?fit=max\u0026auto=format\u0026n=Sov59EnEPMakaGyj\u0026q=85\u0026s=24e1fe49258a9a8f76eaec5792623926\"}},{\"@type\":\"WebSite\",\"@id\":\"https://help.teable.ai#website\",\"name\":\"Teable\",\"url\":\"https://help.teable.ai\",\"publisher\":{\"@id\":\"https://help.teable.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://help.teable.ai/es/basic/ai/app-builder-practical-guide#webpage\",\"url\":\"https://help.teable.ai/es/basic/ai/app-builder-practical-guide\",\"name\":\"Prácticas recomendadas de App Builder\",\"description\":\"Consejos y patrones prácticos para aprovechar al máximo App Builder de Teable.\",\"dateModified\":\"2026-09-04T11:47:25.000Z\",\"isPartOf\":{\"@id\":\"https://help.teable.ai#website\"},\"breadcrumb\":{\"@id\":\"https://help.teable.ai/es/basic/ai/app-builder-practical-guide#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://help.teable.ai/es/basic/ai/app-builder-practical-guide#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"IA\",\"item\":\"https://help.teable.ai/es/basic/ai/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"App Builder\",\"item\":\"https://help.teable.ai/es/basic/ai/app-builder\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Prácticas recomendadas de App Builder\",\"item\":\"https://help.teable.ai/es/basic/ai/app-builder-practical-guide\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://help.teable.ai/es/basic/ai/app-builder-practical-guide#article\",\"headline\":\"Prácticas recomendadas de App Builder\",\"name\":\"Prácticas recomendadas de App Builder\",\"description\":\"Consejos y patrones prácticos para aprovechar al máximo App Builder de Teable.\",\"url\":\"https://help.teable.ai/es/basic/ai/app-builder-practical-guide\",\"mainEntityOfPage\":{\"@id\":\"https://help.teable.ai/es/basic/ai/app-builder-practical-guide#webpage\"},\"image\":\"https://teable.ai/assets/images/og-image.png\",\"dateModified\":\"2026-09-04T11:47:25.000Z\",\"publisher\":{\"@id\":\"https://help.teable.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://help.teable.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Teable\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Teable","nav":{"global":null,"languages":[{"language":"en","banner":{"content":"🚀 Run AI tasks on a schedule. See our [changelog](/en/changelog#oct-15-2026) for details.","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Support"}]},"pages":[{"title":"en","href":"/en/basic/ai/app-builder-practical-guide"}]},{"language":"zh","banner":{"content":"🚀 让 AI 按计划执行任务。查看[更新日志](/zh/changelog#2026-10-15)了解详情。","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"支持"}]},"pages":[{"title":"zh","href":"/zh/basic/ai/app-builder-practical-guide"}]},{"language":"ru","banner":{"content":"🚀 Запускайте задачи ИИ по расписанию. Подробнее в [журнале изменений](/ru/changelog#15-октября-2026-г).","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Поддержка"}]},"pages":[{"title":"ru","href":"/ru/basic/ai/app-builder-practical-guide"}]},{"language":"de","banner":{"content":"🚀 KI-Aufgaben nach Zeitplan ausführen. Mehr im [Changelog](/de/changelog#15-oktober-2026).","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Support"}]},"pages":[{"title":"de","href":"/de/basic/ai/app-builder-practical-guide"}]},{"language":"fr","banner":{"content":"🚀 Exécutez des tâches IA selon un planning. Consultez le [journal des modifications](/fr/changelog#15-octobre-2026).","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Assistance"}]},"pages":[{"title":"fr","href":"/fr/basic/ai/app-builder-practical-guide"}]},{"language":"es","banner":{"content":"🚀 Ejecuta tareas de IA de forma programada. Consulta el [registro de cambios](/es/changelog#15-oct-2026).","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Soporte"}]},"tabs":[{"tab":"Documentación","groups":[{"group":"IA","pages":[{"title":"Descripción general","href":"/es/basic/ai/overview"},{"title":"Chat de IA","href":"/es/basic/ai/ai-chat"},{"title":"Rutina","href":"/es/basic/ai/routine"},{"group":"App Builder","pages":[{"title":"App Builder","description":"Transforma tus datos en aplicaciones web personalizadas mediante IA.","href":"/es/basic/ai/app-builder"},{"title":"Prácticas recomendadas de App Builder","href":"/es/basic/ai/app-builder-practical-guide"}]},{"title":"Campos de IA","description":"Los campos de IA pueden resumir texto, clasificar etiquetas, generar puntuaciones o convertir contenido en imágenes.","href":"/es/basic/field/ai/ai-field"},{"group":"Conectar y migrar todo","pages":[{"title":"Conecta y migra todo","href":"/es/basic/ai/connect-everything"},{"title":"Migrar desde Airtable","href":"/es/basic/ai/connect-everything/migrate-airtable"},{"title":"Migrar desde Baserow","href":"/es/basic/ai/connect-everything/migrate-baserow"},{"title":"Migrar desde SmartSuite","href":"/es/basic/ai/connect-everything/migrate-smartsuite"},{"title":"Migrar desde NocoDB","href":"/es/basic/ai/connect-everything/migrate-nocodb"},{"title":"Migrar Jira","sidebarTitle":"Migrar Jira","href":"/es/basic/ai/connect-everything/migrate-jira"},{"title":"Migrar monday.com","sidebarTitle":"Migrar monday.com","href":"/es/basic/ai/connect-everything/migrate-monday"},{"title":"Migrar ClickUp","sidebarTitle":"Migrar ClickUp","href":"/es/basic/ai/connect-everything/migrate-clickup"},{"title":"Migrar Smartsheet","sidebarTitle":"Migrar Smartsheet","href":"/es/basic/ai/connect-everything/migrate-smartsheet"},{"title":"Conectar y migrar más fuentes","href":"/es/basic/ai/connect-everything/more-sources"}]},{"title":"Credenciales e integraciones","href":"/es/basic/credential"},{"title":"Conecta agentes de IA a Teable","href":"/es/basic/ai/teable-skill"},{"title":"Modelo de IA personalizado","href":"/es/basic/ai/custom-model"}]},{"group":"Espacio","pages":[{"title":"Descripción general","href":"/es/basic/space"},{"title":"Invitación a un Espacio","href":"/es/basic/space/space-invite"},{"title":"Invitación a un Proyecto","href":"/es/basic/space/base-invite"},{"title":"Detalles de los permisos de colaboración","href":"/es/basic/space/space-permission"},{"title":"Facturación y suscripción","href":"/es/basic/space/billing"}]},{"group":"Automatización","pages":[{"title":"Descripción general","href":"/es/basic/automation"},{"group":"Desencadenadores","pages":[{"title":"Cuando un Registro cumple las condiciones","href":"/es/basic/automation/trigger/records/record-matches-conditions"},{"title":"Cuando se crea un Registro","href":"/es/basic/automation/trigger/records/record-created"},{"title":"Cuando se actualiza un Registro","href":"/es/basic/automation/trigger/records/record-updated"},{"title":"Cuando se envía un formulario","href":"/es/basic/automation/trigger/forms/form-submitted"},{"title":"A la hora programada","href":"/es/basic/automation/trigger/external/scheduled-time"},{"title":"Cuando se hace clic en un botón","href":"/es/basic/automation/trigger/forms/button-click"},{"title":"Cuando se recibe un webhook","href":"/es/basic/automation/trigger/external/webhook-received"},{"title":"Al recibir un evento de conector","href":"/es/basic/automation/trigger/external/connector-event"},{"group":"Al recibir un correo electrónico","pages":[{"title":"Descripción general de Cuando se recibe un correo electrónico","href":"/es/basic/automation/trigger/email/email-received-overview"},{"title":"Configurar IMAP de Gmail","href":"/es/basic/automation/trigger/email/gmail-imap"}]}]},{"group":"Acciones","pages":[{"group":"Crear con IA (recomendado)","pages":[{"title":"Ejecutar script","href":"/es/basic/automation/actions/ai/ai-script"}]},{"group":"Crear manualmente","pages":[{"title":"Crear Registro","href":"/es/basic/automation/actions/records/create-record"},{"title":"Actualizar Registro","href":"/es/basic/automation/actions/records/update-record"},{"title":"Obtener Registros","href":"/es/basic/automation/actions/records/get-records"},{"group":"Enviar correo electrónico","pages":[{"title":"Descripción general de Enviar correo electrónico","href":"/es/basic/automation/actions/communication/send-email-overview"},{"title":"Configurar SMTP y remitente","href":"/es/basic/automation/actions/communication/smtp-sender"}]},{"title":"Solicitud HTTP","href":"/es/basic/automation/actions/logic/http-request"},{"title":"Generar con IA","href":"/es/basic/automation/actions/ai/ai-generate"},{"title":"Acceso entre Proyectos","href":"/es/basic/automation/actions/records/cross-base"},{"title":"Bucle (lote)","href":"/es/basic/automation/actions/logic/loop-run"},{"title":"Lógica condicional","href":"/es/basic/automation/actions/manual/conditional-logic"},{"title":"Ejecutar script","href":"/es/basic/automation/ai/scripting/runscript"}]}]},{"group":"Ejemplos","pages":[{"title":"Crear Registros automáticamente de forma periódica","href":"/es/basic/automation/examples/recurring-records"},{"title":"Ejecutar acciones diferentes según los valores de los Registros","href":"/es/basic/automation/examples/conditional-actions"},{"title":"Procesar Registros en lote con Bucle","href":"/es/basic/automation/examples/batch-loop"},{"title":"Evitar disparadores no deseados con filtros y Campos supervisados","href":"/es/basic/automation/examples/prevent-unwanted-triggers"},{"title":"Registrar automáticamente la hora de un cambio de estado","href":"/es/basic/automation/examples/timestamp-status"},{"title":"Enviar notificaciones a Slack, Discord o Teams","href":"/es/basic/automation/examples/push-notifications"},{"title":"Enviar recordatorios antes de que venzan las tareas","href":"/es/basic/automation/examples/deadline-reminders"},{"title":"Generar y enviar un resumen diario por correo electrónico con IA","href":"/es/basic/automation/examples/ai-email-digest"},{"title":"Clasificar automáticamente nuevos formularios con IA","href":"/es/basic/automation/examples/ai-classify-forms"},{"title":"Mantener sincronizados los Registros entre varios Proyectos","href":"/es/basic/automation/examples/cross-base-sync"},{"title":"Crear automatizaciones mediante programación con la API","href":"/es/basic/automation/examples/api-automation"}]}]},{"group":"Proyecto","pages":[{"title":"Descripción general","href":"/es/basic/base"},{"group":"Tabla","pages":[{"title":"Descripción general","href":"/es/basic/table"},{"title":"Importar","href":"/es/basic/table/import"},{"title":"Exportar","href":"/es/basic/table/export"}]},{"group":"Campo","pages":[{"title":"Descripción general","href":"/es/basic/field"},{"title":"Campos de IA","href":"/es/basic/field/ai/ai-field"},{"group":"Campo básico","pages":[{"title":"Texto de una línea","href":"/es/basic/field/single-line-text"},{"title":"Texto largo","href":"/es/basic/field/long-text"},{"title":"Número","href":"/es/basic/field/number"},{"title":"Selección única","href":"/es/basic/field/single-select"},{"title":"Selección múltiple","href":"/es/basic/field/multiple-select"},{"title":"Fecha","href":"/es/basic/field/date"},{"title":"Valoración","href":"/es/basic/field/rating"},{"title":"Casilla de verificación","href":"/es/basic/field/checkbox"},{"title":"Adjunto","href":"/es/basic/field/attachment"}]},{"group":"Campo avanzado","pages":[{"group":"Fórmula","pages":[{"title":"Fórmula","href":"/es/basic/field/formula"},{"title":"Gramática de fórmulas","href":"/es/basic/field/formula/grammar"},{"title":"Guía rápida de funciones","mode":"wide","href":"/es/basic/field/formula/cheat-sheet"}]},{"title":"Enlace a Registro","href":"/es/basic/field/link"},{"title":"Acumulación","href":"/es/basic/field/rollup"},{"title":"Búsqueda","href":"/es/basic/field/lookup"},{"title":"Acumulación condicional","href":"/es/basic/field/conditional-rollup"},{"title":"Búsqueda condicional","href":"/es/basic/field/conditional-lookup"},{"title":"Usuario","href":"/es/basic/field/user"},{"title":"Creado por","href":"/es/basic/field/created-by"},{"title":"Última modificación por","href":"/es/basic/field/last-modified-by"},{"title":"Fecha de creación","href":"/es/basic/field/created-time"},{"title":"Fecha de última modificación","href":"/es/basic/field/last-modified-time"},{"title":"Numeración automática","href":"/es/basic/field/auto-number"},{"group":"Botón","pages":[{"title":"Botón","href":"/es/basic/field/button"},{"title":"Guía práctica del botón","href":"/es/basic/field/button-practical-guide"}]}]},{"group":"Común","pages":[{"title":"Formato","href":"/es/basic/field/common/formatter"},{"title":"Visualización interactiva","href":"/es/basic/field/common/show-as"},{"title":"Valor único y valores múltiples","href":"/es/basic/field/common/is-multiple-value"}]}]},{"group":"Registros","pages":[{"title":"Descripción general","href":"/es/basic/record"},{"title":"Comentarios","href":"/es/basic/record/comment"},{"title":"Historial del Registro","href":"/es/basic/record/record-history"},{"title":"Archivo y papelera","href":"/es/basic/record/archive-trash"}]},{"group":"Vista","pages":[{"title":"Cuadrícula","href":"/es/basic/view/grid"},{"title":"Formulario","href":"/es/basic/view/form"},{"title":"Kanban","href":"/es/basic/view/kanban"},{"title":"Galería","href":"/es/basic/view/gallery"},{"title":"Calendario","href":"/es/basic/view/calendar"},{"title":"Barra de herramientas de la Vista","href":"/es/basic/view/toolbar"}]}]},{"group":"Matriz de autoridad","pages":[{"group":"Matriz de autoridad","pages":[{"title":"Descripción general","href":"/es/basic/authority-matrix"},{"title":"Guía práctica de la Matriz de Autoridad","href":"/es/basic/authority-matrix/authority-matrix-practical-guide"}]}]},{"group":"SSO","pages":[{"title":"Inicio de sesión único (SSO)","href":"/es/basic/sso/overview"},{"title":"SSO con Azure Entra ID","href":"/es/basic/sso/azure-entra-id"},{"title":"SSO con Okta","href":"/es/basic/sso/okta"},{"title":"SSO con Google Workspace","href":"/es/basic/sso/google-workspace"},{"title":"SSO con Auth0","href":"/es/basic/sso/auth0"},{"title":"SSO con OneLogin","href":"/es/basic/sso/onelogin"},{"title":"SSO con Authentik","href":"/es/basic/sso/authentik"}]},{"group":"Comparación","pages":[{"title":"Teable frente a Excel","href":"/es/compare/teable-vs-excel"}]}]},{"tab":"Autoalojado","pages":[{"title":"Autoalojado","href":"/es/deploy/activate"}]},{"tab":"API","pages":[{"title":"API","href":"/es/api-doc/overview"}]},{"tab":"Seguridad","pages":[{"title":"Seguridad","href":"/es/basic/security"}]},{"tab":"Registro de cambios","pages":[{"title":"Registro de cambios","href":"/es/changelog"}]}]},{"language":"it","banner":{"content":"🚀 Esegui le attività IA secondo un programma. Leggi il [registro delle modifiche](/it/changelog#15-ott-2026).","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Supporto"}]},"pages":[{"title":"it","href":"/it/basic/ai/app-builder-practical-guide"}]},{"language":"ja","banner":{"content":"🚀 AI タスクをスケジュールに沿って実行。詳しくは[更新履歴](/ja/changelog#2026年10月15日)をご覧ください。","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"サポート"}]},"pages":[{"title":"ja","href":"/ja/basic/ai/app-builder-practical-guide"}]},{"language":"tr","banner":{"content":"🚀 Yapay zeka görevlerini zamanlayın. Ayrıntılar için [değişiklik günlüğüne](/tr/changelog#15-ekim-2026) bakın.","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Destek"}]},"pages":[{"title":"tr","href":"/tr/basic/ai/app-builder-practical-guide"}]},{"language":"uk","banner":{"content":"🚀 Запускайте завдання ШІ за розкладом. Докладніше в [журналі змін](/uk/changelog#15-жовтня-2026).","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"Підтримка"}]},"pages":[{"title":"uk","href":"/uk/basic/ai/app-builder-practical-guide"}]},{"language":"ar","banner":{"content":"🚀 شغّل مهام الذكاء الاصطناعي وفق جدول زمني. راجع [سجل التغييرات](/ar/changelog#15-أكتوبر-2026) للتفاصيل.","dismissible":true},"navbar":{"links":[{"icon":"comment","href":"https://community.teable.ai/","label":"الدعم"}]},"pages":[{"title":"ar","href":"/ar/basic/ai/app-builder-practical-guide"}]}]},"title":"Prácticas recomendadas de App Builder - Teable","buildId":"dpl_8LJVMfxYNq6LJkohTrn2iyWT8umj","deploymentId":"dpl_8LJVMfxYNq6LJkohTrn2iyWT8umj","dynamics":["10e4515597"],"chunks":["BannerMarkdown-IiEQNrcc.js","dist-dK59mPLe.js","lib-B6V4jynN.js","lib-vtHBCq3V.js","clsx-trXNtT1g.js","html-void-elements-mCSPHezU.js","katex-Cnv50rb0.js","marked.esm-BKo0Hl1x.js"]}