genaitiwari's picture
ai news completed
b213c2c
from tavily import TavilyClient
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
class AINewsNode:
def __init__(self,llm):
"""
Initialize the AINewsNode with API keys for Tavily and OpenAI.
"""
self.tavily = TavilyClient()
self.llm = llm
# this is used to capture various steps in this file so that later can be use for steps shown
self.state = {}
def fetch_news(self, state: dict) -> dict:
"""
Fetch AI news based on the specified frequency.
Args:
state (dict): The state dictionary containing 'frequency'.
Returns:
dict: Updated state with 'news_data' key containing fetched news.
"""
frequency = state['messages'][0].content.lower()
self.state['frequency'] = frequency
time_range_map = {'daily': 'd', 'weekly': 'w', 'monthly': 'm', 'year': 'y'}
days_map = {'daily': 1, 'weekly': 7, 'monthly': 30, 'year': 366}
response = self.tavily.search(
query="Top Artificial Intelligence (AI) technology news India and globally",
topic="news",
time_range=time_range_map[frequency],
include_answer="advanced",
max_results=15,
days=days_map[frequency],
# include_domains=["techcrunch.com", "venturebeat.com/ai", ...] # Uncomment and add domains if needed
)
state['news_data'] = response.get('results', [])
self.state['news_data'] = state['news_data']
return state
def summarize_news(self, state: dict) -> dict:
"""
Summarize the fetched news using an LLM.
Args:
state (dict): The state dictionary containing 'news_data'.
Returns:
dict: Updated state with 'summary' key containing the summarized news.
"""
news_items = self.state['news_data']
prompt_template = ChatPromptTemplate.from_messages([
("system", """Summarize AI news articles into markdown format. For each item include:
- Date in **YYYY-MM-DD** format in IST timezone
- Concise sentences summary from latest news
- Sort news by date wise (latest first)
- Source URL as link
Use format:
### [Date]
- [Summary](URL)"""),
("user", "Articles:\n{articles}")
])
articles_str = "\n\n".join([
f"Content: {item.get('content', '')}\nURL: {item.get('url', '')}\nDate: {item.get('published_date', '')}"
for item in news_items
])
response = self.llm.invoke(prompt_template.format(articles=articles_str))
state['summary'] = response.content
self.state['summary'] = state['summary']
return self.state
def save_result(self,state):
frequency = self.state['frequency']
summary = self.state['summary']
filename = f"./AINews/{frequency}_summary.md"
with open(filename, 'w') as f:
f.write(f"# {frequency.capitalize()} AI News Summary\n\n")
f.write(summary)
self.state['filename'] = filename
return self.state