外部API連携 (Webhook)

このチャプターのゴール

  • Webhookによる外部API連携の方法が理解できている

※本チャプターでは、一部エンジニアリングの知識が必要になります。

Webhookとは?

Webhookとは、サービス(アプリケーション)の何らかのアクションを他のアプリケーションへリアルタイムに通知する仕組みのことです。特定のイベントが発生した際、指定したURLにリクエストを送信します。
この仕組みにより、miiboと様々なサービスやAPIを連携させることが可能になります。



miibo webhooksを使うことにより、簡単に下記のようなインテグレーションを実現できます。

  • miiboのエージェントが応答を返したタイミングで、Slackに通知を送る
  • miiboのエージェントが予定を聞いたら、カレンダーに予定を追加する
  • miiboのエージェントが特定のお問い合わせを受けたら、Slackに通知する
  • miiboのエージェントにツイートを行わせる
  • miiboのエージェントに対して外部のAPIから専門知識を与え、応答をカスタマイズする

MakeやZapierなどのIPaaSサービスと組み合わせると、様々なサービスと手軽に連携可能です。

Make
https://www.make.com/en

Zapier
https://zapier.com/

利用例:
https://note.com/makunugi/n/n198fd6c8bcb4
Notionに自動サマリーを記述するAIメンター
https://www.youtube.com/watch?v=3pD7jXqHV30

Webhook発火のタイミング

1. ユーザーがエージェントに話しかけた

ユーザーがエージェントに話しかけた際に発火します。

設定方法


トリガーの種類で「ユーザーが発話をした」を選択します。


トリガーの条件は下記の3つから選択可能です。

  1. 何らかの発話があったら
  2. 下記の値のいずれかと一致したら
  3. 下記の値のいずれかが含まれたら

すべての発話をトリガーとしたい場合は1を、発話の内容を絞りたい場合は2か3を利用してください。

ペイロードにJSONを指定すると、リクエスト時のBodyに任意のパラメータを追加できます。



2. エージェントが応答をした

エージェントが応答をした際に発火します。

設定方法

トリガーの種類で「エージェントが応答を返した」を選択します。

トリガーの条件は下記の3つから選択可能です。

  1. 何らかの発話があったら
  2. 下記の値のいずれかと一致したら
  3. 下記の値のいずれかが含まれたら

すべての発話をトリガーとしたい場合は1を、発話の内容を絞りたい場合は2か3を利用してください。

ペイロードにJSONを指定すると、リクエスト時のBodyに任意のパラメータを追加できます。

3. function callingが発火した

GPT-3.5、GPT-4、GPT-4o、GPT-4o-miniで利用が可能な、「Function Calling」という仕組みで発火するWebhookです。

  • 「カレンダーに日程を登録したい会話がなされた」
  • 「ユーザーから要望があった」

といった特定の会話内容を検知し、トリガーとすることができます。

設定方法

下記の3つが必須です。

Functionの名前

Functionの名前を指定してください。発火時の「functionName」というパラメータになります。

Functionの詳細

Functionの内容を記述します。どういった会話の内容をトリガーとしたいのか、詳細に記述してください。下記は、ユーザーからのお問い合わせを検知しています。

Function Callingのパラメータ

OpenAI APIの定めるFunction CallingのパラメーターのJSONを指定します。

OpenAI API公式のDoc

パラメータの例

    {
        "type": "object",
        "properties": {
            "question": {
                "type": "string",
                "description": "お問い合わせの質問を入力してください。"
            },
            "email": {
                "type": "string",
                "description": "ユーザーのメールアドレスです。"
            }
        },
        "required": [
            "question","email"
        ]
    }    
  • type
    「object」を指定してください。
  • properties:
    必ず指定してください。この配下に複数のオブジェクトを指定できます。
                "question": {
                    "type": "string",
                    "description": "お問い合わせの質問を入力してください。"
                },

上記のquestionは任意のパラメータです。
任意のパラメータを設定し、descriptionに説明を記述しましょう。

  • required
    requiredには、発火時に取得が必須なパラメータを指定します。
"required": [
    "question","email"
]

OpenAI APIでFunction Callingを利用する際に指定するJSONの内、「parameters」配下のオブジェクトを記載します。parameters は含めないでください。

Function Callingで取得できるパラメータは、下記のようにWebhookのURLやペイロードに挿入できます。


(例) 「area」というパラメータをFunction Callingで取得した場合

@{area} という文字列を利用することで、パラメータで文字列をリプレイスすることができます。

URLへの挿入

https://xxxxx/com?area=@{area}

ペイロードへの挿入

{
  "area": "@{area}"
}

Webhookのリクエスト仕様

Webhookが発火すると、下記の仕様のリクエストが送信されます。

URL

Webhookのリクエスト先となるURLを指定してください。

@{query} という記法を挿入することで、miiboが自動生成した検索クエリーを代入できます。

ex: https://xxxxx.com/api?query=@{query}

メソッド

Webhookの設定で指定したメソッド

(POST, GET, PUT)

ヘッダー

下記は自動で付与されるHeaderです。

KEY内容
X-HMACHash Based Message Authentication Codeです。通信が正規のものかどうかを検証する際に利用できます。独自のAPIと連携をする場合は、この文字列を利用して通信の検証を行ってください。(https://www.notion.so/webhook-4e57a895cb7d448980744f900eada27a?pvs=21)

Webhookの設定で指定したヘッダー情報も合わせて付与されます。

リクエストボディ

リクエストはJson形式のBodyが付与され、送信される。

※ GETメソッドを指定した場合は付与されません。


自動で送信されるパラメータ

パラメータ値の例補足
webhookTypeString「user_utterance」 or 「agent_response」 or 「function_calling」user_utterance
stateObject(String:String){"username":"masashi"}miiboのステートという機能によって記録されたKey, Valueのmapです。https://zenn.dev/makunugi/books/f3d9eb62b6d133/viewer/a1c5e8
userIdStringユーザーを一意に識別する識別子
historyString直近の会話の履歴

下記は設定に応じて送信されるパラメータです。

  • Webhook設定のペイロードに設定したJSON
  • Functaion Callingで取得されたJSON

「自動で送信されるパラメータ」とマージされたJSONとしてリクエストに利用されます。

※マージされる際、キー名が同じ項目は、「設定に応じて送信されるパラメータ」に上書きされます。
@{query} という記法を挿入することで、miiboが自動生成した検索クエリーを代入できます。


サンプルリクエスト

{
    "email": "hoge@miibo.jp",
    "functionName": "contact",
    "history": "user: 不具合を報告したいです。 \nai: もちろんです、正雄さん!不具合の内容を詳しく教えていただけますか?それによって、どのように対応するべきかが変わりますので。\nuser: miiboのログ画面でスクロールをすると固まります",
    "question": "miiboのログ画面でスクロールをすると固まる不具合が発生しています",
    "state": {
        "username": "正雄"
    },
    "userId": "xxxxxxxxxxxx",
    "utterance": "miiboのログ画面でスクロールをすると固まります",
    "webhookType": "function_calling"
}

※リトライ処理は行われません。リクエストに対するレスポンスのタイムアウト時間は10sですが、AIの応答が遅くなることを防止するため、なるべく早いレスポンス速度であることが重要です。

Webhookのリクエストに対する応答を利用する

Webhookの行うリクエストに対して外部APIがレスポンスを返す場合、そのレスポンスをGPTの応答生成時にプロンプトへ付与することができます。

この機能を利用することにより、外部のAPIから取得した情報をもとにしたAIの応答を行うことができます。(RAGとしての利用)

※ 「エージェントが応答をした」のトリガー利用時は利用できません。


Webhookのリクエストに対する応答でステートをアップデートする

Webhookのリクエストに対して、下記のようなレスポンスパラメータを含めることにより、ステートを更新できます。

{
  "state":{
        "recommended_item": "item1"
  }
}

ステートを利用する

下記の項目では、ステートや一部の特殊記号を利用することができます。

  • WebhookのURL
  • Webhookのペイロード(JSON)
  • Webhookをプロンプトで利用する場合のプレフィックス

ペイロード(JSON)の例

{
  "趣味":"#{hobby}"
}

プロンプトプレフィックスの例

下記は関連すルAPIから得られたレスポンスです。このレスポンスを参考に応答をしてください。
また、ユーザーの下記の情報を踏まえて応答を行なってください。

趣味: #{hobby}
困りごと: #{trouble}

その他の変数を利用する

下記の項目では、特別な変数を利用することができます。

  • WebhookのURL
  • Webhookのペイロード(JSON)
  • Webhookをプロンプトで利用する場合のプレフィックス

利用可能な変数。


変数説明
@{query}生成された検索クエリーで置き換えます
@{function_callingで取得した値}Function Callingで取得したパラメータの値で置き換えます。例: @{area}
@{utterance}ユーザーの発話で置き換えます。
@{thirdPartyToken}APIのリクエストやWebチャット画面に渡されたサードパーティートークンで置き換えます。例:

{ "token" : "@{thirdPartyToken}"}
@{sessionId}現在のセッションのIDを格納します。ただし、会話の開始時の発話に対しては空欄が返ります。また、URLへの埋め込みはできません。
@{history}会話の直近の履歴を埋め込むことができます。デフォルトのhistoryパラメータではなく、historyを任意の箇所に埋め込みたい時に利用します。`"utterance" : "下記はユーザーの会話の履歴です。\n@{history}"```

`


例:ペイロードJSONにthirdPartyTokenを含める

{
  "token":"@{thirdPartyToken}"
}

例:WebhookのURLに生成されたクエリーを含める

https://example.xxx/xxx?query=@{query}

例:Funciton Callingで取得されたエリア名をURLに含める

https://example.xxx/xxx?area=@{area}

利用例

MakeやZapierのようなIPaaSサービスと組み合わせる

IPaaSサービスと組み合わせることによって、多くのサービスと連携が可能になります。

Make
https://www.make.com/en

Zapier
https://zapier.com/

利用例:
https://note.com/makunugi/n/n198fd6c8bcb4
Notionに自動サマリーを記述するAIメンター

外部のAPIと連携する

外部のAPIに対してWebhookのリクエストを送信することによって、任意のAPIとmiiboで作成したエージェントを連携させることができます。

https://note.com/makunugi/n/na60260764a9d
https://note.com/miibo_takumori/n/n36d9bc45325b?magazine_key=ma82aceda74a8

通信の検証

独自のAPIと連携させる場合は、Webhookのリクエストに含まれるX-HMACというパラメータを利用して、通信を検証することを推奨します。

通信の検証のDoc
https://narrow-attic-8d7.notion.site/webhook-4e57a895cb7d448980744f900eada27a