メインコンテンツまでスキップ

組み込み変数

Asgard の Expression と Template には組み込み変数が用意されており、ワークフローの実行中に対話の内容、ファイルの情報、チャネルの状態を読み取れます。

変数の一覧​

対話関連​

prevMessage​

  • 型: string
  • 内容: 直前のユーザーメッセージ
  • 使い方:
// Expression
prevMessage || 'メッセージなし'
{{! Template }}
{{#if prevMessage}}
お話の内容: {{prevMessage}}
{{/if}}

prevBlobs​

  • 型: array<Blob>
  • 内容: 直前のメッセージに添付されたファイルの一覧
  • 使い方:
// Expression
prevBlobs && prevBlobs.length > 0 ? `${prevBlobs.length} 件のファイルを受け取りました` : 'ファイルなし'
{{! Template }}
{{#if prevBlobs}}
ファイル一覧:
{{#each prevBlobs}}
• {{fileName}} ({{size}} bytes)
{{/each}}
{{/if}}

prevPayload​

  • 型: object
  • 内容: 直前のメッセージが運ぶ payload
  • 使い方:
// Expression
prevPayload && prevPayload.userAction
{{! Template }}
{{#if prevPayload}}
payload: {{{toJson prevPayload}}}
{{/if}}

prevError​

  • 型: string
  • 内容: 直近のプロセッサーのエラーメッセージ
  • 使い方:
// Expression
prevError ? `エラーが発生しました: ${prevError}` : '正常に処理されました'
{{! Template }}
{{#if prevError}}
エラー: {{prevError}}
{{else}}
正常に処理されました
{{/if}}

チャネル関連​

customChannelId​

  • 型: string
  • 内容: 独自のチャネル ID
  • 使い方:
// Expression
`チャネル: ${customChannelId}`
{{! Template }}
現在のチャネル: {{customChannelId}}

customMessageId​

  • 型: string
  • 内容: 直前のメッセージの独自 ID。クライアントが指定しない場合は空文字列です
  • 使い方:
// Expression
customMessageId || '独自 ID なし'
{{! Template }}
{{#if customMessageId}}
メッセージ ID: {{customMessageId}}
{{/if}}

Blob オブジェクト​

interface Blob {
blobId: number; // blob の識別 ID
fileType: FileType; // ファイルの種類
fileName?: string; // 元のファイル名(任意)
size: number; // ファイルサイズ(bytes)
mime: string; // MIME タイプ
}

type FileType = 'BINARY' | 'IMAGE' | 'VIDEO' | 'AUDIO' | 'DOCUMENT';

変数の読み取り​

安全に読む書き方​

Expression モード

// 変数の存在を確認する
prevMessage && prevMessage.length > 0 ? prevMessage : 'メッセージなし'

// 論理演算子を使う
prevMessage || '既定のメッセージ'

// 配列に安全にアクセスする
prevBlobs && prevBlobs[0] && prevBlobs[0].fileName

// オブジェクトのプロパティを確認する
prevPayload && 'property' in prevPayload ? prevPayload.property : '既定値'

Template モード

{{#if prevMessage}}
メッセージあり: {{prevMessage}}
{{else}}
メッセージなし
{{/if}}

{{#each prevBlobs}}
ファイル
{{@index}}:
{{fileName}}
{{/each}}

実用例​

対話の状態の確認​

// Expression: 状態をまとめて確認する
(() => {
let status = [];

if (prevMessage) {
status.push(`メッセージ: ${prevMessage.substring(0, 50)}...`);
}

if (prevBlobs && prevBlobs.length > 0) {
status.push(`ファイル: ${prevBlobs.length} 件`);
}

if (prevError) {
status.push(`エラー: ${prevError}`);
}

return status.length > 0 ? status.join(' | ') : '状態なし';
})()
{{! Template: 状態のレポート }}
• 対話の状態

{{#if prevMessage}}
• 最後のメッセージ: {{prevMessage}}
{{else}}
• まだメッセージを受け取っていません
{{/if}}

{{#if prevBlobs}}
• ファイル情報:
{{#each prevBlobs}}
• {{fileName}} ({{fileType}}, {{size}} bytes)
{{/each}}
{{else}}
• 添付なし
{{/if}}

{{#if prevError}}
• エラー: {{prevError}}
{{else}}
• 正常に動作しています
{{/if}}

• チャネル: {{customChannelId}}

ファイルの扱い​

// Expression: 種類ごとの件数を集計する
(() => {
if (!prevBlobs || prevBlobs.length === 0) {
return 'ファイルなし';
}

const stats = {};
prevBlobs.forEach(blob => {
stats[blob.fileType] = (stats[blob.fileType] || 0) + 1;
});

return Object.entries(stats)
.map(([type, count]) => `${type}: ${count}`)
.join(', ');
})()
{{! Template: ファイルの詳細 }}
{{#if prevBlobs}}
• ファイルの詳細:
{{#each prevBlobs}}
{{@index}}.
{{fileName}}
• 種類: {{fileType}}
• サイズ: {{size}} bytes
• MIME: {{mime}}
• ID: {{blobId}}
{{/each}}
{{/if}}

よくある質問​

Q: 変数が存在するかを確認するには

// Expression
typeof prevMessage !== 'undefined' && prevMessage !== null

// undefined と null を同時に確認する
prevMessage != null
{{! Template }}
{{#if prevMessage}}
変数が存在します
{{/if}}

Q: 空の配列を扱うには

// Expression
prevBlobs && Array.isArray(prevBlobs) && prevBlobs.length > 0
{{! Template }}
{{#if prevBlobs}}
{{#if prevBlobs.length}}
ファイルがあります
{{/if}}
{{/if}}

Q: ファイルのプロパティを安全に読むには

// Expression
prevBlobs && prevBlobs[0] && prevBlobs[0].fileName
{{! Template }}
{{#if prevBlobs}}
{{#each prevBlobs}}
{{#if fileName}}
ファイル名: {{fileName}}
{{/if}}
{{/each}}
{{/if}}

Q: payload を扱うには

// Expression: payload のプロパティを安全に読む
prevPayload && typeof prevPayload === 'object' && 'action' in prevPayload ? prevPayload.action : 'アクションなし'
{{! Template: payload の内容を表示する }}
{{#if prevPayload}}
payload の内容: {{{toJson prevPayload}}}
{{/if}}

これらの変数を適切に使うことで、状況を踏まえた個別性のある対話を組み立てられます。