AI Chat
TsgcAIChat은 7개 대규모 언어 모델 공급자를 위한 단일 채팅 클라이언트입니다. Provider를 지정하고 API 키와 모델을 설정한 다음 Chat을 호출하면 됩니다. 공급자를 바꾸는 데는 할당문 하나면 충분하고 나머지 코드는 그대로 유지됩니다.
TsgcAIChat은 7개 대규모 언어 모델 공급자를 위한 단일 채팅 클라이언트입니다. Provider를 지정하고 API 키와 모델을 설정한 다음 Chat을 호출하면 됩니다. 공급자를 바꾸는 데는 할당문 하나면 충분하고 나머지 코드는 그대로 유지됩니다.
공급자에 종속되지 않는 채팅 컴포넌트입니다. 대화 기록을 유지하고 공급자별 JSON 본문을 구성하며, 해당 HTTP API 클라이언트를 구동해 어시스턴트 텍스트를 한 번에 또는 토큰 단위로 돌려줍니다.
sgcAI는 자체 완결형 제품입니다. 이 컴포넌트는 기반이 되는 sgcWebSockets Core 런타임과 함께 sgcAI에 포함되어 제공됩니다.
공급자를 고르고 키와 모델을 설정한 다음 Chat을 호출하세요. 스트리밍과 비동기 방식도 동일한 설정을 사용합니다.
uses
sgcAI, sgcAI_Chat;
var
oChat: TsgcAIChat;
vAnswer: string;
begin
oChat := TsgcAIChat.Create(nil);
oChat.Provider := aicpAnthropic;
oChat.ChatOptions.ApiKey := 'sk-ant-...';
oChat.ChatOptions.Model := 'claude-sonnet-4-5';
oChat.ChatOptions.MaxTokens := 4096;
oChat.SystemMessage := 'You are a Delphi expert.';
oChat.MaxHistoryMessages := 20;
// Blocking call, returns the assistant text.
vAnswer := oChat.Chat('How do I keep a WebSocket connection alive?');
// Token by token, delivered on OnChatStream.
oChat.OnChatStream := OnChatStreamHandler;
oChat.ChatStream('Now explain it to a beginner.');
end;
procedure TForm1.OnChatStreamHandler(Sender: TObject;
const aChunk: string; var Cancel: Boolean);
begin
Memo1.Text := Memo1.Text + aChunk;
Cancel := StopRequested; // abort a long generation
end;
// includes: sgcAI.hpp, sgcAI_Chat.hpp
TsgcAIChat *oChat = new TsgcAIChat(NULL);
oChat->Provider = aicpOpenAI;
oChat->ChatOptions->ApiKey = "sk-...";
oChat->ChatOptions->Model = "gpt-6-astra";
oChat->SystemMessage = "You are a Delphi expert.";
String vAnswer = oChat->Chat("How do I keep a WebSocket connection alive?");
// Local models: same code, no data leaves the machine.
oChat->Provider = aicpOllama;
oChat->ChatOptions->BaseUrl = "http://127.0.0.1:11434";
oChat->ChatOptions->Model = "llama3";
vAnswer = oChat->Chat("Same question, local model.");
가장 자주 사용하게 되는 멤버들입니다.
Provider로 공급자를 선택합니다: aicpOpenAI, aicpAnthropic, aicpGemini, aicpDeepSeek, aicpOllama, aicpGrok, aicpMistral. 값을 바꾸면 이전 공급자를 위해 캐시해 둔 클라이언트가 해제됩니다.
ApiKey, Model, MaxTokens, Temperature, TopP, BaseUrl을 제공합니다. Temperature와 TopP를 기본값으로 두면 요청에서 생략되어 공급자 기본값이 적용됩니다.
SystemMessage는 모든 턴에 적용될 페르소나를 지정합니다. MaxHistoryMessages는 다시 전송되는 과거 메시지 수를 제한해 토큰 비용을 억제합니다. ClearHistory와 GetHistory로 대화 기록을 초기화하고 읽습니다.
Chat은 블로킹 방식으로 답변을 반환합니다. ChatStream은 SSE로 스트리밍합니다. ChatWithSystem은 한 턴에 한해 시스템 프롬프트를 덮어씁니다. ChatAsync는 Delphi 2010 이상에서 future를 반환합니다.
OnChatMessage는 완료된 메시지를 역할과 함께 알려 줍니다. OnChatStream은 모든 청크를 전달하며 Cancel 플래그를 함께 제공합니다. OnChatError는 공급자 오류와 전송 오류를 노출합니다.
ChatWithDocument와 ChatWithDocumentBase64는 메시지와 함께 PDF나 이미지 하나를 전송하고, ChatWithAttachments와 ChatJSONWithAttachments는 TsgcAIChatAttachments 목록에 담긴 여러 개를 전송합니다. OpenAI, Anthropic, Gemini는 PDF를 그대로 읽고, 나머지 공급자는 이미지를 받습니다. 채팅을 TsgcAIDocumentExtractor와 연결하면 인보이스, 영수증, 신분증을 스키마로 검증된 JSON으로 바꿀 수 있으며, 필드마다 신뢰도가 제공됩니다.
Provider를 aicpOllama로 설정하면 ChatOptions.BaseUrl이 컴포넌트를 자체 Ollama 호스트로 향하게 하므로, 프롬프트와 답변이 컴퓨터 밖으로 나가지 않습니다.
ChatWithTools는 도구 정의(이름, 설명, JSON Schema)를 메시지와 함께 보내고, 모델이 요청하는 도구 호출을 반환합니다. 호출을 실행하고, 각 결과를 AddToolResult로 돌려준 다음 다시 호출하세요. 7개 공급자 모두에서 각자의 형식으로 동작합니다. TsgcAIAgent가 이 루프를 대신 실행해 줍니다.
ChatOptions.Model에는 fast나 smart 같은 별칭을 지정할 수 있으며, ModelAliases에서 모델 또는 provider:model로 매핑하고 LoadModelAliasesFromFile, LoadModelAliasesFromJSON, LoadModelAliasesFromURL로 불러옵니다. Fallbacks는 연결 오류, HTTP 5xx, HTTP 429, 알 수 없는 모델이 발생했을 때 다음에 시도할 공급자와 모델을 나열하며, OnFallback은 전환할 때마다 알려 줍니다.
LastUsage와 OnChatUsage는 모든 요청의 공급자, 모델, 입력, 출력, 캐시 토큰을 UserId, SessionId와 함께 알려 주고, LastFinishReason은 마지막 답변이 끝난 이유(stop이나 length 등)를 알려 줍니다. UsageMeter에 TsgcAIUsageMeter를 지정하면 비용과 예산을 관리하고, Guardrails에 TsgcAIGuardrails를 지정하면 PII 마스킹, 도구 규칙, 스키마 검증을 사용할 수 있습니다.
역할별로 모델에 이름을 붙이고, 공급자가 실패해도 계속 답하며, 모든 요청의 토큰을 확인하세요. 2026.11.0 신기능입니다.
uses
sgcAI, sgcAI_Chat;
procedure TForm1.ChatWithFallback;
var
oFallback: TsgcAIChatFallback;
begin
sgcAIChat1.Provider := aicpOpenAI;
sgcAIChat1.ChatOptions.ApiKey := 'sk-...';
// aliases: alias=model or alias=provider:model
sgcAIChat1.ModelAliases.Add('fast=gpt-6-luna');
sgcAIChat1.ModelAliases.Add('smart=anthropic:claude-opus-5-5');
sgcAIChat1.ProviderApiKeys.Add('anthropic=sk-ant-...');
sgcAIChat1.ChatOptions.Model := 'fast';
// tried in order on a connection error, HTTP 5xx, HTTP 429 or an unknown model
oFallback := sgcAIChat1.Fallbacks.Add;
oFallback.Provider := aicpGemini;
oFallback.Model := 'gemini-3-flash';
oFallback.ApiKey := 'AIza...';
sgcAIChat1.OnFallback := DoFallback;
Memo1.Lines.Add(sgcAIChat1.Chat('Write a haiku about Delphi.'));
Memo1.Lines.Add(Format('Answered by %s %s: %d input, %d output tokens',
[sgcAIChat1.LastUsage.Provider, sgcAIChat1.LastUsage.Model,
sgcAIChat1.LastUsage.InputTokens, sgcAIChat1.LastUsage.OutputTokens]));
end;
procedure TForm1.DoFallback(Sender: TObject; const aFromProvider, aFromModel,
aToProvider, aToModel, aError: string);
begin
Memo1.Lines.Add('Fallback from ' + aFromProvider + ' to ' + aToProvider +
': ' + aError);
end;
이 컴포넌트가 사용하는 서비스와 프로토콜의 공식 자료입니다.