|
|
""" |
|
|
API Test Script |
|
|
=============== |
|
|
|
|
|
Simple script to test the Multi-Agent RAG API endpoints. |
|
|
|
|
|
Run the API server first: |
|
|
uvicorn app.main:app --reload |
|
|
|
|
|
Then run this script: |
|
|
python scripts/test_api.py |
|
|
""" |
|
|
|
|
|
import asyncio |
|
|
import httpx |
|
|
import json |
|
|
from typing import Optional |
|
|
|
|
|
BASE_URL = "http://localhost:8000/api/v1" |
|
|
|
|
|
|
|
|
async def test_health(): |
|
|
"""Test health endpoint.""" |
|
|
print("\n" + "=" * 50) |
|
|
print("Testing Health Endpoint") |
|
|
print("=" * 50) |
|
|
|
|
|
async with httpx.AsyncClient() as client: |
|
|
response = await client.get(f"{BASE_URL}/health") |
|
|
print(f"Status: {response.status_code}") |
|
|
print(f"Response: {json.dumps(response.json(), indent=2)}") |
|
|
return response.json() |
|
|
|
|
|
|
|
|
async def test_ingest(): |
|
|
"""Test document ingestion.""" |
|
|
print("\n" + "=" * 50) |
|
|
print("Testing Document Ingestion") |
|
|
print("=" * 50) |
|
|
|
|
|
async with httpx.AsyncClient(timeout=120.0) as client: |
|
|
response = await client.post( |
|
|
f"{BASE_URL}/ingest", |
|
|
json={"force_reindex": True} |
|
|
) |
|
|
print(f"Status: {response.status_code}") |
|
|
print(f"Response: {json.dumps(response.json(), indent=2)}") |
|
|
return response.json() |
|
|
|
|
|
|
|
|
async def test_query(query: str, conversation_id: Optional[str] = None): |
|
|
"""Test query endpoint.""" |
|
|
print("\n" + "=" * 50) |
|
|
print(f"Testing Query: {query}") |
|
|
print("=" * 50) |
|
|
|
|
|
async with httpx.AsyncClient(timeout=120.0) as client: |
|
|
payload = { |
|
|
"query": query, |
|
|
"include_sources": True |
|
|
} |
|
|
if conversation_id: |
|
|
payload["conversation_id"] = conversation_id |
|
|
|
|
|
response = await client.post( |
|
|
f"{BASE_URL}/query", |
|
|
json=payload |
|
|
) |
|
|
print(f"Status: {response.status_code}") |
|
|
|
|
|
if response.status_code == 200: |
|
|
result = response.json() |
|
|
print(f"\nAnswer:\n{result['answer']}") |
|
|
print(f"\nAgent Trace: {' -> '.join(result['agent_trace'])}") |
|
|
print(f"Processing Time: {result['processing_time_ms']:.2f}ms") |
|
|
print(f"Sources: {len(result['sources'])} documents") |
|
|
|
|
|
if result['sources']: |
|
|
print("\nTop Source:") |
|
|
source = result['sources'][0] |
|
|
print(f" - Score: {source['relevance_score']:.2f}") |
|
|
print(f" - Source: {source['source']}") |
|
|
print(f" - Content: {source['content'][:200]}...") |
|
|
|
|
|
return result |
|
|
else: |
|
|
print(f"Error: {response.text}") |
|
|
return None |
|
|
|
|
|
|
|
|
async def test_document_count(): |
|
|
"""Test document count endpoint.""" |
|
|
print("\n" + "=" * 50) |
|
|
print("Testing Document Count") |
|
|
print("=" * 50) |
|
|
|
|
|
async with httpx.AsyncClient() as client: |
|
|
response = await client.get(f"{BASE_URL}/documents/count") |
|
|
print(f"Status: {response.status_code}") |
|
|
print(f"Response: {json.dumps(response.json(), indent=2)}") |
|
|
return response.json() |
|
|
|
|
|
|
|
|
async def run_all_tests(): |
|
|
"""Run all API tests.""" |
|
|
print("\n" + "#" * 60) |
|
|
print("# Multi-Agent RAG System - API Tests") |
|
|
print("#" * 60) |
|
|
|
|
|
|
|
|
health = await test_health() |
|
|
if health['status'] != 'healthy': |
|
|
print("ERROR: API is not healthy!") |
|
|
return |
|
|
|
|
|
|
|
|
ingest_result = await test_ingest() |
|
|
if ingest_result.get('documents_processed', 0) == 0: |
|
|
print("WARNING: No documents were ingested!") |
|
|
|
|
|
|
|
|
await test_document_count() |
|
|
|
|
|
|
|
|
test_queries = [ |
|
|
"How do I reset my password?", |
|
|
"What payment methods do you accept?", |
|
|
"How can I enable two-factor authentication?", |
|
|
"The app is running slow, what should I do?", |
|
|
"I want to talk to a human agent", |
|
|
] |
|
|
|
|
|
for query in test_queries: |
|
|
await test_query(query) |
|
|
|
|
|
|
|
|
print("\n" + "=" * 50) |
|
|
print("Testing Multi-turn Conversation") |
|
|
print("=" * 50) |
|
|
|
|
|
result1 = await test_query("What are your password requirements?") |
|
|
if result1: |
|
|
conversation_id = result1['conversation_id'] |
|
|
await test_query( |
|
|
"What if I don't receive the reset email?", |
|
|
conversation_id=conversation_id |
|
|
) |
|
|
|
|
|
print("\n" + "#" * 60) |
|
|
print("# All Tests Complete!") |
|
|
print("#" * 60) |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
print("Starting API Tests...") |
|
|
print("Make sure the API server is running at http://localhost:8000") |
|
|
asyncio.run(run_all_tests()) |
|
|
|