注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
関数実行モードで実行する場合は、Foundry のほかの場所から呼び出せるように、Compute Module に関数を登録する必要があります。このページでは、Compute Module の関数を手動で登録する2つの方法を説明します。
Compute Modules SDK は関数のスキーマを自動的に推論するため、関数の登録が容易になります。Compute Modules SDK を使用している場合は、後述の関数スキーマの自動推論セクションを確認してください。
関数ページから、Compute Module の関数を手動で登録できます。関数を追加を選択すると、カスタム関数作成パネルが開きます。

Compute Module の関数への入力は JSON オブジェクトにまとめられます。追加する各入力は、関数に渡される入力オブジェクトのプロパティに対応します。以下の例では、左側に関数の入力、右側に対応する関数に渡される JSON オブジェクトを示しています。

example_function_payload.json
Copied!1 2 3 4 5{ "arg1": "hello", "arg2": 2, "arg3": "1969-07-20" }
com.<namespace>.computemodules.<MyApiName> という構造に従い、以下の命名規則に準拠する必要があります。API名を変更すると、呼び出し元のコードが動作しなくなります。クエリの最新の公開済みバージョンのみがサポートされます。
関数を定義したら、テストタブに切り替えて関数の呼び出しを試すことや、保存を選択して関数を保存し、Foundry から呼び出せるようにすることができます。
Compute Module の関数は常にバージョン 0.0.0 で登録されます。関数を更新すると、変更内容によって関数のバージョンが上書きされます。
Compute Module 内から HTTP POST リクエストを送信して、関数スキーマを手動で定義することもできます。通常、これが必要になるのは独自のクライアントを作成する場合のみです。HTTP リクエストについては、関数スキーマの POSTドキュメントを確認してください。
このエンドポイントは、ペイロードとして JSON 配列を受け取ります。配列の各要素は、Compute Module 内の関数の仕様に対応します。Python SDK ↗は、この JSON ペイロードを組み立てる方法を確認するための参考になります。
以下のテーブルは、関数の入力と出力のデータ型と、それらが HTTP 経由で Compute Module に渡される際のシリアライズ形式との対応を示しています。
| Foundry のデータ型 | HTTP 経由でのシリアライズ形式 | 注記 |
|---|---|---|
| Integer | int | |
| Byte | 文字列 | |
| ブール値 | ブール値 | |
| Binary | 文字列 | |
| Date | 文字列 | |
| タイムスタンプ | int | エポックからのミリ秒数 |
| Decimal | 文字列 | |
| Float | Float | |
| 配列 | 配列(非ストリーミング)、JSON ストリーム(ストリーミング) | |
| マップ | JSON | キーバリューストア(たとえば、Python の dict、Java の Map) |
| 構造体 | JSON | カスタムオブジェクトタイプ |
Records、dataclasses、TypedDict、@JsonProperty 注釈などのデータ型の定義方法の詳細については、Python SDK、Java SDK、TypeScript SDKのガイドを確認してください。
Compute Module では、関数の定義と登録を簡単に行うことができ、スキーマの自動推論と Foundry の Compute Module アプリケーションとの統合が可能です。このセクションでは、開発をよりスムーズに進められるように、関数の自動登録と高度な使用シナリオについて詳しく説明します。
インポートされた関数スキーマは、Compute Module が実行中で応答可能な状態になって初めて、Compute Module のインターフェースに表示されます。つまり、Foundry で関数を表示してアクセスできるようにするには、Compute Module をデプロイして実行する必要があります。詳細については、レプリカのステータスを使用したデバッグのドキュメントを参照してください。
Compute Module では、コード内で直接 JSON 構造を使用して関数のスキーマを定義できます。この方法には、次の利点があります。
Compute Module の起動時に単純な POST 呼び出しを行うと、モジュールはエンドポイントの呼び出しからスキーマを自動的に推論し、Compute Module アプリケーションで関数として利用できるようにします。これにより、開発者はエンドポイントのスキーマを一度定義するだけで、Foundry に簡単にインポートできます。
入力が x と y(2個の整数)で、出力が文字列の単純な add 関数を考えてみます。以下の例は、この関数の JSON スキーマを定義する方法を示しています。
schemas.json
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{ "functionName": "add", "inputs": [ { "name": "x", "dataType": { "integer": {}, "type": "integer" }, "required": true, "constraints": [] }, { "name": "y", "dataType": { "integer": {}, "type": "integer" }, "required": true, "constraints": [] } ], "output": { "single": { "dataType": { "string": {}, "type": "string" } }, "type": "single" } }
JSON スキーマを定義したら、app.py ファイルで HTTP POST リクエストを送信して Foundry に登録します。
if __name__ == "__main__":
certPath = os.environ['DEFAULT_CA_PATH']
postSchemaUri = os.environ["POST_SCHEMA_URI"]
with open('schemas.json', 'r') as file:
SCHEMAS = json.load(file)
requests.post(
postSchemaUri,
json=SCHEMAS,
headers={"Module-Auth-Token": moduleAuthToken, "Content-Type": "application/json"},
verify=certPath
)
本番環境では、必ず例外処理を行い、適切なエラーログ記録を実装してください。
この関数は、次の制約に従っていることに注意してください。
functionName を宣言する必要があります。| Python のデータ型 | Foundry のデータ型 | HTTP 経由でのシリアライズ形式 | 注記 |
|---|---|---|---|
| int | Integer | int | |
| str | Byte | 文字列 | |
| bool | ブール値 | ブール値 | |
| bytes | Binary | 文字列 | |
| datetime.datetime | Date | 文字列 | |
| datetime.datetime | タイムスタンプ | int | エポックからのミリ秒数 |
| decimal.Decimal | Decimal | 文字列 | |
| float | Float | Float | |
| list | Array | 配列(非ストリーミング)、JSON ストリーム(ストリーミング) | |
| set | Array | 配列(非ストリーミング)、JSON ストリーム(ストリーミング) | |
| dict | マップ | JSON | キーバリューストア(たとえば、Python の dict、Java の Map) |
| class/TypedDict | 構造体 | JSON | カスタムオブジェクトタイプ |
| Iterable | Array | 配列(非ストリーミング)、JSON ストリーム(ストリーミング) |
Compute Module SDK には、関数を自動検出する機能が含まれています。定義された関数とその入出力のデータ型を調べ、変更せずに Foundry の関数としてインポートできる FunctionSpecs に変換します。
この機能を円滑に動作させるには、SDK 内での型推論の仕組みと、入力および出力のデータ型を正しく定義する方法を理解しておく必要があります。次の考慮事項を確認してください。
✅ 入力のデータ型として TypedDict を使用
Copied!1 2 3 4 5 6 7 8 9 10# app.py from typing import TypedDict from compute_modules.annotations import function class HelloInput(TypedDict): planet: str @function def hello(context, event: HelloInput) -> str: return "Hello " + event["planet"] + "!"
✅ 入力のデータ型として dataclass を使用
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22# app.py from compute_modules.annotations import function from dataclasses import dataclass import datetime import decimal @dataclass class TypedInput: bytes_value: bytes bool_value: bool date_value: datetime.date decimal_value: decimal.Decimal float_value: float int_value: int str_value: str datetime_value: datetime.datetime other_date_value: datetime.datetime @function def typed_function(context, event: TypedInput) -> str: diff = event.other_date_value - event.datetime_value return f"The difference between the provided dates is {diff}"
✅ クラスとコンストラクターの両方に型ヒントがある通常のクラス
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14# app.py from compute_modules.annotations import function class GoodExample: some_flag: bool some_value: int def __init__(self, some_flag: bool, some_value: int) -> None: self.some_flag = some_flag self.some_value = some_value @function def typed_function(context, event: GoodExample) -> int: return event.some_value
❌ クラスの型ヒントがない Python クラスは避けてください
Copied!1 2 3 4 5# app.py # これは例外を発生させます class BadClassNoTypeHints: def __init__(self, arg1: str, arg2: int): ...
❌ コンストラクターに Args がある Python クラスは避けてください
Copied!1 2 3 4 5 6 7 8# app.py # これは例外を発生させます class BadClassArgsInit: arg1: str arg2: int def __init__(self, arg1: str, arg2: int, *args): ...
❌ コンストラクターに Kwargs がある Python クラスは避けてください
Copied!1 2 3 4 5 6 7 8# app.py # これは例外を発生させます class BadClassKwargsInit: arg1: str arg2: int def __init__(self, arg1: str, arg2: int, **kwargs): ...
Iterable 型(dict を除く)の場合にストリーミング出力をサポートします。結果のストリーミングを有効にするには、@function を @function(streaming=True) に変更します。詳細は、SDK ドキュメント ↗を参照できます。ストリーミング関数が正しく登録されるように、戻り値の型には任意の Iterable 型を使用してください。これにより、出力は Foundry の Array として登録されます。streaming=True を設定しない場合、結果はイテラブル全体を含む単一の JSON Blob として送信されます。イテラブルを JSON にシリアライズできない場合、例外が発生する可能性があります。streaming=True を設定した場合、結果は各要素をシリアライズした JSON Blob のストリームとして送信されます。詳細は、SDK ドキュメント ↗を参照してください。
✅ 出力タイプとして通常の Iterable を使用
Copied!1 2 3 4 5 6 7 8 9 10 11# app.py # 出力は Foundry Array として登録されます from compute_modules.annotations import function @function(streaming=True) def get_string_list(context, event) -> list[str]: return [f'string {i}' for i in range(10)] @function(streaming=True) def get_string_set(context, event) -> set[str]: return {'string 1', 'string 2', 'string 3'}
✅ 出力タイプとしてジェネレーターを使用
Copied!1 2 3 4 5 6 7 8 9# app.py # ジェネレーターは Iterable です。出力は Foundry Array として登録されます from compute_modules.annotations import function import typing @function(streaming=True) def string_generator(context, event) -> typing.Iterable[str]: for i in range(10): yield f'string {i}'
⚠️ 出力タイプとして通常の Iterable を使用しているが、ストリーミングが有効になっていない
Copied!1 2 3 4 5 6 7# app.py # これは有効です。出力は Foundry Array として登録されますが、結果はストリーミングされません from compute_modules.annotations import function @function def get_string_list(context, event) -> list[str]: return [f'string {i}' for i in range(10)]
❌ 出力タイプとしてジェネレーターを使用しているが、ストリーミングが有効になっていない
Copied!1 2 3 4 5 6 7 8 9 10# app.py # ジェネレーターはオブジェクト全体を JSON にシリアル化できません。非ストリーミング関数ではオブジェクト全体をシリアル化するため、使用できません # 出力タイプは Foundry Array として登録されますが、実行時に例外が発生します from compute_modules.annotations import function import typing @function def string_generator(context, event) -> typing.Iterable[str]: for i in range(10): yield f'string {i}'
次の手順に従って関数を登録します。


Compute Module へのサーバー統合は、開発の試験的フェーズにあり、お使いのエンロールメントでは利用できない場合があります。開発が進められている間に、機能が変更される可能性があります。
通常、Compute Module は、Compute Module API からジョブを取得するクライアントを使用します。ただし、クライアント、アダプター、SDK を必要とせずに、Compute Module で HTTP サーバーを使用することもできます。
OpenAPI Specification (OAS) ↗ は、HTTP API を列挙するためのオープンソースフレームワークです。まず、サーバーの OpenAPI 仕様を指定する必要があります。サーバーの OpenAPI 仕様を作成する方法はさまざまです。OpenAPI ドキュメントに従って手動または LLM アシスタントを使って作成するほか、汎用の OpenAPI ジェネレーターや言語固有のライブラリを使用することもできます。
Compute Module で使用するには、OpenAPI 仕様が次のすべての制約を満たしている必要があります。
http://localhost:port の形式であるサーバーを1個だけ含めること。operationId を含めること。これが Foundry での関数名になります。GET、PUT、POST、DELETE メソッドのみを使用すること。schema フィールドを含め、場所が cookie のパラメーターを使用しないこと。anyOf、oneOf、allOf スキーマ、または複数のデータ型を持つスキーマを使用しないこと。application/json である必要があります。以下は、Flask を使用する Python サーバーと、それに対応する OpenAPI 仕様の例です。
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 35from flask import Flask, request, jsonify import uuid app = Flask(__name__) books = {} @app.route('/books', methods=['POST']) def add_book(): data = request.json user_id = request.headers.get('User-ID') title = data.get('title') author = data.get('author') published_year = int(data.get('published_year')) book_id = str(uuid.uuid4()) books[book_id] = { 'title': title, 'author': author, 'published_year': published_year, 'added_by': user_id } return jsonify(book_id), 200 @app.route('/books/<book_id>', methods=['GET']) def get_book(book_id): return jsonify(books.get(book_id)), 200 if __name__ == '__main__': app.run(port=8000)
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94{ "openapi": "3.0.0", "servers": [ { "url": "http://localhost:8000" } ], "paths": { "/books": { "post": { "operationId": "addBook", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "title": { "type": "string" }, "author": { "type": "string" }, "published_year": { "type": "integer" } } } } } }, "parameters": [ { "name": "User-ID", "in": "header", "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "type": "string" } } } } } } }, "/books/{book_id}": { "get": { "operationId": "getBook", "parameters": [ { "name": "book_id", "in": "path", "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "type": "object", "properties": { "title": { "type": "string" }, "author": { "type": "string" }, "published_year": { "type": "integer" }, "added_by": { "type": "string" } } } } } } } } } } }
Docker イメージをビルドするときは、server.openapi イメージラベルを使用し、その値に OpenAPI 仕様を設定します。以下は、サーバーの仕様を付加した、上記の例の Dockerfile です。
Copied!1 2 3 4 5 6 7 8 9 10 11 12FROM python:3.12 EXPOSE 8000 RUN pip install flask COPY src . USER 5000 LABEL server.openapi='{"openapi":"3.0.0","servers":[{"url":"http://localhost:8000"}],"paths":{"/books":{"post":{"operationId":"addBook","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"author":{"type":"string"},"published_year":{"type":"integer"}}}}}},"parameters":[{"name":"User-ID","in":"header","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}}}}}},"/books/{book_id}":{"get":{"operationId":"getBook","parameters":[{"name":"book_id","in":"path","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"author":{"type":"string"},"published_year":{"type":"integer"},"added_by":{"type":"string"}}}}}}}}}}}' CMD ["python", "app.py"]
通常どおりにイメージをビルド、公開、選択し、Compute Module の設定を保存します。次に、関数タブに移動し、OpenAPI 仕様から検出を選択します。その後、関数をインポートし、関数の生成元となった OpenAPI 仕様を表示できます。これらの関数は Foundry プラットフォーム全体で使用できます。


関数定義を手動で変更しないでください。関数定義は、イメージに付加された OpenAPI 仕様と一致した状態に保つ必要があります。
Functions CLI は、Compute Module のアーティファクトの公開を支援するスタンドアロンツールです。主な役割は次の2つです。
Functions CLI は、ローカルの開発ワークフローで使用することも、CI/CD パイプラインに統合して Compute Module のビルドと公開のプロセスを自動化することもできます。
Functions CLI をはじめるには、次の手順を実行します。
Copied!1chmod +x functions-cli
その後、ターミナルから CLI を直接呼び出せます。
Functions CLI は、ソースコードに対して静的推論を実行し、関数仕様を自動生成できます。これは、Foundry に登録される関数スキーマを調べたり、検証したりする場合に便利です。
関数仕様の推論を実行するには、--opt functions フラグを使用します。SDK を使用する Python Compute Module では、--plugin python_cm フラグを指定します。
次の例では、./src ディレクトリ内の Python ソースコードに対して推論を実行します。
Copied!1functions-cli infer --opt functions --plugin python_cm --dir ./src
プランファイルを使用して推論を設定することもできます。
Copied!1functions-cli infer --planfile ./infer_plan.yml --dir ./src
出力は関数仕様の JSON 配列です。各仕様には、関数名、データ型を含む入力パラメーター、および出力タイプが含まれます。
自動推論に頼らずに関数スキーマを手動で定義する場合は、ファイルプラグインを使用できます。この方法では、明示的な型定義を使用して、JSON ファイル内で関数スキーマを指定できます。
次の例は、カスタム型と、その型を使用する関数を含む関数スキーマファイルです。
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{ "types": { "Person": { "type": "object", "fields": { "name": { "dataType": "string" }, "age": { "dataType": "integer" } } } }, "functions": [ { "functionName": "example_function", "inputs": [ { "name": "text", "dataType": "string", "required": true }, { "name": "items", "dataType": "list<Person>", "required": true }, { "name": "metadata", "dataType": "optional<dict<string, string>>", "required": false } ], "outputs": [ { "dataType": "dict<string, set<Person>>" } ] } ] }
ファイルプラグインは、次のデータ型をサポートしています。
| データ型 | 説明 |
|---|---|
string | テキスト値 |
integer | 整数 |
boolean | true または false |
float | 浮動小数点数 |
binary | バイナリデータ |
date | 日付の値 |
decimal | 任意精度の小数 |
timestamp | 時点 |
list<T> | データ型 T の順序付きコレクション |
set<T> | データ型 T の一意の値からなる順序なしコレクション |
dict<K, V> | データ型 K からデータ型 V へのキーと値のマッピング |
optional<T> | 存在しない場合があるデータ型 T の値 |
これらのデータ型をネストして、dict<string, set<Person>> や optional<list<integer>> などの複雑な構造を作成できます。
Functions CLI は、Compute Module 用の Docker イメージをビルドして公開できます。ビルドは、YAML または JSON 形式のプランファイルを使用して設定します。
次の例はビルドプランです。
Copied!1 2 3 4 5 6 7 8 9 10name: my-compute-module-image tag: $(IMAGE_TAG) registry: url: stack-container-registry.palantirfoundry.com username: ri.artifacts.main.repository.example-artifact-repo-rid-abc123 auth: client_id: $(CLIENT_ID) client_secret: $(CLIENT_SECRET) host: stack.palantirfoundry.com kind: python_cm
次のコマンドでビルドを実行します。
Copied!1functions-cli build -p ./build_plan.yml -d ./src
ビルドプランの auth セクションは、2つの認証方法をサポートしています。
client_id、client_secret、host フィールドを使用します。token フィールドを使用します。タグを手動で指定する代わりに、-t フラグを使用してイメージタグのバージョンを自動的にインクリメントできます。
| フラグ | インクリメント |
|---|---|
-t | パッチバージョン |
-tt | マイナーバージョン |
-ttt | メジャーバージョン |
デフォルトでは、Functions CLI は Docker を使用してイメージをビルドします。Docker デーモンを利用できない場合は、代わりに GoCR エンジンを使用できます。
次の例は、GoCR エンジンを使用するビルドプランです。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15name: my-compute-module-image tag: 0.0.1 registry: url: stack-container-registry.palantirfoundry.com username: ri.artifacts.main.repository.example-artifact-repo-rid-abc123 auth: token: $(FOUNDRY_TOKEN) engine: gocr: base_image: python:3.12 copy_paths: - source: ./src dest: /app/client entrypoint: ["python", "app.py"] kind: python_cm
GoCR エンジンは Docker デーモンを必要としないため、Docker-in-Docker が利用できない、または制限されている CI/CD 環境に適しています。
デバッグのために、CLI 出力の詳細度を上げることができます。
| フラグ | レベル |
|---|---|
-v | 情報 |
-vv | デバッグ |
前提条件:
始める前に、TypeScript コードリポジトリでリソース生成が有効になっていることを確認してください。
functions.json ファイルを開きます。enableResourceGeneration プロパティを true に設定します。
TypeScript で Compute Module 関数をインポートするには、次の手順に従います。



次の例は、Compute Module 関数をインポートして使用する方法を示しています。
// index.ts
import { Function } from "@foundry/functions-api";
// API名: com.mycustomnamespace.computemodules.Add
import { add } from "@mycustomnamespace/computemodules";
export class MyFunctions {
@Function()
public async myFunction(): Promise<string> {
return await add({ x: 50, y: 50 });
}
}
string として宣言した場合、登録済みの Compute Module 関数は struct 型ではなく string を返す必要があります。async/await 構文を使用します。TypeScript 関数は function-executor を経由するため、実行時間が5分未満の Compute Module 関数のみ成功します。関数の実行に5分を超える時間がかかると、タイムアウトします。