API経由で会話させる
※本Chapterは、miiboの提供するAPIの仕組みを利用します。Web API利用に関する知識や、利用をするためのプログラミングスキルを要します。
このチャプターのゴール
- API経由でmiiboで作成したエージェントを会話ができる
準備するもの
- 公開済みのエージェント
APIの利用方法
公式リファレンスは下記をご参照ください。
https://miibo.readme.io/reference/%E3%83%81%E3%83%A3%E3%83%83%E3%83%88
API利用のメリット
API経由で会話ができることはすなわち、様々なプロダクトにmiiboのエージェントを組み込めることです。アシスタントAIやカスタマーサポートAI、AIアバターと連動したAIなど、用途は様々です。
下記は、デジタルヒューマン社の提供するAIアバターと組み合わせた事例です。
https://www.youtube.com/watch?v=RCpdwtfr0mM
こちらも本APIを利用して連携しています。
様々なプロダクトに組み込むことができることは、AIの個性を多様に設定できることにも繋がります。
APIの有効化
「外部サービス連携」 -> 「APIを利用して会話やデータの入稿を行う」に移動します。
「APIを有効にする」を押すことで、APIが利用できるようになります。APIを有効にすると、API KEYが発行されます。API KEYを利用することで、割り当てられたプランの会話上限回数までAPIを利用することができます。
※会話の利用上限や現在の利用回数は、「利用状況」のページで確認ができます。
https://miibo.dev/admin/usageStats
※APIは1秒間に1回以上の同時リクエスト送ることはお控えください。その回数を超えてリクエストが飛び続けた場合、一時的にエージェントの会話が利用できなくなる可能性があります。
※この条件は、今後緩和される可能性があります。エンタープライズプランの場合、個別にご相談いただくことも可能です。
APIの仕様
リクエストメソッド
POST
エンドポイント
https://api-mebo.dev/api
リクエストヘッダー
Key | Value |
---|---|
Content-Type | application/json |
リクエストパラメータ
パラメータ | 説明 | 型 | 必須 |
---|---|---|---|
api_key | APIキー | String | ○ |
agent_id | エージェントID | String | ○ |
utterance | ユーザの発話 | String | ○ |
uid | ユーザ識別子 | String | |
state | ユーザーステート | Map | |
stream | ストリームの利用 | Bool | |
start_utterance | 会話開始時の発話 | String | |
base64_image | Base64エンコードされた画像の文字列(画像認識対応モデル利用時のみ) | String | |
disable_ai_response | AI(LLM)による応答をOFFにするフラグ。(trueの場合はユーザーの発話がAIに対して投げかけられるのみで終了します。) | Bool | |
disable_history | 会話の履歴を用いて応答することを | Bool | |
third_party_token | 外部のトークンを送ることができます。WebhookのURLやペイロード、Function Callingのパラメータで、「@{thirdPartyToken}」というコマンドを一時的に置き換えます。 | String |
uidは「シナリオ対話機能」、「ステート」を利用する場合は必須です。
上記リクエストパラメータを含んだJsonをリクエストボディとして付与します。ユーザ識別子(uid)を含めると、ユーザごとにステートを保持することができます。
※uidは必ず一意になるように設定してください。
(例)
「サービス名_ユニークな文字列」
一意にならない場合、正常にユーザ情報が保持されない事象が発生する可能性があります。
streamにtrueを指定すると、ストリーム形式で応答が返されます。
※利用する場合は、エージェント設定画面で「ストリームの利用」を有効にしてください。
※下記の「ストリーミング応答を利用した場合」をよくお読みの上ご利用ください。
stateにKey, Valueの情報を送信すると、ステートに格納する情報をAPI経由で登録できます。
送信するステートはjsonで下記の形式になります。
{
"username": "太郎",
"age": "28歳",
}
username, ageはステートのキーとして保持されます。
uasername, ageというのは任意の文字列です。登録可能な値はStringのみです。
Curlサンプル
リクエストの動作確認のため、下記のCurlサンプルを必要に応じてご利用ください。(の部分は適宜置き換えてください。)
curl -H "Content-Type: application/json" -X POST -d '{"api_key":"<api key>","agent_id":"<agent_id>","utterance":"<発話>","uid":"mebo.ai_sample_001"}' https://api-mebo.dev/api
レスポンス
ステータスコード
APIから応答時に返されるステータスコードの一覧です。
ステータスコード | 説明 |
---|---|
200 | リクエスト成功 |
400 | Bad Request リクエストに問題 |
401 | Unauthorized 認証エラー |
404 | Not Found 存在しないエンドポイント |
429 | Too Many Requests リクエストの超過 |
500 | Internal Server Error サーバーのエラー |
503 | Service Unavailable サービスが利用できない |
レスポンスボディ
(サンプル)
{
"utterance": "ニックネームはなんですか?",
"bestResponse": {
"utterance": "ジョンと呼んでください!",
"options": [
"他の話題",
"プロフィールについて",
],
"topic": "プロフィールについて",
"isAutoResponse": false,
"extensions": null
}
}
レスポンスパラメータ
Key | 説明 | 型 |
---|---|---|
utterance | ユーザからの発話 | String |
bestResponse | 一番スコアの高い応答 | Object |
BestResponseオブジェクト
Key | 説明 | 型 |
---|---|---|
utterance | 応答の発話 | String |
options | クイックリプライの文字列 | String配列 |
topic | トピック | String |
imageUrl | 画像のURL | String |
url | URL | String |
isAutoResponse | AIによる自動応答かどうか | Bool |
extensions | 応答に設定された付加データ(JSON) ※設定されていない場合はNULL | JSONオブジェクト |
shouldSelectOption | クイックリプライから選択をさせるべきか否か | Bool |
ストリーミング応答を利用した場合
APIリクエスト時に「stream」パラメータをtrueにすると、ストリーミングでの応答が返されます。
"stream":true
ストリーミング時には、下記のレスポンスが返されます。
ストリーミング中のレスポンス
構造
{
"bestResponse": {
"utterance": "おはようございます!私は太郎といいます。どのようにお力になれますか?",
"is_searching": false
}
}
上記のJsonが一行ずつ返ります。
{"bestResponse": {"utterance": "おはようございます!私は太郎といいます。どのようにお力になれますか?","is_searching": false}}
bestResponse以外のパラメータも現在含まれていますが、将来的に不要になるパラメータです。bestResponseのutteranceを取得してください。
(他のパラメータは2023/12/31以降消去されます。)
ストリーミング終了時ののレスポンス
ストリーミングの最後に、上述のAPIの「レスポンスボディ」と同様の構造のJSONが返されます。
{"utterance":"おはようございます!","bestResponse":{"utterance":"おはようございます!私は太郎といいます。どのようにお力になれますか?","score":0.01,"options":[],"topic":"","imageUrl":"","url":"","isAutoResponse":true,"extensions":null,"shouldSelectOption":false,"state":"","embededHtml":""},"avatarIconUrl":"https://firebasestorage.googleapis.com/v0/b/mabo-f1cc7.appspot.com/o/tamago.jpeg?alt=media&token=e98701e3-4fec-4d89-84e5-a00221a4c77a","userState":{}}
ストリーミングのハンドリング時における注意点
:::message
💡 ストリーミング中には、途中のJSONが1回のレスポンスで複数返却されることが、通信状況によってはあり得ます。
:::
例: 1回のレスポンスで下記が同時に返却される。
{"bestResponse": {"utterance": "おはようございます!私は太郎といいます。どのようにお力になれます","is_searching": false}}
{"bestResponse": {"utterance": "おはようございます!私は太郎といいます。どのようにお力になれますか","is_searching": false}}
{"bestResponse": {"utterance": "おはようございます!私は太郎といいます。どのようにお力になれますか?","is_searching": false}}
こういった場合に対応できるよう、APIからのレスポンスを改行で分割し、一番末端のJSONオブジェクトを利用するようにハンドリングしてください。
TypeScriptにおける例
eventSource.onmessage = (event) => {
// 改行文字でデータを分割し、配列に格納
const messages = event.data.split('\n');
// 配列の最後の要素(最新のJSONオブジェクト)を取得
const lastMessage = messages[messages.length - 1];
// 最後のメッセージが空でない場合のみ処理
if (lastMessage) {
try {
// JSONとして解析
const jsonData = JSON.parse(lastMessage);
// jsonDataを使用した処理
} catch (e) {
console.error("JSON解析エラー:", e);
}
}
};
拡張表現を利用する
miiboの会話コンテンツでは、エージェントの応答設定時に「拡張表現」をJson形式で設定できます。
拡張表現のJsonを設定すると、設定した応答がエージェントから返されるタイミングでextensionsというパラメータに設定したJsonが格納されます。
拡張表現を設定した場合のAPIのレスポンスの例です。
{
"utterance": "おはようございます!",
"bestResponse": {
"utterance": "おはようございます!!良い天気ですね。",
"options": [
"他の話題",
"調子はどう?",
"今日は何して過ごそう"
],
"topic": "",
"imageUrl": "",
"url": "",
"isAutoResponse": false,
"extensions": {
"key1": "value1",
"key2": "value2"
}
}
}
APIをコールするサービスで利用するパラメータを応答と紐づけたい時などにご利用するのがお勧めです。
「会話開始」の判定について
シナリオ等の設定により、エージェントが会話を開始したことを検知する必要がある場合がございます。
会話の開始を明示する場合は、API経由で空の文字列をAPIで一度通信を行うことで、会話が開始したとエージェントが認識します。会話の開始時判定されると、AIのユーザーごとに保持している会話の短期記憶もリセットされます。
会話開始を判定させるためには、utteranceに空の文字列「""」を与えます。
会話開始時の発話(start_utterance)を上記の空文字と同時に指定すると、会話開始時の発言を制御できます。
Curlサンプル
curl -H "Content-Type: application/json" -X POST -d '{"api_key":"<api key>","agent_id":"<agent_id>","utterance":"","uid":"mebo.ai_sample_001"}' https://api-mebo.dev/api
以上がAPIを利用してエージェントと会話をする方法の説明になります。
このAPIを利用することで、miiboのチャット画面やLINE、Slack以外のプロダクトでエージェントと会話をすることができるようになります。ぜひ様々なプロダクトからご利用ください。
Updated 4 months ago