Convertir una pregunta en SQL
La distancia entre 'cuántos pedidos llegaron tarde el mes pasado' y un JOIN correcto entre tres tablas es donde la mayoría de las personas sin perfil técnico se rinde y termina abriendo un ticket. Este endpoint toma su esquema y una pregunta en español o inglés llano, y devuelve una consulta escrita contra las tablas y columnas que realmente existen.
Ejecútela online
Ejecute esto en nuestros servidores con su cuenta. Las herramientas gratuitas corren en su navegador; esta cobra de su saldo del KIT según el precio de arriba.
El problema que resuelve
Analistas, líderes de soporte y product managers suelen saber exactamente qué le quieren preguntar a una base de datos y no tienen ningún interés en aprender la diferencia entre un LEFT JOIN y un INNER JOIN para lograrlo. Delegar cada pregunta puntual a un ingeniero es lento para ambas partes, y las herramientas genéricas de texto a SQL que no ven su esquema real tienden a inventar nombres de tabla que no existen. Este endpoint se construye alrededor del esquema que le envía, no de una suposición sobre cómo luce una base de datos típica de comercio electrónico.
Qué proporciona
Envía su esquema (nombres de tabla, columnas, tipos y, opcionalmente, llaves foráneas) junto con la pregunta en lenguaje natural. También puede indicar el dialecto de SQL que necesita, porque PostgreSQL, MySQL y SQLite difieren en cosas como funciones de fecha, concatenación de cadenas y cómo se comportan LIMIT y OFFSET, y una consulta sintácticamente válida en uno puede fallar en otro.
Qué recibe
La respuesta es una consulta escrita estrictamente contra las columnas y tablas que suministró, más una nota breve en lenguaje llano que explica qué hace la consulta y cualquier suposición que tuvo que hacer, por ejemplo qué columna de fecha usó cuando su esquema tenía dos candidatas. Si la pregunta no puede responderse con el esquema dado, por ejemplo porque referencia una métrica que ninguna tabla registra, la tarea lo indica en vez de devolver una consulta que corre pero produce el resultado equivocado sin avisar.
Dónde encaja esto
La integración habitual es una caja de consulta dentro de un panel interno o un bot de chat: alguien escribe una pregunta, la solicitud sale con el esquema actual adjunto, y el SQL devuelto corre directamente contra una réplica de solo lectura o se le muestra a la persona para una revisión rápida antes de ejecutarlo. Como es asíncrona con entrega por webhook, también encaja en escenarios de lote donde decenas de preguntas de reportes guardados se regeneran durante la noche tras una migración de esquema.
Una nota sobre confianza
El SQL generado siempre debería correr contra una conexión o réplica de solo lectura para cualquier cosa expuesta a usuarios finales, la misma disciplina que aplicaría a una consulta escrita por alguien recién contratado. La tarea explica su consulta en vez de esconder la lógica, así puede revisar un JOIN o una cláusula WHERE antes de que toque datos de producción.
Qué puede hacer con ella
Analítica de autoservicio para soporte
Un líder de soporte pregunta 'qué clientes tuvieron dos o más reembolsos este trimestre' y obtiene una consulta ejecutable sin esperar la disponibilidad de un ingeniero.
Caja de consulta en un panel interno
Una herramienta interna permite a los product managers escribir preguntas en lenguaje llano y les muestra el SQL generado junto a la tabla de resultados, con total transparencia.
Regeneración de reportes tras un cambio de esquema
Un equipo migra una base de datos y reenvía su biblioteca de preguntas de reportes guardados para que el SQL se reescriba automáticamente contra los nuevos nombres de columna.
Incorporación de nuevos analistas
Personas recién contratadas que no conocen un esquema interno extenso lo usan para obtener una consulta inicial funcional y luego la refinan mientras aprenden las tablas.
Preguntas frecuentes
¿Necesita mi esquema real o adivina los nombres de las tablas?
Necesita su esquema real; envía nombres de tabla y columna y la API escribe exactamente contra eso, así que nunca inventa tablas inexistentes.
¿Qué dialectos de SQL soporta?
Soporta PostgreSQL, MySQL y SQLite; especifique el dialecto porque el manejo de fechas, las funciones de cadenas y la sintaxis de paginación difieren entre ellos.
¿Hay alguna forma gratuita de probarla?
No hay capa gratuita: las capas gratis se abusan y ralentizan a todos. El acceso funciona con un saldo prepago de ForHosting KIT: se recarga desde $10.00 (no caduca) y cada solicitud se cobra a su precio publicado, así que una llamada sin saldo devuelve HTTP 402. Sin suscripción, sin tokens ni créditos inventados, y una tarea fallida no se cobra.
¿Cuánto cuesta?
$0.003 por solicitud más $0.0135 por consulta, y solo se cobran las consultas que se completan con éxito.
¿Es seguro ejecutar el SQL directamente en producción?
Trate el SQL generado como una consulta escrita por alguien recién contratado: revíselo, y para cualquier uso frente al usuario final ejecútelo contra una réplica de solo lectura y no contra la conexión de escritura en vivo.
¿Qué pasa si mi pregunta no puede responderse con el esquema?
La tarea informa que la pregunta no corresponde a las tablas o columnas disponibles, en vez de devolver una consulta que corre pero produce un resultado engañoso.
¿Puedo usarla para automatizar reportes y no solo preguntas puntuales?
Sí, es asíncrona con entrega por webhook, así que la regeneración en lote de muchas preguntas guardadas, por ejemplo tras una migración, encaja de forma natural.
¿Se guarda mi esquema o mis datos después de la solicitud?
No. El esquema y las preguntas enviadas se eliminan al vencer el período de retención y nunca se usan para entrenar modelos.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, y pronto desde nuestra app, el email y Telegram.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/dev/text-to-sql \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/dev/text-to-sql", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"input": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/text-to-sql",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"input": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/text-to-sql", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"input":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"input":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/text-to-sql", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"input": "…"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.text_to_sql",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
422 | task_failed | La tarea falló tras 3 reintentos. No se cobra. |