b4c28da2ba
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2.6 KiB
2.6 KiB
id, title, status, priority, created, related_components
| id | title | status | priority | created | related_components | |
|---|---|---|---|---|---|---|
| 0080 | tables playground — LLM API "Ask AI" (fase 11) | pending | medium | 2026-05-12 |
|
Contexto
Fase 11 del roadmap del tables playground. El user escribe en lenguaje natural
una pregunta sobre los datos ("show me top 10 langs by total size"). El LLM
recibe el TQL actual + schema + pregunta, devuelve nuevo TQL. App aplica via
tql::apply y renderiza.
Cambios
1. UI
- Boton "Ask AI" en toolbar (al lado de "+ Viz").
- Modal con:
- InputText multiline para la pregunta.
- Boton "Send" + spinner durante la llamada.
- Diff side-by-side: TQL actual vs TQL propuesto (texto con highlight).
- Botones "Apply" / "Reject" / "Edit before apply".
2. Backend LLM
- Provider: Anthropic Claude (API key desde
pass anthropic/api-key). - Endpoint:
https://api.anthropic.com/v1/messages. - Model:
claude-sonnet-4-6por defecto. Configurable via envFN_LLM_MODEL. - Cliente HTTP: cURL via popen (sin deps nuevas) o libcurl si ya esta linkada.
- Prompt template incluye:
- Esquema TQL (de
docs/TQL.md). - Cols disponibles del stage 0 (name, type) + cols joinables.
- Funciones Lua disponibles (de
lua_engine). - TQL actual.
- Pregunta del user.
- Esquema TQL (de
- Response: extraer
luablock del markdown, strip prose.
3. Validacion + safety
- Antes de aplicar:
tql::applycon dry-run (parsea sin mutar State). Si fail, mostrar error + boton "Ask AI again with this error". - Lua sandbox ya cubre side effects en formulas — el TQL en si es declarativo, no ejecuta nada peligroso.
4. Streaming
- Stream tokens via SSE (
stream=trueen Anthropic API). - Mostrar texto en vivo en el modal.
- Cuando termina, parsear lua block final.
5. Persistencia conversation
- UiState guarda lista de turns (pregunta + TQL propuesto + resultado apply).
- "Ask AI" siguiente turn incluye history previa.
- Boton "Reset chat" limpia.
- NO persistido en TQL (es UI state).
6. Coste / rate limit
- Mostrar tokens estimados antes de enviar (rough char count / 4).
- Cap input a 8000 tokens.
- Error handling: 429 / 5xx -> mensaje + reintentar.
Tests
- Mockear HTTP response con cURL stub.
- Test: prompt build incluye schema + TQL + pregunta en formato esperado.
- Test: response parse extrae lua block correctamente.
- Test: tql::apply sobre output del LLM funciona end-to-end con dataset sintetico.
No-objetivos
- Generacion de visualizaciones nuevas via LLM (la viz la elige TQL
display, suficiente). - Acciones del LLM mas alla de modificar TQL (sin acceso a I/O del sistema).
- Multi-provider (OpenAI / local) — fase futura. Hardcode Anthropic primero.