Hızlı yanıt: sgcWebSockets ile Delphi'de bir LLM yanıtını akışla almak için bileşenin OnHTTPAPISSE olayını atayın, ardından akış yöntemini çağırın — OpenAI için Stream := True ile _CreateChatCompletion, Anthropic Claude ve Ollama için _CreateMessageStream, Gemini için _CreateContentStream. Her delta, işleyiciye bir Server-Sent Event olarak gelir; aData'yı bir Memo'ya ekleyin ve yanıt, model onu ürettikçe kendiliğinden yazılsın.
Akışsız bir LLM çağrısı, tüm yanıt hazır olana kadar bloke eder. Tek paragraflık bir yanıt için bu sorun değil, ancak uzun bir tamamlama için kullanıcı, hiçbir geri bildirim olmadan birkaç saniye boyunca donmuş bir pencereye bakar. Akış bunu düzeltir: model, çıktısını tek bir HTTP bağlantısı üzerinden küçük parçalar dizisi olarak döndürür ve her parçayı geldiği an oluşturursunuz. Sonuç, ChatGPT'de gördüğünüz tanıdık "yazıyor" etkisi ve tam yanıt biraz sürse bile duyarlı hissettiren bir arayüzdür.
Akış nasıl çalışır: OnHTTPAPISSE
Kaputun altında her sgcWebSockets AI bileşeni, Server-Sent Events (SSE) kullanarak akış yapar. Sağlayıcı yanıtı açık tutar ve token'lar üretildikçe olayları gönderir. Bileşen bu olayları ayrıştırır ve her bileşende aynı imzaya sahip tek bir işleyici aracılığıyla parça başına bir olay tetikler:
procedure TForm1.HandleSSE(Sender: TObject;
const aEvent, aData: string; var Cancel: Boolean);
begin
// aEvent -> the SSE event name (provider-specific)
// aData -> the payload for this chunk (the token delta)
// Cancel -> set True to abort the stream early
Memo1.Lines.Add(aData);
end;
Sözleşmenin tamamı budur. aData artımlı yükü taşır, aEvent hangi tür olay olduğunu söyler (birden çok olay türü yayan sağlayıcılarda yararlıdır) ve Cancel := True ayarlamak, örneğin kullanıcı bir Durdur düğmesine tıkladığında akışı durdurur. Aynı işleyici biçimi OpenAI, Anthropic, Gemini ve Ollama için çalışır, dolayısıyla bir kez yazdığınızda onu sağlayıcılar arasında yeniden kullanabilirsiniz.
OpenAI: Stream := True
TsgcHTTP_API_OpenAI ile istekte akışı etkinleştirir ve olayı bağlarsınız. OpenAIOptions.ApiKey'i ayarlayın, OnHTTPAPISSE'yi atayın ve sohbet tamamlaması tek bir blokta değil parça parça teslim edilir:
uses
sgcHTTP_API_OpenAI;
var
OpenAI: TsgcHTTP_API_OpenAI;
begin
OpenAI := TsgcHTTP_API_OpenAI.Create(nil);
OpenAI.OpenAIOptions.ApiKey := 'sk-...';
// Each token delta arrives in HandleSSE
OpenAI.OnHTTPAPISSE := HandleSSE;
// Build a typed request, set Stream := True, then call
OpenAI._CreateChatCompletion('gpt-4o-mini', 'Explain WebSockets in detail.');
end;
Türü belirtilmiş istek bir Stream özelliği sunar, dolayısıyla istek nesnesini kendiniz oluşturduğunuzda göndermeden önce Stream := True ayarlarsınız. Token'lar üretildikçe OnHTTPAPISSE aracılığıyla yüzeye çıkar ve her birini Memo'nuza eklersiniz.
Anthropic Claude: _CreateMessageStream
Claude özel bir akış yardımcısı sunar, bu yüzden çevrilecek ayrı bir bayrak yoktur: TsgcHTTP_API_Anthropic üzerinde _CreateMessageStream çağırmak, o istek için SSE'yi açar. API anahtarını ve sürümü ayarlayın, işleyiciyi atayın ve çağırın:
uses
sgcHTTP_API_Anthropic;
var
Anthropic: TsgcHTTP_API_Anthropic;
begin
Anthropic := TsgcHTTP_API_Anthropic.Create(nil);
Anthropic.AnthropicOptions.ApiKey := 'sk-ant-...';
Anthropic.AnthropicOptions.AnthropicVersion := '2023-06-01';
Anthropic.OnHTTPAPISSE := HandleSSE;
Anthropic._CreateMessageStream(
'claude-3-5-sonnet-latest',
'Summarise RFC 6455',
1024);
end;
Claude akış yaparken birkaç SSE olay türü yayar (içerik blokları başlar, deltalar, sonra durur). Gerekirse aEvent argümanı bunları ayırt etmenizi sağlar; basit bir "metni geldikçe göster" arayüzü için aData'yı eklemek yeterlidir.
Gemini ve Ollama: aynı biçim
Google Gemini, kendi akış yöntemi TsgcHTTP_API_Gemini üzerindeki _CreateContentStream ile aynı deseni izler:
Gemini.OnHTTPAPISSE := HandleSSE;
Gemini._CreateContentStream(
'gemini-2.0-flash',
'Explain quantum entanglement',
1024);
Yerel modeller tam olarak aynı şekilde çalışır. TsgcHTTP_API_Ollama hiçbir API anahtarına ihtiyaç duymaz — OllamaOptions.BaseUrl'i http://localhost:11434/api adresine yönlendirin ve _CreateMessageStream çağırın, kendi donanımınızdaki açık model aynı OnHTTPAPISSE işleyicisi aracılığıyla geri akış yapar:
Ollama.OllamaOptions.BaseUrl := 'http://localhost:11434/api';
Ollama.OnHTTPAPISSE := HandleSSE;
Ollama._CreateMessageStream('llama3', 'Summarise RFC 6455');
Dört sağlayıcı, bir olay, her biri için bir yöntem çağrısı. Akış arka ucunu değiştirmek bir yeniden yazım değil, yerel bir düzenlemedir.
Arayüzü güvenli biçimde güncellemek
İşleyici için birkaç pratik not. İlki, OnHTTPAPISSE içindeki işi küçük tutun — deltayı ekleyin ve dönün. Ağır token başına işleme, akışı kesintili hissettirir, bu nedenle metni biriktirin ve pahalı biçimlendirmeyi akış bittikten sonra bir kez yapın. İkincisi, iş parçacığı bağlamına dikkat edin. İsteği bir arka plan iş parçacığından başlatırsanız, SSE olayı o iş parçacığında tetiklenir ve VCL veya FMX denetimlerine ana iş parçacığı dışından dokunmak güvenli değildir. Bu durumda güncellemeyi TThread.Synchronize ile (ya da bloke etmeyen bir ekleme için TThread.Queue ile) geri yönlendirin:
procedure TForm1.HandleSSE(Sender: TObject;
const aEvent, aData: string; var Cancel: Boolean);
begin
TThread.Queue(nil,
procedure
begin
Memo1.SelStart := Length(Memo1.Text);
Memo1.SelText := aData; // append at the caret, no full repaint
end);
end;
Lines.Add yerine SelText ile eklemek, her token'da tüm Memo'nun yeniden akıtılmasını önler, bu da uzun bir akışı akıcı tutar. API'yi ana iş parçacığından çağırırsanız, TThread.Queue sarmalayıcısını çıkarabilir ve denetimi doğrudan güncelleyebilirsiniz.
Başlarken
Bu bileşenlerin tamamı sgcWebSockets ile gelir. Ücretsiz denemeyi edinin, istediğiniz sağlayıcının bileşenini ekleyin, OnHTTPAPISSE'yi atayın ve akış yöntemini çağırın — birkaç satırda token token bir arayüze sahip olacaksınız. Tam yöntem başvurusu için OpenAI bileşeni sayfasına ve Anthropic bileşeni sayfasına bakın ya da AI & LLM bileşenleri merkezinde her modele göz atın.
Sorularınız veya geri bildiriminiz mi var? İletişime geçin — kodu yazan kişilerden yanıt alacaksınız.
