衝撃！Power Automateのドキュメント作成がAzure OpenAIとGPT-4oで実現できる！？

# 衝撃！衝撃！衝撃！
今回の記事は、詳しい解説というよりも感動を書きます！
昨日[「やーい、おまえんPower Automate、ごみやーしきー！」とマウントをとられないために](https://qiita.com/DEmodoriGatsuO/items/5494b2f91eb130008841)という記事の中で[Power Automate Management](https://learn.microsoft.com/ja-jp/connectors/flowmanagement/)に触れました。

https://qiita.com/DEmodoriGatsuO/items/5494b2f91eb130008841

コチラは**フローの詳細までJSONで取得できるコネクタです。**

「あれ？フローの詳細をJSON??」これ渡せば`GPT-4o`で`Markdown`のドキュメント作れるのでは？と感じました。

**やってみたレポートをササっと書きます！**

:::note info
読んでくださった方からみて使えそうなアイディアかどうか、考えていただくきっかけになると凄く嬉しいです！
:::

# Power Automateフローのドキュメント作成
あらためて`Power Automate`のドキュメント作成を考えると、市民開発者からサクっと自動化が構築できる反面、ドキュメントの残し方が非常に悩みます。

- IT職のスタンダードがキャッチアップできない
- `接続`や各コネクタの情報まで拾うことが大変
    - フローの内容だけでもかなり手間

昨今、`GPT-4o`を中心に、`Claude 3.5`、`Gemini`といった凄まじいモデルによって、`Code to Document`は、使われている可能性が高いのでは？と感じています。

:::note warn
実態を正確に把握していないため、ご容赦ください。
著者の想像です。
:::

しかしながら、[Power Automate Management](https://learn.microsoft.com/ja-jp/connectors/flowmanagement/)コネクタのアクション、[フローを取得する](https://learn.microsoft.com/ja-jp/connectors/flowmanagement/#%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)はフローに関する詳細、接続、アクションなどあらゆる情報が返ってきます。

https://learn.microsoft.com/ja-jp/connectors/flowmanagement/

コチラをプロンプトとして突っ込めば、`Markdown`のドキュメントはいけるのでは？🧐

# Azure OpenAI GPT-4oで試す
考える時間より試したほうが早いので、下記のステップで実行することにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4c1636b6-af43-2deb-808d-1b4ee4366afc.png)

フローは`手動`トリガーです。

1. フローを手動でトリガーする
1. [フローの取得](https://learn.microsoft.com/ja-jp/connectors/flowmanagement/#%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B) 今回は手で対象を選択しています
1. `作成(Compose)`で`GPT-4o`に渡すプロンプトを定義
1. `RetrieveEnvironmentVariableSecretValue` - Dataverseからエンドポイントの取得
1. `RetrieveEnvironmentVariableSecretValue` - DataverseからAPIキーの取得
1. `RetrieveEnvironmentVariableSecretValue` - Dataverseからモデル名の取得
1. `HTTP要求`で`Azure OpenAI GPT-4o`を実行
1. `ファイルの作成` - `OneDrive for Businessでマークダウン形式のテキストファイルを作成`
1. 【非推奨】共有リンクの作成
1. [チャットやチャネルにカードを投稿する](https://learn.microsoft.com/ja-jp/power-automate/create-adaptive-cards)

:::note info
凄くワクワクします・・・🐟
:::

:::note alert
`共有リンクの作成`はアダプティブカードでサクっと結果を見るためだけに使っています。
自分しかいない環境で使っている操作です。
対象のファイルは共有を既に切っています。
:::


## 試すフローはコチラ！
[Office Scriptsを使ってCopilot風のサンプルデータ作成機能をExcelに搭載する](https://qiita.com/DEmodoriGatsuO/items/3829122f9033fb634205)で紹介した`Excel`からGPT-4oを使い、サンプルデータを返すフローのドキュメントを作成してもらいます。
 - Excel Online
 - Azure Key Vault
 
上記の接続を利用していますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/6b73714c-a32b-d095-ef58-3dc89489038e.png)

概要は記事を見ていただければ幸いです！

https://qiita.com/DEmodoriGatsuO/items/3829122f9033fb634205

## フロー詳細
[フローを取得する](https://learn.microsoft.com/ja-jp/connectors/flowmanagement/#%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)で中身を取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/a3b641e3-a74c-93ba-3dd0-7e1f181ee8b8.png)

今回の記事で実行していることは、プロンプトの中身だけが肝です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/9644156c-a570-8f78-91d0-778f6614a66c.png)

```plaintext:プロンプト
下記はPower Automate フローの詳細、接続、アクションを列挙したJSONです。解析し、その内容をア日本語にローカライズし、レポート形式にして返してください。形式はMarkdown文字列で表示を返してください。

### JSON
@{body('フローの取得')}
```

下記は`Dataverse`に格納したAzure OpenAIのシークレットを呼び出しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/7e06760c-6734-457c-20e2-e3e44ef43e99.png)

https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/environmentvariables-azure-key-vault-secrets

`Azure OpenAI`で`GPT-4o`を使用するアクションです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/f0e210f4-a1cc-1245-bc9c-a956d69beb98.png)

■ HTTP

| キー | 値 |
|---|---|
| URI | `body('GetSecret_ENDPOINT')?['EnvironmentVariableSecretValue']}openai/deployments/@{body('GetSecret_DEPLOYMENT')?['EnvironmentVariableSecretValue']}/chat/completions?api-version=2024-02-15-preview` |
| Method | `POST` |

■ ヘッダー

| キー | 値 |
|---|---|
| Content-Type | `application/json` |
| api-key | `body('GetSecret_APIKEY')?['EnvironmentVariableSecretValue']` |

```json:Body
{
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "text",
          "text": "@{outputs('プロンプト')}"
        }
      ]
    }
  ],
  "max_tokens": 4096,
  "temperature": 0.7,
  "frequency_penalty": 0,
  "presence_penalty": 0,
  "top_p": 0.95
}
```

:::note info
`max_tokens`を最大まで上げています
:::

戻り値は`body('AzureOpenAI_GPT-4o')?['choices'][0]?['message']?['content']`

`OneDrive for Business`に格納した場合、ブラウザで`Markdown`を見ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/3da7bb46-d104-da5b-9d13-3c1d266cb41b.png)

:::note alert
共有リンクは今回だけの検証用です
:::

最後に[チャットやチャネルにカードを投稿する](https://learn.microsoft.com/ja-jp/power-automate/create-adaptive-cards)を使って、`Teams`に作成完了通知が来るようにしています。

https://learn.microsoft.com/ja-jp/power-automate/create-adaptive-cards

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4ecc4812-d903-5ad2-14fb-9c5b3d51eb29.png)

```json:Adaptive Card
{
    "type": "AdaptiveCard",
    "body": [
        {
            "type": "TextBlock",
            "text": "@{outputs('フローの取得')?['body/properties/displayName']}のレポート",
            "weight": "Bolder",
            "size": "Medium"
        },
        {
            "type": "TextBlock",
            "text": "OneDrive for Businessにレポートの準備ができました",
            "wrap": true
        }
    ],
    "actions": [
        {
            "type": "Action.OpenUrl",
            "title": "レポートを開く",
            "url": "@{outputs('共有リンクを作成する')?['body/WebUrl']}"
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.4"
}
```

# 結果はいかに・・・！
ドキドキ・・・！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/dbcf267e-b498-8973-481b-acfe05a43bb5.png)

おお👀✨

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5e60140d-4094-4902-cbb2-bd817c29980f.png)

うおおおお！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/fa31204a-dfe8-0433-49ee-1322f49d5568.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/84ccd105-8c22-8130-bb38-71df563cdd0b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c57f2ec1-3906-f582-504f-79e50b91c502.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/d2a07795-f0bd-f195-3678-8b48ac26b5a0.png)

感動しました！！！
**GPT-4o最高です！**

:::note warn
 - 見せたくないものは黒塗りしています
 - Markdownで**必ず**返すためには、プロンプトの工夫やfunction callingの設定が必要だと思います
 - さらなる領域に踏み込む場合、`Azure Functions`が適しているように感じます
 - 今回は実験目的であり、セキュリティを十分に検討しない方法を採用しています
 - 実運用に適するためには課題がある前提です
:::

# おわりに
夢がありますね！
夢をみるきっかけになると何よりです！