PSDify: Dify のワークスペースの管理をコマンドで! アプリ・ナレッジ・モデル・メンバ管理用 PowerShell モジュール

はじめに

Dify がすこぶる便利でおもしろいので、もりもりと使ったりちまちまとコントリビューションをしたりしています。

今回、Dify の 運用管理系 の操作、たとえば、

  • アプリのインポートやエクスポート
  • ナレッジの作成とファイルの追加
  • ワークスペースのメンバの改廃
  • モデルの追加やシステムモデルの設定

などを、PowerShell のコマンドレットで行える ようにするモジュール PSDify をリリースしたので、かんたんに使い方などを紹介します。

これは Dify Advent Calendar の 1 日目 です。

利用イメージ

たとえば、以下のシナリオを全自動で行えます

  • 既存の Dify 環境にログイン(クラウド版でもコミュニティ版でも)する
  • または新しくデプロイしたコミュニティ版の環境に 管理者アカウントを作成 する
  • ワークスペースに新しく モデルを追加 して、システムモデルを変更 する
  • 新しい ナレッジを作成してファイルを追加 する
  • 既存の DSL ファイルを 新しいナレッジを使うように修正 したうえで インポート する
  • インポートした アプリで API キーを発行 する
  • API キーを使って アプリにチャットメッセージを送信 する
  • ワークスペースの 全アプリをエクスポート する
  • ワークスペースに新しい メンバを招待 する

これは、具体的なコマンドでは以下な感じです。

# 既存の環境にログインする
PS> Connect-Dify -AuthMethod "Code" -Email "info@example.com"  # クラウド版 
PS> Connect-Dify -Server "https://dify.example.com" -Email "info@example.com"  # コミュニティ版

# 新しい環境に管理者アカウントを作成する(コミュニティ版のみ)
PS> Initialize-Dify -Server "https://dify.example.com" -Email "info@example.com" -Name "Dify"

# ワークスペースにモデルを追加する
PS> New-DifyModel -Provider "openai" -From "predefined" `
  -Credential @{
    "openai_api_key" = "sk-proj-****************"
  }

# ワークスペースのシステムモデルを変更する
PS> Set-DifySystemModel -Type "llm" -Provider "openai" -Name "gpt-4o-mini"
PS> Set-DifySystemModel -Type "text-embedding" -Provider "openai" -Name "text-embedding-3-small"

# 新しいナレッジを作成する
PS> $Knowledge = New-DifyKnowledge -Name "My New Knowledge"

# ナレッジにファイルを追加して、インデキシングの完了を待つ
PS> Get-Item -Path "Docs/*.md" | Add-DifyDocument -Knowledge $Knowledge -Wait

# 既存の DSL ファイル内のナレッジ ID を新しい ID に置き換えて別ファイルとして保存する
PS> $RawContent = Get-DifyDSLContent -Path "oldapp.yml"
PS> $RawContent = $RawContent -replace "dc642635-9416-4794-a99d-0d02bc4ead5e", $Knowledge.Id
PS> Set-DifyDSLContent -Path $UpdatedDSLFile -Content "newapp.yml"

# 新しくできた DSL ファイルをインポートする
PS> $App = Import-DifyApp -Path $UpdatedDSLFile

# インポートしたアプリで API キーを発行する
PS> $APIKey = New-DifyAppAPIKey -App $App

# インポートしたアプリにチャットメッセージを送信する
PS> $env:PSDIFY_APP_TOKEN = $Key.Token
PS> $env:PSDIFY_APP_URL = "https://dify.example.com"
PS> Send-DifyChatMessage -Message "おはよ!" -NewSession

# 全アプリを DSL ファイルとしてエクスポートする
PS> Get-DifyApp | Export-DifyApp

# ワークスペースに新しいメンバを招待する
PS> New-DifyMember -Email "dify-editor1@example.com" -Role "editor"
PS> New-DifyMember -Email "dify-normal1@example.com" -Role "normal"

画面出力イメージはこんな感じです。

なお、返すオブジェクトは PSCustomObject そのままなので、(人間目線で)見やすくしたい場合は適宜 Select-ObjectFormat-Table を併用してください。types.ps1xmlformat.ps1xml を書く気力はあんまりないです(過去に書いたことがありますが、書いたあとも維持が大変なので、Dify 側の仕様変更に追従する苦労を考えるとあまりやりたくないです)。

利用上の注意

  • 当然ですが、非公式 のものです。利用する場合は 自己責任 でお願いします。不具合が起きても Dify や LangGenius に文句は言えません。
  • Dify の API を使っていますが、公式にはサポートされていない使い方 をしています。Dify の API の仕様が少しでも変わると動かなくなる可能性 があります。
  • もともとぼく個人の作業の助けとなるようにつくったものです。とにかく動く ことを目指しているので、エラーハンドリングやヘルプの実装は不十分ですし、今後もたぶんあまり方針は変わりません。
  • バグ報告や機能追加要望は GitHub の Issue へお願いします。

インストール

PowerShell Gallery で公開 しているので、Install-Module でインストールできます。

Install-Module -Name PSDify

コマンドレット一覧

主なものを抜粋して一覧しています。

より詳しい説明は GitHub においてあるドキュメント(日本語) を参照してください。

カテゴリコマンドレット説明
認証Connect-Dify
Disconnect-Dify
Dify へのログイン・Dify からのログアウトを行います。
コミュニティ版向けにパスワード認証、クラウド環境向けにメール認証に対応しています。
アプリGet-DifyApp
Remove-DifyApp
アプリを取得・削除します。
アプリImport-DifyApp
Export-DifyApp
アプリをローカルの DSL ファイルからインポート、または DSL ファイルへエクスポートします。
アプリGet-DifyDSLContent
Set-DifyDSLContent
DSL ファイルの中身を読んだり書いたりします。
アプリNew-DifyAppAPIKey
Get-DifyAppAPIKey
Remove-DifyAppAPIKey
アプリの API キーを作成・取得・削除します。
ナレッジNew-DifyKnowledge
Get-DifyKnowledge
ナレッジを作成・取得します。
ナレッジAdd-DifyDocument
Get-DifyDocument
ナレッジのドキュメントを追加・取得します。
メンバNew-DifyMember
Get-DifyMember
Remove-DifyMember
ワークスペースのメンバを追加(招待)・取得・削除します。
メンバSet-DifyMemberRoleワークスペースのメンバのロールを変更します。
モデルNew-DifyModel
Get-DifyModel
ワークスペースのモデルを追加・取得します。
モデルGet-DifySystemModel
Set-DifySystemModel
ワークスペースのシステムモデルを取得・設定します。
タグGet-DifyTag
Get-DifyAppTag
Get-DifyKnowledgeTag
タグの情報を取得します。
情報取得Get-DifyVersionDify のバージョン情報を取得します。
情報取得Get-DifyProfile認証したアカウントの情報を取得します。
初期設定Initialize-Dify管理者アカウントを作成します(コミュニティ版のみ)。
その他Set-PSDifyConfigurationHTTPS 接続時の証明書の検証を無効化できます。
チャット操作Send-DifyChatMessageアプリにチャットメッセージを送信します。

使い方

認証

ほかのコマンドを実行する前に、まずは Dify に対して認証を要求します。

クラウド版 では通常は SSO で認証して利用しますが、SSO で認証したアカウントでも、紐づけられたメールアドレスでメール認証が行えます。以下のコマンドを実行するとメールで認証コードが届くので、それをプロンプトに投げると認証が完了します。

# メールによる認証(実行後、メールで届いたコードを手動で入力する)
PS> Connect-Dify -AuthMethod "Code" -Email "dify@example.com"
Enter the code sent to dify@example.com: 123456

Server                Version Name     Email
------                ------- ----     -----
https://cloud.dify.ai 0.12.1  kurokobo dify@example.com

コミュニティ版 では、通常はパスワード認証です。-Server-Email で URL とメールアドレスを指定して実行します。

PS> Connect-Dify -Server "https://dify.example.com" -Email "dify@example.com"
Enter password for dify@example.com: ****************

Server                   Version Name     Email
------                   ------- ----     -----
https://dify.example.com 0.12.1  kurokobo dify@example.com

なお、自己署名証明書で HTTPS 化している場合など、構成によっては証明書の検証がコケて認証できないことがあります。リスクを受け入れて雑に回避したい場合は、Connect-Dify の前に次のコマンドを実行すると証明書の検証を無効できます。

PS> Set-PSDifyConfiguration -IgnoreSSLVerification $true

認証ができれば、あとは自由に操作できます。

アプリの管理

アプリの情報を確認(Get-DifyApp)したり、

# すべてのアプリを取得
PS> Get-DifyApp

# ID や名前、タイプ、タグでフィルタ
PS> Get-DifyApp -Id "2a5f3b01-a14c-4f57-b5fd-9b7aa69c250e"
PS> Get-DifyApp -Name "My App"
PS> Get-DifyApp -Mode "chat"  # "chat", "workflow", "agent-chat", "channel", "all"
PS> Get-DifyApp -Tags "Tag A", "Tag B"

アプリをエクスポート(Export-DifyApp)したり、

# アプリのエクスポート("DSLs" フォルダに保存)
PS> Get-DifyApp | Export-DifyApp

# 保存先のディレクトリを変更
PS> Get-DifyApp | Export-DifyApp -Path "./path/to/your/directory"

# シークレットを含める場合
PS> Get-DifyApp | Export-DifyApp -IncludeSecret

アプリをインポート(Import-DifyApp)したり、

# アプリのインポート
PS> Import-DifyApp -Path "DSLs/*.yml"

アプリを削除(Remove-DifyApp)したりできます。

# アプリの削除
PS> Get-DifyApp -Name "Unused App" | Remove-DifyApp

API キーも発行したり確認したりできます。

# API キーの発行
PS> Get-DifyApp -Name "My Chat App" | New-DifyAppAPIKey

# API キーの確認
PS> Get-DifyApp -Name "My Chat App" | Get-DifyAppAPIKey

ナレッジの管理

ナレッジの情報を確認(Get-DifyKnowledge)したり、

# すべてのナレッジを取得
PS> Get-DifyKnowledge

# ID や名前、タグでフィルタ
PS> Get-DifyKnowledge -Id "a48750ec-c36d-4b0f-aa22-2771c466ba3a"
PS> Get-DifyKnowledge -Name "My Knowledge"
PS> Get-DifyKnowledge -Tags "Tag A", "Tag B"

空のナレッジを作成(New-DifyKnowledge)したり、

# 空のナレッジを作成
PS> New-DifyKnowledge -Name "My New Knowledge"

# ナレッジの作成(説明文を追加)
PS> New-DifyKnowledge -Name "My New Knowledge" -Description "This is a new knowledge."

ナレッジを削除(Remove-DifyKnowledge)したりできます。

# ナレッジの削除
Get-DifyKnowledge -Name "Unused Knowledge" | Remove-DifyKnowledge

ナレッジ内のドキュメントを確認(Get-DifyDocument)したり、

# ナレッジのすべてのドキュメントの取得
PS> Get-DifyKnowledge -Name "My Knowledge" | Get-DifyDocument

# ID や名前でフィルタ
Get-DifyKnowledge -Name "My Knowledge" | Get-DifyDocument -Id "..."
Get-DifyKnowledge -Name "My Knowledge" | Get-DifyDocument -Name "..."

ナレッジにファイルをアップロード(Add-DifyDocument)したりもできます。デフォルトで、Web の設定画面でいう『自動』『高品質(システムモデル)』『ベクトル検索』で構成されます。あまり細かいカスタマイズはまだ実装していません。

# 前提: アップロードするナレッジを取得
$Knowledge = Get-DifyKnowledge -Name "My New Knowledge"

# ドキュメントのアップロード
Get-Item -Path "Docs/*.md" | Add-DifyDocument -Knowledge $Knowledge

# システムモデル以外を使う
$EmbeddingModel = Get-DifyModel -Provider "openai" -Name "text-embedding-3-small"
Add-DifyDocument -Knowledge $Knowledge -Path "Docs/*.md" -IndexMode "high_quality" -Model $EmbeddingModel

# エコノミーモードにする
Add-DifyDocument -Knowledge $Knowledge -Path "Docs/*.md" -IndexMode "economy"

Add-DifyDocument は、インデキシングの完了を待機する -Wait オプションも使えます。

メンバの管理

ワークスペースのメンバの情報を確認(Get-DifyMember)したり、

# すべてのメンバの取得
PS> Get-DifyMember

# ID や名前、メールアドレスでフィルタ
PS> Get-DifyMember -Id "6cee2985-f7f3-4b96-aa34-15a0b80a1a2c"
PS> Get-DifyMember -Name "kurokobo"
PS> Get-DifyMember -Email "dify@example.com"

新しいメンバをワークスペースに招待(New-DifyMember)したり、

# メンバの招待
PS> New-DifyMember -Email "dify-editor1@example.com" -Role "normal"  # "admin", "editor", "normal"

メンバのロールを変更(Set-DifyMemberRole)したり、

# メンバのロールの変更
PS> Get-DifyMember -Email "dify-editor1@example.com" | Set-DifyMemberRole -Role "editor"

メンバを削除(Remove-DifyMember)したりできます。

# メンバの削除
PS> Get-DifyMember -Email "dify-editor1@example.com" | Remove-DifyMember

モデルの管理

ワークスペースに追加されているモデルを確認(Get-DifyModel)したり、

# すべてのモデルの取得
PS> Get-DifyModel

# プロバイダや種類、名前、タイプでフィルタ
PS> Get-DifyModel -Provider "openai"
PS> Get-DifyModel -From "predefined"  # "predefined", "customizable"
PS> Get-DifyModel -Name "gpt-4o-mini"
PS> Get-DifyModel -Type "llm"  # "llm", "text-embedding", "speech2text", "moderation", "tts", "rerank"

新しいモデルを追加(New-DifyModel)したりできます。-Provider-Credential で渡すべき情報はプロバイダやモデルによって異なるため、ブラウザの開発者ツールでいちど手作業で追加して、実際の HTTP リクエストを確認するのが確実です。

# モデルの追加(事前定義モデルの追加、OpenAI の例)
PS> New-DifyModel -Provider "openai" -From "predefined" `
  -Credential @{
    "openai_api_key" = "sk-proj-****************"
  }

# モデルの追加(カスタムモデルの追加、OpenAI の例)
PS> New-DifyModel -Provider "openai" -From "customizable" `
  -Type "llm" -Name "gpt-4o-mini" `
  -Credential @{
    "openai_api_key" = "sk-proj-****************"
  }

システムモデルも確認(Get-DifySystemModel)したり変更(Get-DifySystemModel)したりできます。

# すべてのシステムモデルの取得
PS> Get-DifySystemModel

# タイプでフィルタ
PS> Get-DifySystemModel -Type "llm"  # "llm", "text-embedding", "rerank", "speech2text", "tts"

# システムモデルの変更
PS> Set-DifySystemModel -Type "llm" -Provider "openai" -Name "gpt-4o-mini"

情報取得

接続先のインスタンスの情報(Get-DifyVersion)や、認証したアカウントの情報(Get-DifyProfile)を確認できます。

# 接続先の Dify のバージョンの取得
PS> Get-DifyVersion

# 認証したアカウントの情報の取得
PS> Get-DifyProfile

インスタンスの初期化

コミュニティ版に限定した機能ですが、新しくデプロイした直後の管理者アカウントの作成(Initialize-Dify)もできます。初期化パスワード(.envINIT_PASSWORD で設定できるやつ、デフォルトはナシ)を指定している場合でも大丈夫です。

# 管理者アカウントの作成
PS> Initialize-Dify -Server "https://dify.example.com" -Email "dify@example.com"

チャットメッセージの送信

ひとによってはこれだけでも便利かもしれませんが、アプリにチャットも送れます。動作には環境変数の設定が必要です。ログが勝手に Logs フォルダに吐かれます。

# 環境変数の設定
PS> $env:PSDIFY_APP_URL = "https://dify.example.com"
PS> $env:PSDIFY_APP_TOKEN = "app-****************"

# チャットメッセージの送信
PS> Send-DifyChatMessage -Message "Hello, Dify!"

# チャットメッセージの送信(新しいセッションを開始)
PS> Send-DifyChatMessage -Message "Hello, Dify!" -NewSession

見た目はこんな感じ。

モチベーション

日常的にいくつかのインスタンスを運用していると、バックアップ目的でアプリをエクスポートしたり、ワークスペースにメンバを招待したりロールを変更したり、いわゆる運用管理系っぽい操作を頻繁に行うことになります。

また、新しいバージョンが出たら採用前に検証が必要ですが、新しく検証用の環境をつくったのなら、そのたびにデプロイ後の管理者アカウントやモデルの追加、ナレッジの作成、アプリの作成をしなければなりません。

ちまちまとコントリビューションもしていることもあって、開発や調査・検証の目的でも環境を作ったり変更したり消したりが必要です。

最初は Web の GUI から手作業でがんばっていましたが、かなりの頻度と量なので、これはもうどう考えても効率が悪いわけです。この手の作業ならコマンドラインベースの操作でできてしかるべきだし、コマンドでできればスクリプト化も簡単でしょう。

ということでざくざくと作ったのがきっかけです。完全に個人用として作ってきたモノですが、数か月使ってきて実際にとても便利でしたし、そこそこ機能も充実してきたので、今回あらためて整理しなおして公開することにしました。

おわりに

Dify 上での日常の作業をだいぶラクにしてくれる PSDify を紹介しました。自前運用がだいぶラクになるので、興味があればさわってみてください。

バグ報告や機能追加要望は GitHub の Issue へぜひ。

@kurokobo

くろいです。ギターアンサンブルやら音響やらがフィールドの IT やさんなアルトギター弾き。たまこう 48 期ぎたさん、SFC '07 おんぞう、新日本ギターアンサンブル、Rubinetto。今は野良気味。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です