Chatdown フォーマットとは
Chatdown フォーマットは、会話の設計をテキストベースで行うことを意図したフォーマットです。
拡張子は .chat で、下記のような感じで会話例を記述していきます。
user=Joe
bot=LulaBot
bot: Hi!
user: yo!
bot: [Typing][Delay=3000]
Greetings!
What would you like to do?
* update - You can update your account
* List - You can list your data
* help - you can get help
user: I need the bot framework logo.上記のように、チャットボットがタイプ中であることや、応答までのディレイなどもデザインすることができます。 Markdown 形式で書式設定できるようになっているのが Chatdown という名前の由来ですね。
Bot Framework Emulator で会話を再現する
Bot Framework Emulator で会話ファイルを読み込むと、チャット UI 上で会話を再現することができます。
ただし、Emulator が読み込むことのできるファイルは .transcript 形式のファイルなので、あらかじめ .chat ファイルを変換して .transcript ファイルを生成しておく必要があります。
chatdown ツールによる transcript ファイルの生成
chatdown というコマンドラインツールを使用して、.chat ファイルから .transcript ファイルを生成することができます。
chatdown コマンドは、Node パッケージとして公開されているので npm コマンドで簡単にインストールすることができます。
$ npm install -g chatdown下記のように実行すると、.chat ファイルから .transcript ファイルを生成できます。
$ chatdown sample.chat > sample.transcriptBot Framework Emulator で会話を再現する
.transcript ファイルが用意できたら、Bot Framework Emulator で読み込むことで会話を再現することができます。
- Bot Framework Emulator を起動する
- メニューから File → Open transcript… と辿り、
.transcriptファイルを選択する
すると、下記のようにチャットクライアント上であたかも実際の会話があったかのように表示されます。

トラブルシューティング: chatdown コマンドがフリーズする場合
プロキシ環境下などでは、chatdown コマンドを実行したときに処理が進まなくなることがあるようです(Version 2.0.0 で発生することを確認)。
コードを調べたところ、latest-version モジュールの latestVersion 関数を同期呼び出ししており、そこでフリーズしてしまっているようです。
このような場合は、スクリプト本体である chatdown.js ファイルを、下記のようにコメントアウトすれば動かせるようになります。
async function runProgram() {
const args = minimist(process.argv.slice(2));
if (args.prefix) {
intercept(function(txt) {
return `[${pkg.name}]\n${txt}`;
});
}
// let latest = await latestVersion(pkg.name, { version: `>${pkg.version}` })
// .catch(error => pkg.version);
// if (semver.gt(latest, pkg.version)) {
// process.stderr.write(chalk.default.white(`\n Update available `));
// process.stderr.write(chalk.default.grey(`${pkg.version}`));
// process.stderr.write(chalk.default.white(` -> `));
// process.stderr.write(chalk.default.greenBright(`${latest}\n`));
// process.stderr.write(chalk.default.white(` Run `));
// process.stderr.write(chalk.default.blueBright(`npm i -g ${pkg.name} `));
// process.stderr.write(chalk.default.white(`to update.\n`));
// }
// ...