uipath-functions について
Python、JavaScript、TypeScript で決定論的な UiPath Coded Functions を作成するスキルです。型付き入出力、ローカルテスト、パッケージ化、公開、デプロイを扱い、LLM 推論やエージェントループは含みません。
主な機能
- 01Python と JS/TS 関数の雛形作成
- 02型付き入出力スキーマの定義
- 03関数のローカル実行とテスト
- 04プロジェクトのパッケージ化、公開、プッシュ
- 05関数から UiPath API を呼び出し
- 06リソースバインディングの設定
活用シーン
- 01カスタム業務ルールの実装
- 02型付き契約によるデータ変換
- 03公開前の関数テスト
- 04関数コードからプラットフォーム API を呼び出し
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ uipath/ skills --skill uipath-functionsインストール後、Claude Code で/uipath-functionsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/solutions/metadata.jsonreferences/js/authoring-guide.mdbindings-guide.mdcalling-uipath-apis-guide.mdcoded-app-wiring-guide.mddeployment-guide.mdhttp-semantics-guide.mdjob-mode-guide.mdlocal-dev-guide.mdreferences/python/bindings-reference.mdworkflow-guide.md詳細
UiPath コード化関数
ビジネスロジックを担う、アトミックで決定論的な単位です。LLM による推論やエージェントループはなく、Python または TypeScript/JavaScript で記述し、UiPath のファーストクラスの成果物として提供されます。どちらの言語でも、1 つの uip function CLI を使用します。コード化関数は、型付きの入力を受け取り、決定論的なコードを実行して、型付きの出力を返します。汎用アクティビティでは必要なロジックをカバーできない場合(カスタム認証を使った API 呼び出し、ドメインルール、Integration Service 経由の ERP クエリ、データ変換など)に使用してください。
このスキルを使用する場面
- どちらかの言語でコード化関数をひな形から作成、記述、または変更する(
uip function new <NAME> -l py|ts|js) - 型付きの契約を宣言する — Pydantic の Input/Output(Python)、または
defineSchema<T>()/ JSON Schema リテラル(JS/TS) - ローカルでテストする:
uip function run(両言語)、uip function serveと curl(JS/TS の HTTP エンドポイント) - エラー処理:返されるエラーフィールド(Python)、
FunctionError/ ステータスコードとジョブの障害時の動作(JS/TS) - 関数内から UiPath プラットフォーム API を呼び出す(Python SDK、
ctxトークンを使用する@uipath/uipath-typescript) - コード化アプリのフロントエンドを JS/TS 関数のバックエンドに接続する(トークン、CORS、タイムアウト予算、ローカル開発ループ)
- パッケージ化、本番環境への公開と呼び出し、ソリューションへの登録、SDK 呼び出しからの
bindings.jsonリソースバインディングの導出 - デプロイ後の障害をデバッグする:コールドスタートのハング、エラーコード 4801/4804/1623、トークンの不足、エントリーポイントのエラー
次の用途には、このスキルを使用しないでください。
- LLM/エージェント型のプロジェクト(
agent.json、LangGraph、LlamaIndex、OpenAI Agents、エージェントループ)→uipath-agents - コード化アプリのフロントエンドそのもの(React/Vite アプリのコード、PKCE のセットアップ、アプリのデプロイ)→
uipath-coded-apps
言語の選択
何かを行う前に、既存プロジェクトのシグナルを確認してください。新規プロジェクトの場合、言語は呼び出し元のスタックに合わせます。
| Python | JS/TS | |
|---|---|---|
| ひな形の作成 | uip function new <NAME> -l py(-l py は必須) | uip function new <NAME> -l ts / -l js(CLI のデフォルトは ts) |
| プロジェクトのシグナル | pyproject.toml と uipath.json の functions マップ | package.json と uipath.json の functions マップ |
| 契約 | Pydantic の BaseModel / @dataclass Input/Output | defineSchema<T>()(TS) / JSON Schema リテラル(JS) |
| エントリーポイント | uip function init によって生成される "main": "main.py:<fn>" | functions/<FILE>.ts:default、自動同期される。init は不要 |
| 呼び出しモード | ジョブとして実行(Maestro、エージェント、Orchestrator API) | 宣言するモードは 1 つ:HTTP エンドポイントまたはジョブとして実行。両方は不可 |
| ローカル開発 | uip function run | uip function serve(:7070 で HTTP) / uip function run(単発ジョブ) |
| 参照資料 | references/python/ | references/js/ |
ジョブ開始可能な関数は、Maestro BPMN/Flow(Service Task)、コード化エージェント(ツールまたはステップとして)、他の関数、Orchestrator API(POST /Jobs/StartJobs)、またはスケジュールやトリガーから呼び出されます。一方、JS/TS の HTTP モード関数は、Orchestrator の HTTP トリガーを通じて同期的に呼び出されます(references/js/http-semantics-guide.md)。
重要なルール
両言語共通
- コード化関数内で LLM を呼び出さないでください。 LLM による推論は決定論的な契約を損ないます。そのプロジェクトはエージェントです →
uipath-agents。 uipath.jsonのfunctionsマップは、プロジェクトがコード化関数であることを示します — これはすべてのツールが読み取る識別子です。- クラウドを利用する処理には認証が必要です:
uip login --organization "<ORG>" --tenant "<TENANT>" --output json。
Python
UiPath()はモジュールレベルで絶対にインスタンス化しないでください — ゲッター内に遅延シングルトンを用意します。- エラーは送出せず、返します:出力フィールド
error_type/error_messageに値を設定し、エントリーポイントから例外を外部へ伝播させないでください。 uip function initはpackまたはpushの前に実行する必要があります —entry-points.jsonとproject.uiprojを生成し、ファイルが存在しない場合はbindings.jsonを空のひな型として作成します。スキーマまたはエントリーポイントを変更した後は、再実行してください。コードからバインディングが導出されることはありません(ルール 7)。- 型付き I/O は必須です — Pydantic
BaseModel、pydantic.dataclasses.dataclass、標準ライブラリの@dataclass、または薄い型付きクラスを使用します。LLM Ops Traces のため、エントリーポイントに@traced(name=..., run_type="uipath")を適用します。 pyproject.tomlにはauthorsが必要です(ない場合、packはProject authors cannot be emptyとして拒否します)。また、[build-system]セクションは指定しないでください。uip function new -l pyは関数のひな型を生成します — venv にインストールされているエージェントフレームワークのパッケージ(uipath-langchain、uipath-llamaindex、uipath-openai-agents)にかかわらず、functionsマップを含むuipath.jsonを生成し、langgraph.jsonは生成しません。- バインディングは
uipathSDK の呼び出しから導出します — 空のままにせず、推測もしないでください。initの実行後は"resources": []になります。sdk().assets/queues/processes/buckets/context_grounding/connections/mcp/tasksの呼び出しにはそれぞれ、references/python/bindings-reference.md の同期ワークフローで作成した、対応するbindings.jsonのエントリーが必要です。これがない場合、プロジェクトのパックと公開は正常に完了しますが、デプロイ時のマッピング対象となるリソースが表示されず、実行時に失敗します。uip function pushはuip codedagent pushと同様に、Resource Catalog に照らしてエントリーを解決します。
JS/TS
Errorではなく、必ずFunctionErrorをスローしてください。 通常のスローは、常に汎用的な 500(JsCodedFunction.HandlerError)になり、生のスタックが漏えいします。FunctionError(message, status)では、作成者が制御するステータスを指定できます(オプションにerrorCodeを渡すと、ジョブのエラーコードを設定できます)。引数の順序は(message, status)です。エラー処理を参照してください。- コントラクトはスキーマファーストです。 インターフェース(TS。ビルド時に変換されます)には
defineSchema<T>()を、JS には JSON Schema リテラルをそのまま使用してください。新しい関数では zod/arktype/valibot を使用しないでください。静的なコントラクト抽出ができなくなり、ランタイム依存関係も追加されます。$ref、any、bigint、タプルは使用できません。スキーマリテラルは静的である必要があります。 - 各ファイルには、
functions/の直下にdefineFunctionを 1 つだけデフォルトエクスポートしてください。 ヘルパーモジュールには_プレフィックスを付けます(functions/_helpers.ts)。methodとpathは両方指定するか、どちらも指定しないでください。この組み合わせで関数の呼び出しモードが決まり、HTTP エンドポイントか通常のジョブ実行のいずれかになります。両方のインターフェイスで必要なロジックは、_ヘルパーを共有する 2 つの薄い関数にしてください。 - プロジェクト内のインポートには
.ts拡張子を付けてください(./_helpers.ts)。拡張子を省略したインポートはローカル開発では解決されますが、本番環境のコールドスタート時にランタイム全体がハングし、ログも出力されません。 - ランタイム依存関係は
dependenciesに指定し、公開 npm のみを使用してください。SDK はdevDependenciesに残してください。 コールドスタート時の本番環境ではnpm install --omit=devが実行されます。devDependenciesからのランタイムインポートやプライベートレジストリの使用は、関数のクラッシュやハングの原因になります。依存関係を変更したら、必ずロックファイルを再生成してください。古いpackage-lock.jsonがあると、すべてのルートが errorCode 4801 で失敗します。 - 処理は 20 秒未満で完了させてください。ゲートウェイは 25 秒でタイムアウトし、CORS のないポーリング URL への
303を返します。 ブラウザーの呼び出し元は結果を永久に失い、リダイレクトを使ってサーバー側で結果を取得する方法も文書化されていません。すべての外部呼び出しでAbortSignal.timeout(...)を使用してください。時間のかかる処理はジョブ実行関数に移してください。 - 本番環境への POST では、入力が空でも
body: '{}'が必要です。 ゲートウェイは空のボディを400 errorCode 4804で拒否します(ローカルの serve では拒否されないため、この不具合は本番環境でのみ発生します)。 - トークンが 2 つあれば、ID も 2 つあります。
ctx.user.accessTokenは呼び出し元のトークン(委任されたトークンで、呼び出し元のフォルダー権限を使用します)です。ctx.robot.accessTokenは関数自身のロボット ID(S2S。特権付きの読み取りを行います)です。ローカルの serve ではctx.robotは常に null です(Bearer トークンが送信されていない場合はctx.userのみ使用できます)。その場合はprocess.env["UIPATH_ACCESS_TOKEN"]にフォールバックしてください。 - プラットフォームの接続情報は
ctx.platformから取得してください(baseUrl、orgId、tenantId、folderKey)。入力フィールドから取得してはいけません。呼び出し元が制御できる URL はリダイレクトのリスクになります。環境変数(UIPATH_BASE_URL、UIPATH_ORG_ID、UIPATH_TENANT_ID)は、ローカル環境でのみ使うフォールバックです。 - Orchestrator のジョブログに記録されるのは、SDK の
logger.*のみです。console.*はローカルに出力され、転送されません。 Bufferは使用しないでください。Uint8Array、TextEncoder、TextDecoderを使用してください。uip function publishの実行後、Orchestrator(Automations → Processes)で Function Release を手動で更新してください。 トリガーが新しいバージョンに同期されるのは、リリースの更新後のみです。uip function runは HTTP 呼び出しではなく、1 回限りのジョブ実行です。 HTTP インターフェイスをローカルで試すには、serveサーバーに対して curl/fetch を実行してください。CLI のサブコマンドでルートを呼び出すことはできません。
クイックスタート
Python
uip function new <NAME> -l py # scaffold a Python function project
# author: Pydantic Input/Output + @traced entrypoint, lazy UiPath() singleton, errors returned not raised
uip function init # generate entry-points.json / project.uiproj; bindings.json starts empty
# sync bindings.json from the SDK resource calls — references/python/bindings-reference.md
uip function run <ENTRYPOINT> '{"document_id": "42"}'
uip function pack && uip function publish
スキーマ、テンプレート、uipath.json の登録、pyproject.toml、SDK の機能、添付ファイル、packOptions を含むワークフロー全体については、references/python/workflow-guide.md を参照してください。
JS/TS
uip function new <NAME> -l ts # or -l js; --empty for no sample
# author: one default-exported defineFunction per functions/ file — method+path for HTTP, neither for run-as-job
uip function serve # HTTP on :7070, hot reload; test with curl
uip function run --function <NAME> --input '{}' # one-shot local job execution
uip function pack && uip function publish # then update the Function Release in Orchestrator
// functions/invoice.ts
import { defineFunction, defineSchema, FunctionError } from "@uipath/coded-functions-js-sdk";
interface Input {
invoiceId: string;
/** @default 0 */
amount?: number;
}
interface Output {
approved: boolean;
}
export default defineFunction({
name: "approve-invoice",
method: "POST",
path: "/invoice", // omit method+path entirely for a run-as-job function
input: defineSchema<Input>(),
output: defineSchema<Output>(),
handler: async (input, ctx) => {
if (!ctx.user?.accessToken) throw new FunctionError("Unauthorized", 401);
return { approved: input.amount! < 10_000 }; // success data only — errors are thrown
},
});
作成の詳細、ローカル開発、HTTP の仕様、デプロイ、バインディング、Coded App の接続については、references/js/ を参照してください(以下にナビゲーションがあります)。
CLI リファレンス
uip function new <NAME> -l py|ts|js [--empty] # scaffold (TypeScript default; --empty is JS/TS only)
uip function init # Python only — entry-points.json, project.uiproj, empty bindings.json skeleton
uip function serve [--port 7070] [--runtime node|deno] # JS/TS only — local HTTP server, hot reload
uip function run # both languages — one-shot local execution
uip function pack [--nolock] # build the .nupkg
uip function publish [--feed-id <FEED_ID>] # upload package to a process feed
uip function push --project-id <PROJECT_ID> [--ignore-resources] # sync sources to Studio Web and import bindings.json resources
uip function runtime-install # JS/TS — one-time runtime pre-install (otherwise downloaded on first serve/run)
廃止された複数形の表記(
functions)は使用できません。必ず単数形のuip functionと記述してください。
リファレンスのナビゲーション
| 知りたいこと | 読む資料 |
|---|---|
| Python:ワークフロー全体 — スキャフォールド、スキーマ、テンプレート、登録、依存関係、初期化、SDK 呼び出し、添付ファイル、パック | python/workflow-guide.md |
Python:SDK のリソース呼び出しから bindings.json を導出して同期する — リソースごとのスキーマ、SubType、エントリーポイントのバインディング、push の動作 | python/bindings-reference.md |
| JS/TS:ハンドラー、コントラクト、ctx、エラー、ログの作成 | js/authoring-guide.md |
| JS/TS:ローカルでの実行とテスト(serve、run、env、トークン) | js/local-dev-guide.md |
| JS/TS:ルーティング、ステータスコード、デプロイ後の制限 | js/http-semantics-guide.md |
| JS/TS:ジョブとして実行するモード、障害のセマンティクス | js/job-mode-guide.md |
| JS/TS:パック、公開、本番環境での呼び出し、ソリューション、コールドスタート | js/deployment-guide.md |
| JS/TS:バインディング — entry-points.json、bindings_v2.json、オーバーライド | js/bindings-guide.md |
| JS/TS:関数から UiPath API を呼び出す(uipath-typescript、IS) | js/calling-uipath-apis-guide.md |
| JS/TS:Coded App のフロントエンドを関数バックエンドに接続する | js/coded-app-wiring-guide.md |
アンチパターン
Python
- モジュールレベルで
UiPath()をインスタンス化する — 常に getter 内の遅延シングルトンにしてください(Python Rule 1)。 - エントリーポイントから例外を送出する — エラー出力フィールドに値を設定して、戻り値を返してください(Python Rule 2)。
- スキーマ変更後に
uip function initを実行しない — 古いentry-points.jsonが誤ったコントラクトとともに出荷されます(Python Rule 3)。 - コードが SDK のリソースを呼び出しているのに、
"resources": []のbindings.jsonを出荷する —initが作成するのはスケルトンのみです。エントリーを導出してください(Python Rule 7)。
JS/TS
throw new Error("…")— 汎用的な 500 エラーになり、生のスタックが漏えいし、作成者がステータスを制御できません(JS Rule 1)。- 200 のレスポンス内で
errors[]配列を返す。 出力スキーマには成功データのみを含めます。関数が一度に送出するエラーは 1 つです。 - 新しい関数で zod/arktype のコントラクトを使う — 静的抽出が機能しなくなり、ランタイム依存関係が追加されます(JS Rule 2)。
- 拡張子なしの相対インポート — ローカルでは動作しますが、本番環境でのコールドスタートが停止します(JS Rule 4)。
- ランタイム依存関係を
devDependenciesまたはプライベートレジストリに追加する — コールドスタート時にスキップされるか、取得できません(JS Rule 5)。 - 関数にアクセスするため、Coded App の Vite 設定に
server.proxyを追加する — アプリの OAuth コールバックが壊れます。代わりにhttp://localhost:7070/<PATH>を直接 fetch してください(serve は CORS*を送信します)。 - 関数の入力として
baseUrl/orgId/tenantIdを受け付ける — リダイレクトのリスクがあります。ctx.platformを使用してください(JS Rule 9)。 - ブラウザーからポータルのドメインを呼び出す — そこでは CORS が使えません。ブラウザーからは
api.<HOST>サブドメインを呼び出す必要があります。 - 本番環境の診断に
console.logを使う — ジョブログには出力されません(JS Rule 10)。 - トリガー自身の Id から呼び出し URL を組み立てる — 404 errorCode 1623 が発生します。URL にはフォルダー Key GUID、パッケージ ID、スラッグを指定します。
- 呼び出し元が 25 秒後に結果を取得できると想定する — HTTP 関数は 20 秒未満に保ち、それより長い処理はジョブとして実行する関数に移してください(JS Rule 6)。