『miibo』初回のチャットで名前を覚えたら次回以降のチャットでも名前を呼んでほしい！（ステート、シナリオ）

# 何を行いたかったか？
「[miibo](https://miibo.ai/)」のチャットに「[IPアドレス制限](https://note.com/miibo/n/n3ddb30eba7b6)」機能や「[会話の履歴（ON/OFF可能）](https://www.daitoku0110.news/p/miibo-chat-history-display-control)」機能も追加されまして、
いよいよ、そのままmiiboチャットを社内展開に使えるな！（社員メール等を個別にログインさせなくても！）と思いまして。
でも、社員の誰の利用なのか？は把握しておきたいなぁと思い、
”初回のチャットで名前を覚える→次回以降のチャットではその名前を使う”実装を行いたいと思いまして、
そういえば、[miiboにはユーザーIDと、ステート機能がある](https://zenn.dev/makunugi/books/f3d9eb62b6d133/viewer/a1c5e8)から、それで紐づけできそうだなと試していたのです。

# 実装できた機能
- 動作の様子
![OK.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/9351ac00-1b04-abad-6dcb-be8389ba3311.gif)

<span />

- miiboでの設定

| [AIによる応答の設定] - [プロンプトエディタ] | シナリオ「１. あなたのお名前は？」 | シナリオ「２. お名前存じています」 |
|:--|:--|:--|
|![OK1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/8359d684-e64e-7d88-fad6-bff7854e8bc6.png)|![OK1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/81699b5f-0d5f-a519-1340-26cfe6f831e9.png)|![OK1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/c5090436-f373-1ac1-5372-c33095e9adf3.png)|
|ユーザーが名前を回答したら、その名前を記録し、確認のためにユーザーに再度尋ねてください。<br>1. ユーザーが名前を回答したら、その名前をステートに記録してください。<br>キー名は「onamae」です。<br>2. 記録が完了したら、ユーザーに「#{onamae}さんでよろしいですか？」と尋ねてください。|（トリガー）条件: 会話の開始と同時に発動<br><br>エージェントの発話後に保持するステートの名前: onamae|（トリガー）条件:「シナリオ会話をする」のステート(onamae)が存在する場合<br><br>エージェントの発話後に保持するステートの名前: history|

このように、
- [AIによる応答の設定] - [プロンプトエディタ]
- シナリオ「１. あなたのお名前は？」
- シナリオ「２. お名前存じています」

この３つを設定しないと実現できませんでした。

<span />

（追記：2024.12.2）
AIからの返答の度「〇〇さん、こんにちは」から始まってしまったので、、次のように変更。
- [シナリオ対話の作成] - シナリオ「2. お名前存じています」の
”このノードでのエージェントの発話”は「@{auto_response}」だけにした。
- [エージェントの設定] - [固定の応答文言の設定]の
「チャット画面起動時の文言 (※１行に１つの表現を記入)」に、
”#{onamae}さん、こんにちは”を追記。
（こうしておけば口調の設定も含めて「〇〇さん」になります。）

::: note warn
2024.11.30現在、miiboのシナリオ機能では次の動作でした。

- トリガーとして「次のステートが存在しない場合」が機能しない。
  - ▶回避策として「（トリガー）条件: 会話の開始と同時に発動」と「（トリガー）条件:「シナリオ会話をする」のステートが存在する場合」で動作条件を分けたシナリオを２つ作った。

<span />

- シナリオのノード内に書いたプロンプトに反応しない。
- シナリオのノード内の「エージェントの発話後に保持するステートの名前」が機能しない。
  - ▶回避策として[AIによる応答の設定] - [プロンプトエディタ]にステートを記憶するように指示するようにした。
:::

# 試行錯誤
当初は、これらマニュアルの情報から、シナリオに「（トリガー）条件: 「onamae」のステートが存在しない場合」や、名前の予約語である「（トリガー）条件: 「username」のステートが存在しない場合」等を設定すれば簡単に実装できると思っていたのです。。
- mibo公式マニュアル - [シナリオ会話の作成](https://miibo.readme.io/docs/%E3%82%B7%E3%83%8A%E3%83%AA%E3%82%AA%E4%BC%9A%E8%A9%B1%E3%81%AE%E4%BD%9C%E6%88%90)
- mibo公式マニュアル - [ステート](https://miibo.readme.io/docs/%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88)

#### NG1：名前のステートを記憶してくれない。。
<details>

![NG1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/ce540284-bac5-33a8-09db-8c4f32dd6000.gif)
![NG1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/5e1b9496-76d2-67b8-ddbc-2d674b96e225.png)

</details>

#### NG2：予約された名前のステートusernameの初期値「あなた」を上書きしてくれない。。
<details>

![NG2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/5195b06a-0495-b735-0dd1-3e5e92680d71.gif)
![NG2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/b1dae3ca-7814-392c-2a66-8619c37a9bc7.png)

</details>

しかし、どうやら現状は、注釈に書いたような仕様（？）であるらしく、
現時点としては、冒頭に掲載した設定以外には、今回の動作を実現する方法はない様子でした。

この実装までに結構時間と労力を使ったので、、
他にこの機能を実装したい方がおられましたら、ご参考ください。

・・・そしてmiiboは応援しているので！たぶんこの不具合（？）の解消を期待します！

# メモ
### （2025.1.6）「未記録」さんで覚えられてしまった。。
![未記録さんで覚えられてしまった。。.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667967/50d8d899-a530-6192-b98f-dc137a7a64d3.jpeg)
・・・これは「シナリオ」で『ステート「onamae」の値が「未記録」のとき』も追加しないとか。。（無駄にシナリオが消費される。。）