File size: 3,488 Bytes
e63c592
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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())