diff --git a/workflow/04_scheduler/scheduled_daily_briefing.json b/workflow/04_scheduler/scheduled_daily_briefing.json index 156d76c..ee83005 100644 --- a/workflow/04_scheduler/scheduled_daily_briefing.json +++ b/workflow/04_scheduler/scheduled_daily_briefing.json @@ -1,25 +1,68 @@ { - "name": "robeing-scheduled-daily-briefing", + "name": "robeing-daily-headlines-actual-runtime", "nodes": [ + { + "parameters": { + "content": "실제 운영 경로 시각화용 문서입니다.\\nSSOT는 DOCS/workflow/*.md이며 이 JSON은 n8n 시각화 파생물입니다.", + "height": 120, + "width": 360, + "color": 5 + }, + "id": "sched-headlines-note-001", + "name": "SSOT Note", + "type": "n8n-nodes-base.stickyNote", + "typeVersion": 1, + "position": [80, 40] + }, { "parameters": { "rule": { - "cronExpression": "0 9 * * 1-5" + "cronExpression": "10 9 * * 1-5" } }, - "id": "sched-brief-001", - "name": "Schedule Trigger", + "id": "sched-headlines-001", + "name": "09:10 Trigger", "type": "n8n-nodes-base.scheduleTrigger", "typeVersion": 1, - "position": [220, 220] + "position": [120, 220] + }, + { + "parameters": { + "jsCode": "return [{\n json: {\n scheduler_source: 'scheduled_jobs.daily_headlines',\n cron_expression: '10 9 * * mon-fri',\n channel_id: 'C09C98KK2TT',\n runtime: 'rb8001 APScheduler + DB loader'\n }\n}];" + }, + "id": "sched-headlines-002", + "name": "DB Job Config", + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [360, 220] + }, + { + "parameters": { + "jsCode": "return [{\n json: {\n step: 'app.scheduler.jobs.daily_headlines._run_headlines_with_logging(channel_id)',\n channel_id: $json.channel_id,\n description: 'DB scheduler가 rb8001 내부 래퍼 함수를 직접 호출'\n }\n}];" + }, + "id": "sched-headlines-003", + "name": "daily_headlines Wrapper", + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [620, 220] + }, + { + "parameters": { + "jsCode": "return [{\n json: {\n workflow: 'run_headlines_workflow(channel_id)',\n state_store: '/code/state/headlines_graph.sqlite',\n steps: [\n 'fetch_naver',\n 'fetch_sea',\n 'extract_terms',\n 'format',\n 'send'\n ],\n channel_id: $json.channel_id\n }\n}];" + }, + "id": "sched-headlines-004", + "name": "LangGraph Workflow", + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [900, 220] }, { "parameters": { "method": "POST", - "url": "=http://192.168.219.52:8505/api/v1/briefing", + "url": "=http://192.168.219.52:8505/api/news/naver/startup-headlines", "sendBody": true, "specifyBody": "json", - "jsonBody": "={\"mode\":\"daily_briefing\",\"company_id\":\"companyx\",\"topic\":\"business\",\"limit\":10}", + "jsonBody": "={\"format\":\"slack\"}", "options": { "response": { "response": { @@ -28,42 +71,145 @@ } } }, - "id": "sched-brief-002", - "name": "Call skill-news", + "id": "sched-headlines-005", + "name": "skill-news Naver Headlines", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, - "position": [470, 220] + "position": [1180, 140] }, { "parameters": { - "jsCode": "const body = $json.body || {};\nreturn { channel: 'C_DAILY_BRIEFING', text: body.message || body.summary || '브리핑 결과가 비어 있습니다.' };" + "method": "POST", + "url": "=http://192.168.219.52:8505/api/news/sea/headlines", + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={\"format\":\"json\"}", + "options": { + "response": { + "response": { + "fullResponse": true + } + } + } }, - "id": "sched-brief-003", - "name": "Build Slack Message", + "id": "sched-headlines-006", + "name": "skill-news SEA Headlines", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.2, + "position": [1180, 300] + }, + { + "parameters": { + "jsCode": "return [{\n json: {\n step: 'rb8001 headlines_workflow.format_node',\n channel_id: $item(0).$node['LangGraph Workflow'].json.channel_id,\n summary: [\n '네이버 Slack 텍스트 수신',\n '동남아 소식 섹션 삽입',\n '키워드 요약 미삽입',\n '클로징 후 명언, 마지막 빈줄 2줄'\n ],\n naver_endpoint: '/api/news/naver/startup-headlines',\n sea_endpoint: '/api/news/sea/headlines'\n }\n}];" + }, + "id": "sched-headlines-007", + "name": "Format Briefing Text", "type": "n8n-nodes-base.code", "typeVersion": 2, - "position": [700, 220] + "position": [1460, 220] }, { "parameters": { "resource": "message", "operation": "post", - "channel": "={{ $json.channel }}", - "text": "={{ $json.text }}", + "channel": "={{ $json.channel_id }}", + "text": "={{ 'rb8001 headlines_workflow.send_node -> chat_postMessage' }}", "otherOptions": {} }, - "id": "sched-brief-004", - "name": "Post to Slack", + "id": "sched-headlines-008", + "name": "Slack Delivery", "type": "n8n-nodes-base.slack", "typeVersion": 2, - "position": [940, 220] + "position": [1720, 220] } ], "connections": { - "Schedule Trigger": { "main": [[{ "node": "Call skill-news", "type": "main", "index": 0 }]] }, - "Call skill-news": { "main": [[{ "node": "Build Slack Message", "type": "main", "index": 0 }]] }, - "Build Slack Message": { "main": [[{ "node": "Post to Slack", "type": "main", "index": 0 }]] } + "09:10 Trigger": { + "main": [ + [ + { + "node": "DB Job Config", + "type": "main", + "index": 0 + } + ] + ] + }, + "DB Job Config": { + "main": [ + [ + { + "node": "daily_headlines Wrapper", + "type": "main", + "index": 0 + } + ] + ] + }, + "daily_headlines Wrapper": { + "main": [ + [ + { + "node": "LangGraph Workflow", + "type": "main", + "index": 0 + } + ] + ] + }, + "LangGraph Workflow": { + "main": [ + [ + { + "node": "skill-news Naver Headlines", + "type": "main", + "index": 0 + }, + { + "node": "skill-news SEA Headlines", + "type": "main", + "index": 0 + } + ] + ] + }, + "skill-news Naver Headlines": { + "main": [ + [ + { + "node": "Format Briefing Text", + "type": "main", + "index": 0 + } + ] + ] + }, + "skill-news SEA Headlines": { + "main": [ + [ + { + "node": "Format Briefing Text", + "type": "main", + "index": 0 + } + ] + ] + }, + "Format Briefing Text": { + "main": [ + [ + { + "node": "Slack Delivery", + "type": "main", + "index": 0 + } + ] + ] + } }, "pinData": {}, - "meta": { "templateCredsSetupCompleted": true, "instanceId": "robeing-scheduler" } + "meta": { + "templateCredsSetupCompleted": true, + "instanceId": "robeing-scheduler" + } }