#!/usr/bin/env python
"""Run the multi-hop agent as a standalone CLI."""
from __future__ import annotations
import argparse
import os
import sys
from pathlib import Path
from dotenv import load_dotenv
PROJECT_ROOT = Path(__file__).resolve().parents[1]
load_dotenv(PROJECT_ROOT / "05_generation" / ".env")
sys.path.insert(0, str(PROJECT_ROOT / "03_embedding"))
from embed_query import load_client
from multihop_agent import MultiHopAgent, MultiHopConfig
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Run CognitiveRAG multi-hop agent")
parser.add_argument("--query", required=True, help="User query text.")
parser.add_argument("--strategy", choices=["dense", "sparse", "hybrid"], default="hybrid")
parser.add_argument("--max-hops", type=int, default=3)
parser.add_argument("--per-hop-top-k", type=int, default=8)
parser.add_argument("--total-doc-budget", type=int, default=24)
parser.add_argument("--sufficiency-threshold", type=float, default=0.75)
parser.add_argument("--time-limit-sec", type=int, default=60)
parser.add_argument("--output-dir", default=os.path.join("03_embedding", "output", "multihop_traces"))
return parser.parse_args()
def main() -> None:
args = parse_args()
api_key = os.getenv("NVIDIA_API_KEY")
if not api_key:
raise SystemExit("Missing NVIDIA_API_KEY for embeddings.")
client = load_client("nvidia/llama-3.2-nv-embedqa-1b-v2", api_key, "NONE")
embed_fn = lambda text: client.embed_query(text)
config = MultiHopConfig(
max_hops=args.max_hops,
per_hop_top_k=args.per_hop_top_k,
total_doc_budget=args.total_doc_budget,
sufficiency_threshold=args.sufficiency_threshold,
time_limit_sec=args.time_limit_sec,
strategy=args.strategy,
)
agent = MultiHopAgent(embed_fn=embed_fn, config=config, output_dir=args.output_dir)
result = agent.run(args.query)
print("\nAnswer:")
print(result.answer)
print("\nCitations:")
for cite in result.citations:
print(f"- {cite}")
print(f"\nConfidence: {result.confidence:.2f}")
print(f"Termination: {result.termination_reason}")
print(f"Trace: {result.trace_path}")
if __name__ == "__main__":
main()