Files
broswer-automation/USER_ID_PRIORITY_GUIDE.md

185 lines
5.0 KiB
Markdown

# User ID Priority System for LiveKit Agent
This guide explains how the LiveKit agent determines which user ID to use, with multiple fallback options for maximum flexibility.
## 🎯 **Priority Order**
The LiveKit agent checks for user ID in the following order:
1. **Participant Metadata** (Highest Priority)
2. **Room Metadata**
3. **Random Generation** (Fallback)
## 📋 **Detailed Priority System**
### **1. Participant Metadata (Priority 1)**
The agent first checks if any participant has user ID in their metadata:
```python
# In participant metadata (JSON)
{
"userId": "user_1704067200000_abc123def456",
"source": "chrome_extension",
"capabilities": ["browser_automation"]
}
```
**How to set:**
```python
# When creating access token
token = api.AccessToken(api_key, api_secret)
.with_metadata(json.dumps({"userId": "user_1704067200000_abc123"}))
.to_jwt()
# Or update after connection
await room.local_participant.update_metadata(
json.dumps({"userId": "user_1704067200000_abc123"})
)
```
### **2. Room Metadata (Priority 2)**
If no participant metadata found, checks room metadata:
```python
# In room metadata (JSON)
{
"userId": "user_1704067200000_abc123def456",
"createdBy": "chrome_extension",
"timestamp": 1704067200000
}
```
**How to set:**
```python
# When creating room
await livekit_api.room.create_room(
api.CreateRoomRequest(
name="my-room",
metadata=json.dumps({"userId": "user_1704067200000_abc123"})
)
)
```
### **3. Random Generation (Fallback)**
If none of the above methods provide a user ID, generates a random one:
```python
# Format: user_{timestamp}_{random}
# Example: user_1704067200000_xyz789abc123
```
## 🔧 **Implementation Examples**
### **Chrome Extension Integration**
```javascript
// Chrome extension sends user ID via WebSocket
const connectionInfo = {
type: 'connection_info',
userId: 'user_1704067200000_abc123def456',
userAgent: navigator.userAgent,
timestamp: Date.now(),
extensionId: chrome.runtime.id,
};
// Remote server creates LiveKit room with user ID in metadata
const roomMetadata = {
userId: connectionInfo.userId,
source: 'chrome_extension',
};
```
### **LiveKit Agent Manager**
```typescript
// Remote server spawns agent with user ID in environment
const agentProcess = spawn('python', ['livekit_agent.py', 'start'], {
env: {
...process.env,
CHROME_USER_ID: userId, // Priority 4
LIVEKIT_URL: this.liveKitConfig.livekit_url,
LIVEKIT_API_KEY: this.liveKitConfig.api_key,
LIVEKIT_API_SECRET: this.liveKitConfig.api_secret,
},
});
```
### **Direct LiveKit Room Creation**
```python
# Create room with user ID in metadata (Priority 2)
room = await livekit_api.room.create_room(
api.CreateRoomRequest(
name=f"mcp-chrome-user-{user_id}", # Priority 3
metadata=json.dumps({"userId": user_id}) # Priority 2
)
)
```
## 🎮 **Usage Scenarios**
### **Scenario 1: Chrome Extension User**
1. Chrome extension generates user ID: `user_1704067200000_abc123`
2. Connects to remote server with user ID
3. Remote server creates room: `mcp-chrome-user-user_1704067200000_abc123`
4. Agent extracts user ID from room name (Priority 3)
### **Scenario 2: Direct LiveKit Integration**
1. Application creates room with user ID in metadata
2. Agent reads user ID from room metadata (Priority 2)
3. Uses provided user ID for session management
### **Scenario 3: Manual Agent Spawn**
1. Set `CHROME_USER_ID` environment variable
2. Start agent manually
3. Agent uses environment variable (Priority 4)
### **Scenario 4: Participant Metadata**
1. Client joins with user ID in participant metadata
2. Agent reads from participant metadata (Priority 1)
3. Highest priority - overrides all other sources
## 🔍 **Debugging User ID Resolution**
The agent logs which method was used:
```
✅ Using user ID from metadata: user_1704067200000_abc123
🔗 Using user ID from room name: user_1704067200000_abc123
🌍 Using user ID from environment: user_1704067200000_abc123
⚠️ No Chrome user ID detected, using random session
```
## 📝 **Best Practices**
1. **Use Participant Metadata** for dynamic user identification
2. **Use Room Metadata** for persistent room-based user association
3. **Use Room Name Pattern** for Chrome extension integration
4. **Use Environment Variable** for development and testing
5. **Random Generation** ensures the system always works
## 🚨 **Important Notes**
- User IDs should follow format: `user_{timestamp}_{random}`
- Metadata must be valid JSON
- Environment variables are set when agent starts
- Room name pattern is automatically detected
- Random generation ensures no session fails due to missing user ID
## 🔄 **Migration Guide**
If you're updating from a system that only used environment variables:
1. **No changes needed** - environment variable still works (Priority 4)
2. **Optional**: Add user ID to room/participant metadata for better integration
3. **Recommended**: Use room name pattern for Chrome extension compatibility