From 44d4ad1dfd215dc84b61ae034e6669dd0a85cd07 Mon Sep 17 00:00:00 2001 From: pacnpal <183241239+pacnpal@users.noreply.github.com> Date: Tue, 11 Feb 2025 20:11:18 -0500 Subject: [PATCH] Implement prompt handling for web interface; validate API key and JSON input --- conversation_history.db-shm | Bin 32768 -> 32768 bytes discord_bot.log | 36 +++++++++++++++++++ discord_glhf/__pycache__/bot.cpython-313.pyc | Bin 18635 -> 21671 bytes discord_glhf/bot.py | 35 ++++++++++++++++++ discord_glhf/web/app.py | 2 +- queue_state.json | 4 +-- 6 files changed, 74 insertions(+), 3 deletions(-) diff --git a/conversation_history.db-shm b/conversation_history.db-shm index 36ed04cd1106feb9484caaf570387b924118c258..fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10 100644 GIT binary patch delta 89 zcmZo@U}|V!;+1%$%K!t66F*9eTChv7nNGgVi7uf4lYpuIj|Mh=}Ve^ literal 32768 zcmeI*zb->z7zg0Ds((~fi*j%c2A5!z*sUE*?uFIr3TzgWQNm5IxD3uGUlXfA(&T-9 z$;t2Zq&YqBbN08*$4M;HiI^U@AGX`$>GSUO`Tp|y_GW(ecKSYh=smtHF3zu-KYqX5 zucY+Xul!uB*UNeP+p$)=+xB`r@73{}56IR(mwAt8`c zpzPHW0yzcB7C9l1Q=sfj6aqN~%7#!OkW--S!xaKK1#ExL`QA-k1ZEfrq!rjrJGsFL w%n=YsD{zo@a)T2%L_i>|!15o+(gGNq009C72oNAZfB*pk1PBlyKp?TeHxX4SA^-pY diff --git a/discord_bot.log b/discord_bot.log index c7b00ca..01bc5f8 100644 --- a/discord_bot.log +++ b/discord_bot.log @@ -27063,3 +27063,39 @@ Max Tokens: 1000 2025-02-11 20:07:08 - INFO - discord_bot - run_bot:320 - Bot shutdown complete 2025-02-11 20:07:08 - ERROR - asyncio - default_exception_handler:1864 - Task was destroyed but it is pending! task: wait_for=<_GatheringFuture finished result=[CancelledError(''), CancelledError('')]>> +2025-02-11 20:10:25 - INFO - discord_bot - :211 - Using database path: conversation_history.db +2025-02-11 20:10:25 - INFO - discord_bot - load_responses:250 - Loaded responses from file +2025-02-11 20:10:25 - INFO - discord_bot - validate_config:290 - Vision API Configuration: +Model: meta-llama/llama-3.2-90b-vision-instruct:free +Base URL: https://openrouter.ai/api/v1/chat/completions +Timeout: 30.0 +Max Tokens: 1000 +2025-02-11 20:10:25 - WARNING - discord_bot - validate_config:326 - GLHF API is not fully configured. API features will be disabled. +2025-02-11 20:10:25 - INFO - discord_bot - validate_config:356 - Configuration validated successfully +2025-02-11 20:10:25 - INFO - discord_bot - load_state:40 - Queue state loaded from file - Pending messages: 0 +2025-02-11 20:10:25 - DEBUG - asyncio - __init__:64 - Using selector: KqueueSelector +2025-02-11 20:10:28 - INFO - discord_bot - on_ready:156 - CobraSilver#8886 has connected to Discord! +2025-02-11 20:10:28 - INFO - discord_bot - init_db:184 - Initializing database schema... +2025-02-11 20:10:28 - INFO - discord_bot - _init_connection:96 - Database connection initialized with optimized settings +2025-02-11 20:10:28 - INFO - discord_bot - init_db:201 - Users table created/verified +2025-02-11 20:10:28 - INFO - discord_bot - init_db:216 - Threads table created/verified +2025-02-11 20:10:28 - INFO - discord_bot - init_db:236 - Messages table created/verified +2025-02-11 20:10:28 - INFO - discord_bot - init_db:271 - All indices created/verified +2025-02-11 20:10:28 - INFO - discord_bot - init_db:274 - Database schema initialized successfully +2025-02-11 20:10:28 - INFO - discord_bot - start:38 - API manager started +2025-02-11 20:10:28 - INFO - discord_bot - on_ready:172 - Started API health check loop +2025-02-11 20:10:29 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0 +2025-02-11 20:10:29 - INFO - discord_bot - _process_queue:207 - Queue processor 18dbe14e starting +2025-02-11 20:10:29 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0 +2025-02-11 20:10:39 - INFO - discord_bot - shutdown:306 - Received SIGINT +2025-02-11 20:10:39 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0 +2025-02-11 20:10:39 - WARNING - discord_bot - _process_queue:329 - Queue processor 18dbe14e exited - Processed: 1859, Failed: 46 +2025-02-11 20:10:39 - INFO - discord_bot - stop:254 - Initiating shutdown... +2025-02-11 20:10:39 - INFO - discord_bot - stop:254 - Initiating shutdown... +2025-02-11 20:10:39 - INFO - discord_bot - shutdown:46 - API manager shutdown +2025-02-11 20:10:39 - INFO - discord_bot - stop:276 - Stopped API health check loop +2025-02-11 20:10:39 - DEBUG - discord_bot - _close_connection:107 - Database connection closed +2025-02-11 20:10:39 - INFO - discord_bot - stop:299 - Shutdown complete +2025-02-11 20:10:39 - ERROR - discord_bot - run_bot:363 - Error stopping bot: Event loop stopped before Future completed. +2025-02-11 20:10:39 - INFO - discord_bot - stop:299 - Shutdown complete +2025-02-11 20:10:39 - INFO - discord_bot - run_bot:366 - Bot shutdown complete diff --git a/discord_glhf/__pycache__/bot.cpython-313.pyc b/discord_glhf/__pycache__/bot.cpython-313.pyc index 5466ff2481ef20c1091542fa816260bdb44aaa17..6cdc6ffa6c3c966245be4b6b77e91d5322a97b28 100644 GIT binary patch delta 5124 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 diff --git a/discord_glhf/bot.py b/discord_glhf/bot.py index d8449f1..5915aab 100644 --- a/discord_glhf/bot.py +++ b/discord_glhf/bot.py @@ -82,6 +82,41 @@ class DiscordBot: self._initialized = False raise + async def _handle_prompt(self, request: web.Request) -> web.Response: + """Handle incoming prompt requests from the web interface.""" + try: + # Validate API key if provided in environment + expected_key = os.getenv('BACKEND_API_KEY') + if expected_key: + provided_key = request.headers.get('X-API-Key') + if not provided_key or provided_key != expected_key: + return web.json_response({"error": "Invalid API key"}, status=401) + + # Parse request body + try: + body = await request.json() + except ValueError: + return web.json_response({"error": "Invalid JSON"}, status=400) + + # Validate required fields + prompt = body.get('prompt') + if not prompt: + return web.json_response({"error": "Missing required field: prompt"}, status=400) + + # Use provided channel_id or default + channel_id = body.get('channel_id', AUTO_RESPONSE_CHANNEL_ID) + + # Have the event handler process the prompt + if self.event_handler: + await self.event_handler.send_prompt_to_channel(prompt, channel_id) + return web.json_response({"status": "processing"}) + else: + return web.json_response({"error": "Event handler not initialized"}, status=503) + + except Exception as e: + logger.error(f"Error handling prompt request: {e}") + return web.json_response({"error": str(e)}, status=500) + async def _handle_connection(self, token: str) -> None: """Handle bot connection with retries.""" retry_count = 0 diff --git a/discord_glhf/web/app.py b/discord_glhf/web/app.py index 32ad231..609763b 100644 --- a/discord_glhf/web/app.py +++ b/discord_glhf/web/app.py @@ -32,7 +32,7 @@ def send_prompt(): headers['X-API-Key'] = BACKEND_API_KEY response = requests.post( - f'http://localhost:{API_PORT}/api/prompt', + 'http://127.0.0.1:8000/api/prompt', # Use fixed internal API port json=data, headers=headers ) diff --git a/queue_state.json b/queue_state.json index d74af84..823ba3b 100644 --- a/queue_state.json +++ b/queue_state.json @@ -1,9 +1,9 @@ { "total_processed": 1859, "failed_messages": 46, - "last_processed_time": 1739322428.929682, + "last_processed_time": 1739322639.0875552, "user_queues": {}, - "last_save": 1739322428.929683, + "last_save": 1739322639.087557, "processor_id": null, "active": false, "pending_messages": [],