codescraftman / ethanicbot / langchain / agent.py
agent.py
Raw
from ethanicbot.langchain.retriever import load_vectorstore
from langgraph.graph import StateGraph, END
from langchain.prompts import PromptTemplate
from langchain_community.llms import OpenAI

retriever = load_vectorstore()
llm = OpenAI(temperature=0)

prompt = PromptTemplate.from_template("""
You are Ethanic Bot, a personal portfolio assistant. Use the following context:

{context}

User: {question}
Bot:
""")

def retrieval_node(state):
    query = state["input"]
    docs = retriever.similarity_search(query)
    context = "\n".join([d.page_content for d in docs])
    state["context"] = context
    return state

def generate_node(state):
    formatted = prompt.format(question=state["input"], context=state["context"])
    state["response"] = llm(formatted)
    return state

def get_agent():
    # Define a state schema with the expected keys
    state_schema = {
        "input": str,    # Expecting a string input
        "context": str,  # Expecting a string context
        "response": str  # Expecting a string response
    }

    # Initialize the StateGraph with the schema
    workflow = StateGraph(state_schema=state_schema)

    # Add nodes to the workflow
    workflow.add_node("retrieve", retrieval_node)
    workflow.add_node("generate", generate_node)
    
    # Define the flow of execution in the workflow
    workflow.set_entry_point("retrieve")
    workflow.add_edge("retrieve", "generate")
    workflow.set_finish_point("generate")

    # Compile and return the agent
    return workflow.compile()