diff --git a/src/cli.py b/src/cli.py new file mode 100644 index 0000000..9c43b61 --- /dev/null +++ b/src/cli.py @@ -0,0 +1,67 @@ +"""Interactive command‑line client for the RAG agent. + +Commands: + /add – add a new document to the knowledge base. + /search – perform a semantic search. + /quit – exit the program. + +Any other input is treated as a user message and is processed by the agent. +""" + +from typing import List + +from .agent import run_agent +from .tools import search_knowledge_base, add_to_knowledge_base + +def main() -> None: + print("Welcome to the RAG agent CLI. Type /help for commands.") + history: List[dict] = [] + while True: + try: + user_input = input(">>> ") + except EOFError: + break + if not user_input: + continue + if user_input.startswith("/"): + cmd, *args = user_input.split(maxsplit=1) + if cmd == "/quit": + print("Goodbye!") + break + elif cmd == "/help": + print("Commands: /add, /search, /quit") + continue + elif cmd == "/add": + title = input("Title: ") + print("Enter content (end with a single line containing only 'END'):\n") + lines = [] + while True: + line = input() + if line.strip() == "END": + break + lines.append(line) + content = "\n".join(lines) + response = add_to_knowledge_base(content, title) + print(response) + continue + elif cmd == "/search": + query = input("Query: ") + results = search_knowledge_base(query, max_results=5) + if not results: + print("No results found.") + else: + for i, res in enumerate(results, 1): + print(f"{i}. Title: {res['title']}, Score: {res['score']:.4f}") + print(f" {res['content'][:200]}...\n") + continue + else: + print("Unknown command. Type /help for list of commands.") + continue + # Normal user message + history.append({"role": "user", "content": user_input}) + reply = run_agent(history) + print(f"Assistant: {reply}") + history.append({"role": "assistant", "content": reply}) + +if __name__ == "__main__": + main() \ No newline at end of file