Dlaczego natywny komponent Delphi do Claude?
Anthropic Claude to jedna z najlepszych rodzin AI na rynku, ale każdy publiczny przykład używa Pythona lub Node. Dla deweloperów Delphi i C++Builder ręczne wywoływanie endpointów REST oznacza samodzielne tworzenie JSON, żonglowanie Server-Sent Events, zarządzanie TLS, obsługę limitów żądań i przepisywanie kodu boilerplate za każdym razem, gdy Anthropic dostarcza nową funkcję — co robi mniej więcej co kwartał. Komponent TsgcHTTP_API_Anthropic dostarczany z sgcWebSockets usuwa to tarcie. To silnie typowany wrapper wokół całej powierzchni Anthropic — wiadomości, streaming, vision, użycie narzędzi, rozszerzone myślenie, buforowanie promptów, pliki, wsady i konektor Model Context Protocol — który możesz upuścić na formularz i używać z dowolnej aplikacji VCL, FMX lub konsolowej.
Ten samouczek omawia każdą główną funkcjonalność z działającym kodem Delphi. Pod koniec będziesz w stanie zbudować klienta czatu, analizator dokumentów z obsługą vision, agentowego runnera narzędzi i zoptymalizowany kosztowo pipeline produkcyjny. Wszystkie fragmenty kierują się do najnowszych modeli claude-sonnet-4-20250514 i claude-opus-4-20250514, a wszystkie z nich działają bez zmian na Delphi 7 do Delphi 13.
Krótka uwaga o filozofii zanim się zagłębimy. Komponent celowo udostępnia dwie powierzchnie. Powierzchnia „szybka” (metody jak _CreateMessage, _CreateMessageStream, _CreateMessageWithImage) akceptuje kilka stringów i zwraca string — idealna dla prototypów, dem i 80% wywołań, w których nie zależy Ci na temperaturze, top-p, metadanych ani sekwencjach zatrzymania. Powierzchnia „typowana” (klasy jak TsgcAnthropicClass_Request_Messages i TsgcAnthropicClass_Response_Messages) daje Ci pełną kontrolę nad każdym parametrem, który API Anthropic wspiera, z silnym typowaniem i autouzupełnianiem w IDE. Użyj szybkiego API do nauki; promuj na typowane API do produkcji. Ten sam komponent, dwie warstwy, bez duplikacji.
1. Konfiguracja i Twoja pierwsza wiadomość
Dodaj sgcHTTP_API_Anthropic do swojej klauzuli uses, utwórz komponent, ustaw swój klucz API (zdobądź jeden z console.anthropic.com) i wywołaj _CreateMessage. To absolutne minimum, aby porozmawiać z Claude.
uses
sgcHTTP_API_Anthropic;
var
oClaude: TsgcHTTP_API_Anthropic;
vReply : string;
begin
oClaude := TsgcHTTP_API_Anthropic.Create(nil);
try
oClaude.AnthropicOptions.ApiKey := 'sk-ant-api03-...';
vReply := oClaude._CreateMessage(
'claude-sonnet-4-20250514',
'Write a haiku about Pascal compilers.');
ShowMessage(vReply);
finally
oClaude.Free;
end;
end;
Komponent wykonuje ciężką pracę: buduje ciało żądania JSON, ustawia nagłówki x-api-key i anthropic-version, wysyła post do /v1/messages i parsuje odpowiedź do zwykłego stringa Delphi. Jeśli potrzebujesz pełnej kontroli nad parametrami żądania, użyj typowanej klasy TsgcAnthropicClass_Request_Messages.
Jedna wskazówka operacyjna: nigdy nie wbudowuj klucza API w binarkę. Czytaj go ze zmiennej środowiskowej, klucza rejestru lub menedżera tajemnic. Anthropic teraz skanuje GitHub w poszukiwaniu wyciekłych kluczy i automatycznie je unieważnia — nie chcesz dostarczać aktualizacji w piątek o 18:00, bo ktoś zrobił zrzut ekranu Twojego pliku .pas.
2. Strumieniowane odpowiedzi z SSE
Wywołania synchroniczne są w porządku dla krótkich promptów, ale dla UI czatu chcesz, by tokeny pojawiały się w miarę jak Claude je generuje. Anthropic strumieniuje odpowiedzi jako Server-Sent Events, a komponent udostępnia je przez zdarzenie OnHTTPAPISSE.
procedure TForm1.FormCreate(Sender: TObject);
begin
oClaude := TsgcHTTP_API_Anthropic.Create(Self);
oClaude.AnthropicOptions.ApiKey := 'sk-ant-api03-...';
oClaude.OnHTTPAPISSE := ClaudeSSE;
end;
procedure TForm1.ClaudeSSE(Sender: TObject;
const aEvent, aData: string; var Cancel: Boolean);
var
vDelta: string;
begin
// aEvent values: message_start, content_block_delta,
// content_block_stop, message_stop
if aEvent = 'content_block_delta' then
begin
vDelta := oClaude.SSEExtractText(aData);
Memo1.Text := Memo1.Text + vDelta;
Application.ProcessMessages;
end;
end;
procedure TForm1.btnAskClick(Sender: TObject);
begin
Memo1.Clear;
oClaude._CreateMessageStream(
'claude-sonnet-4-20250514',
edtPrompt.Text);
end;
Jeden szczegół wart uwagi: streaming działa na wątku w tle, więc aktualizuj UI przez TThread.Synchronize lub TThread.Queue w kodzie produkcyjnym. Fragment powyżej używa ProcessMessages dla zwięzłości. Inny: strumień SSE wysyła wiele typów zdarzeń w sekwencji (message_start, content_block_start, powtarzane content_block_delta, content_block_stop, message_delta, message_stop) i powinieneś ignorować te, których nie potrzebujesz. Pomocnik SSEExtractText obsługuje typowy przypadek wyciągania delty tekstu z content_block_delta; dla statystyk użycia i powodów zatrzymania parsuj message_delta bezpośrednio.
Streaming jest niezbędny dla każdego UI czatu zorientowanego na użytkownika — użytkownicy postrzegają odpowiedź, która zaczyna się w 400 ms, jako szybką, nawet jeśli pełna odpowiedź zajmuje dziesięć sekund. Bez streamingu wpatrują się w spinner przez dziesięć sekund i zakładają, że aplikacja jest zepsuta. Koszt jest identyczny: żądania ze streamingiem i bez są naliczane tak samo.
3. Vision — Wysyłanie obrazów
Claude potrafi analizować obrazy JPEG, PNG, GIF i WebP. Przekazujesz je albo jako publiczny URL, albo jako bajty zakodowane base64. Komponent udostępnia _CreateMessageWithImage dla przypadku URL i typowane API dla wszystkiego innego.
var
oRequest : TsgcAnthropicClass_Request_Messages;
oMessage : TsgcAnthropicClass_Request_Message;
oImage : TsgcAnthropicClass_Request_Content_Image;
oResponse: TsgcAnthropicClass_Response_Messages;
begin
oRequest := TsgcAnthropicClass_Request_Messages.Create;
try
oRequest.Model := 'claude-sonnet-4-20250514';
oRequest.MaxTokens := 1024;
oMessage := oRequest.NewMessage('user');
oMessage.AddText('Describe what you see and read any text.');
oImage := oMessage.AddImage;
oImage.Source.LoadFromFile('C:\invoices\inv-2026-05-12.png');
oImage.MediaType := 'image/png';
oResponse := oClaude.CreateMessage(oRequest);
try
Memo1.Lines.Add(oResponse.Content[0].Text);
finally
oResponse.Free;
end;
finally
oRequest.Free;
end;
end;
Vision jest idealny do OCR na skanowanych fakturach, triagowania zrzutów ekranu w zgłoszeniach wsparcia, interpretacji wykresów i każdego zadania, w którym deterministyczny silnik OCR miałby trudności z układem. Uważaj na koszt tokenów: obraz 1024x1024 pochłania mniej więcej 1600 tokenów wejściowych. Anthropic zmniejsza rozmiar wszystkiego większego niż 1568 pikseli na dłuższej krawędzi przed przetwarzaniem, więc nie ma sensu uploadować zrzutów ekranu 4K — pomniejsz po swojej stronie i oszczędź pasmo.
Praktyczne przypadki użycia, które widzieliśmy u sklepów Delphi dostarczane w ciągu ostatniego roku: wyciąganie pozycji z PDF dostawców, które były zbyt niespójne dla tradycyjnych pipelines OCR, klasyfikowanie obrazów medycznych do szerokich kategorii przed routingiem do specjalistycznego oprogramowania, odczytywanie wartości liczników ze zdjęć serwisu polowego i triagowanie zrzutów ekranu błędów UI w zgłoszeniach helpdesk („czy zrzut ekranu pokazuje problem z układem czy problem z danymi?”). W każdym przypadku wygraną nie była surowa dokładność — było wyeliminowanie potrzeby pisania i utrzymywania kruchego, per-dokumentowego parsera.
4. Użycie narzędzi (wywoływanie funkcji)
Użycie narzędzi pozwala Claude zdecydować, kiedy wywołać Twoje funkcje Pascal. Deklarujesz każde narzędzie z nazwą, opisem i schematem JSON dla jego parametrów. Kiedy Claude odpowiada blokiem tool_use zamiast zwykłym tekstem, wykonujesz wywołanie i wprowadzasz wynik z powrotem do rozmowy.
var
oRequest: TsgcAnthropicClass_Request_Messages;
oTool : TsgcAnthropicClass_Request_Tool;
begin
oRequest := TsgcAnthropicClass_Request_Messages.Create;
oRequest.Model := 'claude-sonnet-4-20250514';
oRequest.MaxTokens := 1024;
oTool := oRequest.NewTool;
oTool.Name := 'get_stock_price';
oTool.Description := 'Return the current bid/ask for a US ticker symbol.';
oTool.InputSchema :=
'{"type":"object",' +
'"properties":{"symbol":{"type":"string","description":"Ticker, e.g. AAPL"}},' +
'"required":["symbol"]}';
oRequest.NewMessage('user').AddText('What is Apple trading at?');
oResponse := oClaude.CreateMessage(oRequest);
if oResponse.StopReason = 'tool_use' then
begin
vSymbol := oResponse.ToolUse[0].InputAsJSON.S['symbol'];
vPrice := MyQuoteFeed.Quote(vSymbol); // your code
oClaude.SendToolResult(oResponse.ToolUse[0].Id,
Format('{"bid":%.2f,"ask":%.2f}', [vPrice.Bid, vPrice.Ask]));
end;
end;
Buduj agentic workflows przez łączenie narzędzi: agent badawczy może łączyć narzędzia web_search, read_pdf i send_email. Zawsze trzymaj gard iMaxIterations, żeby źle zachowujący się model nie mógł zapętlić się na zawsze. W produkcji ograniczamy do pięciu wywołań narzędzi na turę użytkownika z powodów kosztowych; jeśli Claude potrzebuje więcej, zwykle jest to znak, że prompt lub projekt narzędzia jest błędny.
Pojedynczym największym wyznacznikiem jakości wywoływania narzędzi jest tekst opisu. Modele wybierają właściwe narzędzie z właściwymi argumentami około 99% czasu, gdy opisy są precyzyjne („Zwróć bieżący bid/ask dla amerykańskiego symbolu giełdowego. Używaj tego tylko dla akcji, nie dla kryptowalut ani FX”); spadają do może 70% przy niejasnym opisie („Pobierz cenę”). Poświęć czas. Dodaj przykłady w opisie. Powiedz, czego narzędzie NIE robi. Przyszły Ty, debugujący halucynowane wywołanie funkcji za 0,40 $ o 23:00, podziękuje obecnemu Tobie.
5. Rozszerzone myślenie
Claude 4 wprowadza tryb myślenia, w którym model rozumuje krok po kroku nad problemem przed odpowiedzią. Alokujesz budżet myślenia w tokenach, a Claude zwraca ślad rozumowania osobno od ostatecznej odpowiedzi. To zmiana zasad gry dla matematyki, przeglądu kodu i wieloetapowej analizy.
oRequest.Thinking.Enabled := True;
oRequest.Thinking.BudgetTokens := 8000; // soft cap on internal reasoning
oRequest.MaxTokens := 16000;
oRequest.NewMessage('user').AddText(
'A train leaves Madrid at 07:00 doing 220 km/h. Another leaves ' +
'Barcelona at 07:15 doing 250 km/h. The route is 621 km. ' +
'Where do they meet?');
oResponse := oClaude.CreateMessage(oRequest);
MemoThinking.Lines.Text := oResponse.Thinking; // reasoning trace
MemoAnswer.Lines.Text := oResponse.Content[0].Text;
Używaj rozszerzonego myślenia oszczędnie — tokeny rozumowania są naliczane jako output, więc 16k-tokenowy budżet myślenia na Opus 4 może łatwo kosztować więcej niż normalne wywołanie. Zarezerwuj go dla problemów, w których poprawność liczy się bardziej niż latencja. Dobre dopasowania: analiza dokumentów prawnych, uzgodnienia finansowe, generowanie złożonego SQL, debugowanie śladów stosu, harmonogramowanie z wieloma ograniczeniami. Złe dopasowania: odpowiedzi czatu, klasyfikacja treści, proste wyszukiwania — czas myślenia i koszt nie są uzasadnione.
Użyteczna sztuczka to udostępnienie śladu rozumowania w UI jako zwijaną sekcję „pokaż myślenie”, jak robi to publiczna aplikacja Claude. Zaawansowani użytkownicy uwielbiają widzieć, jak model doszedł do odpowiedzi; przypadkowi użytkownicy ignorują to. Tak czy inaczej masz ślad audytowy za darmo.
6. Buforowanie promptów
Jeśli ciągle wysyłasz ten sam długi prompt systemowy, bazę wiedzy lub definicje narzędzi, buforowanie promptów może obniżyć koszty nawet o 90% i skrócić czas do pierwszego tokenu o 80%. Oznaczasz blok treści jako buforowalny; Anthropic przechowuje go po swojej stronie przez 5 minut (lub 1 godzinę z rozszerzonym buforem) i nalicza tylko tańszą cenę odczytu bufora przy kolejnych wywołaniach.
var
oSystem: TsgcAnthropicClass_Request_System;
begin
oSystem := oRequest.NewSystemBlock;
oSystem.Text := LoadFile('C:\kb\product-manual.txt'); // 50k tokens
oSystem.CacheControl := 'ephemeral'; // mark as cacheable
oRequest.NewMessage('user').AddText('How do I configure SSL on the server?');
oResponse := oClaude.CreateMessage(oRequest);
// Inspect cache stats
ShowMessage(Format('Cache: created=%d, read=%d, input=%d, output=%d',
[oResponse.Usage.CacheCreationInputTokens,
oResponse.Usage.CacheReadInputTokens,
oResponse.Usage.InputTokens,
oResponse.Usage.OutputTokens]));
end;
Reguła kciuka: wszystko powyżej 1024 tokenów, co ponownie używasz w ciągu pięciu minut, jest warte buforowania. Duże korpusy dokumentacji, przykłady few-shot i duże schematy narzędzi to oczywiści kandydaci. Księgowość: zapisy do bufora kosztują 25% więcej niż normalny token wejściowy, odczyty z bufora kosztują 10% normalnego tokenu wejściowego. Więc wychodzisz na zero po drugim trafieniu i zaczynasz oszczędzać prawdziwe pieniądze od trzeciego. Dla bota wsparcia klienta odpowiadającego na 50 pytań na minutę przeciwko 40k-tokenowej bazie wiedzy, buforowanie promptów zwykle obniża miesięczny rachunek Anthropic o 80–85%.
Możesz oznaczyć do czterech bloków treści jako buforowalne na żądanie. Częsty wzorzec to: narzędzia (buforowalne, rzadko się zmieniają), prompt systemowy (buforowalny, rzadko się zmienia), duży dokument (buforowalny, zmienia się na sesję), ostatnie wiadomości (NIE buforowalne, zmieniają się w każdej turze). Komponent obsługuje to warstwowanie naturalnie — po prostu ustaw CacheControl na blokach, które chcesz buforować.
7. Konektor MCP
Model Context Protocol pozwala Claude rozmawiać ze zdalnymi serwerami narzędzi bez konieczności ręcznego owijania każdego narzędzia. Wskaż komponentowi URL serwera MCP, a Claude może odkryć narzędzia, wywołać je i połączyć wyniki.
oRequest.MCPServers.Add(
'weather-mcp',
'https://mcp.example.com/weather',
'Bearer ' + GetMcpToken);
oRequest.NewMessage('user').AddText(
'What is the weather like in Madrid and should I take an umbrella?');
oResponse := oClaude.CreateMessage(oRequest);
ShowMessage(oResponse.Content[0].Text);
Połącz konektor MCP z własnym TsgcAI_MCP_Server (omówionym w oddzielnym samouczku) i masz w pełni natywnego dla Delphi agenta, który udostępnia Twoje API domenowe dowolnemu klientowi AI świadomemu MCP — Claude Desktop, Cursor, Continue, Twoim własnym aplikacjom, wszystkiemu, co mówi w tym protokole. Uwierzytelnianie jest Twoją odpowiedzialnością: przekaż token bearer lub podpisany nagłówek i waliduj po stronie serwera. Anthropic nie widzi Twoich poświadczeń — handshake konektora MCP kieruje token z żądania do docelowego serwera.
Dla wielodzierżawnych wdrożeń SaaS typowym wzorcem jest jeden serwer MCP na dzierżawcę, z identyfikatorem dzierżawcy osadzonym w URL lub tokenie bearer. Claude wywołuje narzędzia każdego dzierżawcy bez krzyżowego zanieczyszczania danych. Widzieliśmy wdrożenia produkcyjne rozprzestrzeniające się na 200+ serwerów MCP z jednej rozmowy.
Lista kontrolna produkcyjna
Zanim przerzucisz aplikację Delphi zasilaną Anthropic do produkcji, przejdź przez tę krótką listę:
| Zagadnienie | Jak sobie z tym poradzić |
| Przechowywanie klucza API | Zmienna środowiskowa lub OS secret store, nigdy nie zakodowane na sztywno |
| Ponowne próby przy 429 / 529 | Wykładniczy backoff z jitterem, maks. 3 próby |
| Górne granice kosztów | Śledź Usage na żądanie, odmawiaj nowych wywołań po przekroczeniu dziennego budżetu |
| Redakcja PII | Usuń emaile/SSN/numery kart kredytowych przed wysłaniem do API |
| Przypinanie wersji modelu | Używaj pełnych nazw modeli z datami; nie polegaj na aliasach „latest” |
| Wersjonowanie promptów | Przechowuj prompty systemowe w kontroli źródeł obok kodu |
| Telemetria | Loguj model, tokeny wejściowe, tokeny wyjściowe, latencję na wywołanie |
Dokąd dalej
Ten samouczek omówił osiem funkcji, których potrzebujesz w 95% przypadków. Komponent wspiera również wsady wiadomości (tanie asynchroniczne przetwarzanie tysięcy promptów — 50% taniej niż wywołania synchroniczne, idealne do nocnych zadań wzbogacania), Files API (upload raz, odwoływanie się na zawsze — idealne dla dużych PDF, które wielokrotnie pytasz), liczenie tokenów (szacowanie kosztów przed zapłaceniem) i strukturalne wyjścia JSON (wymuszona zgodność schematu, nigdy więcej błędów parsowania). Przeglądaj stronę komponentu Anthropic, by zobaczyć pełną matrycę funkcji, i przejdź do huba Pierwsze kroki, jeśli jeszcze nie zainstalowałeś sgcWebSockets.
A jeśli zbudujesz coś interesującego z Claude w Delphi — agenta, copilota, analizator dokumentów — powiedz nam. Uwielbiamy widzieć, co robią deweloperzy Pascal, gdy tarcie AI znika.