from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langgraph.graph import START, StateGraph from langchain_core.messages import HumanMessage, AIMessage, BaseMessage, SystemMessage from typing import List from typing_extensions import List, TypedDict from langchain_core.documents import Document import os from backend.pinecone_utilis import vectorstore from dotenv import load_dotenv load_dotenv() OPENAI_API_KEY=os.getenv("OPENAI_API_KEY") retriever = vectorstore.as_retriever(search_kwargs={"k": 4}) llm = ChatOpenAI( model='gpt-4.1', api_key=OPENAI_API_KEY ) output_parser = StrOutputParser() contextualize_q_system_prompt = ( "Given a chat history and the latest user question " "which might reference context in the chat history, " "formulate a standalone question which can be understood " "without the chat history. Do NOT answer the question, " "just reformulate it if needed and otherwise return it as is." ) contextualize_q_prompt = ChatPromptTemplate.from_messages([ ("system", contextualize_q_system_prompt), MessagesPlaceholder("chat_history"), ("human", "{input}"), ]) qa_prompt = ChatPromptTemplate.from_messages([ ("system", "You are a helpful AI assistant. Use the following context to answer the user's question."), ("system", "Context: {context}"), MessagesPlaceholder(variable_name="chat_history"), ("human", "{input}") ]) class State(TypedDict): messages: List[BaseMessage] # Define application steps def retrieve(query: str): retrieved_docs = vectorstore.similarity_search(query) return retrieved_docs def generate_response(query: str, state: State)->State: retrieved_docs=retrieve(query=query) docs_content = "\n\n".join(doc.page_content for doc in retrieved_docs) system_message = SystemMessage( content="You are a helpful AI assistant. Answer the user's question using ONLY the information provided below. " "If the answer is not in the context, say 'I don't know.' Do not make up information. " f"Context: {docs_content}" ) state['messages'].append(system_message) state['messages'].append(HumanMessage(content=query)) response = llm.invoke(state["messages"]) state['messages'].append(AIMessage(content=response.content)) return state