Fix team chat integration

This commit is contained in:
Iyeoluwa Akinrinola
2025-05-20 22:23:33 +01:00
parent 0a27103875
commit 1c75eece93
3 changed files with 182 additions and 33 deletions
+23 -1
View File
@@ -60,6 +60,20 @@ async def startup_event():
print("=" * 50)
print("Starting OpenWebUI bot...")
# Check if the OpenWebUI URL and API key are set
if not config.OPENWEBUI_URL or not config.OPENWEBUI_API_KEY:
print("ERROR: OpenWebUI URL or API key not set. Bot cannot be started.")
print("Please set OPENWEBUI_URL and OPENWEBUI_API_KEY in your .env file.")
print("=" * 50)
else:
# Try to start the bot with multiple retries
max_retries = 3
retry_delay = 5 # seconds
success = False
for attempt in range(1, max_retries + 1):
print(f"Starting bot (attempt {attempt}/{max_retries})...")
# Start the bot with configuration
success = await bot_manager.start_bot(
openwebui_url=config.OPENWEBUI_URL,
@@ -75,8 +89,16 @@ async def startup_event():
if success:
print("Bot started successfully!")
break
else:
print("Failed to start bot. Check the logs for details.")
print(f"Failed to start bot (attempt {attempt}/{max_retries}).")
if attempt < max_retries:
print(f"Retrying in {retry_delay} seconds...")
await asyncio.sleep(retry_delay)
else:
print("Maximum retry attempts reached. Bot could not be started.")
print("Check the logs for details.")
print("=" * 50)
else:
print("OpenWebUI bot is disabled. Set BOT_ENABLED=true in .env to enable it.")
+123 -9
View File
@@ -8,6 +8,7 @@ import os
import sys
import asyncio
import logging
import traceback
from typing import Optional
# Set up logging
@@ -28,16 +29,66 @@ sys.path.insert(0, openwebui_bot_dir)
logger.info(f"Adding OpenWebUI bot directory to Python path: {openwebui_bot_dir}")
# Import the bot modules
try:
from env import WEBUI_URL, TOKEN
from examples.custom_ai import main as custom_bot_main
except ImportError as e:
print(f"Error importing OpenWebUI bot modules: {str(e)}")
print("Make sure the openwebui-bot directory exists and contains the required files.")
WEBUI_URL = None
TOKEN = None
custom_bot_main = None
# Check if the openwebui-bot directory exists
if not os.path.exists(openwebui_bot_dir):
logger.error(f"OpenWebUI bot directory not found: {openwebui_bot_dir}")
else:
logger.info(f"OpenWebUI bot directory found: {openwebui_bot_dir}")
# Add examples directory to path
examples_dir = os.path.join(openwebui_bot_dir, 'examples')
if os.path.exists(examples_dir):
sys.path.insert(0, examples_dir)
logger.info(f"Added examples directory to path: {examples_dir}")
# Check for required files
env_path = os.path.join(openwebui_bot_dir, 'env.py')
custom_ai_path = os.path.join(openwebui_bot_dir, 'examples', 'custom_ai.py')
if not os.path.exists(env_path):
logger.error(f"env.py not found at {env_path}")
else:
logger.info(f"env.py found at {env_path}")
if not os.path.exists(custom_ai_path):
logger.error(f"custom_ai.py not found at {custom_ai_path}")
else:
logger.info(f"custom_ai.py found at {custom_ai_path}")
# Try to import the modules
try:
# Use a different approach to import the modules
sys.path.insert(0, openwebui_bot_dir)
# Import the custom_ai module
try:
from examples.custom_ai import main as custom_bot_main
logger.info("Successfully imported custom_ai module")
except ImportError as e:
logger.error(f"Error importing custom_ai module: {str(e)}")
# Try a different approach
try:
import importlib.util
spec = importlib.util.spec_from_file_location("custom_ai", custom_ai_path)
custom_ai = importlib.util.module_from_spec(spec)
spec.loader.exec_module(custom_ai)
custom_bot_main = custom_ai.main
logger.info("Successfully imported custom_ai module using importlib")
except Exception as e:
logger.error(f"Error importing custom_ai module using importlib: {str(e)}")
except Exception as e:
logger.error(f"Error importing OpenWebUI bot modules: {str(e)}")
logger.error(f"Traceback: {traceback.format_exc()}")
# Log the current state
if custom_bot_main is None:
logger.error("Failed to import custom_bot_main function")
else:
logger.info("Successfully imported custom_bot_main function")
# Global variable to store the bot task
bot_task = None
@@ -55,6 +106,11 @@ async def start_bot(
"""
Start the OpenWebUI bot.
This function creates a .env file for the bot and starts it in a background task.
The bot connects to OpenWebUI via WebSocket and listens for messages in channels.
When a message mentions the bot (using trigger words like @ai), the bot processes
the message and sends a response back to the channel.
Args:
openwebui_url: URL of the OpenWebUI instance.
api_key: API key for authentication.
@@ -81,6 +137,27 @@ async def start_bot(
logger.error("OpenWebUI bot modules not found. Bot cannot be started.")
return False
# Create .env file for the bot
try:
env_file_path = os.path.join(openwebui_bot_dir, '.env')
with open(env_file_path, 'w') as f:
f.write(f"# OpenWebUI configuration\n")
f.write(f"WEBUI_URL={openwebui_url}\n")
f.write(f"TOKEN={api_key}\n\n")
f.write(f"# Model configuration\n")
f.write(f"MODEL_ID={model_id}\n\n")
f.write(f"# Bot behavior configuration\n")
f.write(f'SYSTEM_PROMPT="{system_prompt or "You are a helpful AI assistant."}"\n')
f.write(f"TEMPERATURE={temperature or 0.7}\n")
f.write(f"MAX_TOKENS={max_tokens or 2048}\n")
f.write(f"TOP_P={top_p or 0.9}\n")
f.write(f"TRIGGERS={','.join(triggers) if triggers else '@ai,@bot,@assistant,@chatbot'}\n")
f.write(f"RESPOND_TO_ALL={'true' if respond_to_all else 'false'}\n")
logger.info(f"Created .env file at {env_file_path}")
except Exception as e:
logger.error(f"Error creating .env file: {str(e)}")
# Continue anyway, as we'll set environment variables too
# Set environment variables for the bot
os.environ["WEBUI_URL"] = openwebui_url
os.environ["TOKEN"] = api_key
@@ -104,6 +181,7 @@ async def start_bot(
# Start the bot in a background task
logger.info("Starting OpenWebUI bot...")
logger.info(f"OpenWebUI URL: {openwebui_url}")
logger.info(f"API Key: {api_key[:4]}...{api_key[-4:] if len(api_key) > 8 else ''}")
logger.info(f"Model: {model_id}")
if system_prompt:
@@ -120,12 +198,48 @@ async def start_bot(
logger.info(f"Respond to all: {respond_to_all}")
# Create a task for the bot
bot_task = asyncio.create_task(custom_bot_main())
try:
# Try to reload the env module to pick up new environment variables
try:
import importlib
if 'env' in sys.modules:
importlib.reload(sys.modules['env'])
logger.info("Reloaded env module")
except Exception as e:
logger.warning(f"Failed to reload env module: {str(e)}")
# Start the bot with a retry mechanism
max_retries = 3
retry_delay = 5 # seconds
last_error = None
for attempt in range(1, max_retries + 1):
try:
logger.info(f"Starting bot (attempt {attempt}/{max_retries})...")
bot_task = asyncio.create_task(custom_bot_main())
logger.info("Bot started successfully!")
return True
except Exception as e:
last_error = e
logger.error(f"Error starting bot (attempt {attempt}/{max_retries}): {str(e)}")
if attempt < max_retries:
logger.info(f"Retrying in {retry_delay} seconds...")
await asyncio.sleep(retry_delay)
else:
logger.error("Maximum retry attempts reached")
# If we get here, all attempts failed
logger.error(f"Failed to start bot after {max_retries} attempts")
logger.error(f"Last error: {str(last_error)}")
logger.error(f"Traceback: {traceback.format_exc()}")
return False
except Exception as e:
logger.error(f"Error creating bot task: {str(e)}")
logger.error(f"Traceback: {traceback.format_exc()}")
return False
except Exception as e:
logger.error(f"Error starting bot: {str(e)}")
logger.error(f"Traceback: {traceback.format_exc()}")
return False
async def stop_bot() -> bool:
+14 -1
View File
@@ -4,6 +4,7 @@ import asyncio
import socketio
import os
import sys
import traceback
from env import WEBUI_URL, TOKEN
from utils import send_message, send_typing
import aiohttp
@@ -188,13 +189,25 @@ async def main():
try:
# Callback function for user-join
async def join_callback(data):
async def join_callback(*args):
try:
if args and len(args) > 0:
data = args[0]
print(f"Received callback data: {data}")
if isinstance(data, dict) and "id" in data:
bot_id = data["id"]
print(f"Bot connected with ID: {bot_id}")
events(bot_id) # Attach the event handlers dynamically
else:
print(f"Invalid callback data format: {data}")
else:
print("No callback data received")
# If no data is received, use a default ID
print("Using default bot ID")
events("bot-default-id") # Attach the event handlers with a default ID
except Exception as e:
print(f"Error in join_callback: {str(e)}")
print(traceback.format_exc())
# Authenticate with the server
print("Authenticating with the server...")