Difyでredmineのチケットを読み込んでLLMで集計したり、チケットを登録・更新してみる

AI

Dify(ディファイ)は、システム開発の敷居を大幅に下げ、誰もが高度なアプリケーションを手軽に構築できるオープンソースのLLM(大規模言語モデル)アプリ開発プラットフォームです。 生成AIを活用して、チャットボット、コンテンツ生成ツール、データ分析ツールなど、多岐にわたるAIアプリケーションの開発をサポートします。

本記事は、RedmineのAPIを用いた、Difyの標準機能を用いたアクセス方法と、ツールを用いたアクセス方法を試してみたのでそのメモ書きとなります。もしRedmineとの連携を考えておらえる方がいらしたら少しでも参考になれば幸いです。

Redmineの状態とAPIキーの取得

まず、はじめにRedmienとAPIで通信するため、RedmineのAPIアクセスキーを取得しておく必要があります。アクセスキーは利用者の権限に従うのでどの権限のアクセスをするのかに応じてその権限を持ったアカウントを用意してください。また、できるだけ個人に紐付けずAPI専用で作っておくことをオススメします。アカウントの棚卸しで突然APIが動かなくなったなど悲しい状況になる恐れがありますので。。。(´・ω・`)

Redmineの状態

RedmineのAPIアクセスキーの取得

画面右上の個人設定を押して、開いた画面の右に折りたたまれている(≪)ところを開く(≫)とAPIアクセスキーの画面が出てきます。

curlでのAPI操作

RedmineとのAPIのやり取りのイメージを掴むために、まずはじめに、コマンドラインを使ってやり取りをしてみます。

コマンドは、curlやwgetというHTTPクライアントツールを用います。これらコマンドでAPIにアクセスして欲しい情報を取得したり、チケットを登録や更新、削除をしたりすることができます。

DifyでもHTTPリクエストのツールを用いることで、cURL(=curl)でアクセスした値を取ってきたり、UIをそのまま活用してアクセスするなどもできますが、それは後ほどサンプルを上げるとしてひとまずcurlによるアクセスのサンプルを以下にご紹介します。

redmineが、localhostで、ポート番号 8004、URLパスが/redmineで設定された想定です。

チケットの一覧取得

curl -X GET \
-H "X-Redmine-API-Key: APIアクセスキー" \
"http://localhost:8004/redmine/issues.json?staus_id=5"

※ 上記はstatus_id=5 (終了)でフィルタしたものの一覧が出力されます。デフォルトでは25件しか出力されません。

チケットのコメントを全部取得する

curl -X GET \
-H "X-Redmine-API-Key: APIアクセスキー" \
"http://localhost:8004/redmine/issues/1.json?include=children,journals"

※ include=journalsでコメントが出力されます。チケット番号の後ろに .json をつけるとJSONでの出力、.xml とつけるとXMLで出力されます。上記例はJSONとなります。

コメント文の追加

コメントを追加する際には、issue番号を指定されているURI指定出ないとだめなので、以下のような感じになります。PUTメソッドを使いますのでご注意。また、送信するデータをJSONであることをサーバに伝えるため、Content-Typeで指定する必要があります。

curl -X PUT \
-H "Content-Type: application/json" \
-H "X-Redmine-API-Key: APIアクセスキー" \
-d '{"issue": {"notes": "追加したいコメント文"}}' \
http://localhost:8004/redmine/issues/1.json

アクセス例

ご参考まで。(簡便のため、URLの部分をURLと略させていただいております。)

機能コマンド
プロジェクト一覧表示curl -X GET \
-H "X-Redmine-API-Key: APIアクセスキー" \
http://URL/projects.json
プロジェクト詳細表示curl -X GET \
-H "X-Redmine-API-Key: APIアクセスキー" \
http://URL/projects/プロジェクトのID.json
プロジェクトの作成curl -X POST \
-H "Content-Type: application/json" \
-H "X-Redmine-API-Key: APIアクセスキー" \
-d '{"project":{"name":"プロジェクトID","identifier":"プロジェクトの識別子"}}' \
http://URL/projects.json
プロジェクトの更新curl -X PUT \
-H "Content-Type: application/json" \
-H "X-Redmine-API-Key: APIアクセスキー" \
-d '{"project":{"description":"説明の内容"}}" \
http://URL/projects/プロジェクトのID.json
プロジェクトの削除curl -X DELETE \
-H "Content-Type: application/json" \
-H "X-Redmine-API-Key: APIアクセスキー" \
http://URL/projects/プロジェクトのID.json

DifyのHTTPリクエストで操作する

さて、ここからDifyを使った設定に入っていきます。以下の例は「HTTPリクエスト」を使った方法となり、DifyのRedmineツールを使わない方法での操作となります。

前提として、Difyのインストールが終わっていて、LLMの導入とDifyでLLMが使えるようになっていること。

issue一覧を取得

まずは、issue一覧を取得するHTTPリクエストブロックを追加してみます。

先程のcurlで指定していたAPIアクセスキーのヘッダの部分は「認証APIキー」から右のような「認証」のダイアログが出るので必要な情報を入力します。フィルタにしていたstatus_idはパラメータ欄に入力します。出力された値は、次のブロックへ、sys.queryとして引き継がれます。
※HTTPリクエストでは、Difyからアクセスすることになるので、URL指定はDockerなどを使ってRedmineとDifyを別々に起動している場合は、localhostではまずいかもしれない。

  • 認証タイプ  : APIキー
  • API認証タイプ :カスタム
  • ヘッダー   : X-Redmine-API-Key
  • APIキー    : redmineのアクセスキー

取得した一覧を順番に処理する

例えば、issueで取得したチケット一覧のコメントを順番に取得したいとします。上記で作成したissue取得の「HTTPリクエスト」で得たsys.queryの値を、「パラメータ抽出」でissueのidをArrayに放り込んで、イテレーションで順に回すという感じになります。

上記の画像ではGETのURLのIPアドレスがlocalhostではなくなっていますが、同じサーバで直接起動させている場合はlocalhostのままで大丈夫です

この例は、Redmineに登録された終了ステータスの全チケットを順に取り出して、そのチケット毎にイテレーションを回して、チケット毎のコメント欄をすべて抽出してLLMに要約させようとしています。

このような処理は毎回何か検索したりする都度、全件に対して行うのはLLMをローカルで立ち上げているなら良いですが、有料のAPIを使っていると大変なトークン数になり課金が大変な事になってしまいます。

そこで、例えばチケットが終了になったことを受けてそのチケット1件のみLLMに要約させてそれをRAGとして登録するという処理がオススメです。

ちなみに、ここでは「イテレーション」を用いましたが、「ループ」ブロックでも処理ができます。ただし、ループでは100ループの上限設定があるため、100件とっては次は101件目から100件取るといった繰り返し処理をしつつチケットの要約のループさせるといった処理にする必要が出てきます。

DifyのRedmineツールの導入

ここまでは、Difyの標準機能+JSON Processツール(そのツールのParserをつかいました)で作ってきましたが、このあたりの処理をRedmineに特化して処理をしてくれるツールがあります。

ということで、以下よりRedmineツールを使った方法を試してみました!

DifyのRedmineツール

Difyの上部にある以下の「ツール」を選択し、Redmineを検索します

以下の「レッドマイン」のツールが出てきますのでインストールしてください。

DifyのRedmineツールにRedmineのAPIとURLを登録

インストールがおわったら、Redmineのツールを選択し、「RedmineホストURL」と、そのRedmineサーバに接続するための「APIキー」(APIアクセスキー)を登録します。

チケットの一覧表示

以下は、チケットの情報を一括取得する機能を使ったサンプルです。チケットのリストを取得ではデフォルト25件、最大100件まで一括取得が可能です。

ワークフローで以下のようなフローを作っていきます。

開始フィールドの入力値をchat変数に代入

Redmineツールの「チケット一覧取得」ブロックを追加

RedmineのAPIを利用して一覧が取得されtext変数に代入される

LLMブロックにより一覧表示を指示する

SYSTEMではLLMに渡す指示の内、共通的な内容のプロンプトを記載し、USERには個別に変化するようなものを指定したプロンプトにするイメージです。ここでは、Redmineから抽出されたtextの変数の値をchatの変数でどのように修正するのかをUSER欄に書くのが良いかもしれません。

LLMで加工された変数textを出力する

この一覧取得は、デフォルト25件、最大100件と一回ですべてのチケットを処理するには少ない。が、オフセットが設定できるため全件取得するには取得件数ステップごとのチケットの終わりに達するまでループさせ集計しつつ変数に代入するという処理を入れる必要がありそう。

どんな値をどのように集計したいかで処理が変わるため、折を見て具体例を作ってみようと思います。

チケットの削除

このツールではチケットの削除機能はないようです。

チケットの登録

マップ全体

「IF/ELSE」ブロックの設定

「パラメータ抽出」ブロックの設定

Redmineツールの「チケットを作成」ブロック

タイトルとURLをコピーしました