sgcAI in cinque minuti

Un componente, una proprietà per il provider, una chiamata. Questa pagina fa dialogare un'applicazione Delphi con un modello linguistico di grandi dimensioni, ti mostra come ricevere la risposta in streaming invece di attenderla e ti chiarisce l'unico limite di piattaforma che coglie di sorpresa.

OpenAI, Claude, Gemini, DeepSeek, Ollama, Grok, Mistral
TsgcAIChat su Windows, macOS, Linux, iOS e Android
Edizione Enterprise, oppure il pacchetto sgcAI autonomo

Cosa serve per la prima chiamata

Un componente, una chiave, il nome di un modello e un prompt. Nessun JSON da costruire e nessun client HTTP da configurare.

Componente

TsgcAIChat nella pagina SGC AI della palette. È un sottile wrapper pubblicato attorno a TsgcAI_Chat, che è ciò che le demo incluse creano da codice.

Unit

sgcAI_Chat.pas per la classe, oppure l'unit barrel sgcAI.pas per il componente della palette. Le demo scrivono uses sgcAI_Chat;.

L'unica proprietà che cambia fornitore

Provider, di tipo TsgcAIChatProvider. I sette membri sono aicpOpenAI, aicpAnthropic, aicpGemini, aicpDeepSeek, aicpOllama, aicpGrok e aicpMistral. Nient'altro nel tuo codice cambia.

Piattaforma, leggi questo

TsgcAIChat compila per ogni piattaforma: Win32, Win64, macOS, Linux64, iOS e Android, e l'IDE lo offre nelle form per tutte. Le chiamate HTTPS richiedono la consueta configurazione TLS di ciascuna piattaforma, per esempio le librerie OpenSSL su Linux. Vedi la tabella qui sotto.

Requisiti ed edizioni

La colonna dell'edizione indica il define che regola il codice, con la riga in cui si trova in Source/sgcVer.inc.

Cosa Valore
IDE Da Delphi 7 a RAD Studio 13 e le versioni corrispondenti di C++Builder. ChatAsync è l'unico membro con un requisito minimo più alto, perché è racchiuso in {$IFDEF D2010}.
Clausola uses sgcAI_Chat per TsgcAI_Chat, TsgcAIChatProvider e i tipi degli eventi.
Edizione, dentro sgcWebSockets SGC_AI è definito alla riga 796, dentro il blocco {$IFDEF SGC_EDT_ENT} che va dalla riga 759 alla riga 842. Quindi Enterprise e superiori, non Standard e non Professional.
Edizione, pacchetto autonomo Il prodotto sgcAI definisce SGC_PACK_AI alla riga 857 e il suo blocco alle righe da 946 a 959 definisce SGC_AI alla riga 947. Stessi componenti, senza il resto della libreria.
Piattaforme Nessuna delle due definizioni di SGC_AI, riga 796 e riga 947, ha una guardia di piattaforma, quindi sgcAI_Chat.pas compila per ogni target e il componente porta ComponentPlatforms(0). Solo TsgcAudioRecorderMCI, TsgcAudioRecorderWave, TsgcAudioPlayerMCI e TsgcTextToSpeechSystem, che chiamano le API audio e vocali di Windows, sono compilati solo su Windows.
Cosa è multipiattaforma SGC_AI_MCP, alla riga 797 e alla riga 955, non ha guardie di piattaforma. Quindi il client e il server MCP funzionano anche su Linux, macOS, iOS e Android. Anche i define dei provider SGC_OPENAI, SGC_ANTHROPIC, SGC_GEMINI, SGC_DEEPSEEK, SGC_OLLAMA, SGC_GROK e SGC_MISTRAL, righe da 786 a 792, non sono limitati per piattaforma.

Stai costruendo un servizio Linux o un'app mobile? TsgcAIChat compila anche su questi target. In alternativa, chiama direttamente il client REST del fornitore, per esempio TsgcHTTP_API_OpenAI o TsgcHTTP_API_Anthropic. La guida chiamare un LLM da Delphi mostra entrambe le strade affiancate.

Installa e trova la pagina della palette

sgcAI è incluso nell'installer di sgcWebSockets e anche come pacchetto a sé. In entrambi i casi l'installazione ha la stessa forma.

1. Decomprimi

Decomprimi il download in una cartella, chiamata {$DIR} qui sotto.

2. Library path

Tools, Options, Library. Aggiungi {$DIR}\source e la cartella lib per il tuo IDE, per esempio {$DIR}\libD13\$(Platform).

3. Compila i package

Apri il gruppo di package per la versione del tuo IDE in {$DIR}\Packages\. Compila prima il .dpk di runtime, poi installa quello di design-time dcl.

4. Controlla la palette

Compare una pagina chiamata SGC AI con quindici componenti. TsgcAIChat è il primo. Se la pagina manca su un target non Windows è previsto, perché la palette dell'IDE offre questi componenti solo su Win32 e Win64, mentre le unit compilano su tutte le piattaforme.

5. Ottieni una chiave API

Per un provider ospitato porti la tua chiave di quel fornitore e la assegni a ChatOptions.ApiKey. Ollama non richiede alcuna chiave, perché il modello gira sulla tua macchina.

La tua prima risposta, in circa dieci righe

Crea il componente, imposta un provider, una chiave e un modello, poi chiama Chat e leggi la stringa che restituisce.

fUnifiedChat.pas
uses
  Classes, SysUtils,
  // sgc
  sgcAI_Chat;

procedure TfrmUnifiedChat.btnChatClick(Sender: TObject);
var
  oChat: TsgcAI_Chat;
begin
  oChat := TsgcAI_Chat.Create(nil);
  try
    oChat.Provider := aicpOpenAI;
    oChat.ChatOptions.ApiKey := GetApiKey;
    oChat.ChatOptions.Model := 'gpt-4o-mini';
    oChat.ChatOptions.MaxTokens := 1024;
    oChat.SystemMessage := 'You are a concise assistant inside a Delphi ERP.';

    memoResponse.Lines.Text := oChat.Chat(memoPrompt.Text);
  finally
    oChat.Free;
  end;
end;

Cambiare fornitore richiede una sola riga. Provider accetta aicpOpenAI, aicpAnthropic, aicpGemini, aicpDeepSeek, aicpOllama, aicpGrok e aicpMistral. Tutto il resto rimane com'è.

fUnifiedChat.pas
procedure TfrmUnifiedChat.OnChatStream(Sender: TObject; const aChunk: string;
  var Cancel: Boolean);
begin
  memoResponse.Text := memoResponse.Text + aChunk;
  // set Cancel to stop the generation early
end;

procedure TfrmUnifiedChat.OnChatError(Sender: TObject; const aError: string);
begin
  memoResponse.Text := 'error: ' + aError;
end;

procedure TfrmUnifiedChat.btnChatStreamClick(Sender: TObject);
begin
  GetChat.Provider := aicpAnthropic;
  GetChat.ChatOptions.ApiKey := GetApiKey;
  GetChat.ChatOptions.Model := 'claude-sonnet-4-20250514';
  GetChat.SystemMessage := memoSystem.Text;

  memoResponse.Lines.Clear;
  GetChat.ChatStream(memoPrompt.Text);
end;

La demo costruisce il proprio componente una sola volta in GetChat e vi assegna OnChatStream e OnChatError. ChatStream restituisce anche la risposta completa, quindi puoi ignorare il valore restituito e usare solo l'evento, oppure usare entrambi.

uLocal.pas
uses
  Classes, SysUtils,
  // sgc
  sgcAI_Chat;

var
  oChat: TsgcAI_Chat;
begin
  oChat := TsgcAI_Chat.Create(nil);
  try
    // no API key at all: the model runs on this machine
    oChat.Provider := aicpOllama;
    oChat.ChatOptions.Model := 'llama3';

    // BaseUrl is read only for the Ollama provider, and only when
    // the server is not on the default address. Internally it is
    // forwarded to the Ollama client's Host property.
    oChat.ChatOptions.BaseUrl := 'http://localhost:11434';

    Writeln(oChat.Chat('Summarise this invoice in one line.'));
  finally
    oChat.Free;
  end;
end;

Non esiste OllamaOptions.BaseUrl. A livello di API grezza la proprietà è OllamaOptions.Host in TsgcHTTP_API_Ollama, e ChatOptions.BaseUrl è ciò che la alimenta da questo livello.

Le prime due schede sono la demo inclusa Demos\15.AI\02.Applications\06.UnifiedChat\fUnifiedChat.pas, con i controlli del form sostituiti da valori letterali. La terza scheda è lo stesso componente puntato a un server Ollama locale. Una seconda demo, 07.ConversationHistory, mostra l'API della cronologia nella stessa cartella.

Verifica che funzioni e osserva l'errore quando non funziona

Chat non solleva eccezioni in caso di chiamata fallita, cosa che sorprende. Restituisce invece una stringa vuota e genera un evento.

Il valore restituito

Chat restituisce il testo dell'assistente come string. Una stringa vuota significa che la chiamata è fallita, perché un errore non solleva eccezioni.

OnChatError

procedure(Sender: TObject; const aError: string). Sia Chat sia ChatStream intercettano l'eccezione e la inoltrano qui. È il primo evento da collegare, prima di qualsiasi altra cosa.

OnChatStream

procedure(Sender: TObject; const aChunk: string; var Cancel: Boolean). Il testo che compare nel memo mentre il modello sta ancora scrivendo è la prova che lo streaming funziona e non sta usando un buffer.

La conversazione

GetHistory restituisce ciò che il componente riproporrà alla chiamata successiva. MaxHistoryMessages ne fissa il limite e ClearHistory ricomincia da capo.

Cosa va storto di solito la prima volta

Sei problemi spiegano quasi ogni prima chiamata fallita.

Compilare per Linux, macOS o mobile

sgcAI_Chat.pas compila per ogni piattaforma. TsgcAudioRecorderMCI, TsgcAudioRecorderWave, TsgcAudioPlayerMCI e TsgcTextToSpeechSystem chiamano le API audio e vocali di Windows e sono compilati solo su Windows, quindi tienili fuori da una form multipiattaforma. Le chiamate HTTPS richiedono la consueta configurazione TLS di ciascuna piattaforma, per esempio le librerie OpenSSL su Linux.

Chat restituisce una stringa vuota e non viene sollevato nulla

Chat e ChatStream inghiottono l'eccezione e la inoltrano a OnChatError, la cui firma è procedure(Sender: TObject; const aError: string). Collega quell'evento prima di fare debug di qualsiasi altra cosa.

Un modello Ollama locale viene ignorato

L'indirizzo base di Ollama va in ChatOptions.BaseUrl, non nell'oggetto delle opzioni del fornitore. Viene inoltrato internamente a OllamaOptions.Host ed è l'unico provider per cui BaseUrl viene letto.

Il form si blocca durante una risposta lunga

Chat e ChatStream sono sincroni. Da Delphi 2010 in poi usa ChatAsync, che restituisce un IsgcFuture<string>. Sui compilatori più vecchi esegui la chiamata in un thread tuo.

Il nome del modello viene rifiutato

I nomi dei modelli appartengono al fornitore, non al componente, e cambiano. ChatOptions.Model viene passato così com'è, quindi un nome che funziona nella console del fornitore funziona anche qui.

Il costo cresce con una conversazione lunga

Il componente riproduce la cronologia a ogni chiamata, ed è ciò che fa funzionare una domanda successiva. Limitala con MaxHistoryMessages e ricomincia con ClearHistory.

Cosa si costruisce dopo la prima risposta

Una casella di prompt è solo l'inizio. Tutte e quattro queste cose sono già nel pacchetto.

Rispondi dai tuoi documenti

Trasforma i tuoi contenuti in vettori con TsgcAIOpenAIEmbeddings, salvali in TsgcAIDatabaseVectorFile o TsgcAIDatabaseVectorPinecone e recupera i passaggi più vicini da inserire nel prompt.

Riferimento degli embeddings e riferimento dei database vettoriali

Parlaci a voce

TsgcAIOpenAIChatBot collega in un unico componente un registratore, la trascrizione, la chiamata di chat e la sintesi vocale. TsgcAIOpenAITranslator fa lo stesso per la traduzione dal vivo.

Riferimento del ChatBot e riferimento del traduttore

Esponi la tua app a un agente

Il componente server MCP trasforma la tua applicazione in uno strumento che un assistente può chiamare, e il client MCP utilizza altri server. Nessuno dei due è limitato a Windows, quindi un server MCP scritto in Delphi funziona su Linux.

Riferimento del server MCP e riferimento del client MCP

Usa l'intera API del fornitore

Visione, documenti, ragionamento esteso, batch, generazione di immagini, trascrizione e moderazione si trovano nei client REST per fornitore e non nel livello di chat neutro.

Riferimento di OpenAI e riferimento di Anthropic

Riferimento, demo e documentazione

Le pagine di riferimento documentano ogni opzione ed evento. I progetti demo sono inclusi nel download, in Demos\15.AI.

Guida, chiamare un LLM da Delphi La spiegazione completa: streaming, chiamata di strumenti e ospitato contro locale.
Riferimento, client OpenAI Ogni metodo, opzione ed evento di TsgcHTTP_API_OpenAI.
Riferimento, client Anthropic Messaggi, strumenti, visione, batch e conteggio dei token in TsgcHTTP_API_Anthropic.
Riferimento, server MCP Il componente che permette a un assistente di chiamare la tua applicazione.
Pagina del componente TsgcAIChat Ogni proprietà ed evento del componente chat, con gli altri quattordici collegati da lì.
Guida online Il riferimento generato, sempre allineato alla versione corrente.

Letture correlate: creare app Delphi basate sull'IA, confronto dei provider da Delphi e scrivere un server MCP. Ogni prodotto ha la propria guida rapida, elencata nella pagina per iniziare.

Domande sulla guida rapida di sgcAI

Trascina TsgcAIChat dalla pagina SGC AI della palette. È dichiarato in sgcAI.pas come wrapper pubblicato attorno a TsgcAI_Chat, che è dichiarato in sgcAI_Chat.pas. Il codice che crea l'oggetto a runtime, come fanno le demo incluse, usa TsgcAI_Chat e uses sgcAI_Chat;. Entrambi ti danno le stesse proprietà.
Dentro sgcWebSockets il vincolo è SGC_AI, definito alla riga 796 di sgcVer.inc, dentro il blocco SGC_EDT_ENT che va dalla riga 759 alla riga 842. Si tratta dell'edizione Enterprise e superiori. Standard, righe da 674 a 723, e Professional, righe da 726 a 757, non lo definiscono. Se non vuoi il resto della libreria, il pacchetto sgcAI autonomo definisce SGC_PACK_AI alla riga 857, il cui blocco alle righe da 946 a 959 attiva gli stessi componenti.
Sì. SGC_AI è definito senza guardia di piattaforma, alla riga 796 nel blocco Enterprise e alla riga 947 nel blocco del pacchetto autonomo, quindi sgcAI_Chat.pas e sgcAI.pas compilano per Windows, macOS, Linux, iOS e Android, e TsgcAIChat porta ComponentPlatforms(0). Le eccezioni sono TsgcAudioRecorderMCI, TsgcAudioRecorderWave, TsgcAudioPlayerMCI e TsgcTextToSpeechSystem, che chiamano le API audio e vocali di Windows e sono compilati solo su Windows. Le chiamate HTTPS richiedono la consueta configurazione TLS di ciascuna piattaforma, per esempio le librerie OpenSSL su Linux.
Cambia Provider. Accetta aicpOpenAI, aicpAnthropic, aicpGemini, aicpDeepSeek, aicpOllama, aicpGrok e aicpMistral. Poi imposta la chiave e il modello per quel fornitore. Per aicpOllama non serve alcuna chiave e, se il server non è all'indirizzo predefinito, imposti ChatOptions.BaseUrl, che il componente inoltra internamente al client Ollama.
Chiama ChatStream invece di Chat e gestisci OnChatStream. La sua firma è procedure(Sender: TObject; const aChunk: string; var Cancel: Boolean): accoda aChunk al tuo memo man mano che arriva e imposta Cancel a True per interrompere la generazione in anticipo.
Chat e ChatStream non sollevano eccezioni. Intercettano l'eccezione, generano OnChatError con il messaggio e restituiscono una stringa vuota. Quindi un OnChatError non gestito appare identico a un modello che ha risposto con nulla. Collegalo per primo.
Da Delphi 2010 in poi chiama ChatAsync, che è racchiuso in {$IFDEF D2010} e restituisce un IsgcFuture<string>. Da Delphi 7 a 2009 quel metodo non esiste, quindi esegui Chat in un thread che crei tu.
Sì. Conserva lo scambio e lo riproduce alla chiamata successiva, ed è ciò che fa funzionare una domanda successiva. MaxHistoryMessages limita quanto viene riprodotto, ClearHistory avvia una nuova conversazione e GetHistory restituisce i messaggi memorizzati.
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 mettere un modello dentro la tua applicazione?

Scarica la versione di prova ed esegui la demo della chat unificata con la tua chiave.