Files
fn_registry/cpp/functions/viz/data_table_ai_panel.md
T
egutierrez b9716a7cd6 chore: snapshot WIP previo + flow 0008 + 7 sub-issues (0112-0119)
Snapshot de WIP acumulado de sesiones previas antes de merge wave 1
del flow 0008 (kanban_cpp + agent_runner_api + DoD schema).

Incluye:
- dev/flows/0008-kanban-cpp-and-agent-workflows.md
- dev/issues/0112-0119*.md (7 sub-issues)
- WIP previo en cmd/fn/doctor.go, registry/*, modules/, cpp/, etc.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 18:17:08 +02:00

4.3 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path, framework, params, output
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports tested tests test_file_path file_path framework params output
data_table_ai_panel function cpp viz 1.0.0 impure void data_table::draw_ask_ai_modal(AskAiState& ask_ai, State& st, const std::vector<std::string>& active_headers, const std::vector<ColumnType>& active_types, int orig_cols) Modal 'Ask AI' de la tabla TQL: UI de prompt en lenguaje natural, llamada bloqueante a llm_anthropic::ask, render de la respuesta (codigo TQL o SQL editable), botones Apply/Reject/Close. El Apply ejecuta tql::apply sobre el estado actual de la tabla. Soporta modo TQL (default) y SQL (requiere FN_TQL_DUCKDB). Sub-funcion extraida de modules/data_table/data_table.cpp (issue 0107c, fase 11 / issue 0080).
viz
table
imgui
ui
ai
llm
tql
cpp-tables
ask-ai
data_table_cpp_viz
data_table_types_cpp_core
false error_go_core
imgui
false
cpp/functions/viz/data_table_ai_panel.cpp imgui
name desc
ask_ai Estado mutable del modal (AskAiState): prompt, modo TQL/SQL, buffers de respuesta, flags open/busy. Debe persistir entre frames (vive en UiState del data_table).
name desc
st State principal de la tabla. Mutado por Apply: tql::apply modifica st.stages, filtros, sorts.
name desc
active_headers / active_types Snapshot del output del stage activo en el momento de abrir el modal. Se pasan a llm_anthropic::AskInput para que el modelo conozca el schema.
name desc
orig_cols Numero de columnas originales. Necesario para la firma de tql::apply.
Void. Efectos: mutates ask_ai (flags, buffers), mutates st (via tql::apply en Apply).

Documentacion

Sub-funcion que encapsula el modal "Ask AI" de la tabla TQL (issue 0080, fase 11). Permite al usuario escribir una pregunta en lenguaje natural y recibir codigo TQL o SQL generado por un modelo de lenguaje.

Flujo del modal

  1. ask_ai.open = true (seteado por boton "Ask AI" en draw_viz_selector).
  2. Primer frame con open=true: ImGui::OpenPopup("Ask AI").
  3. Modal se abre: prompt input, combo modo TQL/SQL.
  4. Usuario escribe pregunta y hace click en "Send":
    • Construye llm_anthropic::AskInput con question, col_names, col_types, tql_current.
    • Llamada bloqueante a llm_anthropic::ask(in)AskResult.
    • Si error: ask_ai.error se muestra en rojo.
    • Si ok: ask_ai.response_code se copia a ask_ai.edit_buf (editable).
  5. Panel dividido en dos columnas: TQL actual (read-only) | propuesta (editable).
  6. Botones:
    • Apply: ejecuta tql::apply(ask_ai.edit_buf, st, ...). Si ok: cierra modal.
    • Reject: limpia edit_buf y response_code.
    • Close: ask_ai.open = false.

Dependencia llm_anthropic

Si FN_LLM_ANTHROPIC esta definido en el build, se incluye core/llm_anthropic.h (real). Si no, se usa el stub no-op que retorna error "not available". Pendiente promover a cpp/functions/infra/llm_anthropic (Wave 4, issue 0107c deuda tecnica).

Ejemplo

// En el render principal, llamar una vez por frame tras el grid:
data_table::draw_ask_ai_modal(U.ask_ai, st,
    U.active_headers, U.active_types, orig_cols);

// El boton de apertura vive en draw_viz_selector:
//   if (ImGui::SmallButton("Ask AI##ask_open")) U.ask_ai.open = true;

Cuando usarla

Llamar una vez por frame desde el entrypoint thin data_table::render() en el bloque de modales (junto a TQL show/apply, Custom column, etc.), SIEMPRE que el contexto ImGui tenga la ventana activa. No llamar desde apps directamente.

Gotchas

  • La llamada a llm_anthropic::ask es bloqueante (red HTTP). La UI se congela brevemente. Consideracion futura: mover a hilo background + flag de estado asincrono.
  • El modal se destruye (EndPopup) si el usuario hace click fuera. ask_ai.open se pone a false por el &ask_ai.open del BeginPopupModal. Esto borra el estado del prompt en curso — consideracion UX conocida.
  • En modo SQL (ask_ai.mode == 1), Apply solo funciona si FN_TQL_DUCKDB esta definido; de lo contrario muestra mensaje de error informativo.
  • llm_anthropic no esta en el registry (deuda Wave 4). Hasta que se promueva, el stub vive inlined en este .cpp. No duplicar el stub en otros archivos.