scratch_chat / examples /integration_examples.py
WebashalarForML's picture
Upload 178 files
330b6e4 verified
#!/usr/bin/env python3
"""
Integration Examples - How to use Chat Service in different scenarios.
This file shows practical examples of integrating the chat service
with various types of applications.
"""
from chat_service_client import ChatServiceClient, MultiUserChatManager
import asyncio
import time
from typing import Dict, List
# Example 1: Learning Management System (LMS) Integration
class LearningPlatformIntegration:
"""
Example integration with a learning management system.
This shows how to maintain separate chat sessions for different
courses and students.
"""
def __init__(self, chat_service_url: str = "http://localhost:5000"):
self.chat_manager = MultiUserChatManager(chat_service_url, "LearningPlatform")
self.course_languages = {
"python-101": "python",
"js-fundamentals": "javascript",
"java-oop": "java",
"cpp-advanced": "cpp"
}
def enroll_student_in_course(self, student_id: str, course_id: str) -> str:
"""
Enroll a student in a course and start their chat session.
Args:
student_id: Unique student identifier
course_id: Course identifier
Returns:
Session ID for the student's chat
"""
language = self.course_languages.get(course_id, "python")
# Create unique user ID combining student and course
user_id = f"{student_id}_{course_id}"
metadata = {
"student_id": student_id,
"course_id": course_id,
"enrollment_date": time.strftime("%Y-%m-%d")
}
session_id = self.chat_manager.start_chat_for_user(user_id, language, metadata)
# Send welcome message
welcome_msg = f"Welcome to {course_id}! I'm your programming assistant. What would you like to learn about {language}?"
self.chat_manager.send_user_message(user_id, welcome_msg)
return session_id
def student_ask_question(self, student_id: str, course_id: str, question: str) -> str:
"""
Student asks a question in their course context.
Args:
student_id: Student identifier
course_id: Course identifier
question: Student's question
Returns:
AI assistant's response
"""
user_id = f"{student_id}_{course_id}"
try:
response = self.chat_manager.send_user_message(user_id, question)
return response['response']
except Exception as e:
return f"Sorry, I couldn't process your question right now: {e}"
def get_student_progress(self, student_id: str, course_id: str) -> Dict:
"""
Get student's chat history and progress.
Args:
student_id: Student identifier
course_id: Course identifier
Returns:
Dict containing progress information
"""
user_id = f"{student_id}_{course_id}"
try:
history = self.chat_manager.get_user_history(user_id)
# Analyze progress
questions_asked = len([msg for msg in history if msg['role'] == 'user'])
topics_covered = set()
# Simple topic extraction (in practice, you'd use NLP)
for msg in history:
if msg['role'] == 'user':
content = msg['content'].lower()
if 'loop' in content:
topics_covered.add('loops')
if 'function' in content:
topics_covered.add('functions')
if 'class' in content:
topics_covered.add('classes')
# Add more topic detection logic
return {
'student_id': student_id,
'course_id': course_id,
'questions_asked': questions_asked,
'topics_covered': list(topics_covered),
'last_activity': history[-1]['timestamp'] if history else None
}
except Exception as e:
return {'error': str(e)}
# Example 2: Code Editor Plugin Integration
class CodeEditorPlugin:
"""
Example integration with a code editor (like VS Code, Sublime, etc.).
This shows how to provide contextual help based on the current file
and programming language.
"""
def __init__(self, chat_service_url: str = "http://localhost:5000"):
self.client = ChatServiceClient(chat_service_url, "CodeEditor")
self.user_sessions = {} # user_id -> {language -> session_id}
def get_or_create_session(self, user_id: str, language: str) -> str:
"""
Get existing session for user+language or create new one.
Args:
user_id: User identifier
language: Programming language
Returns:
Session ID
"""
if user_id not in self.user_sessions:
self.user_sessions[user_id] = {}
if language not in self.user_sessions[user_id]:
# Create new session for this language
session_data = self.client.create_session(
f"{user_id}_{language}",
language,
{"context": "code_editor", "user_id": user_id}
)
self.user_sessions[user_id][language] = session_data['session_id']
return self.user_sessions[user_id][language]
def ask_about_code(self, user_id: str, language: str, code_snippet: str,
question: str) -> str:
"""
Ask a question about a specific code snippet.
Args:
user_id: User identifier
language: Programming language
code_snippet: The code in question
question: User's question about the code
Returns:
AI assistant's response
"""
session_id = self.get_or_create_session(user_id, language)
# Format the question with code context
formatted_question = f"""
I have this {language} code:
```{language}
{code_snippet}
```
{question}
"""
try:
response = self.client.send_message(session_id, formatted_question)
return response['response']
except Exception as e:
return f"Error getting help: {e}"
def explain_error(self, user_id: str, language: str, error_message: str,
code_context: str = "") -> str:
"""
Explain an error message in context.
Args:
user_id: User identifier
language: Programming language
error_message: The error message
code_context: Optional code that caused the error
Returns:
Explanation of the error
"""
session_id = self.get_or_create_session(user_id, language)
question = f"I got this error in {language}:\n\n{error_message}"
if code_context:
question += f"\n\nThe code that caused it:\n```{language}\n{code_context}\n```"
question += "\n\nCan you explain what's wrong and how to fix it?"
try:
response = self.client.send_message(session_id, question)
return response['response']
except Exception as e:
return f"Error explaining error: {e}"
# Example 3: Chatbot for Website Integration
class WebsiteChatbot:
"""
Example integration for a website chatbot.
This shows how to handle anonymous users and session persistence
across page reloads.
"""
def __init__(self, chat_service_url: str = "http://localhost:5000"):
self.client = ChatServiceClient(chat_service_url, "WebsiteChatbot")
self.anonymous_sessions = {} # browser_id -> session_id
def start_anonymous_chat(self, browser_id: str, preferred_language: str = "python") -> Dict:
"""
Start a chat session for an anonymous website visitor.
Args:
browser_id: Unique browser/session identifier
preferred_language: User's preferred programming language
Returns:
Dict with session info and welcome message
"""
# Create session with anonymous user ID
user_id = f"anonymous_{browser_id}"
metadata = {
"session_type": "anonymous",
"browser_id": browser_id,
"start_time": time.strftime("%Y-%m-%d %H:%M:%S")
}
session_data = self.client.create_session(user_id, preferred_language, metadata)
session_id = session_data['session_id']
# Store mapping
self.anonymous_sessions[browser_id] = session_id
# Send welcome message
welcome_response = self.client.send_message(
session_id,
f"Hello! I'm a programming assistant. I can help you with {preferred_language} and other programming languages. What would you like to learn?"
)
return {
'session_id': session_id,
'welcome_message': welcome_response['response'],
'language': preferred_language
}
def continue_anonymous_chat(self, browser_id: str, message: str) -> Dict:
"""
Continue an existing anonymous chat session.
Args:
browser_id: Browser identifier
message: User's message
Returns:
Dict with response and session info
"""
if browser_id not in self.anonymous_sessions:
# Session expired or doesn't exist, start new one
return self.start_anonymous_chat(browser_id)
session_id = self.anonymous_sessions[browser_id]
try:
response = self.client.send_message(session_id, message)
return {
'response': response['response'],
'session_id': session_id,
'message_id': response.get('message_id')
}
except Exception as e:
# Session might have expired, start new one
return self.start_anonymous_chat(browser_id)
def get_chat_widget_data(self, browser_id: str) -> Dict:
"""
Get data needed for the chat widget on the website.
Args:
browser_id: Browser identifier
Returns:
Dict with chat widget configuration
"""
has_active_session = browser_id in self.anonymous_sessions
return {
'has_active_session': has_active_session,
'supported_languages': ['python', 'javascript', 'java', 'cpp', 'csharp'],
'welcome_message': "Hi! I'm here to help you with programming questions.",
'placeholder_text': "Ask me anything about programming...",
'session_id': self.anonymous_sessions.get(browser_id)
}
# Example 4: Mobile App Integration
class MobileAppIntegration:
"""
Example integration for a mobile learning app.
This shows how to handle user authentication and offline scenarios.
"""
def __init__(self, chat_service_url: str = "http://localhost:5000"):
self.chat_manager = MultiUserChatManager(chat_service_url, "MobileLearningApp")
self.offline_messages = {} # user_id -> List[messages]
def login_user(self, user_id: str, user_profile: Dict) -> str:
"""
Handle user login and restore their chat session.
Args:
user_id: User identifier
user_profile: User profile information
Returns:
Session ID
"""
# Determine preferred language from profile
preferred_language = user_profile.get('preferred_language', 'python')
metadata = {
'user_profile': user_profile,
'platform': 'mobile',
'login_time': time.strftime("%Y-%m-%d %H:%M:%S")
}
session_id = self.chat_manager.start_chat_for_user(user_id, preferred_language, metadata)
# Process any offline messages
if user_id in self.offline_messages:
for message in self.offline_messages[user_id]:
try:
self.chat_manager.send_user_message(user_id, message)
except Exception as e:
print(f"Failed to send offline message: {e}")
# Clear offline messages
del self.offline_messages[user_id]
return session_id
def send_message_with_offline_support(self, user_id: str, message: str) -> Dict:
"""
Send message with offline support.
Args:
user_id: User identifier
message: User's message
Returns:
Response dict or offline confirmation
"""
try:
# Try to send message
response = self.chat_manager.send_user_message(user_id, message)
return {
'status': 'sent',
'response': response['response'],
'timestamp': response.get('timestamp')
}
except Exception as e:
# Store message for later (offline mode)
if user_id not in self.offline_messages:
self.offline_messages[user_id] = []
self.offline_messages[user_id].append(message)
return {
'status': 'offline',
'message': 'Message saved. Will be sent when connection is restored.',
'queued_messages': len(self.offline_messages[user_id])
}
def sync_offline_messages(self, user_id: str) -> Dict:
"""
Sync offline messages when connection is restored.
Args:
user_id: User identifier
Returns:
Sync status
"""
if user_id not in self.offline_messages:
return {'status': 'no_messages', 'synced': 0}
messages = self.offline_messages[user_id]
synced = 0
failed = 0
for message in messages:
try:
self.chat_manager.send_user_message(user_id, message)
synced += 1
except Exception:
failed += 1
# Clear successfully synced messages
if failed == 0:
del self.offline_messages[user_id]
else:
self.offline_messages[user_id] = self.offline_messages[user_id][-failed:]
return {
'status': 'synced',
'synced': synced,
'failed': failed,
'remaining': len(self.offline_messages.get(user_id, []))
}
if __name__ == "__main__":
print("🧪 Testing Integration Examples")
# Test Learning Platform Integration
print("\n1. Testing Learning Platform Integration...")
lms = LearningPlatformIntegration()
try:
# Enroll student
session_id = lms.enroll_student_in_course("student123", "python-101")
print(f"✅ Student enrolled, session: {session_id}")
# Student asks question
response = lms.student_ask_question("student123", "python-101", "How do I create a list?")
print(f"✅ Response: {response[:100]}...")
# Get progress
progress = lms.get_student_progress("student123", "python-101")
print(f"✅ Progress: {progress}")
except Exception as e:
print(f"❌ LMS test failed: {e}")
# Test Code Editor Plugin
print("\n2. Testing Code Editor Plugin...")
editor = CodeEditorPlugin()
try:
code = "def hello():\n print('Hello World')"
response = editor.ask_about_code("dev123", "python", code, "How can I improve this function?")
print(f"✅ Code help: {response[:100]}...")
error_help = editor.explain_error("dev123", "python", "NameError: name 'x' is not defined")
print(f"✅ Error help: {error_help[:100]}...")
except Exception as e:
print(f"❌ Editor test failed: {e}")
print("\n✅ Integration examples completed!")