Difyのカスタムクライアント「webapp-conversation」をIBM Cloud Code Engineで動かすまでの手順

# この記事の概要
自分達で生成AIを活用したサービスやAPIを作成できる「Dify（ディファイ）」のフロントエンドに、会社のロゴを入れたり、デザインを変更するには、カスタムクライアントの「webapp-conversation」を活用する必要があります。
この記事では、「webapp-conversation」を、IBM Cloud Code Engine でデプロイして動かすまでの手順を説明します。
また、本記事で想定するシステム構成は、下図のようになります。

## セルフホスト版のDifyを用意する場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/ace24e99-21a9-36d3-fa51-87a054d9604a.png)

## SaaS版のDifyを用意する場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/0fd5dfb2-f008-45d9-e342-f21f6b716a62.png)

# 前提 : Dify環境の確保
本記事にあたり、以下の資料を参考に、Difyの実行環境を入手しましょう。Difyの実行環境は、SaaSでも良いですし、IBM CloudやAWS等の仮想マシンを使ったセルフホスト環境のどちらでも構いません。

- SaaSを使う場合
    - https://dify.ai/jp
- セルフホスト環境の場合
    - [Dify 入門：環境構築とチャットボット作成](https://mydocument.atlassian.net/wiki/spaces/support4textbook/pages/1860403430/Dify)
    - [OllamaをAPI経由で接続するための環境構築](https://mydocument.atlassian.net/wiki/spaces/support4textbook/pages/1864761359/Ollama+API)
    - [DifyをIBM Cloud Virtual Serverで動かして、IBM Cloudについて質問できる基本のチャットボットを作るまで](https://qiita.com/kolinz/items/a27976f19f28fd4829d9)

# 作業環境について
## パソコンを用意しましょう
メモリが8GB以上のパソコンを用意しましょう。Windows、Mac、Linux各自で好みのもので良いです。残念ながら、iPadでは出来ません。2024年現在、高等学校などでは、iPad = パソコン として認識されている場合があります。この記事では、コンテナをビルドする作業を行う都合から、Windows、Mac、Linuxが入っているパソコンでしかできません。
本記事の執筆にあたり、Linux環境として「Ubuntu 24.04」を使っています。Windows環境の場合は、WSL2を使うことでほぼ同じ環境が用意できます。
## コンテナ実行環境を用意しましょう
Dockerあるいは、Docker互換環境を用意します。Docker互換環境としては、OrbStackやPodmanがあります。
## コンテナレポジトリを用意
Difyのカスタムクライアントをビルドすると、500MBを超えるので、IBM Cloudのコンテナレポジトリの無料版は使えません。今回は、Docker Hub を使います。
[Docker Hub](https://hub.docker.com/)を使うために、無料プランにユーザー登録しておきます。

# Difyカスタムクライアントのビルド
Difyのカスタムクライアントである「webapp-conversation」は、DockerもしくはDocker互換環境を前提としてコンテナ実行になります。
Githubからリポジトリをクローンして作業します。

## クローンして環境変数を設定
クローン後、「webapp-conversation」ディレクトリに移動します。
```
git clone https://github.com/langgenius/webapp-conversation.git
cd webapp-conversation
```
Github上のドキュメントに従い、.env.exampleを複製し、.env.local というファイル名にします。
```
cp .env.example .env.local
nano .env.local
```
下記の内容が記載されています。
```
# APP ID
NEXT_PUBLIC_APP_ID=
# APP API key
NEXT_PUBLIC_APP_KEY=
# API url prefix
NEXT_PUBLIC_API_URL=
```
この３つの変数に、必要な値を記述する必要があります。
各変数に挿入する値を取得します。

### APP API Keyの取得
次の手順で実行します。Difyに作ったチャットボットアプリのAPIキーです。
1. Difyで作ったチャットボットにアクセスします。
1. 「APIアクセス」>>「APIキー」をクリックします。
1. 「APIシークレットキー」画面が表示されます。
1. 「+新しいシークレットキーを作成」をクリックします。
1. 表示されたAPIシークレットキーをコピーしておきましょう。例 app-8S64nBWrlA6KeAKaM9V2u07i
1. 「OK」をクリックします。

### APP ID と API URLの取得
次の手順で実行します。
1. Difyで作ったチャットボットにアクセスします。
1. 「監視」>>「カスタマイズ」をクリックします。
1. 「AI Web Appのカスタマイズ」に表示された環境変数を確認します。「NEXT_PUBLIC_APP_ID」と「NEXT_PUBLIC_API_URL」の値をコピーしておきましょう。

### 「.env.local」に各値を記述します。
取得した各値を「.env.local」に記述し、保存します。

## カスタムクライアントのカスタマイズ
カスタムクライアントとしてのアプリ名を設定するために、「config/index.ts」を編集します。
```
nano config/index.ts
```
編集すべき項目は下記です。
```
title: 'Chat APP',
description: '',
copyright: '',
privacy_policy: '',
default_language: 'en',
```
たとえば、次のように編集します。
```
title: 'Custom Chat APP',
description: 'MyChatApp',
copyright: 'MyChatApp Corp',
privacy_policy: '',
default_language: 'ja',
```
## カスタムクライアント用のコンテナイメージをビルド
次の手順で作業を行います。Docker Hub接続します。Docker Hubのユーザー名は、例として、workuser1 とします。
workuser1の部分を、各自のユーザー名に読み替えて作業しましょう。
```
docker login --username workuser1
```
Dockerfileをもとにビルドします。2024年9月時点で2.8GBになります。かなりの大きさです。
IBM Container Registryの無料プランを超えていますので、Docker Hubを使うわけです。会社等で独自に構築したコンテナレジストリがあるのであれば、そちらでも良いでしょう。
```
docker build . -t workuser1/webapp-conversation:latest
```
## ビルドしたカスタムクライアントをプッシュ
次の手順で実行します。
```
docker push workuser1/webapp-conversation:latest
```
コンテナが2GBを超えるので、それなりに時間がかかります。コーヒー前でも挽いて、ドリップして待ちましょう。
Docker Hub では、無料プランの場合、6か月間使われていないと自動削除されます。
無事に終わると、下記のURLでコンテナイメージにアクセスできるようになります。
```
docker.io/workuser1/webapp-conversation
```
# IBM Cloud Code Engine でアプリケーションを実行
IBM Cloudにアクセスします。
IBM Cloud Code Engine にアクセスします。>> https://cloud.ibm.com/codeengine/overview

## Project を作成
IBM Cloud Code Engine 上で、「Projects」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/13dbde06-5b8b-3fca-9bd8-48af2baae55c.png)

「Create」をクリックし、Projectを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/ccd57baf-a680-b075-a873-7e6cc7244499.png)

作成したProject名をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/f34dafb4-b064-f1a7-ea1e-ad183338c63c.png)

Project内に、アプリケーションを作成します。

## アプリケーションの作成
Project画面で、「Applications」をクリックします。その後、「Create」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/60cca42f-8860-2b49-2a88-bd9c9e04c1be.png)

「Image reference」に、コンテナイメージをプッシュした際に取得した、docker.ioから始まるURLを記述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/769b6f1a-19a2-292e-f9e0-219bd9230f04.png)

画面下に移動し、「Min number of instances」を1インスタンスにします。「Max number of instances」を2インスタンスにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/24c452a6-cb89-d7a2-8b3b-ea824bb2a22b.png)

画面右側に表示されている「Create」をクリックします。
下図のよう「Ready」が表示されるまで待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/89896ce4-f0f6-b849-26ab-64a1be878c44.png)

## アプリケーションにアクセス
画面左上に表示されている Project名をクリックし、Project画面に戻ります。Project画面内に、稼働中のアプリケーションが表示されています。
「Open URL」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/bfdb301f-bbc2-18f2-f51f-e6fad85788ff.png)

表示されたアプリケーションを使ってみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/3313ee7d-b0e8-c1f0-57bd-47a920bf9d73.png)

Difyのカスタムクライアントアプリケーションが表示されます。「開始」をクリックします。
実際にチャットボットとして動くことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/fc3553eb-31ef-9e07-71dd-9cef6c54a84c.png)

# まとめ
この記事では、IBM Cloud Code Engineを使い、Difyのカスタムクライアントを動かす手順を記しました。
生成AIを活用したサービスを開発および構築する際に、フロントエンドを独自のものにしたいニーズはたくさんありますので、カスタムクライアントに関するノウハウは役立つはずです。