Multi-Rag / src /Blog /graph /nodes /worker_node.py
VashuTheGreat's picture
Clean commit without images
1f725d8
import logging
import sys
from src.Blog.models.Task_models import Task
from src.Blog.models.Plan_model import Plan
from src.Blog.models.Evidence_model import EvidenceItem
from src.Blog.llm import llm
from langchain_core.messages import SystemMessage, HumanMessage
from src.Blog.prompts import WORKER_SYSTEM
from exception import MyException
from utils.asyncHandler import asyncHandler
@asyncHandler
async def worker_node(payload: dict) -> dict:
logging.info("Entering worker_node")
try:
task = Task(**payload["task"])
plan = Plan(**payload["plan"])
evidence = [EvidenceItem(**e) for e in payload.get("evidence", [])]
topic = payload["topic"]
mode = payload.get("mode", "closed_book")
logging.debug(f"Task: {task.title}, Mode: {mode}")
bullets_text = "\n- " + "\n- ".join(task.bullets)
evidence_text = ""
if evidence:
evidence_text = "\n".join(
f"- {e.title} | {e.url} | {e.published_at or 'date:unknown'}".strip()
for e in evidence[:20]
)
response = await llm.ainvoke(
[
SystemMessage(content=WORKER_SYSTEM),
HumanMessage(
content=(
f"Blog title: {plan.blog_title}\n"
f"Audience: {plan.audience}\n"
f"Tone: {plan.tone}\n"
f"Blog kind: {plan.blog_kind}\n"
f"Constraints: {plan.constraints}\n"
f"Topic: {topic}\n"
f"Mode: {mode}\n\n"
f"Section title: {task.title}\n"
f"Goal: {task.goal}\n"
f"Target words: {task.target_words}\n"
f"Tags: {task.tags}\n"
f"requires_research: {task.requires_research}\n"
f"requires_citations: {task.requires_citations}\n"
f"requires_code: {task.requires_code}\n"
f"Bullets:{bullets_text}\n\n"
f"Evidence (ONLY use these URLs when citing):\n{evidence_text}\n"
)
),
]
)
section_md = response.content.strip()
logging.info(f"Worker node completed task: {task.title}")
return {"sections": [(task.id, section_md)]}
except Exception as e:
logging.error(f"Error in worker_node: {str(e)}")
raise MyException(e, sys)