社内でdifyを利用できる環境があって少しずつ触ってみていたのだけれども(本質ではないけれども)ワークフローを作成するワークフローエンジンとしても面白いなと思いつつ外部のAPIを呼び出したり、その結果とLLMを絡めたピタゴラスイッチを作りやすく、更に作成したワークフロー自体もAPIとして外部から呼べることもわかったので簡単にメモ。
手順としては以下の通り、
- ワークフローを作成する
- ワークフロー編集画面の左手の
APIアクセス
を開き、右上にある APIキー
のUIからAPIキーを生成して取得する
- ワークフロー編集画面右上の
公開する
ボタンを押してワークフローを公開(または更新)する
-
- で取得したAPIキーをBearerとして認証ヘッダに設定してPOSTする
- POSTする際にinputsの中にワークフローの「開始」で設定した入力フィールドの変数名にそろえて入力する
curlコマンドでワークフローをAPI経由で呼び出すには以下の様な形になる。
(今回はプロダクトに組み込むとかの目的ではないのでblockingモードで呼び出しているけれども推奨はstreamingモードになっている。)
ちなみに自分が躓いたところは、
- ワークフローの「終了」のブロックで出力変数を指定していないので結果が帰ってこない
- ワークフローを画面上で編集した後、「公開する」のメニューから「更新」を行わないため修正前のワークフローの結果が帰ってきてしまう
の2点でこれにいつまでも気づかずいくら呼び出しても結果が返ってこない、あるいは修正が反省されないと悩み、もしかすると世の中に2名くらいは同じ失敗をした人の役に立つかも知れないと思ったのでここに残しておく。
実行例
ワークローの「開始」に入力フィールドとして "form1", "form2" を設けていた場合、
curl -X POST 'https://difyホスト名/v1/workflows/run' \
--header 'Authorization: Bearer app-xxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"inputs": {
"form1": "123",
"form2": "abc"
},
"response_mode": "blocking",
"user": "hideack"
}'
上でAPIへリクエストするとblockingモードの場合は以下の様なJSONが戻ってくる。ワークフローの処理結果が完了するまでブロックされるのでoutputsにワークフローの出力(= 終了ブロックの出力変数)が含まれる。
{
"data": {
"created_at": 1721012680,
"elapsed_time": 20.174075001035817,
"error": null,
"finished_at": 1721012700,
"id": "f4166b4b-1234-xxxx-yyyy-zzzz",
"outputs": {
"result": "結果がここに入ります"
},
"status": "succeeded",
"total_steps": 6,
"total_tokens": 893,
"workflow_id": "cba8a879-1234-xxxx-yyyy-zzzz"
},
"task_id": "f8c804e5-1234-xxxx-yyyy-zzzz",
"workflow_run_id": "f4166b4b-1234-xxxx-yyyy-zzzz"
}
最近のコメント