You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
6.4 KiB
Python

import os
import json
import asyncio
import sys
import uuid
from datetime import datetime
from unittest.mock import MagicMock, AsyncMock
# Set PYTHONPATH to include the current directory
sys.path.append(os.getcwd())
from src.ircfa_interaction.schema import ChatRequest
from src.auth.model import UserBase
from src.ircfa_interaction.stream2 import stream_create
from src.ircfa_interaction.model import ChatHistory as ChatHistoryModel, Conversation as ConversationModel
from src.database.core import async_session, collector_async_session
# Token provided by USER
TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTc3NTEwNzEzOS4wODk5NjksImp0aSI6InRjOU9MbndhMkxFckFPaXF1YVk4aXciLCJ0eXBlIjoiYWNjZXNzIiwic3ViIjoiMTUzZjdlMmUtZjBlYS00NDBjLTk5Y2QtN2E3ODJhZThhNjMxIiwibmJmIjoxNzc1MTA3MTM5LCJjc3JmIjoiMmRiNzI3MWEtYTU5Mi00ODU4LWJjMzAtNDY4NGU2ODI1YWNjIiwiZXhwIjoyMDkwNDY3MTM5LCJub25jZSI6ImQzYWNkMDE5YjNiNzkyNWU3ZTY0MDFiMGQyMzhmNDQxIiwidXNlcm5hbWUiOiJkZXZhZG1pbiJ9.YjmpfEFuOAvdOyp9wpPAaykdKGkHFwbNayyVPNDrw_-13-noQwY76lbns-aGF3DG35il2bbjQqNNBIAUFwcD0mDJqeWxaAQkbaL_SGLHpGU6Ul6DGNpyOE4jHxASI7B8DdiwRJkuI-zsA-4uISC8kIkyskOjv-HGFi7mwsxwScbtsWQ5d6dK9xzNCjbwYCVrskJHjEV6aXIYI1VisgbNFyx-hsvbVKKydka1Olu6iurv25ZopDgU0LwRtppALYMURcZYRm9Nrh6ZHLq5306rqUXsKwBbmzKQ8WMExfICvvk1zRPbCNG6-wJCf0E0Ft1XNuFfhbDIM-2N_zS3QCJQGw"
async def test_chat_flow(message: str, location_tag: str = None, conversation_id: str = None):
print(f"\n=== Testing Chat Flow / Intention Recognition ===")
print(f"User Message: {message}")
print(f"Initial Location Tag: {location_tag}")
print(f"Conversation ID: {conversation_id}")
# 1. Setup Mock User
current_user = UserBase(
user_id=str(uuid.uuid4()),
name="Test User",
role="admin"
)
# 2. Setup DB Sessions
async with async_session() as db_session:
async with collector_async_session() as collector_db_session:
# 3. Prepare Conversation ID
conv_uuid = uuid.UUID(conversation_id) if conversation_id else uuid.uuid4()
# Ensure Conversation exists in DB to prevent IntegrityError (FK constraint)
if not conversation_id:
new_conv = ConversationModel(
id=conv_uuid,
conversation_id=conv_uuid,
user_id=uuid.UUID(current_user.user_id),
conversation_title=f"Test: {message[:20]}...",
created_by=current_user.name,
updated_by=current_user.name
)
db_session.add(new_conv)
await db_session.commit()
print(f"✅ Created dummy conversation in DB: {conv_uuid}")
# 4. Create Request
request_as_rag = ChatRequest(
message=message,
conversation_id=conv_uuid,
message_id=uuid.uuid4(),
attachments=[],
equipment_id=None,
flow_type="llm_only",
model="icon-qwen",
context_state=None,
enable_background_analysis=True
)
# Mocking CommonParameters (it's a dict according to database/service.py)
common = {
"db_session": db_session,
"page": 1,
"items_per_page": 5
}
# 5. Invoke stream_create
print("Starting stream...")
try:
# We need to pass the request that stream_create expects.
# stream_create uses request.message and request.conversation_id
generator = stream_create(
db_session=db_session,
collector_db_session=collector_db_session,
request=request_as_rag,
upload_type=None,
location_tag=location_tag,
current_user=current_user,
token=TOKEN,
common=common
)
full_response = ""
async for chunk in generator:
if chunk.startswith("data: "):
content = chunk[6:].strip()
if content:
if content.startswith("{"):
# This is likely JSON (intention or metadata)
try:
data = json.loads(content)
if "intent" in data:
print(f"🎯 [Intention Detected]: {data['intent']} (Confidence: {data.get('confidence')})")
if data.get('suggested_tool'):
print(f"🛠️ [Tool Suggested]: {data['suggested_tool']}")
else:
print(f"[Metadata]: {content}")
except:
print(f"[Chunk]: {content}")
else:
# Normal text
print(content, end="", flush=True)
full_response += content
elif chunk.startswith("event: tool_result"):
print(f"\n🛠️ [Tool Result]: {chunk[18:].strip()}")
elif chunk.startswith("event: "):
print(f"\n[Event]: {chunk.strip()}")
print("\n\n=== Final Response ===")
# print(full_response)
return str(request_as_rag.conversation_id)
except Exception as e:
print(f"\n❌ Chat flow failed: {e}")
import traceback
traceback.print_exc()
return None
async def main():
# Test case 1: Asking for equipment condition (New Conversation)
print("\n--- TEST 1: New Query ---")
conv_id = await test_chat_flow("Bagaimana kondisi equipment CHS STACKER/RECLAIMER A saat ini?")
if conv_id:
# Test case 2: Follow-up question (Testing history & context persistence)
print(f"\n--- TEST 2: Follow-up (Context Persistence) ---")
await test_chat_flow("Apa penyebab utama kegagalannya?", conversation_id=conv_id)
# Test case 3: Search for location tag by name
print("\n--- TEST 3: Search by Name ---")
await test_chat_flow("Cari location tag untuk boiler")
if __name__ == "__main__":
asyncio.run(main())