Dify 1.0.0betaがリリースされたのでプラグイン開発する

# この記事について

Difyが1.0betaになり今までカスタムプロバイダーとして
Difyをクローンして自身で実装しないといけなかった機能の追加が
プラグインとして作成、共有することが可能になりました

このシリーズではMiiboの外部APIを利用してLLMモデルプラグインの作成をすることで学んでDifyのプラグイン作成を学びます


この記事ではプラグイン初期化などの基本操作について記述します


## 目次
### 1. 本ドキュメント
1. [まずお読みください](#まずお読みください)
1. [プラグインプロジェクトの初期化](#プラグインプロジェクトの初期化)
2. [プロジェクトの構成](#プロジェクトの構成)
3. [プラグインのパッケージ](#プラグインのパッケージ)
4. [プロジェクトファイルの修正](#プロジェクトファイルの修正)
5. [参考リンク](#参考リンク)

### 2. プラグイン実行編（予定）
5. Dify1.0.0beta1の導入
6. プラグインのデバッグ

### 3. プラグイン実装編（予定）

## まずお読みください

[Miibo 🔗](https://miibo.ai/)はAgent型のAPIを提供しているサービスです<br>
一般的なLLMモデルとは違いAgent側で状態を保持します
AgentのAPIのラッパーとしてプラグインLLMモデルを利用する
方法を解説していきます

## プラグインプロジェクトの初期化
  
  [https://github.com/langgenius/dify-plugin-daemon/releases](https://github.com/langgenius/dify-plugin-daemon/releases) 
  から対象の環境のdify-pluginをダウンロードし
      
  必要であれば権限を付与
      
  ```
  chmod +x dify-plugin-darwin-arm64
  ```

  パッケージの実行
   
  ```
  ./dify-plugin-darwin-arm64 init
  ```

  プラグイン名、著者、説明を入力します
![1_dify_plugin_init.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3988136/b04d7ab1-3022-5e79-403d-2e86de549393.png)


  言語を指定します今回はPythonで実装します
  ![2_dify_plugin_lang.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3988136/656919db-60f5-ddcd-e23e-df03975cb2b5.png)



  llmを指定します
![3_dify_plugin_select.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3988136/bd6fbdaa-742a-300f-249e-b10ce6e6de17.png)



  今回はLLM Modelプロジェクトを作成するのでドキュメントに従って次の権限を付与します

  このLLMプラグインには、次の権限を設定します。
    - Models
    - LLM
    - Storage

  矢印で移動、tabで選択の切り替え、エンターで決定です
![4_dify_plugin_capability.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3988136/b8743c20-f3a0-a5a7-f006-4b0c1fe7312f.png)


  - モデルタイプ設定

  predefined-model 定義済みモデルを選択<br>
  miibo_agentというフォルダが作成されています


## プロジェクトの構成
<pre>
    .
    ├── GUIDE.md
    ├── PRIVACY.md
    ├── README.md                
    ├── _assets   ･･･････････････････iconなどのアセットフォルダ
    │   └── icon.svg
    ├── main.py   ･･･････････････････ main関数が定義されています
    ├── manifest.yaml ･･････････････ プラグインのメタ情報
    ├── provider
    │   ├── miibo_agent.py  ･･･････ プロバイダの実装、credientialsの扱いなど
    │   └── miibo_agent.yaml ･･････ プロバイダの定義ファイル
    ├── models
    │   └── llm
    │       ├── llm.py   ･･････････  LLMモデルの実装、エントリポイント
    │       └── llm.yaml  ･････････  LLMモデル定義
    └── requirements.txt         プラグインインストール時にpip installされる

</pre>


上記コマンドはmacOSの場合です
環境に合わせて実行してください


公式のドキュメントはこちらになります

https://docs.dify.ai/plugins/quick-start/develop-plugins/initialize-development-tools



## プラグインのパッケージ

次のコマンドを実行します

```
./dify-plugin-darwin-arm64 plugin package {対象のフォルダ}
```
カレントディレクトリにdifypkgファイルが作成されます


## プロジェクトファイルの修正

プロバイダについてはドキュメントに詳しくあります
この記事では実際に変更した内容について記述します

https://docs.dify.ai/ja-jp/plugins/quick-start/develop-plugins/model-plugin/integrate-the-predefined-model

### 1. manifest.yaml [🔗](https://github.com/cshara1/dify-plugin-miibo-agent/blob/0.0.2/manifest.yaml)

- version 
  
  ヴァージョンの定義が含まれているのでバージョン変更時には修正します

- label
- description

  日本語表示などが必要であればja_JPを修正します

- icon
  
  アイコンを_assetsフォルダに指定しているものに変更します
  画像ファイルであれば形式はなんでも良さそうです

### 2. provider/miibo_agent.yaml [🔗](https://github.com/cshara1/dify-plugin-miibo-agent/blob/0.0.2/provider/miibo_agent.yaml)

- label
- description
- help

を変更します 
helpはCredentialsの入力で表示されるものです<br>
APIキー取得先のURLを指定します<br>
ja_JPで日本語の指定もできます<br>

<pre>
label:
  en_US: MiiboAgent
description:
  en_US: Unofficial model provider for miibo
  zh_Hans: MiiboAgent 提供的模型。
  ja_JP: Miibo Agentのモデルプラグイン非公式実装

help:
  title:
    en_US: Get your API key from miibo
    zh_Hans: 从 miibo 获取 API Key
  url:
    en_US: https://miibo.dev/admin/externalServices/api
</pre>

 - icon_small
 - icon_large


アイコンを変更します
_assetsフォルダ内に画像ファイルを設置して
カスタムプロバイダーの場合なくても動作したのですがプラグインでは
今の所(1.0.0beta1現在)必要なようです
small, largeの仕様は既存では

<pre>
  icon_small:
    en_US: miibo_icon.png
  icon_large:
    en_US: miibo_icon.webp
  background: "#FFF6F2"
</pre>

- provider_credential_schema
- model_credential_schema
  

プロバイダ内もしくはモデルで指定できるcredential keyの定義ができます

今回はAPI Key, Agent IDをそれぞれ指定します
API Keyは入力をマスクします

<pre>
    provider_credential_schema:
      credential_form_schemas:
        - variable: api_key
          required: true
          label:
            en_US: API Key
          type: secret-input
          placeholder:
            zh_Hans: 在此输入您的 API Key
            en_US: Enter your API Key

        - variable: agent_id
          required: true
          label:
            en_US: Agent ID
          type: text-input
          placeholder:
            zh_Hans: 在此输入您的 Agent ID
            en_US: Enter your Agent ID
</pre>


以上がパッケージの作成、設定内容の修正になります<br>
最終的なファイルは[リンク先 🔗](https://github.com/cshara1/dify-plugin-miibo-agent/blob/0.0.2/provider/miibo_agent.yaml)を確認してください<br>


##
次回は、Dify 1.0.0beta1でプラグインが動作する環境を作ります
お急ぎの方はgithubにあるmdを参照ください

[JP_HowTo.md 🔗](https://github.com/cshara1/dify-plugin-miibo-agent/blob/main/JP_HowTo.md)

## 参考リンク
[cshara1/dify-plugin-miibo-agent](https://github.com/cshara1/dify-plugin-miibo-agent/tree/main) <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"></path></svg>

[開発環境のセットアップ](https://docs.dify.ai/ja-jp/plugins/quick-start/develop-plugins/initialize-development-tools)

[miibo.ai](https://miibo.ai/)