|
|
""" |
|
|
Test script for context-aware chat functionality |
|
|
This demonstrates the new chat endpoint with conversation context |
|
|
""" |
|
|
|
|
|
import requests |
|
|
import json |
|
|
from typing import Optional |
|
|
|
|
|
|
|
|
BASE_URL = "http://localhost:8000" |
|
|
API_TOKEN = None |
|
|
|
|
|
|
|
|
def login(email: str, password: str) -> Optional[str]: |
|
|
"""Login and get access token""" |
|
|
url = f"{BASE_URL}/auth/login" |
|
|
payload = {"email": email, "password": password} |
|
|
|
|
|
try: |
|
|
response = requests.post(url, json=payload) |
|
|
response.raise_for_status() |
|
|
data = response.json() |
|
|
token = data.get("session", {}).get("access_token") |
|
|
print(f"β Login successful") |
|
|
return token |
|
|
except Exception as e: |
|
|
print(f"β Login failed: {e}") |
|
|
return None |
|
|
|
|
|
|
|
|
def create_conversation(token: str, title: str = "Test Conversation") -> Optional[str]: |
|
|
"""Create a new conversation""" |
|
|
url = f"{BASE_URL}/chat-history/conversations" |
|
|
headers = {"Authorization": f"Bearer {token}"} |
|
|
payload = {"title": title} |
|
|
|
|
|
try: |
|
|
response = requests.post(url, json=payload, headers=headers) |
|
|
response.raise_for_status() |
|
|
data = response.json() |
|
|
conv_id = data.get("id") |
|
|
print(f"β Conversation created: {conv_id}") |
|
|
return conv_id |
|
|
except Exception as e: |
|
|
print(f"β Failed to create conversation: {e}") |
|
|
return None |
|
|
|
|
|
|
|
|
def send_chat_message( |
|
|
token: str, |
|
|
query: str, |
|
|
conversation_id: Optional[str] = None |
|
|
) -> dict: |
|
|
"""Send a chat message with context awareness""" |
|
|
url = f"{BASE_URL}/law-explanation/chat" |
|
|
headers = {"Authorization": f"Bearer {token}"} |
|
|
payload = { |
|
|
"query": query, |
|
|
"conversation_id": conversation_id |
|
|
} |
|
|
|
|
|
try: |
|
|
response = requests.post(url, json=payload, headers=headers) |
|
|
response.raise_for_status() |
|
|
data = response.json() |
|
|
return data |
|
|
except Exception as e: |
|
|
print(f"β Chat request failed: {e}") |
|
|
if hasattr(e, 'response'): |
|
|
print(f"Response: {e.response.text}") |
|
|
return {} |
|
|
|
|
|
|
|
|
def get_conversation_history(token: str, conversation_id: str) -> list: |
|
|
"""Get conversation messages""" |
|
|
url = f"{BASE_URL}/chat-history/conversations/{conversation_id}/messages" |
|
|
headers = {"Authorization": f"Bearer {token}"} |
|
|
|
|
|
try: |
|
|
response = requests.get(url, headers=headers) |
|
|
response.raise_for_status() |
|
|
return response.json() |
|
|
except Exception as e: |
|
|
print(f"β Failed to get messages: {e}") |
|
|
return [] |
|
|
|
|
|
|
|
|
def print_response(response: dict, test_name: str): |
|
|
"""Pretty print the response""" |
|
|
print(f"\n{'='*60}") |
|
|
print(f"Test: {test_name}") |
|
|
print(f"{'='*60}") |
|
|
|
|
|
if not response: |
|
|
print("No response received") |
|
|
return |
|
|
|
|
|
print(f"Query: {response.get('query', 'N/A')}") |
|
|
print(f"Context Used: {response.get('context_used', False)}") |
|
|
print(f"Is Non-Legal: {response.get('is_non_legal', False)}") |
|
|
|
|
|
if response.get('original_query'): |
|
|
print(f"Original Query: {response['original_query']}") |
|
|
if response.get('summarized_query'): |
|
|
print(f"Summarized Query: {response['summarized_query']}") |
|
|
|
|
|
print(f"\nSummary: {response.get('summary', 'N/A')}") |
|
|
print(f"\nExplanation: {response.get('explanation', 'N/A')[:200]}...") |
|
|
print(f"\nSources: {len(response.get('sources', []))} documents") |
|
|
print(f"{'='*60}\n") |
|
|
|
|
|
|
|
|
def run_test_scenario(token: str): |
|
|
"""Run comprehensive test scenarios""" |
|
|
print("\n" + "="*60) |
|
|
print("CONTEXT-AWARE CHAT TEST SCENARIOS") |
|
|
print("="*60 + "\n") |
|
|
|
|
|
|
|
|
conv_id = create_conversation(token, "Context Awareness Test") |
|
|
if not conv_id: |
|
|
print("Cannot proceed without conversation ID") |
|
|
return |
|
|
|
|
|
|
|
|
print("\n--- Test 1: Initial Legal Query (No Context) ---") |
|
|
response1 = send_chat_message( |
|
|
token, |
|
|
"I had a fight with my brother over property", |
|
|
conv_id |
|
|
) |
|
|
print_response(response1, "Initial Property Dispute Query") |
|
|
|
|
|
|
|
|
print("\n--- Test 2: Dependent Follow-up Query (With Context) ---") |
|
|
response2 = send_chat_message( |
|
|
token, |
|
|
"He is making fake allegations", |
|
|
conv_id |
|
|
) |
|
|
print_response(response2, "Follow-up About Brother's Allegations") |
|
|
|
|
|
|
|
|
print("\n--- Test 3: Another Dependent Query ---") |
|
|
response3 = send_chat_message( |
|
|
token, |
|
|
"What evidence do I need to counter this?", |
|
|
conv_id |
|
|
) |
|
|
print_response(response3, "Evidence Question (Continuation)") |
|
|
|
|
|
|
|
|
print("\n--- Test 4: Independent New Topic ---") |
|
|
response4 = send_chat_message( |
|
|
token, |
|
|
"How do I apply for citizenship in Nepal?", |
|
|
conv_id |
|
|
) |
|
|
print_response(response4, "New Independent Query - Citizenship") |
|
|
|
|
|
|
|
|
print("\n--- Test 5: Non-Legal Query (Greeting) ---") |
|
|
response5 = send_chat_message( |
|
|
token, |
|
|
"Thank you so much for your help!", |
|
|
conv_id |
|
|
) |
|
|
print_response(response5, "Gratitude Message") |
|
|
|
|
|
|
|
|
print("\n--- Test 6: Non-Legal Query (Greeting) ---") |
|
|
response6 = send_chat_message( |
|
|
token, |
|
|
"Hi, how are you?", |
|
|
conv_id |
|
|
) |
|
|
print_response(response6, "Casual Greeting") |
|
|
|
|
|
|
|
|
print("\n--- Test 7: Back to Legal Topic ---") |
|
|
response7 = send_chat_message( |
|
|
token, |
|
|
"What are the divorce laws in Nepal?", |
|
|
conv_id |
|
|
) |
|
|
print_response(response7, "New Legal Topic - Divorce") |
|
|
|
|
|
|
|
|
print("\n" + "="*60) |
|
|
print("CONVERSATION HISTORY SUMMARY") |
|
|
print("="*60) |
|
|
messages = get_conversation_history(token, conv_id) |
|
|
print(f"Total messages in conversation: {len(messages)}") |
|
|
|
|
|
for i, msg in enumerate(messages, 1): |
|
|
role = msg.get('role', 'unknown') |
|
|
content = msg.get('content', '') |
|
|
print(f"\n{i}. [{role.upper()}]: {content[:100]}...") |
|
|
|
|
|
|
|
|
def run_edge_case_tests(token: str): |
|
|
"""Test edge cases""" |
|
|
print("\n" + "="*60) |
|
|
print("EDGE CASE TESTS") |
|
|
print("="*60 + "\n") |
|
|
|
|
|
|
|
|
print("\n--- Test: No Conversation ID (Standalone Query) ---") |
|
|
response = send_chat_message( |
|
|
token, |
|
|
"What are tenant rights in Nepal?", |
|
|
conversation_id=None |
|
|
) |
|
|
print_response(response, "Standalone Query Without Conversation") |
|
|
|
|
|
|
|
|
conv_id = create_conversation(token, "Empty Conversation Test") |
|
|
print("\n--- Test: First Message in New Conversation ---") |
|
|
response = send_chat_message( |
|
|
token, |
|
|
"Tell me about labor laws", |
|
|
conversation_id=conv_id |
|
|
) |
|
|
print_response(response, "First Message in Fresh Conversation") |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
print(""" |
|
|
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ |
|
|
β Context-Aware Chat Testing Suite β |
|
|
β Tests conversation context awareness, independence β |
|
|
β detection, and non-legal query filtering β |
|
|
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ |
|
|
""") |
|
|
|
|
|
|
|
|
print("Please provide your test credentials:") |
|
|
email = input("Email: ").strip() |
|
|
password = input("Password: ").strip() |
|
|
|
|
|
|
|
|
token = login(email, password) |
|
|
if not token: |
|
|
print("\nCannot proceed without authentication token") |
|
|
exit(1) |
|
|
|
|
|
|
|
|
try: |
|
|
run_test_scenario(token) |
|
|
print("\n" + "="*60) |
|
|
run_edge_case_tests(token) |
|
|
|
|
|
print("\n" + "="*60) |
|
|
print("ALL TESTS COMPLETED") |
|
|
print("="*60 + "\n") |
|
|
|
|
|
except KeyboardInterrupt: |
|
|
print("\n\nTests interrupted by user") |
|
|
except Exception as e: |
|
|
print(f"\n\nTest suite failed: {e}") |
|
|
import traceback |
|
|
traceback.print_exc() |
|
|
|