ワークフローイベントをストリーム
対象アプリ:Chatflow、Workflow。
一時停止後または元の SSE 接続が切断された後にワークフロー実行の Server-Sent Events ストリーム を再開します。すでに完了している実行に対しては、workflow_finished イベントを 1 つ送信してストリームを閉じます。
進行中の実行のノードレベルのステータスと進捗を確認するには、include_state_snapshot=true を指定して呼び出します。ストリームは新しいイベントの送信前に、実行済み各ノードのステータスを再送します。
1 min read
get/workflow/{workflow_run_id}/events
Request example
curl --request GET \
--url https://api.dify.ai/v1/workflow/{workflow_run_id}/events \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.dify.ai/v1/workflow/{workflow_run_id}/events"
headers = {
"Authorization": "Bearer <token>",
}
response = requests.request("GET", url, headers=headers)
print(response.text)const response = await fetch('https://api.dify.ai/v1/workflow/{workflow_run_id}/events', {
method: 'GET',
headers: {
'Authorization': 'Bearer <token>'
}
});
const data = await response.json();
console.log(data);<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.dify.ai/v1/workflow/{workflow_run_id}/events',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer <token>',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;package main
import (
"fmt"
"io"
"net/http"
)
func main() {
url := "https://api.dify.ai/v1/workflow/{workflow_run_id}/events"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.dify.ai/v1/workflow/{workflow_run_id}/events"))
.header("Authorization", "Bearer <token>")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());require 'uri'
require 'net/http'
url = URI('https://api.dify.ai/v1/workflow/{workflow_run_id}/events')
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = url.scheme == 'https'
request = Net::HTTP::Get.new(url)
request['Authorization'] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyResponse
event: ping
data: {"event": "human_input_form_filled", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "workflow_run_id": "fb47b2e6-5e43-4f90-be01-d5c5a088d156", "data": {"node_id": "approval_node", "node_title": "Approval", "rendered_content": "ドラフトを確認してください。", "action_id": "approve", "action_text": "承認", "submitted_data": {"comment": "問題ありません。"}}}
data: {"event": "node_started", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "workflow_run_id": "fb47b2e6-5e43-4f90-be01-d5c5a088d156", "data": {"id": "node_exec_2", "node_id": "node_1", "node_type": "llm", "title": "LLM Node", "index": 2, "created_at": 1705407705}}
data: {"event": "reasoning_chunk", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "workflow_run_id": "fb47b2e6-5e43-4f90-be01-d5c5a088d156", "data": {"reasoning": "Approved, now translating.", "node_id": "node_1", "is_final": false}}
data: {"event": "reasoning_chunk", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "workflow_run_id": "fb47b2e6-5e43-4f90-be01-d5c5a088d156", "data": {"reasoning": "", "node_id": "node_1", "is_final": true}}
data: {"event": "text_chunk", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "workflow_run_id": "fb47b2e6-5e43-4f90-be01-d5c5a088d156", "data": {"text": "Bonjour", "from_variable_selector": ["node_1", "text"]}}
data: {"event": "workflow_finished", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "workflow_run_id": "fb47b2e6-5e43-4f90-be01-d5c5a088d156", "data": {"id": "fb47b2e6-5e43-4f90-be01-d5c5a088d156", "workflow_id": "7c3e33d4-2a8b-4e5f-9b1a-d3c6e8f12345", "status": "succeeded", "outputs": {"result": "Bonjour"}, "elapsed_time": 2.1, "total_tokens": 42, "total_steps": 2, "created_at": 1705407629, "finished_at": 1705407706}}event: ping
data: {"event": "human_input_form_filled", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "message_id": "2e4f6a8b-1c3d-5e7f-9a0b-2c4d6e8f0a1b", "conversation_id": "9d3a2f1b-6c7d-4e8f-a0b1-c2d3e4f5a6b7", "created_at": 1705407705, "workflow_run_id": "fb47b2e6-5e43-4f90-be01-d5c5a088d156", "data": {"node_id": "approval_node", "node_title": "Approval", "rendered_content": "ドラフトを確認してください。", "action_id": "approve", "action_text": "承認", "submitted_data": {"comment": "問題ありません。"}}}
data: {"event": "node_started", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "message_id": "2e4f6a8b-1c3d-5e7f-9a0b-2c4d6e8f0a1b", "conversation_id": "9d3a2f1b-6c7d-4e8f-a0b1-c2d3e4f5a6b7", "created_at": 1705407705, "workflow_run_id": "fb47b2e6-5e43-4f90-be01-d5c5a088d156", "data": {"id": "ne_002", "node_id": "node_llm_1", "node_type": "llm", "title": "LLM", "index": 2, "created_at": 1705407705}}
data: {"event": "reasoning_chunk", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "message_id": "2e4f6a8b-1c3d-5e7f-9a0b-2c4d6e8f0a1b", "conversation_id": "9d3a2f1b-6c7d-4e8f-a0b1-c2d3e4f5a6b7", "created_at": 1705407705, "data": {"message_id": "2e4f6a8b-1c3d-5e7f-9a0b-2c4d6e8f0a1b", "reasoning": "The reviewer approved the draft.", "node_id": "node_llm_1", "is_final": false}}
data: {"event": "reasoning_chunk", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "message_id": "2e4f6a8b-1c3d-5e7f-9a0b-2c4d6e8f0a1b", "conversation_id": "9d3a2f1b-6c7d-4e8f-a0b1-c2d3e4f5a6b7", "created_at": 1705407705, "data": {"message_id": "2e4f6a8b-1c3d-5e7f-9a0b-2c4d6e8f0a1b", "reasoning": "", "node_id": "node_llm_1", "is_final": true}}
data: {"event": "message", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "message_id": "2e4f6a8b-1c3d-5e7f-9a0b-2c4d6e8f0a1b", "conversation_id": "9d3a2f1b-6c7d-4e8f-a0b1-c2d3e4f5a6b7", "answer": "Approved", "created_at": 1705407706}
data: {"event": "node_finished", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "message_id": "2e4f6a8b-1c3d-5e7f-9a0b-2c4d6e8f0a1b", "conversation_id": "9d3a2f1b-6c7d-4e8f-a0b1-c2d3e4f5a6b7", "created_at": 1705407706, "workflow_run_id": "fb47b2e6-5e43-4f90-be01-d5c5a088d156", "data": {"id": "ne_002", "node_id": "node_llm_1", "node_type": "llm", "title": "LLM", "index": 2, "status": "succeeded", "elapsed_time": 1.2, "created_at": 1705407705, "finished_at": 1705407706}}
data: {"event": "message_end", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "message_id": "2e4f6a8b-1c3d-5e7f-9a0b-2c4d6e8f0a1b", "conversation_id": "9d3a2f1b-6c7d-4e8f-a0b1-c2d3e4f5a6b7", "created_at": 1705407706, "metadata": {"usage": {"total_tokens": 42, "latency": 1.3}}}
data: {"event": "workflow_finished", "task_id": "c3800678-a077-43df-a102-53f23ed20b88", "message_id": "2e4f6a8b-1c3d-5e7f-9a0b-2c4d6e8f0a1b", "conversation_id": "9d3a2f1b-6c7d-4e8f-a0b1-c2d3e4f5a6b7", "created_at": 1705407706, "workflow_run_id": "fb47b2e6-5e43-4f90-be01-d5c5a088d156", "data": {"id": "fb47b2e6-5e43-4f90-be01-d5c5a088d156", "workflow_id": "7c3e33d4-2a8b-4e5f-9b1a-d3c6e8f12345", "status": "succeeded", "elapsed_time": 2.1, "total_tokens": 42, "total_steps": 2, "created_at": 1705407629, "finished_at": 1705407706}}{
"code": "not_workflow_app",
"message": "Please check if your app mode matches the right API route.",
"status": 400
}{
"code": "not_found",
"message": "Workflow run not found",
"status": 404
}get/workflow/{workflow_run_id}/events
Authorization
すべてのリクエストは API キーで認証します:Authorization: Bearer {API_KEY}。アプリのエンドポイントにはアプリの API キーを、ナレッジのエンドポイントにはナレッジベースの API キーを使用します(Dify API クイックスタート)。
キーはサーバーサイドで保管し、クライアントコードには決して埋め込まないでください。キーが欠落または無効なリクエストは HTTP 401(unauthorized)で失敗します。
Path parameters
Query parameters
エンドユーザーの識別子。アプリ側で定義し、アプリ内で一意にします。実行を開始した
user と一致する必要があります。エンドユーザーの識別 を参照してください。true の場合、永続化された状態スナップショットからリプレイし、新しいイベントのストリーミング開始前に実行済みノードのステータスサマリーを含めます。Default: false
true に設定すると、複数の workflow_paused イベントを跨いでストリームを開いたままにします(ワークフローに複数の人間の入力ノードが連続する場合に有用)。デフォルトでは最初の一時停止で閉じます。Default: false
Responses
text/event-stream
Server-Sent Events ストリーム。ストリームはキープアライブの
event: ping フレーム(data: なし)で始まり、その後もおよそ 10 秒ごとに届きます。それ以外のイベントは data: {JSON}\n\n として配信されます。イベントペイロードは元のストリーミングレスポンスと同じスキーマに従います。