from langchain_openai import ChatOpenAI from pydantic import SecretStr from langchain.tools import tool from langchain_qdrant import QdrantVectorStore from qdrant_client import QdrantClient from qdrant_client.http.models import Distance, VectorParams from langchain_ollama import OllamaEmbeddings from langchain_core.documents import Document from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain.agents import create_agent import os # ---------- LLM ---------- llm = ChatOpenAI( model="openai/gpt-oss-20b", base_url='https://platform.brojs.ru/jrnl-bh/api/inference/v1', api_key=SecretStr("jrnl_30283ab953615cbb6846ff9940a1eedce0b76d7b2f59a2394f29e74643e6a90d"), temperature=0.7, ) # ---------- Vector Store ---------- client = QdrantClient(":memory:") client.create_collection( collection_name="knowledge_base", vectors_config=VectorParams(size=1024, distance=Distance.COSINE), ) embeddings = OllamaEmbeddings(model="nomic-embed-text") vector_store = QdrantVectorStore( client=client, collection_name="knowledge_base", embedding=embeddings, ) # ---------- Text Splitter ---------- splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100) # ---------- Tools ---------- @tool def add_to_knowledge_base(content: str, title: str) -> str: """Add a document to the knowledge base.""" docs = splitter.split_text(content) documents = [Document(page_content=c, metadata={"title": title}) for c in docs] vector_store.add_documents(documents) return f"Added {len(docs)} chunks under title '{title}'." @tool def search_knowledge_base(query: str, max_results: int = 5) -> str: """Search the knowledge base for relevant information.""" results = vector_store.similarity_search_with_score(query, k=max_results) if not results: return "No relevant documents found." out_lines = [] for doc, score in results: title = doc.metadata.get("title", "Untitled") out_lines.append(f"[{score:.2f}] {title}: {doc.page_content[:200]}...") return "\n".join(out_lines) # ---------- Agent ---------- system_prompt = """ You are an assistant with access to a knowledge base. Use the tools `add_to_knowledge_base` and `search_knowledge_base` as needed. Respond concisely. If you need more info, ask the user. """ agent = create_agent( model=llm, tools=[add_to_knowledge_base, search_knowledge_base], system_prompt=system_prompt, ) # ---------- CLI ---------- def main(): print("RAG Agent CLI. Commands: /add <content>, /search <query>, /quit") while True: try: inp = input("> ").strip() except EOFError: break if not inp: continue if inp.lower() in ("exit", "quit", "/quit"): print("Bye!") break if inp.startswith("/add "): parts = inp[5:].split(None, 1) if len(parts) != 2: print("Usage: /add <title> <content>") continue title, content = parts res = add_to_knowledge_base(content=content, title=title) print(res) elif inp.startswith("/search "): query = inp[8:].strip() if not query: print("Usage: /search <query>") continue res = search_knowledge_base(query=query, max_results=5) print(res) else: # Regular chat with agent result = agent.invoke({"messages": [{"role": "human", "content": inp}]}) ai_msg = result["messages"][-1] print(ai_msg.content) if __name__ == "__main__": main()