注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
このページでは、関数インターフェースを使用して LLM を登録するレガシーな方法について説明します。2026年3月に、推奨される方法は登録済みモデルの実装に置き換えられました。
このページの TypeScript の例では、TypeScript v1 の関数 API を使用しています。関数インターフェースによるモデルの登録は、TypeScript v1 でのみサポートされています。TypeScript v2 には、この登録方法に相当するものはありません。代わりに登録済みモデルを使用してください。
関数インターフェースを使用して LLM を登録する前に、Palantir サポートにお問い合わせください。
関数インターフェースを使用すると、独自の LLM を Palantir プラットフォームで使用できます。たとえば、独自にファインチューニングしたモデルを AIP Logic で使用し、ユーザーにより柔軟な選択肢を提供できます。関数インターフェースを使用すると、オンプレミスでホストされている LLM、独自のクラウドでホストされている LLM、別のプラットフォームでファインチューニングされた LLM のいずれも登録して使用できます。
現在、OpenAI へのカスタム接続を作成する方法は2つあります。
このチュートリアルでは、LLM の API エンドポイントを定義するソースを作成し、Webhook を使用して TypeScript 関数からモデルを呼び出し、Palantir プラットフォーム(たとえば、AIP Logic や Pipeline Builder)で使用できるように関数を公開する方法を説明します。

このチュートリアルでは、Webhook 経由で外部の OpenAI モデルを呼び出し、ChatCompletion 関数インターフェースを実装して、Foundry にモデルを登録する TypeScript 関数を作成します。チュートリアルを完了すると、カスタム LLM API を AIP Logic でネイティブに使用できるようになります。
ChatCompletion インターフェースを実装します。
ChatCompletion 関数インターフェース@ChatCompletion 関数インターフェースでデコレートされ、ソースを呼び出す TypeScript 関数を作成します。プラットフォームのセキュリティを維持するために、Data Connection アプリケーションを使用して、OpenAI への呼び出しを Webhook として登録する必要があります。以下の手順では、Data Connection で REST API ソースと Webhook を設定する方法を説明します。
Webhook を作成して TypeScript 関数で使用する方法について、詳しくはこちら。
Data Connection アプリケーションを開きます。
新規ソースを選択します。
REST API を検索します。
プロトコルソースで、REST API を選択します。
データソース接続方法を選択してくださいページで、Foundry ワーカーを選択します。
ソースに名前を付け、フォルダーに保存します。この例では、ソース名に MyOpenAI を使用します。
接続情報で、次の手順を実行します。
https://api.openai.com に設定し、認証を無記名トークンに設定します。OpenAI API について、詳しくはこちら。↗。443 に設定します。APIKey という名前のシークレットを追加で作成し、Bearer トークン項目に使用したものと同じAPIキーを貼り付けます。https://api.openai.com を追加します。これを行うには、ネットワーク接続に移動し、新規ポリシーをリクエストして自己承認を選択します。
この API エンドポイントを AIP Logic や Pipeline Builder などのプラットフォームアプリケーションで使用するには、エクスポート設定を有効にする必要があります。エクスポート設定を有効にするには、次のオプションを切り替えます。
関数でこのエンドポイントを使用するには、コードのインポートを有効化する必要があります。
続行と開始を選択し、API エンドポイントとエグレスのセットアップを完了します。
ソースの概要ページで、Webhook を作成を選択します。
Webhook を、名前 Create Chat Completion、API名 CreateChatCompletion で保存します。
OpenAI の Create chat completion のドキュメント ↗から、curl の例をインポートします。
以下の例に示すように、messages と model の入力パラメーターを設定します。
以下の例に示すように、choices と usage の出力パラメーターを設定します。
Webhook を読み取り API に設定します。書き込み API に指定された Webhook は、@OntologyEditFunction() でのみ使用できるため、次のセクションで作成する @ChatCompletion() 関数からは呼び出せません。このオプションの詳細については、Webhook を参照してください。
Webhook をテストして保存します。
これで、TypeScript リポジトリにインポートできる REST ソースと Webhook が作成されました。
外部 LLM からチャット補完を取得する Webhook を設定したら、Foundry が提供する ChatCompletion インターフェースを実装し、OpenAI Webhook を呼び出す関数を作成できます。
AIP Logic は、登録されたモデルを表示するときに、ChatCompletion インターフェースを実装するすべての関数を検索するため、関数がこのインターフェースを実装することを宣言する必要があります。また、この宣言により、シグネチャが期待される形式と一致することがコンパイル時に強制されます。
チャット補完の実装は TypeScript で記述できます。そのためには、新しい TypeScript 関数リポジトリを作成する必要があります。
この例の関数は、次の処理を行います。
まず、OpenAI Webhook と ChatCompletion 関数インターフェースの両方をリポジトリにインポートする必要があります。TypeScript 関数リポジトリを開いた状態で、リソースのインポートアイコンを選択し、チャット補完関数インターフェースと、前に作成した Webhook に関連付けられている OpenAI ソースの両方をインポートします。
リソースのインポートサイドパネルの追加を使って、次の項目をインポートします。
CreateChatCompletion Webhook を含む OpenAI REST API ソース
ChatCompletion 関数インターフェース
リソースのインポートパネルで、CreateChatCompletion Webhook を含む OpenAI ソースを検索し、TypeScript リポジトリにインポートします。Code Repositories にリソースをインポートする方法について詳しくはこちら。
リソースのインポートパネルで、ChatCompletion インターフェースを検索し、TypeScript リポジトリにインポートします。
この時点で、次の画像に示すように、リソースのインポートには OpenAI ソースと ChatCompletion インターフェースの両方が含まれているはずです。
リソースをインポートすると、Task Runner が localDev タスクを再実行し、関連するコードバインディングを生成します。ページ下部のリボンにある Task Runner タブを開くと、このタスクの進行状況を確認できます。

このセクションでは、前に作成した OpenAI Webhook を呼び出し、チャット補完インターフェースを実装する TypeScript 関数を記述します。
CreateChatCompletion Webhook(OpenAI ソース経由)と ChatCompletion 関数インターフェースの両方をインポートすると、これらのリソースを操作するためのコードバインディングが生成されます。
リソースのインポートパネルで ChatCompletion 関数インターフェースを選択すると、関数のひな形を設定するためのコードスニペットを確認できます。

この時点でのコードの例を次に示します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18// index.ts import { ChatCompletion } from "@palantir/languagemodelservice/contracts"; import { FunctionsGenericChatCompletionRequestMessages, GenericCompletionParams, FunctionsGenericChatCompletionResponse } from "@palantir/languagemodelservice/api"; import { OpenAI } from "@foundry/external-systems/sources"; // このデコレーターは、関数が ChatCompletion インターフェースを実装していることをコンパイラーと Foundry に伝えます。 // 汎用の @Function デコレーターは不要です。 @ChatCompletion() public myFunction( messages: FunctionsGenericChatCompletionRequestMessages, params: GenericCompletionParams, ): FunctionsGenericChatCompletionResponse { // TODO: 本体を実装します }
このセクションでは、リクエストを完了するための、この関数の最も単純な実装を示します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57import { isErr, UserFacingError } from "@foundry/functions-api"; import { OpenAI } from "@foundry/external-systems/sources"; import { ChatCompletion } from "@palantir/languagemodelservice/contracts"; import { ChatMessageRole, FunctionsGenericChatCompletionRequestMessages, FunctionsGenericChatCompletionResponse, GenericChatMessage, GenericCompletionParams, } from "@palantir/languagemodelservice/api"; export class MyFunctions { @ChatCompletion() public async myFunction( messages: FunctionsGenericChatCompletionRequestMessages, params: GenericCompletionParams ): Promise<FunctionsGenericChatCompletionResponse> { const res = await OpenAI.webhooks.CreateChatCompletion.call({ model: "gpt-4o", messages: convertToWebhookList(messages), }); if (isErr(res)) { throw new UserFacingError("Error from OpenAI."); } return { completion: res.value.output.choices[0].message.content ?? "No response from OpenAI.", tokenUsage: { promptTokens: res.value.output.usage.prompt_tokens, maxTokens: res.value.output.usage.total_tokens, completionTokens: res.value.output.usage.completion_tokens, }, } } } function convertToWebhookList( messages: FunctionsGenericChatCompletionRequestMessages, ): Array<{ role: string; content: string; }> { return messages.map((genericChatMessage: GenericChatMessage) => { return { role: convertRole(genericChatMessage.role), content: genericChatMessage.content }; }); } function convertRole(role: ChatMessageRole): "system" | "user" | "assistant" { switch (role) { case "SYSTEM": return "system"; case "USER": return "user"; case "ASSISTANT": return "assistant"; default: throw new Error(`Unsupported role: ${role}`); } }
下部のツールバーから関数タブを選択すると、プレビューパネルが開き、関数をテストできます。公開済みを選択し、関数を選択して、入力を JSON で指定する選択肢を選択します。
次のようなメッセージでテストできます。
Copied!1 2 3 4 5 6 7 8{ "messages": [ { "role": "USER", "content": "hello world" } ] }