🐨

Power Automateと生成AIを活用して、ZennのPublicationへの招待をしてくれるエージェントを作成

に公開

やりたいこと

全社的にZennへのテック記事投稿を推進しています。
去年から沢山のエンジニアが入社されるようになり、ZennのPublicationアカウントに新しいメンバーを招待する機会が増えてきました。
今年はさらに増える見込みですので早いうちにエージェントを作成しました。

処理の流れ

  1. ユーザーは所定のTeamsチャネルに以下の要件を満たしたメッセージを投稿
      * 「招待」というワードを含める
      * Zennのuser_iduser_nameを記載(なるべく区別がつくように分かりやすく)
  2. Power Automateがメッセージの投稿を検知して起動
  3. メッセージ内に「招待」というワードが含まれてなければ処理を中止
  4. 生成AI(gpt-4o-mini)とStructure Outputsを使って、メッセージ内からuser_iduser_nameを抽出
  5. zennのAPIにuser_idをリクエストボディで含ませて送信
  6. レスポンスのステータスコードが200以外だったら処理を中止
  7. Share Pointサイトの項目ページにフルネームuser_iduser_nameを追加
  8. 投稿メッセージのスレッドに招待が完了した旨の連絡を入れる。

実装

Power Automateにアクセス。
https://make.powerautomate.com/


トリガーはTeamsの「チャネルにメッセージが追加された時」にします。


パラメーターに対象のチームとチャネルを設定します。
検知の間隔は1分ごとにしました。


「変数の初期化」アクションを選択して、トリガーから取得したメッセージ本文を変数に代入します。


次に「Control」アクションの条件式を選択して、メッセージ本文内に「招待」という文字が含まれているかを判定します。


もし含まれてる場合は生成AIとStrucuture Outputsを使ってuser_iduser_nameを取得します。
「HTTP」アクションを選択して、REST形式でのリクエスト文を作成します。
Structure Outputsのリクエスト文は以下を参考にしてください。
https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/structured-outputs?tabs=rest#function-calling-with-structured-outputs


もし「招待」という文字がない場合はフローを中止させます。


生成AIからの回答は以下に格納されてるので変数で持っておきます。
JSON文字列なので型はStringです。

body ('Azure_OpenAI_Structure_Outputs')['choices'] [0] ['message']|'tool_calls'] [0]['function'] l'arguments']


取得したJSON文字列からuser_iduser_nameの値を抽出します。
「JSONの解析」アクションを選択して、以下のように設定。


次に取得したuser_idを使ってZennAPIに招待のリクエストを送ります。
「HTTP」アクションを選択して、リクエストボディにuser_idを含ませます。


「Control」アクションをの条件式を選択して、ステータスコードが422であるかを判定します。


もしTrue(つまり422コードエラー)だったら処理を中止させます。


Zennのアカウント情報はShare Pointで別途管理しています。
そこへの登録も今までは手動で行なっていましたが面倒なので自動で登録させます。
トリガーで取得したメッセージの中にTeamsのユーザー名(本名)があるので、それとuser_iduser_nameを設定したSharePointの項目に追加させます。


ここまできたら代行処理は全て完了したので、最後に完了の旨を送信者に伝えます。
投稿スレッドに返信するようにしたいので、トリガーで取得した情報の中にあるメッセージIDを使用して、スレッドの特定と返信文を設定します。

検証

うまく動きました!

Zennにも承認待ちが来てました。


新年1発目のAI?エージェントができました。(一応生成AI絡ませてるので...)
Teams使う系はPower Automateが非常に相性いいですね。1,2時間で作れました。

ヘッドウォータース

Discussion