Class GridAIController

java.lang.Object
com.vaadin.flow.component.ai.grid.GridAIController
All Implemented Interfaces:
com.vaadin.flow.component.ai.orchestrator.AIController

public class GridAIController extends Object implements com.vaadin.flow.component.ai.orchestrator.AIController
AI controller for populating a Grid<AIDataRow> with database data via LLM tool calls. Attach it to an AIOrchestrator via AIOrchestrator.Builder.withController(AIController) to expose its tools to the LLM. Workflow instructions are delivered through the description of the get_grid_instructions tool, which the LLM reads as part of the tool manifest.
 var grid = new Grid<AIDataRow>();
 var controller = new GridAIController(grid, databaseProvider);
 AIOrchestrator orchestrator = AIOrchestrator
         .builder(llmProvider, systemPrompt).withController(controller)
         .withMessageList(messageList).build();
 

The grid uses AIDataRow as its item type. Row instances are created internally when query results are rendered and are not intended to be constructed or inspected by application code.

The grid automatically creates columns from query results with:

  • Lazy loading with SQL LIMIT/OFFSET
  • Built-in renderers for dates and numbers
  • Right-alignment for numeric columns
  • Resizable, sortable columns with auto-width
  • Column grouping from dot-separated aliases

State changes requested by the LLM are deferred and applied in onResponse(Throwable) on the success path, avoiding partial state and multiple redraws during a multi-tool LLM turn. The grid state is stored directly on the Grid component, so it survives serialization.

If the LLM turn fails, onResponse(Throwable) fires with the cause — pending changes are discarded and the grid keeps its last successfully-rendered state.

Serialization: This controller is not serialized with the orchestrator. After deserialization, create a new controller and restore transient dependencies via reconnect(provider) .withController(controller).apply(). The grid data can be captured via getState() and re-applied via restoreState(GridState):

 var controller = new GridAIController(grid, databaseProvider);
 orchestrator.reconnect(llmProvider).withController(controller).apply();
 if (savedState != null) {
     controller.restoreState(savedState);
 }
 

Register a listener via addStateChangeListener(SerializableConsumer) to be notified when the grid state changes, for example to persist getState() after each successful AI request.

Since:
25.2
Author:
Vaadin Ltd
See Also:
  • Constructor Summary

    Constructors
    Constructor
    Description
    GridAIController(com.vaadin.flow.component.grid.Grid<AIDataRow> grid, com.vaadin.flow.component.ai.provider.DatabaseProvider databaseProvider)
    Creates a new grid AI controller.
  • Method Summary

    Modifier and Type
    Method
    Description
    com.vaadin.flow.shared.Registration
    addStateChangeListener(com.vaadin.flow.function.SerializableConsumer<GridState> listener)
    Adds a listener that is notified when the grid state changes after an AI request completes successfully.
    Returns the current grid state for persistence, or null if no data has been loaded yet.
    List<com.vaadin.flow.component.ai.provider.LLMProvider.ToolSpec>
     
    void
     
    void
    Restores a previously saved grid state.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface com.vaadin.flow.component.ai.orchestrator.AIController

    onRequest
  • Constructor Details

    • GridAIController

      public GridAIController(com.vaadin.flow.component.grid.Grid<AIDataRow> grid, com.vaadin.flow.component.ai.provider.DatabaseProvider databaseProvider)
      Creates a new grid AI controller.
      Parameters:
      grid - the grid to populate, not null
      databaseProvider - the database provider for schema and query execution, not null
  • Method Details

    • getTools

      public List<com.vaadin.flow.component.ai.provider.LLMProvider.ToolSpec> getTools()
      Specified by:
      getTools in interface com.vaadin.flow.component.ai.orchestrator.AIController
    • onResponse

      public void onResponse(Throwable error)
      Specified by:
      onResponse in interface com.vaadin.flow.component.ai.orchestrator.AIController
    • getState

      public GridState getState()
      Returns the current grid state for persistence, or null if no data has been loaded yet.
      Returns:
      the current state, or null
    • restoreState

      public void restoreState(GridState state)
      Restores a previously saved grid state. Re-executes the stored query and renders the grid.

      Does not fire state change listeners.

      Parameters:
      state - the state to restore, not null
    • addStateChangeListener

      public com.vaadin.flow.shared.Registration addStateChangeListener(com.vaadin.flow.function.SerializableConsumer<GridState> listener)
      Adds a listener that is notified when the grid state changes after an AI request completes successfully. This is typically used to persist the grid state — for example by calling getState() and saving the result so that it can be reapplied with restoreState(GridState) after deserialization.

      The listener is not fired by restoreState(GridState).

      Parameters:
      listener - the listener, not null
      Returns:
      a registration for removing the listener