|
|
import os |
|
|
import time |
|
|
import json |
|
|
from dotenv import load_dotenv |
|
|
from langchain_community.tools import DuckDuckGoSearchRun |
|
|
from langchain_community.tools import TavilySearchResults |
|
|
from langgraph.graph import MessagesState |
|
|
from langchain_core.prompts import PromptTemplate |
|
|
from langchain_core.messages import HumanMessage, SystemMessage |
|
|
from langgraph.graph import START, StateGraph |
|
|
from langgraph.prebuilt import tools_condition |
|
|
from langgraph.prebuilt import ToolNode |
|
|
from langgraph.graph.state import CompiledStateGraph |
|
|
|
|
|
|
|
|
load_dotenv(override=True) |
|
|
tavily_api_key = os.getenv("TAVILY_API_KEY") |
|
|
|
|
|
|
|
|
def blog_titles_agent(llm, state): |
|
|
|
|
|
queries = state["search_queries"] |
|
|
|
|
|
def tavily_search(query: str) -> str: |
|
|
""" |
|
|
Performs a search on Tavily using the provided query. |
|
|
|
|
|
Args: |
|
|
query (str): The search query to be executed. |
|
|
|
|
|
Returns: |
|
|
str: The result of the search query. |
|
|
""" |
|
|
tavily = TavilySearchResults( |
|
|
max_results=5, |
|
|
search_depth="advanced", |
|
|
include_answer=True, |
|
|
include_raw_content=True, |
|
|
api_key=tavily_api_key, |
|
|
) |
|
|
|
|
|
text = tavily.invoke({"query": f"{query}"}) |
|
|
print("Tool Call") |
|
|
return text |
|
|
|
|
|
|
|
|
tool = [tavily_search] |
|
|
|
|
|
llm_with_tools = llm.bind_tools(tool) |
|
|
|
|
|
|
|
|
sys_msg = SystemMessage(content=""" |
|
|
Task: You are an expert Blog Title generator. Generate a blog Title on the Topic given to you by using the examples below as a guide. |
|
|
|
|
|
Examples: |
|
|
- Is It Time To Replace Your Boiler |
|
|
- Cold Radiators Let’s Look at the Reasons |
|
|
- Why Invest in a New Central Heating System |
|
|
- When Is the Right Time to Replace Your Boiler |
|
|
- Common Boiler Faults That Are Repaired by Gas Engineers |
|
|
- Air Source Heat Pumps vs. Traditional Boilers: Which Is Right for You |
|
|
- What Are Smart Thermostats and Are They Worth Installing |
|
|
|
|
|
Context: |
|
|
- Generate only 3 Blog Titles. |
|
|
- The blog Title should be engaging. |
|
|
- Always Use the attached tool tavily_search to get the latest information about the Topic. |
|
|
|
|
|
Constraints: |
|
|
- Dont include any punctuation mark in the Title. |
|
|
|
|
|
Output Format: |
|
|
- Give the Blog Titles in the JSON List of String Format. |
|
|
- Don't include any extra information. |
|
|
|
|
|
""") |
|
|
|
|
|
|
|
|
def assistant(state: MessagesState) -> MessagesState: |
|
|
return {"messages": [llm_with_tools.invoke([sys_msg] + state["messages"])]} |
|
|
|
|
|
|
|
|
builder: StateGraph = StateGraph(MessagesState) |
|
|
|
|
|
builder.add_node("assistant", assistant) |
|
|
builder.add_node("tools", ToolNode(tool)) |
|
|
|
|
|
|
|
|
builder.add_edge(START, "assistant") |
|
|
builder.add_conditional_edges( |
|
|
"assistant", |
|
|
tools_condition, |
|
|
) |
|
|
builder.add_edge("tools", "assistant") |
|
|
react_graph: CompiledStateGraph = builder.compile() |
|
|
|
|
|
|
|
|
titles = [] |
|
|
for q in queries: |
|
|
|
|
|
messages = [HumanMessage(content=f"Search this query: {q}")] |
|
|
messages = react_graph.invoke({"messages": messages}) |
|
|
print("\n",messages) |
|
|
t = messages['messages'][-1].content |
|
|
t = t.replace("json", "").replace("```", "").strip() |
|
|
t = json.loads(t) |
|
|
for i in t: |
|
|
titles.append(i) |
|
|
|
|
|
print(titles) |
|
|
return {"blog_topics": titles} |
|
|
|
|
|
|
|
|
def blog_titles_llm(llm, state): |
|
|
topic = state["topic"] |
|
|
blog_titles_prompt_template = PromptTemplate.from_template(""" |
|
|
Task: You are an expert Blog Titles generator. Generate a blog Title on the Category given to you by using the examples below as a guide. |
|
|
|
|
|
|
|
|
Examples: |
|
|
- Is It Time To Replace Your Boiler |
|
|
- Cold Radiators Let’s Look at the Reasons |
|
|
- Why Invest in a New Central Heating System |
|
|
- When Is the Right Time to Replace Your Boiler |
|
|
- Common Boiler Faults That Are Repaired by Gas Engineers |
|
|
- Air Source Heat Pumps vs. Traditional Boilers: Which Is Right for You |
|
|
- What Are Smart Thermostats and Are They Worth Installing |
|
|
|
|
|
Context: |
|
|
- Generate atleast 10 Blog Titles. |
|
|
- The blog Title should be engaging. |
|
|
|
|
|
Constraints: |
|
|
- Dont include any punctuation mark in the Title. |
|
|
|
|
|
Output Format: |
|
|
- Give the Blog Titles in the JSON List of String Format. |
|
|
- Don't include any extra information. |
|
|
|
|
|
Category = {category} |
|
|
""") |
|
|
|
|
|
prompt = blog_titles_prompt_template.invoke({"category": topic}) |
|
|
response = llm.invoke(prompt) |
|
|
content = response.content |
|
|
titles = content.replace("json", "").replace("```", "").strip() |
|
|
titles = json.loads(titles) |
|
|
print(titles) |
|
|
return {"blog_topics": titles} |