JieGouは260以上のMCP統合、9つのLLMプロバイダー、ビジュアルワークフロービルダーを搭載しています。しかし、すべての組織には汎用プラットフォームでは予測できない独自のツール、内部API、プロセスがあります。
本日、コードベースのフォークや統合の構築を待つことなく、独自の機能をJieGouに持ち込める3つの拡張機能をリリースします。
カスタムWebhookツール
任意のHTTPエンドポイントに裏打ちされたツールを定義します。ツールはレシピ、ワークフロー、会話エージェントで利用可能になります — 組み込みツールと同様に。
仕組み
- ツールを定義:名前、説明、JSON入力スキーマ、エンドポイントURL
- リクエストを設定:メソッド(GET/POST)、カスタムヘッダー(暗号化)、オプションのHandlebarsリクエストテンプレート
- レスポンスをマッピング:関連する出力を抽出するJSONPathエクスプレッション
- スコープを設定:特定の部門に割り当てるか、アカウント全体にする
例:在庫チェックツール
{
"name": "check_inventory",
"description": "Check current inventory levels for a product SKU",
"inputSchema": {
"type": "object",
"properties": {
"sku": { "type": "string", "description": "Product SKU" }
},
"required": ["sku"]
},
"endpoint": {
"url": "https://api.internal.example.com/inventory/{{sku}}",
"method": "GET",
"headers": { "Authorization": "Bearer {{env.INVENTORY_API_KEY}}" },
"timeoutMs": 10000
},
"responseMapping": "$.data.quantity"
}
これで任意のレシピやワークフローステップがcheck_inventoryをツールとして使用できます。LLMは組み込みツールと並んでこれを認識し、関連する場合に呼び出します。
セキュリティ
- 本番環境ではHTTPS必須
- カスタムヘッダーは保存時に暗号化(BYOKキーと同じAES-256-GCM)
- すべての送信リクエストはプラットフォームのタイムアウト、リトライ、レート制限インフラを経由
- レスポンスサイズは100KBに制限
- ツール実行はアカウントのレート制限に算入
カスタムWebhookツールはTeamプラン以上で利用可能です。
カスタムワークフローステップタイプ
Webhook呼び出しを超えるロジックの場合、V8アイソレート内で実行されるTypeScriptモジュールとしてカスタムステップタイプを定義します — ファイルシステム、ネットワーク、ホストプロセスへのアクセスなしで完全にサンドボックス化されています。
サンドボックス
カスタムステップは厳格な制約付きのisolated-vm V8アイソレートで実行されます:
- メモリ制限:実行あたり128MB
- CPU時間制限:ステップごとに設定可能
require()やimportなし:依存関係は明示的にインジェクション- ファイルシステムやネットワークなし:プラットフォーム提供のAPIのみ利用可能
インジェクションされるAPI
カスタムステップは定義時に宣言されたプラットフォーム機能のサブセットを使用できます:
| API | 提供内容 |
|---|---|
http | プロキシされたHTTP fetch(レート制限を遵守) |
llm | LLM呼び出し(アカウントのBYOK設定を使用、課金追跡) |
firestore_read | 読み取り専用Firestoreアクセス(アカウントにスコープ) |
例:センチメント集約ステップ
// Custom step: aggregate-sentiment
// Allowed APIs: llm
export async function execute(input: { reviews: string[] }, context: any) {
const results = await Promise.all(
input.reviews.map(review =>
context.llm.invoke(`Rate this review's sentiment from 1-5: "${review}". Reply with just the number.`, { model: 'haiku' })
)
);
const scores = results.map(r => parseInt(r.trim())).filter(n => !isNaN(n));
const average = scores.reduce((a, b) => a + b, 0) / scores.length;
return {
averageSentiment: Math.round(average * 10) / 10,
totalReviews: scores.length,
distribution: {
positive: scores.filter(s => s >= 4).length,
neutral: scores.filter(s => s === 3).length,
negative: scores.filter(s => s <= 2).length,
},
};
}
組み込みMonacoエディターでコードを編集し、入出力スキーマを定義し、デプロイ前にサンプルデータでテストできます。
カスタムステップタイプはEnterpriseプランで利用可能です。
ライフサイクルフック
ワークフローとレシピの実行イベントで発火するWebhookエンドポイントを登録します。Slack、PagerDuty、カスタムダッシュボード、または任意のHTTPサービスとの統合に使用できます。
サポートされるイベント
| イベント | 発火タイミング |
|---|---|
workflow:start | ワークフロー実行開始 |
workflow:complete | ワークフロー正常完了 |
workflow:error | ワークフロー失敗 |
step:start | 個別ステップ開始 |
step:complete | 個別ステップ完了 |
step:error | 個別ステップ失敗 |
recipe:start | レシピ実行開始 |
recipe:complete | レシピ完了 |
approval:requested | 承認ゲートトリガー |
approval:granted | 承認付与 |
approval:rejected | 承認拒否 |
ノンブロッキング vs. ブロッキング
ノンブロッキングフック(デフォルト)はファイアアンドフォーゲットです。プラットフォームはWebhookを送信し、レスポンスを待たずに実行を続行します。通知とログに使用します。
ブロッキングフックはWebhookが応答するまで実行を一時停止します(10秒タイムアウト)。レスポンスは実行コンテキストを変更できます。プリフライトチェックや動的設定注入に使用します。ブロッキングフックにはサーキットブレーカーがあり、繰り返し失敗すると自動的に無効化されます。
例:ワークフロー完了時のSlack通知
{
"name": "Slack notify on completion",
"events": ["workflow:complete", "workflow:error"],
"webhookUrl": "https://hooks.slack.com/services/T.../B.../xxx",
"blocking": false
}
ライフサイクルフックはTeamプラン以上で利用可能です。
これらの連携方法
3つの拡張機能は自然に組み合わせることができます:
- カスタムツールが内部在庫APIを確認
- カスタムステップがV8サンドボックスで専門的なビジネスロジックを実行
- ライフサイクルフックがワークフロー完了時にSlackチャネルに通知
3つすべてがプラットフォームの既存セキュリティモデルを遵守します — RBAC、監査ログ、レート制限、部門スコーピングが統一的に適用されます。
アカウント設定で拡張機能を探索してください。