AIAssistant

TsgcHTMLAIAssistant: trasforma una domanda scritta in linguaggio naturale in un insieme di operazioni validato per una griglia, una tabella dati, un pivot o un modulo, in Delphi, C++ Builder e .NET. Non tocca mai il tuo dataset, non costruisce SQL e non emette HTML.

TsgcHTMLAIAssistant

Un componente non visuale. Trasforma una domanda in un insieme chiuso di operazioni: filtri, ordinamenti, un raggruppamento, evidenziazioni e un limite per una griglia, oppure righe, colonne, una misura e un aggregato per un pivot, e il componente dati le applica alle proprie righe. Un provider è facoltativo: un parser integrato risponde senza alcuna chiave API.

Classe del componente

TsgcHTMLAIAssistant (unit sgcHTML_AI, non visuale, un TsgcComponent_Base)

Renderizza

Nessun markup: restituisce operazioni validate, e i componenti dati le renderizzano

Famiglia

Chat e IA

Linguaggi

Delphi, C++ Builder, .NET

Crealo, assegnalo, instrada la query

Se vuoi, configura un provider con Provider, APIKey e Model. Assegna l’assistente alla proprietà AIAssistant del componente dati, imposta AIQueryEnabled per renderizzare la barra di query e instrada l’azione che la barra invia. Puoi anche chiamare direttamente l’assistente.

uses
  sgcHTML_AI, sgcHTML_Component_Grid;

FAI := TsgcHTMLAIAssistant.Create(Self);
FAI.Provider := aiprOpenAI;
FAI.APIKey := 'API_KEY';   // optional, the built-in parser answers without it
FAI.Model := 'gpt-4o-mini';
FAI.AllowRowDataToProvider := False;   // the default

oGrid.AIAssistant := FAI;
oGrid.AIQueryEnabled := True;

// in the message handler, action = gridAIQuery
oGrid.LoadAIQueryState(vState);   // empty when the state lives in the session
oGrid.ProcessAIQuery(vQuery);
oGrid.LoadFromDataSource;         // when the grid is bound to a dataset
oHTMX.PushFragment(vGuid, oGrid.HTML);

// Or call it directly and read the validated operations
oCols := TsgcHTMLAIColumns.Create;
oOps := TsgcHTMLGridOps.Create;
try
  oCols.Add('Amount', aidtFloat, 'Order amount');
  oCols.Add('Country', aidtString).AddSample('Spain');
  oCols.Add('Date', aidtDate);
  if FAI.QueryToGridOps('amount greater than 500 sort by date desc',
    oCols, oOps) then
    vText := oOps.ToText;   // what survived validation, as text
finally
  oOps.Free;
  oCols.Free;
end;
// includes: sgcHTML_AI.hpp, sgcHTML_Component_Grid.hpp

FAI = new TsgcHTMLAIAssistant(this);
FAI->Provider = aiprOpenAI;
FAI->APIKey = "API_KEY";   // optional, the built-in parser answers without it
FAI->Model = "gpt-4o-mini";
FAI->AllowRowDataToProvider = false;   // the default

oGrid->AIAssistant = FAI;
oGrid->AIQueryEnabled = true;

// in the message handler, action = gridAIQuery
oGrid->LoadAIQueryState(vState);   // empty when the state lives in the session
oGrid->ProcessAIQuery(vQuery);
oGrid->LoadFromDataSource();       // when the grid is bound to a dataset
oHTMX->PushFragment(vGuid, oGrid->HTML);

// Or call it directly and read the validated operations
String vText;
TsgcHTMLAIColumns *oCols = new TsgcHTMLAIColumns();
TsgcHTMLGridOps *oOps = new TsgcHTMLGridOps();
try
{
  oCols->Add("Amount", aidtFloat, "Order amount");
  oCols->Add("Country", aidtString, "")->AddSample("Spain");
  oCols->Add("Date", aidtDate, "");
  if (FAI->QueryToGridOps("amount greater than 500 sort by date desc",
    oCols, oOps))
    vText = oOps->ToText();   // what survived validation, as text
}
__finally
{
  delete oOps;
  delete oCols;
}
using esegece.sgcWebSockets;

var ai = new TsgcHTMLAIAssistant();
ai.Provider = TsgcHTMLAIAssistant.TsgcHTMLAIProvider.aiprOpenAI;
ai.APIKey = "API_KEY";   // optional, the built-in parser answers without it
ai.Model = "gpt-4o-mini";
ai.AllowRowDataToProvider = false;   // the default

grid.AIAssistant = ai;
grid.AIQueryEnabled = true;

// in the message handler, action = gridAIQuery
grid.LoadAIQueryState(state);   // empty when the state lives in the session
grid.ProcessAIQuery(query);
grid.LoadFromDataSource();      // when the grid is bound to a dataset
htmx.PushFragment(guid, grid.HTML);

// Or call it directly and read the validated operations
var cols = new TsgcHTMLAIColumns();
var ops = new TsgcHTMLGridOps();
cols.Add("Amount", TsgcHTMLAIDataType.aidtFloat, "Order amount");
cols.Add("Country", TsgcHTMLAIDataType.aidtString).AddSample("Spain");
cols.Add("Date", TsgcHTMLAIDataType.aidtDate);
if (ai.QueryToGridOps("amount greater than 500 sort by date desc", cols, ops))
{
    string text = ops.ToText();   // what survived validation, as text
}

Proprietà e metodi principali

I membri che utilizzerai più spesso.

Edizioni e piattaforme

Un provider richiede le unit AI dell’edizione Enterprise o All-Access, oppure il pack sgcAI, e sono solo per Windows. Il parser integrato risponde su ogni piattaforma senza alcun provider. L’unit compila quando è definito SGC_HTML, cosa che sgcVer.inc non fa per Android e iOS, e sgcHTML è un pack autonomo, venduto indipendentemente da sgcWebSockets.

Dove assegnarlo

AIAssistant esiste su TsgcHTMLComponent_Grid, TsgcHTMLComponent_DataTable, TsgcHTMLComponent_PivotTable, TsgcHTMLComponent_Form e TsgcHTMLComponent_InlineAIPrompt. AIQueryEnabled esiste su griglia, tabella dati e pivot: renderizza la barra di query, il chip di interpretazione e il controllo di cancellazione. Il modulo non ha AIQueryEnabled: usa l’assistente per l’incolla intelligente, e InlineAIPrompt lo usa per la sua risposta. Finché non è assegnato alcun assistente, una griglia non renderizza alcun markup AI.

Che cosa esce dalla macchina

Una domanda su una griglia o un pivot invia i nomi delle colonne, le didascalie, i tipi e fino a tre valori di esempio per colonna, ciascuno tagliato a 40 caratteri. Nient’altro, qualunque sia il valore dell’interruttore. Le righe escono solo tramite le chiamate che riguardano le righe, e solo quando AllowRowDataToProvider è True, cosa che per impostazione predefinita non è: SuggestColumnValues e Summarize restituiscono allora False e non inviano nulla, e MaxRows limita ciò che possono trasportare. L’incolla intelligente invia il testo incollato da una persona e il nome, l’etichetta e il tipo di ogni campo, e nessun valore del modulo.

La validazione è il confine

Tutto ciò che restituisce un provider viene trattato come testo ostile. Ogni nome di colonna deve corrispondere alla tua whitelist, per nome esatto e senza distinguere maiuscole e minuscole. Ogni operatore deve essere uno dei 13 di TsgcHTMLAIOperator, ogni aggregato uno tra sum, count, avg, min e max, e ogni valore viene convertito in base al tipo della sua colonna: un valore che non si converte elimina l’intera operazione. Lo stile di un’evidenziazione deve essere uno tra primary, secondary, success, danger, warning, info, light o dark. I limiti vengono ricondotti a MaxLimit, ci sono al massimo 32 filtri, 32 ordinamenti e 32 evidenziazioni, i caratteri di controllo vengono rimossi e tutto ciò che è sconosciuto viene scartato in silenzio. Se non sopravvive nulla, l’intero insieme viene svuotato, spiegazione inclusa. Una prompt injection produce un insieme vuoto o parziale, mai un’eccezione.

Il modello delle operazioni

TsgcHTMLGridOps contiene Filters, Sorts, Highlights, GroupBy, Limit e Explanation. TsgcHTMLPivotOps contiene Rows, Columns, Measure, Aggregate e Explanation. TsgcHTMLAIColumns è la whitelist: Add(aName, aDataType, aCaption) per ogni colonna, con AddSample per i valori di esempio. Entrambe le classi di operazioni offrono IsEmpty, ToText e ToJSON, e FromJSON costituisce il confine completo solo quando gli passi le colonne, quindi rivalida tutto ciò che rileggi da un browser rispetto alla whitelist attuale.

Scegliere un provider

Provider è uno tra aiprOpenAI (predefinito), aiprAnthropic, aiprGemini, aiprDeepSeek, aiprOllama, aiprGrok e aiprMistral, i sette di TsgcAIChatProvider in sgcAI_Chat. Imposta APIKey oppure BaseUrl e l’assistente gestisce un proprio TsgcAI_Chat configurato a partire da Provider, APIKey, Model (se vuoto, mantiene il valore predefinito della chat) e BaseUrl. Oppure assegna il tuo componente chat a Chat, dichiarato solo dove le unit AI sono compilate. Ogni chiamata richiede un output strutturato che segue uno schema JSON, e la tua chat viene ripristinata al termine. HasProvider indica in quale dei due casi ti trovi.

Ripiego basato su regole

Senza provider l’assistente risponde con il proprio parser, e UseRuleBasedFallback (attivo per impostazione predefinita) gli consente di rispondere anche quando una chiamata al provider fallisce. Legge clausole della forma colonna operatore valore unite da and oppure da una virgola, più sort by, group by, top N, between A and B e highlight, e per un pivot le righe, le colonne e l’aggregato. Accetta le consuete grafie inglesi di ciascun operatore ed entrambi i separatori decimali. Una domanda che non comprende non produce alcuna operazione e la pagina mantiene le sue righe. SuggestColumnValues e Summarize non hanno alcun ripiego.

SmartPaste per i moduli

SmartPaste(aText, aFields, aValues) associa il testo incollato a un insieme di campi. Imposta SmartPasteEnabled su TsgcHTMLComponent_Form e renderizza una zona di incollaggio; ProcessSmartPaste(aText) passa il testo all’assistente, scrive ciò che torna indietro nei campi per nome e li contrassegna come compilati dall’AI, con un piccolo badge sull’etichetta. Il parser basato su regole risponde anche senza provider, e le interruzioni di riga sopravvivono al viaggio verso il server.

Assistente di colonna

SuggestColumnValues(aPrompt, aRows, aValues) pilota l’assistente di colonna della griglia. Una colonna il cui AIMode non è acOff renderizza un controllo di suggerimento, ProcessAIColumnValues(aColumnName) chiede un valore per ogni riga visibile in una sola chiamata, e le risposte diventano AIProposals con un controllo Accetta e uno Rifiuta. La libreria non scrive nulla: una proposta accettata genera OnAIColumnValues e la tua applicazione la salva. La chiamata invia righe, quindi richiede un provider e AllowRowDataToProvider attivo.

Impostazioni delle risposte ed eventi

Language imposta la lingua del testo libero, e se vuoto usa le impostazioni locali della richiesta. CacheMinutes (5) risponde dalla cache a una domanda identica su un insieme di colonne identico, e ClearCache la svuota. MaxLimit (1000) non può essere aumentato oltre 1000. OnBeforeQuery(Sender, aPrompt, aAllow) vede l’intero prompt prima di ogni chiamata al provider e la blocca quando imposti aAllow a False. Nessun metodo solleva eccezioni: un errore del provider arriva a OnAIError(Sender, E, aHandled).

Contratto con l’host

Non esiste alcuna route HTTP. Ogni controllo è un modulo data-sgc-ws-send e la tua applicazione smista in base a action: gridAIQuery, gridAIClear, gridAIColumn, gridAIAccept, gridAIReject, pivotAIQuery, pivotAIClear, formSmartPaste e le quattro azioni del prompt inline. Rispondi con il componente renderizzato di nuovo come frammento out of band. Un insieme di componenti corrisponde a un utente, quindi associalo a una sessione e mantieni sul server l’autorizzazione di ciò che fa un’azione.

Continua a esplorare

Guida in lineaRiferimento API completo e guida all’uso per questo componente.
Guida all’AI Data PackIl quadro completo: che cosa riceve il modello, la validazione, il parser basato su regole, il contratto con l’host e i limiti.
Tutti i componenti sgcHTMLEsplora la matrice completa delle funzionalità di oltre 80 componenti.
Scarica la Prova GratuitaLa prova di 30 giorni include i progetti demo 60.HTML, tra cui 18.AIData, che pone domande in linguaggio naturale a una griglia, a un pivot e a un modulo.
PrezziLicenze Single, Team e Site con codice sorgente completo.
La scelta più conveniente: All-AccessTutti i prodotti eSeGeCe, con Supporto Premium incluso, a partire da €1,059/anno.
Vedi i prezzi All-Access

Pronto a Iniziare?

Scarica la versione di prova gratuita e inizia a creare interfacce web in Delphi, C++ Builder e .NET.