【Dify×Notionで作るレシピ管理システム】レシピ登録編

Power Platformとは全く関係ないですが、たまには他のツールも触ってみようということで**生成AIを用いたワークフローが簡単に作れるDifyと、神タスク管理ツールであるNotionを連携させてレシピ管理システムを一日で作成した**ので備忘的に内容を説明します。

前回の概要＆セットアップ編に続いて、今回はレシピ管理システムの核心部分であるレシピ登録機能について解説します。

https://powerplatformnikki.com/difyrecepiautomation1

## 実行結果

こんな感じでURLを入力するだけで自動でレシピDBが完成します。便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/0192eb37-1eeb-aa3a-4bb2-f8766bdb605d.png)

## レシピ登録機能の概要

https://twitter.com/PowerPlatform4/status/1820040693773193267

最初の質問分類で、レシピを含むURLかレシピのテキストが入力された場合に実行される処理を説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/4ed86647-320d-0392-e5a9-bd2e9f01c6f0.png)

**クラス1としてURLが入力された場合はURL内のテキストを、クラス2としてレシピが入力された場合はそのテキストを解析してNotionのAPIで登録できる形式に整形**します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/c60b4133-945d-f8e5-ed77-298197ff2646.png)

ちなみにこの機能だけならiPhoneアプリのRecipinというアプリでもできます。
買うものリスト機能はないのでDifyで作りました。
[Recipin シンプルなお料理レシピ保存・管理アプリ - App Store](https://apps.apple.com/jp/app/recipin/id1528090845)

## レシピ登録プロセス

### ユーザー入力・質問分類

先述の通りユーザー入力をクラス1~4に分類して条件分岐します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/4f9ece48-7075-48ed-8753-156bbe8db467.png)

クラス2としてレシピのテキストが入力された場合は中間処理をスキップして変数集約器にぶち込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/5e1bdca5-c825-173f-6438-6a4db393c7ed.png)

### URL解析

再度質問分類器を使用してYouTubeのURLかどうかで分岐しています。
Transcripts APIがあまり正常に動作しないので、空の場合はJinaReaderで処理されるようにフローを組んでいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/a7dd3df8-654d-07b6-bd39-a92bb8856678.png)

JinaReaderはURLの中のテキストを読み取ってくれるAPIで、無料で使えます。クオリティもいいです。
[Reader API](https://jina.ai/reader)

### パラメータ抽出

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/ec01c8b2-e4f1-ad4b-59a7-44d21ba19891.png)

YouTube Transcript, Jinaまたはユーザー入力を変数集約器でまとめ、そのうち有効なものをレシピ抽出LLMでレシピを抽出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/20a3dd2f-3b1d-929c-f5a1-f27d7bf0b9f3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/08af6bc0-8f91-34ae-c4c8-e499b3a2a05c.png)

HTTPリクエストのボディは文字エスケープが面倒なのでLLMで成形してから入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/5ea30124-3ab2-d050-57ae-0002e14df2fb.png)

いくらプロンプトを工夫しても頭に'''jsonとついてしまうので、正しい形式になっていない場合は修正されるようにしています。現状エラー処理はIf/Elseで対応するしかなさそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/c1809026-bd2c-6ab1-80a6-fd295f5ec3aa.png)

### Notion APIでレシピ登録

ここまででJSONを整形できたので、Notion APIでNotionにレシピを登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/e1df5aba-b93c-2c05-ea77-7731b18a5e2a.png)

```
POST https://api.notion.com/v1/pages/
Authorization: Bearer [NOTION_API_KEY]
Content-Type: application/json
Notion-Version: 2022-06-28
```

ボディは以下の通りです。

```json
{
  "parent": { "database_id": "NOTION_DATABASE_ID" },
  "properties": {
    "名前": {
      "title": [
        {
          "text": {
            "content": "レシピ名"
          }
        }
      ]
    },
    "手順": {
      "rich_text": [
        {
          "text": {
            "content": "手順の詳細"
          }
        }
      ]
    },
    "材料": {
      "rich_text": [
        {
          "text": {
            "content": "材料の詳細"
          }
        }
      ]
    },
    "タグ": {
      "multi_select": [
        { "name": "タグ1" },
        { "name": "タグ2" }
      ]
    },
    "時間": {
      "number": 30
    },
    "URL": {
      "url": "https://example.com/recipe"
    }
  }
}
```

プロパティ別の記法は以下を参考にしました。

https://www.6666666.jp/blog/post/20210617

その他Notion APIを使用するにあたって参考にさせていただいた記事です。

https://qiita.com/unecchi/items/baf095f1e1ba7e6a7fb3#api%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6page%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B

https://zenn.dev/kou_pg_0131/articles/notion-api-usage

## つづき

需要とやる気があれば機能ごとに記事を書くかも…

Claudeなど生成AIチャットボットに聞きながらではありましたが、Difyを通じて前から使いたいと思っていたGeminiやNotionのAPIを勉強できたのでよかったです。

## 元記事

https://powerplatformnikki.com/difyrecepiautomation2