公開日:2025-02-19
こんにちは。久しぶりにブログを書いた自分へのご褒美に新しいスニーカーを買ったコスパの悪いうっちーです。
前回のブログ記事 で MCP(Model Context Protocol) という仕組みを利用すれば kintone と AI と、更に様々なものを繋げて色んなことが実現できるよというお話を書かせていただきました。
今回はその続きとして AI にメールを送らせようと思ったのですが、あまりにもカンタンにできるのでネタとして弱いなと思いまして・・

今回はまたちょっと違った方法をご紹介できればと思います。 今話題の Dify です。
2025年は AIエージェント元年?
2025年は AIエージェント元年だそうです。
ChatGPT により爆発的に普及した 生成AI ですが、チャットでいちいち話しかけるのが面倒だなあ・・と思うことはありませんか?
私はしょっちゅうあります(笑)
AIと長々と会話をしてもなかなか伝わらない・・のは伝え方の問題もあるのだとは思いますが、例えば kintone にデータを保存したら自動的に AI が良い感じに処理してくれないかな・・と思うのは贅沢なのでしょうか?
kintone のレコード詳細画面上でボタンを押したら AWS Lambda を呼び出す
というわけで kintone にデータを保存したら Webhook か何かを使って Dify のワークフローを呼び出す ということをやりたかったのですが、具体的な実装方法が分からなかったので自分にできる方法で対応しました。何事も一歩ずつ進めていくことが重要です。
ここでは kintone のレコード詳細画面上に gusuku Customine を使ってボタンを配置し、このボタンを押したら AWS Lambda の関数を呼び出すようにしてみます。
僕にとってカスタマインは「kintoneから自在にLambda関数を呼べる最強のツール」なので、ここはチャチャッとやっちゃいます。
まずは「詳細画面を表示した時」にボタンを表示するようにします。
ボタンを押したら二度押し防止対策で「ボタンを無効化する」と「読み込み中画面を表示する」をやります。

で、詳細画面で現在表示している kintoneレコードを取得して、取得したレコード内容を AWS Lambda関数に渡すために「JavaScript を実行する」を使って JSON形式の文字列にします。

そして Lambda関数を呼び出すわけですが、呼ぶための認証情報を「AWS Cognito で認証を取得する」を使って取得します。
(あらかじめ AWS側で Amazon Cognito アイデンティティプール と IAMロールの設定を行っておく必要があります)
認証情報を取得したら「AWS Lambda ファンクションを実行する」で Lambda関数を呼べます。

Dify のワークフローを呼び出す Lambda関数を作成する
先に Dify のワークフローを作っておくのが良い気がしますが、説明の順序として先に Dify を呼び出す AWS Lambda関数 を作成します。 カスタマインから渡された kintone データを Dify側で処理しやすい形にして https://api.dify.ai/v1/workflows/run へ投げます。
認証トークンはあとで設定することにします。

Dify でワークフローを作成する
ごくシンプルなワークフローを作成します。
AWS Lambda から受け取った 企業名(companyName)と個人名(userName)を gpt-4o-mini へ投げ、その結果をメール送信して終了します。

まず「開始」のブロックで「入力フィールド」を 3つ追加します。
- companyName
- userName
の 3つです。いずれもフィールドタイプは「短文」で、最大長は 256 、必須項目にします。

LLMブロックを追加して繋ぎ、システムプロンプトとユーザープロンプトを入力します。
ここではシステムプロンプトに「 あなたは10年の経験を持つ営業マンです。 」、ユーザープロンプトに「 companyName の userName 様宛に時候の挨拶メール文面を生成して 」と入力しています。
companyName と userName は {x} をクリックして変数を指定しています。

「HTTPリクエスト」ブロックを使用してメール送信サービスを呼び出します。
今回は 株式会社ラクスライトクラウド社 が提供している「ブラストエンジン」 ( blastengine ) というサービスの メール送信API を試用しました。

下図赤枠で囲った「認証 APIキー」をクリックして Bearerトークンを入力します。
blastengine の Bearerトークン作成方法は ドキュメント に書かれているので、これに従い作成します。

作成したワークフローを公開し、左側の「APIアクセス」をクリックします。
さらに右上に表示される「APIキー」のボタンを押して「APIシークレットキー」を作成します。
これが Dify のワークフローを外部から呼び出すための認証情報になります。
このシークレットキー文字列を AWS Lambda 側で Bearerトークンとして指定するようにします。

実行結果
準備が整ったら kintone 上のボタンを押して結果を確認します。以下のようなメールが届きました。
(なりすまし云々の表示が出ているのは、今回の検証では SPF, DKIM, DMARC といった送信元のセキュリティ設定をしていないために出ているだけなのでお気になさらず)

なお、生成AI にメールの文面を考えてもらうのは カスタマイン の 「OpenAI を呼び出してテキストを生成する」を使えば できますし、メールを実際に送るのも Job Runner の「SendGrid でメールを送信する」を呼ぶようにすればできます。
まとめ
ごくシンプルな例ですが、 kintone から Dify のワークフローを呼び出してメールを送信できました。
Dify は、生成AI の 大規模言語モデル(LLM)を活用したチャットボットやワークフローを視覚的に開発できるツールで、オープンソースで開発されており、クラウドサービス版を利用するだけでなく、ローカルやオンプレミスで動作させることもできます。
また、今後プラグインシステムによって外部サービスやカスタム機能を簡単に追加できるようになっていくようです。目が離せないですね!
投稿者プロフィール
