なぜ Claude 向けのネイティブ Delphi コンポーネントなのか?
Anthropic Claude は市場で最も能力の高い AI ファミリーの 1 つですが、公開されている例はすべて Python か Node を使用します。Delphi と C++Builder の開発者にとって、REST エンドポイントを手で呼び出すことは、JSON を手書きし、Server-Sent Events を捌き、TLS を管理し、レート制限を処理し、Anthropic が新機能をリリースするたび(概ね四半期ごと)に定型コードを書き直すことを意味します。sgcWebSockets に同梱される TsgcHTTP_API_Anthropic コンポーネントはその摩擦を取り除きます。Anthropic の全領域 — メッセージ、ストリーミング、ビジョン、ツール利用、拡張思考、プロンプトキャッシング、ファイル、バッチ、Model Context Protocol コネクタ — を強く型付けでラップし、フォームにドロップしてあらゆる VCL、FMX、コンソールアプリケーションから使用できます。
このチュートリアルでは、動作する Delphi コードで主要な機能をすべて解説します。終わる頃には、チャットクライアント、ビジョン対応ドキュメント分析、エージェント型ツールランナー、コスト最適化された本番パイプラインを構築できるようになります。すべてのスニペットは最新の claude-sonnet-4-20250514 および claude-opus-4-20250514 モデルを対象とし、すべて Delphi 7 から Delphi 13 まで変更なしで動作します。
本題に入る前に、考え方について簡単に説明します。このコンポーネントは意図的に 2 つの面を公開しています。「クイック」面(_CreateMessage、_CreateMessageStream、_CreateMessageWithImage のようなメソッド)はいくつかの文字列を受け取って文字列を返します — プロトタイプ、デモ、そして温度、top-p、メタデータ、停止シーケンスを気にしない 80% の呼び出しに最適です。「型付き」面(TsgcAnthropicClass_Request_Messages や TsgcAnthropicClass_Response_Messages のようなクラス)は、Anthropic API がサポートするすべてのパラメーターに対するフルコントロールを、強い型付けと IDE の自動補完付きで提供します。学習にはクイック API を使い、本番には型付き API に格上げしてください。同じコンポーネント、2 つの層、重複なし。
1. セットアップと最初のメッセージ
uses 句に sgcHTTP_API_Anthropic を追加し、コンポーネントを作成し、API キー(console.anthropic.com で取得)を設定し、_CreateMessage を呼び出します。これが 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;
コンポーネントが重い作業を行います: JSON リクエストボディを構築し、x-api-key と anthropic-version ヘッダーを設定し、/v1/messages に POST し、レスポンスをプレーンな Delphi 文字列にパースします。リクエストパラメーターを完全に制御したい場合は、型付き TsgcAnthropicClass_Request_Messages クラスを使用してください。
運用上のヒント: API キーをバイナリに焼き込まないでください。環境変数、レジストリキー、シークレットマネージャーから読み込みます。Anthropic は GitHub の漏洩キーをスキャンして自動的に失効させます — 誰かが .pas ファイルのスクリーンショットを撮ったせいで金曜日の午後 6 時に更新を出荷したくないはずです。
2. SSE によるストリーミングレスポンス
短いプロンプトには同期呼び出しで問題ありませんが、チャット UI では Claude が生成するそばからトークンが現れてほしいものです。Anthropic はレスポンスを Server-Sent Events としてストリームし、コンポーネントは 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;
注目すべき点が 1 つ: ストリーミングはバックグラウンドスレッドで実行されるため、本番コードでは UI を TThread.Synchronize または TThread.Queue 経由で更新してください。上記のスニペットは簡潔さのため ProcessMessages を使用しています。もう 1 つ: SSE ストリームは複数のイベントタイプを順次送信し(message_start、content_block_start、繰り返される content_block_delta、content_block_stop、message_delta、message_stop)、必要のないものは無視すべきです。ヘルパー SSEExtractText は content_block_delta からテキストデルタを取り出すよくあるケースを処理します。使用量統計と停止理由については、message_delta を直接パースしてください。
ストリーミングは、ユーザーに面するチャット UI には不可欠です — ユーザーは 400 ms で始まる応答を、たとえ完全な回答に 10 秒かかっても高速と感じます。ストリーミングがなければ、10 秒間スピナーを見つめてアプリが壊れたと思います。コストは同じです: ストリーミングと非ストリーミングのリクエストは同額で課金されます。
3. ビジョン — 画像の送信
Claude は JPEG、PNG、GIF、WebP の画像を解析できます。公開 URL か base64 エンコードされたバイトとして渡します。コンポーネントは URL のケース向けに _CreateMessageWithImage を、それ以外には型付き API を公開します。
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;
ビジョンは、スキャンされた請求書の OCR、サポートチケットのスクリーンショットトリアージ、グラフ解釈、決定論的な OCR エンジンがレイアウトに苦戦するタスクに最適です。トークンコストに注意してください: 1024x1024 の画像は約 1,600 入力トークンを消費します。Anthropic は長辺が 1568px を超えるものは処理前にリサイズするため、4K のスクリーンショットをアップロードする意味はありません — 自分の側でダウンスケールして帯域を節約しましょう。
過去 1 年間に Delphi ショップが出荷した実例: 従来の OCR パイプラインには一貫性が足りない仕入先 PDF からの明細抽出、専門ソフトに振り分ける前の医療画像の大分類、フィールドサービスの写真からのメーター値読み取り、ヘルプデスクチケットの UI バグスクリーンショットのトリアージ(「このスクリーンショットはレイアウト問題かデータ問題か?」)。いずれの場合も、勝利は生の精度ではなく — 脆弱でドキュメントごとのパーサーを書いて保守する必要性を排除したことでした。
4. ツール利用(関数呼び出し)
ツール利用により、Claude はあなたの Pascal 関数をいつ呼び出すかを決定できます。各ツールを名前、説明、パラメーターの JSON Schema で宣言します。Claude がプレーンテキストの代わりに tool_use ブロックで応答した場合、呼び出しを実行して結果を会話にフィードバックします。
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;
ツールをチェーンしてエージェント型ワークフローを構築できます: リサーチエージェントは web_search、read_pdf、send_email ツールを組み合わせるかもしれません。誤動作するモデルが永久ループに陥らないよう、常に iMaxIterations ガードを設けてください。本番ではコスト上の理由でユーザーターンあたり 5 ツール呼び出しに制限しています。Claude がそれ以上必要とするなら、通常プロンプトかツール設計が間違っているサインです。
ツール呼び出し品質の最大の決定要因は、説明文です。正確な説明(「Return the current bid/ask for a US ticker symbol. Use this only for equities, not for crypto or FX」)があれば、モデルは約 99% の確率で正しい引数で正しいツールを選びます。曖昧な説明(「Get a price」)では 70% 程度まで落ちます。時間をかけてください。説明に例を追加してください。ツールが何を行わないかを述べてください。夜 11 時に幻覚的な $0.40 の関数呼び出しをデバッグする未来のあなたが、現在のあなたに感謝します。
5. 拡張思考
Claude 4 は、回答前に問題を段階的に推論する思考モードを導入しました。トークン単位で思考予算を割り当てると、Claude は推論トレースを最終回答とは別に返します。数学、コードレビュー、多段階分析にとってのゲームチェンジャーです。
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;
拡張思考は控えめに使用してください — 推論トークンは出力として課金されるため、Opus 4 で 16k トークンの思考予算は容易に通常呼び出しより高くつきます。レイテンシより正確性が重要な問題に予約してください。良い適合: 法務文書分析、財務調整、複雑な SQL 生成、スタックトレースのデバッグ、多制約スケジューリング。悪い適合: チャット応答、コンテンツ分類、単純なルックアップ — 思考時間とコストは正当化されません。
便利なテクニックは、公式 Claude アプリのように、UI で推論トレースを折りたたみ可能な「思考を表示」セクションとして公開することです。パワーユーザーはモデルが回答にどう辿り着いたかを見るのが大好きで、カジュアルユーザーは無視します。どちらにしても、無料で監査証跡が手に入ります。
6. プロンプトキャッシング
同じ長いシステムプロンプト、ナレッジベース、ツール定義を送り続けているなら、プロンプトキャッシングはコストを最大 90% カットし、最初のトークンまでの時間を 80% 削減できます。コンテンツブロックをキャッシュ可能としてマークすると、Anthropic はそれを 5 分間(拡張キャッシュでは 1 時間)サーバー側に保存し、以降の呼び出しでは安いキャッシュ読み取り価格で再課金するだけです。
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;
目安: 5 分以内に再利用する 1,024 トークン超のものは何でもキャッシュする価値があります。大きなドキュメントコーパス、few-shot 例、大きなツールスキーマが明らかな候補です。会計: キャッシュ書き込みは通常入力トークンより 25% 高く、キャッシュ読み取りは通常入力トークンの 10% です。つまり 2 回目のヒットで損益分岐、3 回目から本格的に節約します。40k トークンのナレッジベースに対して毎分 50 質問に回答するカスタマーサポートボットなら、プロンプトキャッシングは典型的に月額 Anthropic 請求を 80–85% 削減します。
1 リクエストあたり最大 4 つのコンテンツブロックをキャッシュ可能としてマークできます。よくあるパターン: ツール(キャッシュ可、稀にしか変わらない)、システムプロンプト(キャッシュ可、稀にしか変わらない)、大きなドキュメント(キャッシュ可、セッションごとに変わる)、最近のメッセージ(キャッシュ不可、ターンごとに変わる)。コンポーネントはこの階層化を自然に処理します — キャッシュしたいブロックに CacheControl を設定するだけです。
7. MCP コネクタ
Model Context Protocol により、Claude は各ツールを手でラップせずにリモートツールサーバーと話せます。コンポーネントを MCP サーバー URL に向けると、Claude はツールを発見し、それらを呼び出し、結果を連鎖できます。
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);
MCP コネクタを独自の TsgcAI_MCP_Server(別のチュートリアルで扱います)と組み合わせれば、ドメイン API を任意の MCP 対応 AI クライアント — Claude Desktop、Cursor、Continue、自社アプリ、プロトコルを話す何でも — に公開する完全な Delphi ネイティブエージェントが得られます。認証はあなたの責任です: ベアラートークンまたは署名ヘッダーを渡し、サーバー側で検証します。Anthropic はあなたの資格情報を見ません — MCP コネクタハンドシェイクがリクエストからターゲットサーバーへトークンをルーティングします。
マルチテナント SaaS デプロイでは、典型的なパターンはテナントごとに 1 つの MCP サーバーで、テナント ID を URL またはベアラートークンに埋め込みます。Claude は各テナントのツールをデータの相互汚染なしに呼び出します。本番デプロイで単一の会話から 200 以上の MCP サーバーにファンアウトする例を見てきました。
本番チェックリスト
Anthropic 駆動の Delphi アプリを本番に出す前に、この短いリストを通り抜けてください:
| 関心事 | 対処方法 |
| API キー保存 | 環境変数または OS シークレットストア、決してハードコードしない |
| 429 / 529 での再試行 | ジッター付き指数バックオフ、最大 3 試行 |
| コスト上限 | リクエストごとに Usage を追跡し、日次予算を超えたら新規呼び出しを拒否 |
| PII 除去 | API に送る前にメール/SSN/カード番号を除去 |
| モデルバージョン固定 | 完全な日付付きモデル名を使用、「latest」エイリアスに依存しない |
| プロンプトバージョニング | システムプロンプトをコードと並行してソース管理に保存 |
| テレメトリ | 呼び出しごとにモデル、入力トークン、出力トークン、レイテンシを記録 |
次にどこへ
このチュートリアルは 95% の場面で必要な 8 機能をカバーしました。コンポーネントはさらに、メッセージバッチ(数千プロンプトの安価な非同期処理 — 同期呼び出しより 50% 安く、夜間エンリッチメントジョブに最適)、Files API(一度アップロードして永遠に参照 — 繰り返しクエリする大きな PDF に最適)、トークンカウント(支払う前にコストを見積もる)、構造化 JSON 出力(強制スキーマ適合、パースエラーよさらば)もサポートします。完全な機能マトリックスは Anthropic コンポーネントページ を参照し、まだ sgcWebSockets をインストールしていなければ はじめにハブ へ向かってください。
そして、Delphi の Claude で何か面白いものを構築したら — エージェント、コパイロット、ドキュメントアナライザー — ぜひ教えてください。AI の摩擦が消えた後、Pascal 開発者が何を作るのかを見るのが大好きです。