185 lines
5.0 KiB
Markdown
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
|