Spaces:
Sleeping
Sleeping
| import argparse | |
| import json | |
| import sys | |
| from typing import Any, Dict, List | |
| import httpx | |
| def parse_args() -> argparse.Namespace: | |
| parser = argparse.ArgumentParser( | |
| description=( | |
| "Smoke-test the /chat endpoint of the RAG backend. " | |
| "Optionally ingests a couple of Wikipedia pages first." | |
| ) | |
| ) | |
| parser.add_argument( | |
| "--backend-url", | |
| type=str, | |
| default="http://localhost:8000", | |
| help="Base URL of the running backend (default: http://localhost:8000).", | |
| ) | |
| parser.add_argument( | |
| "--namespace", | |
| type=str, | |
| default="dev", | |
| help="Target Pinecone namespace (default: dev).", | |
| ) | |
| parser.add_argument( | |
| "--skip-ingest", | |
| action="store_true", | |
| help="Skip the initial Wikipedia ingestion step.", | |
| ) | |
| return parser.parse_args() | |
| def ingest_wiki(client: httpx.Client, base_url: str, namespace: str) -> None: | |
| url = f"{base_url.rstrip('/')}/ingest/wiki" | |
| payload: Dict[str, Any] = { | |
| "titles": [ | |
| "Retrieval-augmented generation", | |
| "Vector database", | |
| ], | |
| "namespace": namespace, | |
| } | |
| print(f"[smoke_chat] POST {url} with payload:", file=sys.stderr) | |
| print(json.dumps(payload, indent=2), file=sys.stderr) | |
| try: | |
| resp = client.post(url, json=payload) | |
| resp.raise_for_status() | |
| except httpx.HTTPError as exc: | |
| print(f"[smoke_chat] Wiki ingest failed: {exc}", file=sys.stderr) | |
| if resp.content: | |
| print(resp.text, file=sys.stderr) | |
| return | |
| print("[smoke_chat] Wiki ingest response:", file=sys.stderr) | |
| print(json.dumps(resp.json(), indent=2), file=sys.stderr) | |
| def call_chat(client: httpx.Client, base_url: str, namespace: str) -> None: | |
| url = f"{base_url.rstrip('/')}/chat" | |
| payload: Dict[str, Any] = { | |
| "query": "What is retrieval-augmented generation?", | |
| "namespace": namespace, | |
| "top_k": 5, | |
| "use_web_fallback": True, | |
| "min_score": 0.25, | |
| "max_web_results": 5, | |
| "chat_history": [ | |
| { | |
| "role": "user", | |
| "content": "You are helping me understand retrieval-augmented generation.", | |
| } | |
| ], | |
| } | |
| print(f"[smoke_chat] POST {url} with payload:", file=sys.stderr) | |
| print(json.dumps(payload, indent=2), file=sys.stderr) | |
| resp = client.post(url, json=payload) | |
| try: | |
| resp.raise_for_status() | |
| except httpx.HTTPError as exc: | |
| print(f"[smoke_chat] /chat request failed: {exc}", file=sys.stderr) | |
| if resp.content: | |
| print(resp.text, file=sys.stderr) | |
| return | |
| data = resp.json() | |
| print("[smoke_chat] /chat response:", file=sys.stderr) | |
| print(json.dumps(data, indent=2), file=sys.stderr) | |
| answer = data.get("answer", "") | |
| sources: List[Dict[str, Any]] = data.get("sources", [])[:3] | |
| print("\nAnswer:\n", answer) | |
| print("\nFirst up to 3 sources:") | |
| for src in sources: | |
| print( | |
| f"- [{src.get('source')}] {src.get('title')} ({src.get('url', '')}) " | |
| f"score={src.get('score')}", | |
| ) | |
| def main() -> int: | |
| args = parse_args() | |
| base_url = args.backend_url | |
| with httpx.Client(timeout=60.0) as client: | |
| if not args.skip_ingest: | |
| ingest_wiki(client, base_url, args.namespace) | |
| call_chat(client, base_url, args.namespace) | |
| return 0 | |
| if __name__ == "__main__": | |
| raise SystemExit(main()) |