import langwatch
from langwatch.types import RAGChunk
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores.faiss import FAISS
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.tools.retriever import create_retriever_tool
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain.prompts import ChatPromptTemplate
from langchain.schema.runnable.config import RunnableConfig
# 1. Setup LangWatch (if not done globally)
# langwatch.setup()
# 2. Prepare your retriever
loader = WebBaseLoader("https://docs.langwatch.ai/introduction") # Example source
docs = loader.load()
documents = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200
).split_documents(docs)
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
retriever = vector.as_retriever()
# 3. Wrap the retriever for LangWatch RAG capture
# This lambda tells LangWatch how to extract data for RAGChunk from LangChain's Document
langwatch_retriever_tool = create_retriever_tool(
langwatch.langchain.capture_rag_from_retriever(
retriever,
lambda document: RAGChunk(
document_id=document.metadata.get("source", "unknown_source"), # Use a fallback for source
content=document.page_content,
# You can add other fields like 'score' if available in document.metadata
),
),
"langwatch_docs_search", # Tool name
"Search for information about LangWatch.", # Tool description
)
# 4. Use the wrapped retriever in your agent/chain
tools = [langwatch_retriever_tool]
model = ChatOpenAI(model="gpt-5", streaming=True)
prompt = ChatPromptTemplate.from_messages(
[
("system", "You are a helpful assistant. Answer questions based on the retrieved context.\n{agent_scratchpad}"),
("human", "{question}"),
]
)
agent = create_tool_calling_agent(model, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True) # type: ignore
@langwatch.trace(name="LangChain RAG Agent Execution")
def run_langchain_rag(user_input: str):
current_trace = langwatch.get_current_trace()
current_trace.update(metadata={"user_id": "lc_rag_user"})
# Ensure the LangChain callback is used to capture all LangChain steps
response = agent_executor.invoke(
{"question": user_input},
config=RunnableConfig(
callbacks=[current_trace.get_langchain_callback()]
),
)
output = response.get("output", "No output found.")=
return output
if __name__ == "__main__":
question = "What is LangWatch?"
answer = run_langchain_rag(question)
print(f"Question: {question}")
print(f"Answer: {answer}")