| """ |
| 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() |
|
|