AI Chat
TsgcAIChat 是面向七家大语言模型提供商的单一聊天客户端。设置 Provider,设置 API 密钥和模型,然后调用 Chat 即可。更换厂商只需一处赋值,其余代码保持不变。
TsgcAIChat 是面向七家大语言模型提供商的单一聊天客户端。设置 Provider,设置 API 密钥和模型,然后调用 Chat 即可。更换厂商只需一处赋值,其余代码保持不变。
一个与提供商无关的聊天组件。它维护对话历史、构建各提供商专有的 JSON 请求体、驱动对应的 HTTP API 客户端,并把助手文本交还给您,可以一次性返回,也可以逐个令牌返回。
sgcAI 是自包含的。该组件随 sgcAI 一同交付,并附带它所基于的 sgcWebSockets Core 运行时。
选择提供商,设置密钥和模型,然后调用 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 只为单轮覆盖系统提示词。在 Delphi 2010 及更高版本上,ChatAsync 返回一个 future。
OnChatMessage 报告每条完成的消息及其角色。OnChatStream 送达每个数据块,并带有 Cancel 标志。OnChatError 暴露提供商和传输层错误。
ChatWithDocument 和 ChatWithDocumentBase64 会随消息发送一个 PDF 或图片,ChatWithAttachments 和 ChatJSONWithAttachments 则发送保存在 TsgcAIChatAttachments 列表中的多个文件。OpenAI、Anthropic 和 Gemini 原生读取 PDF,其他提供商接受图片。将聊天组件关联到 TsgcAIDocumentExtractor,即可把发票、收据和身份证件转换为按 schema 校验过的 JSON,并给出逐字段置信度。
把 Provider 设为 aicpOllama 后,ChatOptions.BaseUrl 会把组件指向您自己的 Ollama 主机,因此提示词和答案永远不会离开本机。
ChatWithTools 会随消息发送您的工具定义(名称、描述和 JSON Schema),并返回模型请求的工具调用。执行它们,用 AddToolResult 把每个结果交还给模型,然后再次调用。七家提供商全部支持,各自使用自己的格式。TsgcAIAgent 可为您运行这个循环。
ChatOptions.Model 可以是 fast 或 smart 这样的别名,在 ModelAliases 中映射到某个模型或 provider:model,并可用 LoadModelAliasesFromFile、LoadModelAliasesFromJSON 或 LoadModelAliasesFromURL 加载。Fallbacks 列出在连接错误、HTTP 5xx、HTTP 429 或未知模型时依次尝试的下一个提供商和模型,OnFallback 报告每一次切换。
LastUsage 和 OnChatUsage 报告每个请求的提供商、模型、输入、输出和缓存令牌数,并带有 UserId 和 SessionId,LastFinishReason 说明最后一个答案结束的原因,例如 stop 或 length。把 TsgcAIUsageMeter 赋给 UsageMeter 以获得成本和预算,把 TsgcAIGuardrails 赋给 Guardrails 以实现 PII 脱敏、工具规则和 schema 校验。
按角色命名模型,提供商失败时继续作答,并读取每个请求的令牌数。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;
该组件所用服务和协议的权威资料来源。