Delphi'den bir LLM çağırın

Bir VCL, FMX veya konsol uygulamasından istem gönderin ve yanıt alın; OpenAI ya da Anthropic Claude gibi barındırılan bir modelden veya Ollama üzerinden kendi makinenizde çalışan bir modelden. Bu sayfa sizi boş bir formdan çalışan bir çağrıya götürür, ardından her projenin hemen sonra karşılaştığı üç konuya: akış, araç çağırma ve barındırılan model ile yerel model arasındaki karar.

OpenAI, Claude, Gemini, Grok, DeepSeek, Mistral, Ollama
Server-Sent Events üzerinden akış
Delphi 7'den RAD Studio 13'e

Çağrıyı yapmanın iki yolu

Sağlayıcıdan bağımsız bir sohbet bileşeni var, bir de her satıcı için ayrı bir REST istemcisi. İkisi de aynı kütüphanede geliyor, dolayısıyla biriyle başlayıp proje değiştirmeden diğerine inebilirsiniz.

TsgcAIChat, her sağlayıcı için tek bir API

Provider, bir API anahtarı ve bir model ayarlayın, sonra Chat çağırın. Bileşen satıcıya özgü JSON'u kurar, konuşma geçmişini tutar ve asistan metnini döndürür. OpenAI'den Claude'a ya da yerel bir Ollama modeline geçmek tek bir atamadır. sgcAI_Chat biriminde TsgcAI_Chat tarafından uygulanır ve palete TsgcAIChat olarak kaydedilir.

Satıcıya özel REST istemcileri

TsgcHTTP_API_OpenAI, TsgcHTTP_API_Anthropic ve TsgcHTTP_API_Ollama her satıcının API'sini eksiksiz sunar, hiçbir nötr katmanın kapsayamayacağı bölümler dahil: görüntü girdisi, belge girdisi, genişletilmiş düşünme, toplu işler, dosyalar, embeddings, görsel üretimi ve transkripsiyon. Belirli bir uç noktaya ihtiyacınız olduğunda bunları kullanın.

Sürüm ve platform

Yapay zeka ve LLM istemcileri sgcWebSockets'in Enterprise özelliğidir, Standard değil ve Professional da değil; ya da bağımsız sgcAI paketini satın alabilirsiniz.

Platform burada önemlidir. Üç REST istemcisi Windows, macOS, Linux, iOS ve Android üzerinde derlenir. TsgcAIChat derlenmez: yalnızca Windows için derlenmiştir, dolayısıyla bir Linux servisinde, bir macOS derlemesinde veya bir mobil hedefte REST istemcisini doğrudan çağırırsınız. Bu sayfadaki örnekler iki yol da çalışacak şekilde yazılmıştır.

İlk çağrınız, yaklaşık on satırda

Bileşeni forma bırakın, bir anahtar ve bir model ayarlayın, istem gönderin. Başlayacağınız sağlayıcının sekmesini seçin. Son sekme hiç API anahtarı istemez, çünkü model sizin makinenizde çalışır.

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

procedure TfrmMain.btnAskClick(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.';

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

Satıcı değiştirmek tek satırdır. Provider şu değerleri kabul eder: aicpOpenAI, aicpAnthropic, aicpGemini, aicpDeepSeek, aicpOllama, aicpGrok ve aicpMistral. Kodunuzdaki diğer her şey olduğu yerde kalır.

Yalnızca Windows. TsgcAI_Chat ve palet bileşeni TsgcAIChat Windows için, Win32 ve Win64 olarak derlenir. macOS, Linux, iOS ve Android üzerinde birim hiç derlenmez, dolayısıyla hedefiniz bir Linux servisi veya bir mobil uygulamaysa diğer üç sekmedeki satıcı REST istemcilerini kullanın. Onlarda platform kısıtı yoktur.

uOpenAI.pas
uses
  Classes, SysUtils,
  // sgc
  sgcHTTP_API_OpenAI;

var
  oOpenAI: TsgcHTTP_API_OpenAI;
begin
  oOpenAI := TsgcHTTP_API_OpenAI.Create(nil);
  try
    oOpenAI.OpenAIOptions.ApiKey := GetApiKey;

    // Shortcut: model plus one user message, raw JSON back
    memoAnswer.Lines.Text := oOpenAI._CreateChatCompletion(
      'gpt-4o', 'Say hello');
  finally
    oOpenAI.Free;
  end;
end;

Alt çizgiyle başlayan metotlar, ham yanıt gövdesini döndüren dize kısayollarıdır. Ayrıştırılmış bir nesne istediğinizde bir TsgcOpenAIClass_Request_ChatCompletion kurun ve CreateChatCompletion çağırın; bu, sayfanın ilerisinde gösteriliyor.

uClaude.pas
uses
  Classes, SysUtils,
  // sgc
  sgcHTTP_API_Anthropic;

var
  oAnthropic: TsgcHTTP_API_Anthropic;
begin
  oAnthropic := TsgcHTTP_API_Anthropic.Create(nil);
  try
    oAnthropic.AnthropicOptions.ApiKey := GetApiKey;
    oAnthropic.AnthropicOptions.AnthropicVersion := '2023-06-01';

    // Model, prompt, max tokens
    memoAnswer.Lines.Text := oAnthropic._CreateMessage(
      'claude-sonnet-4-20250514',
      'Summarise RFC 6455 in three bullet points.', 1024);
  finally
    oAnthropic.Free;
  end;
end;

Claude API sürüm başlığını ister, bu yüzden anahtarın yanında AnthropicVersion değerini de ayarlayın. _CreateMessageWithSystem bir sistem istemi ekler ve _CountTokens göndermeden önce bir istemin maliyetini hesaplar.

uOllama.pas
uses
  Classes, SysUtils,
  // sgc
  sgcHTTP_API_Ollama;

var
  oOllama: TsgcHTTP_API_Ollama;
begin
  oOllama := TsgcHTTP_API_Ollama.Create(nil);
  try
    // Local server, no API key required
    oOllama.OllamaOptions.Host := 'http://localhost:11434';

    // Which models are pulled on this machine?
    memoModels.Lines.Text := oOllama._GetTags;

    memoAnswer.Lines.Text := oOllama._CreateMessage(
      'llama3', 'Summarise this invoice in one line.');
  finally
    oOllama.Free;
  end;
end;

Host varsayılan olarak http://localhost:11434 değerindedir, dolayısıyla varsayılan bir kurulumda ona dokunmanız gerekmez. _PullModel bir model indirir, _GetTags diskte zaten bulunanları listeler ve _ShowModel ayrıntılarını okur.

Yanıtı yazılırken gösterin

Tek seferlik bir çağrı, model bitirene kadar bloke eder; uzun bir yanıtta bu bozuk gibi hissettirir. Akış, yanıtı parçalar halinde iletir, böylece model yazmaya devam ederken metin memo'nuzda belirir. İnsanların en çok takıldığı yer burasıdır, bu yüzden iki seviyesi de burada.

TsgcAIChat ile, delta'lar zaten çözülmüş

Chat yerine ChatStream çağırın ve OnChatStream olayını ele alın. Bileşen sağlayıcıdan akışlı bir yanıt ister, her Server-Sent Event'i ayrıştırır ve size yalnızca yeni metni içeren aChunk değerini verir. Siz onu eklersiniz, uygulamanın tamamı budur.

Her sağlayıcı farklı bir JSON biçimi akıtır. OpenAI, DeepSeek, Ollama, Grok ve Mistral metni choices[0].delta.content içine, Claude delta.text içine, Gemini ise daha da derinde candidates içine koyar. TsgcAIChat seçtiğiniz sağlayıcı için hangisinin geçerli olduğunu zaten bilir, bu yüzden olay işleyiciniz hiç JSON görmez.

Kontrolden çıkan bir yanıtı durdurmak için işleyicinin içinde Cancel değerini True yapın. İstek o noktada terk edilir ve başka parça gelmez. Akış bittiğinde birleştirilen metin geçmişe eklenir ve ChatStream tarafından döndürülür, OnChatMessage ise tam yanıtla bir kez tetiklenir.

uChatStream.pas
procedure TfrmMain.btnStreamClick(Sender: TObject);
begin
  FChat.Provider := aicpAnthropic;
  FChat.ChatOptions.ApiKey := GetApiKey;
  FChat.ChatOptions.Model := 'claude-sonnet-4-20250514';
  FChat.OnChatStream := OnChatStream;
  FChat.OnChatError := OnChatError;

  memoAnswer.Lines.Clear;
  FChat.ChatStream(memoPrompt.Lines.Text);
end;

procedure TfrmMain.OnChatStream(Sender: TObject;
  const aChunk: string; var Cancel: Boolean);
begin
  memoAnswer.Text := memoAnswer.Text + aChunk;
  Cancel := FUserPressedStop;
end;

procedure TfrmMain.OnChatError(Sender: TObject;
  const aError: string);
begin
  memoAnswer.Lines.Add('ERROR: ' + aError);
end;

Satıcı istemcisiyle, ham olaylar

REST istemcileri de akış yapar. OnHTTPAPISSE atayın ve akış kısayolunu çağırın: Claude ve Ollama üzerinde _CreateMessageStream, OpenAI üzerinde ise Stream değeri True olan bir TsgcOpenAIClass_Request_ChatCompletion. Olay size Server-Sent Event adı olan aEvent değerini ve o olaya ait yükü, satıcının gönderdiği haliyle, aData olarak verir.

Bu seviyede JSON'u kendiniz ayrıştırırsınız, mesele de budur: araç çağrısı delta'larını, durma nedenlerini, kullanım kayıtlarını ve satıcının hatta koyduğu her şeyi görürsünüz. Kısmi ağ okumaları sizin için zaten yeniden birleştirilir, böylece iki TCP okumasına bölünen bir olay yine bütün olarak gelir ve Ollama'nın satır sonuyla ayrılmış JSON'u da aynı olay üzerinden iletilir.

Sonlandırıcılar satıcıya göre değişir. OpenAI düz [DONE] ile kapatır, Claude ise message_stop adlı bir olayla. Kodunuz ikisini de hedefliyorsa ikisini de ele alın.

uRawStream.pas
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  FAnthropic := TsgcHTTP_API_Anthropic.Create(nil);
  FAnthropic.AnthropicOptions.ApiKey := GetApiKey;
  FAnthropic.AnthropicOptions.AnthropicVersion := '2023-06-01';
  FAnthropic.OnHTTPAPISSE := HandleSSE;
  FAnthropic.OnHTTPAPIException := HandleException;
end;

procedure TfrmMain.btnStreamClick(Sender: TObject);
begin
  memoRaw.Lines.Clear;
  FAnthropic._CreateMessageStream(
    'claude-sonnet-4-20250514',
    'Write a haiku about Object Pascal.', 1024);
end;

procedure TfrmMain.HandleSSE(Sender: TObject;
  const aEvent, aData: string; var Cancel: Boolean);
begin
  if (aEvent = 'message_stop') or (aData = '[DONE]') then
    Exit;
  memoRaw.Lines.Add(aEvent + ': ' + aData);
end;

procedure TfrmMain.HandleException(Sender: TObject;
  E: Exception);
begin
  memoRaw.Lines.Add('ERROR: ' + E.Message);
end;

İş parçacıkları. Chat ve ChatStream eşzamanlıdır, dolayısıyla bunları doğrudan bir düğme tıklamasından çağırmak formu istek boyunca dondurur. Delphi 2010 ve sonrasında ChatAsync çağrıyı bir çalışan iş parçacığında yürütür ve bir IsgcFuture<string> döndürür. Sonuç için ThenProc, hatalar için OnError zincirleyin ve uçuştaki bir isteği terk etmek için Cancel çağırın. ThenProc geri çağrısı ana iş parçacığına gönderilir, dolayısıyla arayüze oradan doğrudan dokunabilirsiniz.

Modelin Pascal kodunuzu çağırmasına izin verin

Araç çağırma, diğer adıyla fonksiyon çağırma, bir modelin uygulamanızdan bir şeye bakmasını veya bir eylem yapmasını isteme biçimidir. Fonksiyonu bir JSON Schema ile tanımlarsınız, model istediği argümanlarla yanıt verir, siz Pascal kodunu çalıştırıp sonucu geri gönderirsiniz. Bir iş uygulamasının içindeki her işe yarar asistanın arkasındaki mekanizma budur.

Claude, tipli araç nesneleriyle

Bir TsgcAnthropicClass_Request_Messages kurun, bir veya daha fazla TsgcAnthropicClass_Request_Tool girdisi ekleyin ve CreateMessage çağırın. Her araç bir Name, bir Description ve argümanlarının JSON Schema'sı olan bir InputSchema taşır.

Yanıt, Content alanı blok dizisi olan bir TsgcAnthropicClass_Response_Messages nesnesidir. ContentType değeri 'tool_use' olan bir blok, araç adını Name içinde, argümanları Input içinde ve bir Id taşır. Fonksiyonunuzu çalıştırın, sonra ContentType değeri 'tool_result' olarak ayarlanmış, aynı ToolUseId değerini ve yanıtınızı Content içinde taşıyan bir TsgcAnthropicClass_Request_Content_Block içeren bir izleme mesajı gönderin. Çağrı başarısız olduğunda IsError değerini ayarlayın, böylece model tahmin yürütmek yerine toparlanabilir.

Sahipliğe dikkat edin: Anthropic isteği, eklediğiniz mesajların ve araçların sahibi değildir, dolayısıyla örnekteki gibi onları kendiniz serbest bırakın.

uToolUse.pas
var
  oRequest: TsgcAnthropicClass_Request_Messages;
  oMessage: TsgcAnthropicClass_Request_Message;
  oTool: TsgcAnthropicClass_Request_Tool;
  oMessages: TsgcAnthropicArray_Request_Messages;
  oTools: TsgcAnthropicArray_Request_Tools;
  oResponse: TsgcAnthropicClass_Response_Messages;
  i: Integer;
begin
  oRequest := TsgcAnthropicClass_Request_Messages.Create;
  try
    oRequest.Model := 'claude-sonnet-4-20250514';
    oRequest.MaxTokens := 4096;

    oMessage := TsgcAnthropicClass_Request_Message.Create;
    oMessage.Role := 'user';
    oMessage.Content := 'What is the stock of SKU 8841?';
    SetLength(oMessages, 1);
    oMessages[0] := oMessage;
    oRequest.Messages := oMessages;

    oTool := TsgcAnthropicClass_Request_Tool.Create;
    oTool.Name := 'get_stock';
    oTool.Description := 'Read the on-hand stock for a SKU';
    oTool.InputSchema :=
      '{"type":"object","properties":{"sku":{"type":"string",' +
      '"description":"The product code"}},"required":["sku"]}';
    SetLength(oTools, 1);
    oTools[0] := oTool;
    oRequest.Tools := oTools;

    oResponse := FAnthropic.CreateMessage(oRequest);
    try
      for i := 0 to Length(oResponse.Content) - 1 do
        if oResponse.Content[i].ContentType = 'tool_use' then
          // .Name is the tool, .Input the JSON arguments,
          // .Id the value to echo back as ToolUseId
          RunTool(oResponse.Content[i].Name,
            oResponse.Content[i].Input, oResponse.Content[i].Id)
        else if oResponse.Content[i].ContentType = 'text' then
          memoAnswer.Lines.Add(oResponse.Content[i].Text);
    finally
      oResponse.Free;
    end;
  finally
    sgcFree(oMessage);
    sgcFree(oTool);
    sgcFree(oRequest);
  end;
end;

OpenAI, tipli bir istekle

Aynı fikir, farklı biçim. Bir TsgcOpenAIClass_Request_ChatCompletion doldurun, Messages dizisini atayın, araç tanımlarınızı Tools içine bir JSON dizisi olarak koyun ve isterseniz modeli ToolChoice ile yönlendirin. ParallelToolCalls, modelin aynı anda birkaç aracı isteyip isteyemeyeceğini denetler ve ResponseFormat, ayrıştırmanız gerektiğinde yanıtı JSON'a sabitler.

CreateChatCompletion ayrıştırılmış bir TsgcOpenAIClass_Response_ChatCompletion döndürür. Yanıtı Choices[0]._Message.Content alanından, istenen çağrıları Choices[0]._Message.ToolCalls alanından, modelin neden durduğunu Choices[0].FinishReason alanından ve maliyetini Usage.PromptTokens, Usage.CompletionTokens ve Usage.TotalTokens alanlarından okuyun. Anthropic isteğinin aksine bu istek, eklediğiniz mesaj nesnelerinin sahibidir ve kendisiyle birlikte onları da serbest bırakır.

Eski Functions ve FunctionCall özellikleri, özgün OpenAI fonksiyon çağırma biçimine göre yazılmış kodlar için yerinde duruyor.

uTypedRequest.pas
var
  oRequest: TsgcOpenAIClass_Request_ChatCompletion;
  oResponse: TsgcOpenAIClass_Response_ChatCompletion;
  oSystem, oUser: TsgcOpenAIClass_Request_Completion_Message;
  oMessages: TsgcOpenAIArray_Request_Completion_Messages;
begin
  oRequest := TsgcOpenAIClass_Request_ChatCompletion.Create;
  try
    oRequest.Model := 'gpt-4o';
    oRequest.MaxTokens := 1024;
    oRequest.Temperature := 0.2;

    oSystem := TsgcOpenAIClass_Request_Completion_Message.Create;
    oSystem.Role := 'system';
    oSystem.Content := 'You are a warehouse assistant.';

    oUser := TsgcOpenAIClass_Request_Completion_Message.Create;
    oUser.Role := 'user';
    oUser.Content := 'What is the stock of SKU 8841?';

    SetLength(oMessages, 2);
    oMessages[0] := oSystem;
    oMessages[1] := oUser;
    oRequest.Messages := oMessages;

    // Tool definitions as a JSON array
    oRequest.Tools :=
      '[{"type":"function","function":{"name":"get_stock",' +
      '"description":"Read the on-hand stock for a SKU",' +
      '"parameters":{"type":"object","properties":' +
      '{"sku":{"type":"string"}},"required":["sku"]}}}]';
    oRequest.ToolChoice := 'auto';

    oResponse := FOpenAI.CreateChatCompletion(oRequest);
    try
      if Length(oResponse.Choices) > 0 then
      begin
        memoAnswer.Lines.Text := oResponse.Choices[0]._Message.Content;
        memoTools.Lines.Text := oResponse.Choices[0]._Message.ToolCalls;
        lblStop.Caption := oResponse.Choices[0].FinishReason;
      end;
      lblTokens.Caption := IntToStr(oResponse.Usage.TotalTokens);
    finally
      oResponse.Free;
    end;
  finally
    // frees the attached Messages too
    oRequest.Free;
  end;
end;

Barındırılan model mi, yerel model mi

İstemleriniz müşteri kayıtları, tıbbi veriler, sözleşmeler veya bir veri işleme sözleşmesi kapsamındaki herhangi bir şey içeriyorsa bu bir performans sorusu değil, bir uyumluluk sorusudur. Karşılaştırma şöyle.

Barındırılan, OpenAI veya Claude Yerel, Ollama
İstem nereye gider Satıcıya, HTTPS üzerinden, onun koşulları altında Hiçbir yere. İstek http://localhost:11434 adresine gider
Kimlik bilgileri Kaynak kontrolünün ve ikili dosyanın dışında tutmanız gereken bir API anahtarı Varsayılan olarak yok. OllamaOptions.ApiKey, proxy arkasındaki veya uzak bir örnek için vardır
Yanıt kalitesi Bugün mevcut olan en güçlü modeller İyi ve gelişiyor, zor akıl yürütmede sınırın açıkça gerisinde
Maliyet Token başına, sürekli. Usage.TotalTokens değerini izleyin Donanımınız, bir kez. İşe yarar bir model bol miktarda RAM veya bir GPU ister
Gecikme Bir ağ gidiş dönüşü, yoğun saatlerde satıcı kuyruğu da eklenir Ağ yok. Hız, makinenizin yaptığı kadardır
Çevrimdışı ve ağdan yalıtılmış Hayır Evet
Hız sınırları ve kesintiler Satıcı tarafında. RetryOptions kullanın ve Retry-After başlığına uyun Yalnızca kendi kapasiteniz
Bileşen TsgcHTTP_API_OpenAI, TsgcHTTP_API_Anthropic TsgcHTTP_API_Ollama

Yaygın yanıt ikisi birden olur. TsgcAIChat her sağlayıcıyı tek bir API'nin arkasına koyduğu için çalışma zamanında veri sınıflandırmasına göre yönlendirebilirsiniz: bir müşteri kaydına dokunan her şey için yerel, gerisi için barındırılan. Anahtar Provider değeridir, sağlayıcı Ollama olduğunda buna ChatOptions.BaseUrl eklenir.

if aContainsPersonalData then
begin
  FChat.Provider := aicpOllama;
  FChat.ChatOptions.BaseUrl := 'http://localhost:11434';
  FChat.ChatOptions.Model := 'llama3';
end
else
begin
  FChat.Provider := aicpOpenAI;
  FChat.ChatOptions.ApiKey := GetApiKey;
  FChat.ChatOptions.Model := 'gpt-4o-mini';
end;

memoAnswer.Lines.Text := FChat.Chat(memoPrompt.Lines.Text);

Üretimde önemli olan ayarlar

Masanızda çalışan bir demo ile bir hız sınırından, yavaş bir modelden ve "birden durdu" diyen bir destek kaydından sağ çıkan bir istemci aynı şey değildir.

Yeniden denemeler ve geri çekilme

Her istemci bir RetryOptions bloğu taşır: Enabled, Retries, Wait, Multiplier, MaxInterval, Jitter ve HonorRetryAfter. Bunu açtığınızda geçici bir hata, bir istisna olarak yüzeye çıkmak yerine üstel geri çekilmeyle yeniden denenir. HonorRetryAfter, istemcinin tahmin yürütmek yerine satıcının Retry-After başlığına uymasını sağlar.

Zaman aşımları

Yükseltmeniz gereken değer HttpOptions.ReadTimeout. Uzun süren bir metin üretimi, özellikle yerel bir modelde, varsayılan bir HTTP okuma zaman aşımını aşabilir ve iyi giden bir yanıtın ortasında başarısız olabilir.

Günlükleme

LogOptions.Enabled ile LogOptions.FileName trafiği bir dosyaya yazar. Bir istem üretimde farklı davrandığında, kodunuzun gerçekte gönderdiği JSON'u görmenin en hızlı yolu budur.

Konuşma geçmişi

TsgcAIChat alışverişi saklar ve bir sonraki çağrıda yeniden oynatır; takip sorusunu çalışır kılan şey budur. MaxHistoryMessages ile sınırlayın, böylece uzun bir oturum istemi, dolayısıyla faturayı, sınırsızca büyütmez. ClearHistory baştan başlatır, GetHistory ise Count değerini ve tek tek mesajları verir.

Azure OpenAI

OpenAIOptions.Provider değerini oapvAzure yapın ve AzureOptions.ResourceName, AzureOptions.DeploymentId ile AzureOptions.APIVersion alanlarını doldurun. Kodunuzun geri kalanı değişmez; satın alma biriminiz trafiğin Azure kiracınızın içinde kalmasında ısrar ettiğinde bu önemlidir.

Hatalar ve devre kesme

OnHTTPAPIException REST istemcilerindeki hataları yüzeye çıkarır, OnChatError ise aynısını TsgcAIChat için yapar. Bir HTTP hatası EsgcHTTPAPIProtocolException olarak gelir; bu sınıf yine EIdHTTPProtocolException sınıfından türer ve ayrıca yanıt başlıklarını taşır. CircuitBreaker ve RateLimit, kendi yaptığınız çağrılar için istemcide mevcuttur.

İlk çağrıdan sonra insanlar ne kuruyor

Bir sohbet kutusu başlangıçtır. Bu iş genellikle şu dört yöne gider ve hepsi kütüphanede zaten var.

Kendi verinizden yanıtlayın

Belgelerinizi TsgcAIOpenAIEmbeddings ile vektörlere dönüştürün, TsgcAIDatabaseVectorFile veya TsgcAIDatabaseVectorPinecone içinde saklayın ve isteme koymak üzere en yakın pasajları getirin. Bu, geri getirmeyle zenginleştirilmiş üretimdir ve modelin işiniz hakkında yanıt uydurmasını böyle durdurursunuz.

Embeddings ve vektör veritabanları

Onunla konuşun, o da size konuşsun

TsgcAIOpenAIChatBot bir kaydediciyi, transkripsiyonu, sohbet çağrısını ve metinden konuşmayı tek bir bileşende birleştirir, böylece bir kullanıcı uygulamanızla sesli bir konuşma yürütebilir. TsgcAIOpenAITranslator aynısını canlı çeviri için yapar.

Yapay Zeka ChatBot ve Yapay Zeka Çevirmeni

Uygulamanızı bir yapay zeka ajanına açın

Model Context Protocol, asistanların araçları keşfetme ve çağırma biçimidir. TsgcWSServer_API_MCP Delphi uygulamanızı, Claude'un ve diğer istemcilerin sürebileceği bir MCP sunucusuna dönüştürür, TsgcWSAPI_Client_MCP ise kodunuzdan başka sunucuları tüketir. Palette TsgcWSAPIServer_MCP ve TsgcWSAPIClient_MCP olarak görünürler.

Bilmekte fayda var: sohbet bileşeninin aksine MCP birimleri Windows ile sınırlı değildir, dolayısıyla Delphi ile yazılmış bir MCP sunucusu Linux üzerinde çalışabilir.

MCP genel bakış, MCP sunucusu ve MCP istemcisi

Her satıcı API'sinin geri kalanını kullanın

OpenAI'de görsel üretimi, transkripsiyon, moderasyon, toplu işler ve ince ayar. Claude'da görüntü, belgeler, genişletilmiş düşünme, web araması ve token sayımı. Ollama'da embeddings ve model yönetimi. Her satıcı sayfası, istemcisinin neleri sunduğunu listeler.

OpenAI, Claude ve Ollama

Referans, demolar ve eğitimler

Bileşen referansı her özelliği ve olayı belgeler. Çalıştırmaya hazır demo projeleri kütüphanenin içinde, Demos\AI altında gelir.

Referans, OpenAI istemcisi TsgcHTTP_API_OpenAI üzerindeki her metot, seçenek ve olay.
Referans, Anthropic istemcisi TsgcHTTP_API_Anthropic üzerinde mesajlar, araçlar, görüntü, toplu işler ve token sayımı.
Eğitim, Delphi'den Claude Anthropic istemcisinin baştan sona uzun anlatımı.
Eğitim, Ollama ile yerel modeller Bir model çekin, istemciyi localhost'a yöneltin ve çevrimdışı çalıştırın.
Eğitim, fonksiyon çağırma Bir modeli kendi Pascal fonksiyonlarınıza adım adım bağlama.
Kullanıcı Kılavuzu (PDF) Kütüphanedeki her bileşeni kapsayan kapsamlı kılavuz.

Daha fazla okuma: Delphi'den OpenAI istemcisi, bir yapay zeka sohbet botu kurmak, bir yapay zeka ajanı kurmak ve MCP istemcisi. Bileşen tanıtım sayfaları Delphi OpenAI istemcisi ve Anthropic API.

Bu sayfa, her biri tek bir işi baştan sona ele alan Delphi kullanım senaryoları arasındadır. Şimdiye kadarki diğerleri bir kullanıcıyı OAuth2 ve PKCE ile oturum açtırma ve iki uygulamayı WebRTC ile eşler arası bağlama.

Sıkça sorulan sorular

sgcAI_Chat biriminden bir TsgcAI_Chat oluşturun, Provider değerini istediğiniz satıcıya ayarlayın, ChatOptions.ApiKey ve ChatOptions.Model değerlerini verin, sonra yanıtı dize olarak döndüren Chat('istediğiniz istem') çağırın. Tek bir satıcının API'siyle doğrudan konuşmayı tercih ederseniz TsgcHTTP_API_OpenAI, TsgcHTTP_API_Anthropic veya TsgcHTTP_API_Ollama kullanın ve _CreateChatCompletion ya da _CreateMessage çağırın. İki yaklaşım da sgcWebSockets ile ve bağımsız sgcAI paketiyle gelir, Delphi 7'den RAD Studio 13'e kadar çalışır.
Chat yerine ChatStream çağırın ve her deltanın çözülmüş metnini aChunk ile, erken durmak için ayarlayabileceğiniz bir Cancel bayrağıyla birlikte veren OnChatStream olayını ele alın. REST istemcisi seviyesinde OnHTTPAPISSE atayın ve Claude ile Ollama istemcilerinde _CreateMessageStream çağırın, ya da bir TsgcOpenAIClass_Request_ChatCompletion üzerinde Stream değerini True yapın. Bu olay size ham Server-Sent Event adını ve verisini verir, kısmi ağ okumaları önceden yeniden birleştirilmiş olarak.
Evet. Ollama'yı kurun, bir model çekin, sonra TsgcHTTP_API_Ollama bileşenini ona yöneltin. OllamaOptions.Host zaten varsayılan olarak http://localhost:11434 değerindedir, dolayısıyla varsayılan bir kurulumda yalnızca bir model seçip _CreateMessage çağırırsınız. Makineden hiçbir şey çıkmaz, API anahtarı gerekmez ve uygulama çevrimdışı çalışır. TsgcAIChat üzerinden aynı sunucuya, Provider değerini aicpOllama yaparak ve sunucu localhost'ta değilse ChatOptions.BaseUrl ayarlayarak ulaşılır.
Fonksiyonu bir JSON Schema ile tanımlayın ve isteğe ekleyin. Claude'da bir TsgcAnthropicClass_Request_Messages nesnesinin Tools dizisine Name, Description ve InputSchema içeren bir TsgcAnthropicClass_Request_Tool ekleyin. Yanıt bu durumda ContentType değeri tool_use olan, Name, Input ve Id taşıyan bir içerik bloğu içerir; siz de aynı ToolUseId değerini anan bir tool_result bloğuyla yanıt verirsiniz. OpenAI'de tanımları bir TsgcOpenAIClass_Request_ChatCompletion nesnesinin Tools özelliğine koyun ve istenen çağrıları Choices[0]._Message.ToolCalls alanından okuyun.
Yapay zeka ve LLM istemcileri sgcWebSockets'in Enterprise özelliğidir. Standard veya Professional sürümlerine dahil değildir. sgcWebSockets'in geri kalanına ihtiyacınız yoksa bağımsız sgcAI paketi aynı bileşenleri, ihtiyaç duydukları çalışma zamanıyla birlikte içerir. Kütüphane Delphi 7'den RAD Studio 13'e ve eşleşen C++ Builder sürümlerine kadar destek verir. Platformlarda, TsgcHTTP_API_OpenAI, TsgcHTTP_API_Anthropic ve TsgcHTTP_API_Ollama REST istemcileri Windows, macOS, Linux, iOS ve Android için derlenir, TsgcAIChat ise yalnızca Windows için, Win32 ve Win64 olarak derlenir. MCP istemcisi ve sunucusu da Windows ile sınırlı değildir.
Barındırılan sağlayıcılar için evet. Bileşenler REST istemcileridir, dolayısıyla kendi OpenAI, Anthropic, Google, xAI, DeepSeek veya Mistral hesabınızdan bir anahtar getirir ve ChatOptions.ApiKey alanına ya da OpenAIOptions.ApiKey gibi satıcı seçeneklerine atarsınız. Kullanım o satıcı tarafından sizin anahtarınıza faturalanır ve bunu yanıt başına Usage.PromptTokens, Usage.CompletionTokens ve Usage.TotalTokens üzerinden izleyebilirsiniz. Ollama anahtar istemez, çünkü model yerelde çalışır.
Chat ve ChatStream eşzamanlıdır. Delphi 2010 ve sonrasında bunun yerine ChatAsync çağırın: isteği bir çalışan iş parçacığında yürütür ve dize türünde bir IsgcFuture döndürür, böylece yanıtı almak için ThenProc, bir istisnayı almak için OnError ve uçuştaki bir isteği terk etmek için Cancel zincirlersiniz. ThenProc geri çağrısı ana iş parçacığına gönderilir, dolayısıyla arayüzü oradan güncellemek güvenlidir. Ayrıca HttpOptions.ReadTimeout değerini yükseltin, çünkü uzun süren bir metin üretimi varsayılan bir okuma zaman aşımını aşabilir.
Evet. OpenAIOptions.Provider değerini oapvAzure yapın ve AzureOptions.ResourceName, AzureOptions.DeploymentId ile AzureOptions.APIVersion alanlarını doldurun. İstemci bundan sonra Azure dağıtımınızı hedefler ve zaten yazdığınız çağrılar tamamen aynı kalır.

Delphi uygulamanızdan bir LLM çağırmaya hazır mısınız?

Ücretsiz denemeyi indirin ve ilk çağrınızı bugün yapın.