from __future__ import annotations import time from ..state import AgentState from ..models import LLMClient, WRITER_PROMPT_TEMPLATE from ..tools import get_logger, log_state_summary logger = get_logger() def writer_node(state: AgentState) -> AgentState: start = time.time() topic = state.get("topic", "") snippets = state.get("research_snippets", []) or [] joined_snippets = "\n\n".join( f"- {s['snippet']} (source: {s['title']} – {s['url']})" for s in snippets ) client = LLMClient() system_prompt = "You are a precise and structured writer who follows instructions carefully." user_prompt = WRITER_PROMPT_TEMPLATE.format(topic=topic, snippets=joined_snippets) logger.info("Writer: generating first draft...") draft = client.generate(system_prompt=system_prompt, user_prompt=user_prompt) meta = state.get("meta", {}) or {} meta["writer_time_sec"] = round(time.time() - start, 3) new_state: AgentState = { **state, "draft": draft, "meta": meta, } log_state_summary(new_state, prefix="Writer") return new_state