Renamed bots; fixed config load

This commit is contained in:
James Ketr 2025-09-15 13:45:44 -07:00
parent 7a06bfc102
commit f67ff9ec2f
9 changed files with 45 additions and 7 deletions

View File

@ -21,7 +21,11 @@ except ImportError as e:
def create_bot_router(
bot_manager, session_manager, lobby_manager, public_url: str = "/"
bot_manager,
session_manager,
lobby_manager,
bot_config_manager,
public_url: str = "/",
) -> APIRouter:
"""Create bot API router with dependencies"""
@ -52,7 +56,9 @@ def create_bot_router(
async def request_bot_join_lobby(bot_name: str, request: BotJoinLobbyRequest) -> BotJoinLobbyResponse:
"""Request a bot to join a specific lobby"""
try:
return await bot_manager.request_bot_join(bot_name, request, session_manager, lobby_manager)
return await bot_manager.request_bot_join(
bot_name, request, session_manager, lobby_manager, bot_config_manager
)
except ValueError as e:
if "not found" in str(e).lower():
raise HTTPException(status_code=404, detail=str(e))

View File

@ -36,6 +36,7 @@ from shared.models import (
)
from core.session_manager import SessionManager
from core.lobby_manager import LobbyManager
from core.bot_config_manager import BotConfigManager
class BotProviderConfig:
"""Configuration class for bot provider management"""
@ -306,6 +307,7 @@ class BotManager:
request: BotJoinLobbyRequest,
session_manager: SessionManager,
lobby_manager: LobbyManager,
config_manager: "BotConfigManager",
) -> BotJoinLobbyResponse:
"""Request a bot to join a specific lobby"""
@ -399,6 +401,12 @@ class BotManager:
# Get public URL prefix from environment
public_url = os.getenv("PUBLIC_URL_PREFIX", "/ai-voicebot")
# Check for existing configuration for this bot in this lobby
existing_config = config_manager.get_lobby_bot_config(
request.lobby_id, bot_name
)
config_values = existing_config.config_values if existing_config else None
# Prepare the join request for the bot provider
bot_join_payload = BotJoinPayload(
lobby_id=request.lobby_id,
@ -406,6 +414,7 @@ class BotManager:
nick=bot_nick,
server_url=f"{server_base_url}{public_url}".rstrip("/"),
insecure=True, # Accept self-signed certificates in development
config_values=config_values,
)
try:

View File

@ -203,7 +203,11 @@ async def lifespan(app: FastAPI):
# Create bot API router
bot_router = create_bot_router(
bot_manager, session_manager, lobby_manager, public_url=public_url
bot_manager,
session_manager,
lobby_manager,
bot_config_manager,
public_url=public_url,
)
# Create bot configuration API router

View File

@ -496,6 +496,9 @@ class BotJoinPayload(BaseModel):
nick: str
server_url: str
insecure: bool = False
config_values: Optional[Dict[str, Any]] = (
None # Existing configuration for the bot in this lobby
)
class BotJoinLobbyResponse(BaseModel):

View File

@ -330,8 +330,11 @@ async def bot_join(bot_name: str, req: JoinRequest):
chat_handler = bot_data.get("chat_handler")
track_handler = bot_data.get("track_handler")
bind_send_chat_function = bot_data.get("chat_bind")
config_handler = bot_data.get("config_handler")
logger.info(f"🤖 Bot {bot_name} joining lobby {req.lobby_id} with nick: '{req.nick}'")
if req.config_values:
logger.info(f"🤖 Bot {bot_name} has existing configuration: {req.config_values}")
if track_handler:
logger.info(f"🤖 Bot {bot_name} has track handling capabilities")
if chat_handler:
@ -339,6 +342,18 @@ async def bot_join(bot_name: str, req: JoinRequest):
if bind_send_chat_function:
logger.info(f"🤖 Bot {bot_name} has chat sending capabilities")
# Apply configuration if provided
if req.config_values and config_handler:
try:
logger.info(f"Applying existing configuration to bot {bot_name}")
success = await config_handler(req.lobby_id, req.config_values)
if success:
logger.info(f"Successfully applied existing configuration to bot {bot_name}")
else:
logger.warning(f"Failed to apply existing configuration to bot {bot_name}")
except Exception as e:
logger.error(f"Error applying existing configuration to bot {bot_name}: {e}")
# Start the WebRTCSignalingClient in a background asyncio task and register it
client = WebRTCSignalingClient(
server_url=req.server_url,

View File

@ -35,7 +35,7 @@ except ImportError as e:
AI_PROVIDERS_AVAILABLE = False
AGENT_NAME = "ai_chatbot"
AGENT_NAME = "Generative Chat Bot"
AGENT_DESCRIPTION = "Advanced AI chatbot with multi-provider support, personality system, and conversation memory"
# Bot configuration from environment

View File

@ -464,7 +464,7 @@ def create_synthetic_tracks(session_name: str) -> dict[str, MediaStreamTrack]:
# Agent descriptor exported for dynamic discovery by the FastAPI service
AGENT_NAME = "synthetic_media"
AGENT_NAME = "Synthetic Media Test Bot"
AGENT_DESCRIPTION = "Synthetic audio and video tracks (AnimatedVideoTrack + SyntheticAudioTrack)"
def agent_info() -> dict[str, str]:

View File

@ -197,7 +197,7 @@ class OpenVINOConfig(BaseModel):
# Global configuration and constants
AGENT_NAME = "whisper"
AGENT_NAME = "Transcription Bot"
AGENT_DESCRIPTION = "Real-time speech transcription (OpenVINO Whisper) - converts speech to text on Intel Arc B580"
SAMPLE_RATE = 16000 # Whisper expects 16kHz
CHUNK_DURATION_MS = 100 # Reduced latency - 100ms chunks

View File

@ -9,7 +9,7 @@ from __future__ import annotations
import argparse
from enum import Enum
from typing import Dict, Optional, TYPE_CHECKING
from typing import Dict, Optional, Any, TYPE_CHECKING
from dataclasses import dataclass, field
from pydantic import BaseModel, Field
@ -95,6 +95,7 @@ class JoinRequest(BaseModel):
nick: str
server_url: str
insecure: bool = False
config_values: Optional[Dict[str, Any]] = None
def _default_attributes() -> Dict[str, object]: