miiboで作成したエージェントとAPI経由で会話が可能です。

エージェント会話API仕様

リクエスト情報

ヘッダー

KeyValue
Content-Typeapplication/json

パラメータ

パラメータ説明必須
api_keyAPIキーString
agent_idエージェントIDString
utteranceユーザの発話String
uidユーザ識別子String
stateユーザーステートObject
streamストリームの利用(SSE)Bool
start_utterance会話開始時の発話String
base64_imageBase64エンコードされた画像の文字列(画像認識対応モデル利用時のみ)String
disable_ai_responseAI(LLM)による応答をOFFにするフラグ。(trueの場合はユーザーの発話がAIに対して投げかけられるのみで終了します。)Bool
disable_history会話の履歴を用いて応答することを
third_party_token外部のトークンを送ることができます。WebhookのURLやペイロード、Function Callingのパラメータで、「@{thirdPartyToken}」というコマンドを一時的に置き換えます。String

  • uid: 「シナリオ対話機能」、「ステート」を利用する場合は必須。一意にならない場合、ユーザ情報が正常に保持されない可能性あり。例:「サービス名_ユニークな文字列」
  • stream: true指定でストリーム形式応答。利用する場合は、エージェント設定画面で「ストリームの利用」を有効にしてください。
  • state: Key, Valueを指定してステート情報を追加する事が可能。登録可能な値はStringのみ。例:
{ "username": "太郎", "age": "28歳", }

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

レスポンス情報

ステータスコード

ステータスコード説明
200リクエスト成功
400Bad Request リクエストに問題
401Unauthorized 認証エラー
404Not Found 存在しないエンドポイント
429Too Many Requests リクエストの超過
500Internal Server Error サーバーのエラー
503Service Unavailable サービスが利用できない

レスポンスボディ (サンプル)

{ "utterance": "ニックネームはなんですか?", "bestResponse": { "utterance": "ジョンと呼んでください!", "options": [ "他の話題", "プロフィールについて", ], "topic": "プロフィールについて", "isAutoResponse": false, "extensions": null } }

レスポンスボディ

パラメータ説明
utteranceユーザーの発話String
bestResponseエージェントの最適な応答Object
userStateユーザーステートObject

userStateはエージェントとユーザーが会話を行い保持された、ステートのペアが格納されます。

{ "興味のある商品": "冷蔵庫", "購買意欲": "3" }

bestResponseオブジェクトは以下のプロパティを含みます:

パラメータ説明備考
utteranceエージェントの応答String
score応答スコアFloat
optionsオプションArray
topicトピックString
imageUrl画像URLString
urlURLString
isAutoResponse自動応答かどうかBoolean
isSearching検索中かどうかBoolean
extensions拡張子Stringnull
shouldSelectOptionクイックリプライから選択をさせるべきか否かBoolean
stateトピックやシナリオで発火した発言に紐づくステートのキーString
scenarioNode呼び出されたシナリオにおける現在のシナリオノードの詳細情報ObjectDeprecated
(2023/8/20まで)
embededHtml埋め込みHTMLString※一部のお客様にのみ提供

拡張表現を利用する

応答設定時に「拡張表現」をJson形式で設定可能。設定した応答がエージェントから返されるタイミングでextensionsというパラメータに設定したJsonが格納されます。

会話開始の判定

API経由で空の文字列「""」をAPIで一度通信を行うことで、会話が開始したとエージェントが認識します。

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
💡 会話開始時の発話(start_utterance)を上記の空文字と同時に指定すると、会話開始時の発言を制御できます。

ストリーミングを利用した応答 (Beta版)

APIリクエスト時に「stream」パラメータをtrueにすると、ストリーミングでの応答が返されます。

"stream":true

ストリーミング時には、下記のレスポンスが返されます。

ストリーミング中のレスポンス

構造

{ "bestResponse": { "utterance": "おはようございます!私は太郎といいます。どのようにお力になれますか?", "is_searching": false } }

上記のJsonが一行ずつ返ります。

{"bestResponse": {"utterance": "おはようございます!私は太郎といいます。どのようにお力になれますか?","is_searching": false}}

💡 bestResponse以外のパラメータも現在含まれていますが、将来的に不要になるパラメータです。bestResponseのutteranceを取得してください。

ストリーミング終了時のレスポンス

ストリーミングの最後に、上述の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":{}}

ストリーミングのハンドリング時における注意点

💡 ストリーミング中には、途中の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); } } };