Add Quart web interface and prompt handling; update queue state and logging

This commit is contained in:
pacnpal
2025-02-11 22:02:36 -05:00
parent 44d4ad1dfd
commit 9efd4454fe
10 changed files with 399 additions and 37 deletions

View File

@@ -27099,3 +27099,176 @@ Max Tokens: 1000
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
2025-02-11 20:11:59 - INFO - discord_bot - <module>:211 - Using database path: conversation_history.db
2025-02-11 20:11:59 - INFO - discord_bot - load_responses:250 - Loaded responses from file
2025-02-11 20:11:59 - 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:11:59 - WARNING - discord_bot - validate_config:326 - GLHF API is not fully configured. API features will be disabled.
2025-02-11 20:11:59 - INFO - discord_bot - validate_config:356 - Configuration validated successfully
2025-02-11 20:11:59 - INFO - discord_bot - load_state:40 - Queue state loaded from file - Pending messages: 0
2025-02-11 20:11:59 - DEBUG - asyncio - __init__:64 - Using selector: KqueueSelector
2025-02-11 20:12:02 - INFO - discord_bot - on_ready:156 - CobraSilver#8886 has connected to Discord!
2025-02-11 20:12:02 - INFO - discord_bot - init_db:184 - Initializing database schema...
2025-02-11 20:12:02 - INFO - discord_bot - _init_connection:96 - Database connection initialized with optimized settings
2025-02-11 20:12:02 - INFO - discord_bot - init_db:201 - Users table created/verified
2025-02-11 20:12:02 - INFO - discord_bot - init_db:216 - Threads table created/verified
2025-02-11 20:12:02 - INFO - discord_bot - init_db:236 - Messages table created/verified
2025-02-11 20:12:02 - INFO - discord_bot - init_db:271 - All indices created/verified
2025-02-11 20:12:02 - INFO - discord_bot - init_db:274 - Database schema initialized successfully
2025-02-11 20:12:02 - INFO - discord_bot - start:38 - API manager started
2025-02-11 20:12:02 - INFO - discord_bot - on_ready:172 - Started API health check loop
2025-02-11 20:12:03 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0
2025-02-11 20:12:03 - INFO - discord_bot - _process_queue:207 - Queue processor 6bc98aa8 starting
2025-02-11 20:12:03 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0
2025-02-11 20:12:14 - INFO - discord_bot - shutdown:306 - Received SIGINT
2025-02-11 20:12:14 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0
2025-02-11 20:12:14 - WARNING - discord_bot - _process_queue:329 - Queue processor 6bc98aa8 exited - Processed: 1859, Failed: 46
2025-02-11 20:12:14 - INFO - discord_bot - shutdown:306 - Received SIGTERM
2025-02-11 20:12:14 - INFO - discord_bot - stop:254 - Initiating shutdown...
2025-02-11 20:12:14 - INFO - discord_bot - shutdown:46 - API manager shutdown
2025-02-11 20:12:14 - INFO - discord_bot - stop:276 - Stopped API health check loop
2025-02-11 20:12:14 - INFO - discord_bot - stop:254 - Initiating shutdown...
2025-02-11 20:12:14 - DEBUG - discord_bot - _close_connection:107 - Database connection closed
2025-02-11 20:12:14 - INFO - discord_bot - stop:299 - Shutdown complete
2025-02-11 20:12:14 - INFO - discord_bot - stop:299 - Shutdown complete
2025-02-11 20:12:14 - INFO - discord_bot - run_bot:366 - Bot shutdown complete
2025-02-11 20:16:46 - INFO - discord_bot - <module>:211 - Using database path: conversation_history.db
2025-02-11 20:16:46 - INFO - discord_bot - load_responses:250 - Loaded responses from file
2025-02-11 20:16:47 - 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:16:47 - WARNING - discord_bot - validate_config:326 - GLHF API is not fully configured. API features will be disabled.
2025-02-11 20:16:47 - INFO - discord_bot - validate_config:356 - Configuration validated successfully
2025-02-11 20:16:47 - INFO - discord_bot - load_state:40 - Queue state loaded from file - Pending messages: 0
2025-02-11 20:16:47 - DEBUG - asyncio - __init__:64 - Using selector: KqueueSelector
2025-02-11 20:16:50 - INFO - discord_bot - on_ready:156 - CobraSilver#8886 has connected to Discord!
2025-02-11 20:16:50 - INFO - discord_bot - init_db:184 - Initializing database schema...
2025-02-11 20:16:50 - INFO - discord_bot - _init_connection:96 - Database connection initialized with optimized settings
2025-02-11 20:16:50 - INFO - discord_bot - init_db:201 - Users table created/verified
2025-02-11 20:16:50 - INFO - discord_bot - init_db:216 - Threads table created/verified
2025-02-11 20:16:50 - INFO - discord_bot - init_db:236 - Messages table created/verified
2025-02-11 20:16:50 - INFO - discord_bot - init_db:271 - All indices created/verified
2025-02-11 20:16:50 - INFO - discord_bot - init_db:274 - Database schema initialized successfully
2025-02-11 20:16:50 - INFO - discord_bot - start:38 - API manager started
2025-02-11 20:16:50 - INFO - discord_bot - on_ready:172 - Started API health check loop
2025-02-11 20:16:51 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0
2025-02-11 20:16:51 - INFO - discord_bot - _process_queue:207 - Queue processor 640ebc33 starting
2025-02-11 20:16:51 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0
2025-02-11 20:16:54 - INFO - discord_bot - shutdown:306 - Received SIGINT
2025-02-11 20:16:54 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0
2025-02-11 20:16:54 - WARNING - discord_bot - _process_queue:329 - Queue processor 640ebc33 exited - Processed: 1859, Failed: 46
2025-02-11 20:16:54 - INFO - discord_bot - shutdown:306 - Received SIGTERM
2025-02-11 20:16:54 - INFO - discord_bot - stop:254 - Initiating shutdown...
2025-02-11 20:16:54 - INFO - discord_bot - shutdown:46 - API manager shutdown
2025-02-11 20:16:54 - INFO - discord_bot - stop:276 - Stopped API health check loop
2025-02-11 20:16:54 - INFO - discord_bot - stop:254 - Initiating shutdown...
2025-02-11 20:16:54 - DEBUG - discord_bot - _close_connection:107 - Database connection closed
2025-02-11 20:16:54 - INFO - discord_bot - stop:299 - Shutdown complete
2025-02-11 20:16:54 - INFO - discord_bot - stop:299 - Shutdown complete
2025-02-11 20:16:54 - INFO - discord_bot - run_bot:366 - Bot shutdown complete
2025-02-11 20:19:42 - INFO - discord_bot - <module>:211 - Using database path: conversation_history.db
2025-02-11 20:19:42 - INFO - discord_bot - load_responses:250 - Loaded responses from file
2025-02-11 20:19:43 - 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:19:43 - WARNING - discord_bot - validate_config:326 - GLHF API is not fully configured. API features will be disabled.
2025-02-11 20:19:43 - INFO - discord_bot - validate_config:356 - Configuration validated successfully
2025-02-11 20:19:43 - INFO - discord_bot - load_state:40 - Queue state loaded from file - Pending messages: 0
2025-02-11 20:19:43 - DEBUG - asyncio - __init__:64 - Using selector: KqueueSelector
2025-02-11 20:19:46 - INFO - discord_bot - on_ready:156 - CobraSilver#8886 has connected to Discord!
2025-02-11 20:19:46 - INFO - discord_bot - init_db:184 - Initializing database schema...
2025-02-11 20:19:46 - INFO - discord_bot - _init_connection:96 - Database connection initialized with optimized settings
2025-02-11 20:19:46 - INFO - discord_bot - init_db:201 - Users table created/verified
2025-02-11 20:19:46 - INFO - discord_bot - init_db:216 - Threads table created/verified
2025-02-11 20:19:46 - INFO - discord_bot - init_db:236 - Messages table created/verified
2025-02-11 20:19:46 - INFO - discord_bot - init_db:271 - All indices created/verified
2025-02-11 20:19:46 - INFO - discord_bot - init_db:274 - Database schema initialized successfully
2025-02-11 20:19:46 - INFO - discord_bot - start:38 - API manager started
2025-02-11 20:19:46 - INFO - discord_bot - on_ready:172 - Started API health check loop
2025-02-11 20:19:46 - INFO - discord_bot - shutdown:306 - Received SIGINT
2025-02-11 20:19:46 - INFO - discord_bot - shutdown:306 - Received SIGTERM
2025-02-11 20:19:46 - INFO - discord_bot - stop:254 - Initiating shutdown...
2025-02-11 20:19:46 - INFO - discord_bot - shutdown:46 - API manager shutdown
2025-02-11 20:19:46 - INFO - discord_bot - stop:276 - Stopped API health check loop
2025-02-11 20:19:46 - INFO - discord_bot - stop:254 - Initiating shutdown...
2025-02-11 20:19:46 - DEBUG - discord_bot - _close_connection:107 - Database connection closed
2025-02-11 20:19:46 - INFO - discord_bot - stop:299 - Shutdown complete
2025-02-11 20:19:46 - INFO - discord_bot - stop:299 - Shutdown complete
2025-02-11 20:19:46 - INFO - discord_bot - run_bot:366 - Bot shutdown complete
2025-02-11 20:21:35 - INFO - discord_bot - <module>:211 - Using database path: conversation_history.db
2025-02-11 20:21:35 - INFO - discord_bot - load_responses:250 - Loaded responses from file
2025-02-11 20:21:35 - 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:21:35 - WARNING - discord_bot - validate_config:326 - GLHF API is not fully configured. API features will be disabled.
2025-02-11 20:21:35 - INFO - discord_bot - validate_config:356 - Configuration validated successfully
2025-02-11 20:21:35 - INFO - discord_bot - load_state:40 - Queue state loaded from file - Pending messages: 0
2025-02-11 20:21:35 - DEBUG - asyncio - __init__:64 - Using selector: KqueueSelector
2025-02-11 20:21:38 - INFO - discord_bot - on_ready:156 - CobraSilver#8886 has connected to Discord!
2025-02-11 20:21:38 - INFO - discord_bot - init_db:184 - Initializing database schema...
2025-02-11 20:21:38 - INFO - discord_bot - _init_connection:96 - Database connection initialized with optimized settings
2025-02-11 20:21:38 - INFO - discord_bot - init_db:201 - Users table created/verified
2025-02-11 20:21:38 - INFO - discord_bot - init_db:216 - Threads table created/verified
2025-02-11 20:21:38 - INFO - discord_bot - init_db:236 - Messages table created/verified
2025-02-11 20:21:38 - INFO - discord_bot - init_db:271 - All indices created/verified
2025-02-11 20:21:38 - INFO - discord_bot - init_db:274 - Database schema initialized successfully
2025-02-11 20:21:38 - INFO - discord_bot - start:38 - API manager started
2025-02-11 20:21:38 - INFO - discord_bot - on_ready:172 - Started API health check loop
2025-02-11 20:21:38 - INFO - discord_bot - shutdown:306 - Received SIGINT
2025-02-11 20:21:38 - INFO - discord_bot - stop:254 - Initiating shutdown...
2025-02-11 20:21:38 - INFO - discord_bot - stop:254 - Initiating shutdown...
2025-02-11 20:21:38 - INFO - discord_bot - shutdown:46 - API manager shutdown
2025-02-11 20:21:38 - INFO - discord_bot - stop:276 - Stopped API health check loop
2025-02-11 20:21:38 - INFO - discord_bot - shutdown:306 - Received SIGTERM
2025-02-11 20:21:38 - INFO - discord_bot - stop:299 - Shutdown complete
2025-02-11 20:21:38 - INFO - discord_bot - stop:299 - Shutdown complete
2025-02-11 20:21:38 - INFO - discord_bot - run_bot:366 - Bot shutdown complete
2025-02-11 20:22:23 - ERROR - asyncio - default_exception_handler:1864 - Task was destroyed but it is pending!
task: <Task pending name='Task-10' coro=<shutdown() done, defined at /Volumes/macminissd/Projects/discord_glhf/discord_glhf/bot.py:302> wait_for=<_GatheringFuture finished result=[CancelledError(''), CancelledError('')]>>
2025-02-11 20:23:19 - INFO - discord_bot - <module>:211 - Using database path: conversation_history.db
2025-02-11 20:23:19 - INFO - discord_bot - load_responses:250 - Loaded responses from file
2025-02-11 20:23:19 - 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:23:19 - WARNING - discord_bot - validate_config:326 - GLHF API is not fully configured. API features will be disabled.
2025-02-11 20:23:19 - INFO - discord_bot - validate_config:356 - Configuration validated successfully
2025-02-11 20:23:19 - INFO - discord_bot - load_state:40 - Queue state loaded from file - Pending messages: 0
2025-02-11 20:23:19 - DEBUG - asyncio - __init__:64 - Using selector: KqueueSelector
2025-02-11 20:23:22 - INFO - discord_bot - on_ready:156 - CobraSilver#8886 has connected to Discord!
2025-02-11 20:23:22 - INFO - discord_bot - init_db:184 - Initializing database schema...
2025-02-11 20:23:22 - INFO - discord_bot - _init_connection:96 - Database connection initialized with optimized settings
2025-02-11 20:23:22 - INFO - discord_bot - init_db:201 - Users table created/verified
2025-02-11 20:23:22 - INFO - discord_bot - init_db:216 - Threads table created/verified
2025-02-11 20:23:22 - INFO - discord_bot - init_db:236 - Messages table created/verified
2025-02-11 20:23:22 - INFO - discord_bot - init_db:271 - All indices created/verified
2025-02-11 20:23:22 - INFO - discord_bot - init_db:274 - Database schema initialized successfully
2025-02-11 20:23:22 - INFO - discord_bot - start:38 - API manager started
2025-02-11 20:23:22 - INFO - discord_bot - on_ready:172 - Started API health check loop
2025-02-11 20:23:23 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0
2025-02-11 20:23:23 - INFO - discord_bot - _process_queue:207 - Queue processor 9e0b5f34 starting
2025-02-11 20:23:23 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0
2025-02-11 20:24:23 - INFO - discord_bot - _process_queue:295 - Queue processor 9e0b5f34 heartbeat - Active: True, Queue size: 0, Processing: 0, Total processed: 1859
2025-02-11 20:24:23 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0
2025-02-11 20:24:27 - INFO - discord_bot - shutdown:306 - Received SIGINT
2025-02-11 20:24:27 - DEBUG - discord_bot - save_state:62 - Queue state saved - Pending messages: 0
2025-02-11 20:24:27 - WARNING - discord_bot - _process_queue:329 - Queue processor 9e0b5f34 exited - Processed: 1859, Failed: 46
2025-02-11 20:24:27 - INFO - discord_bot - shutdown:306 - Received SIGTERM
2025-02-11 20:24:27 - INFO - discord_bot - stop:254 - Initiating shutdown...
2025-02-11 20:24:27 - INFO - discord_bot - shutdown:46 - API manager shutdown
2025-02-11 20:24:27 - INFO - discord_bot - stop:276 - Stopped API health check loop
2025-02-11 20:24:27 - INFO - discord_bot - stop:254 - Initiating shutdown...
2025-02-11 20:24:27 - DEBUG - discord_bot - _close_connection:107 - Database connection closed
2025-02-11 20:24:27 - INFO - discord_bot - stop:299 - Shutdown complete
2025-02-11 20:24:27 - INFO - discord_bot - stop:299 - Shutdown complete
2025-02-11 20:24:27 - INFO - discord_bot - run_bot:366 - Bot shutdown complete

View File

@@ -192,11 +192,10 @@ class DiscordBot:
await internal_site.start()
logger.info("Internal API server started")
# Start HTTP server for backend prompts
http_port = int(os.getenv('WEB_PORT', '8080'))
self.http_server = HTTPServer(self.event_handler)
await self.http_server.start(port=http_port)
logger.info(f"Web server started on port {http_port}")
# Initialize and start web interface
from discord_glhf.web.app import init_app
self.web_app = init_app(self.event_handler)
logger.info("Web interface initialized with event handler")
# Set bot status
activity = Game(name="with roller coasters")

View File

@@ -0,0 +1,4 @@
2025-02-11 20:23:21 - INFO - discord_bot - <module>:211 - Using database path: conversation_history.db
2025-02-11 20:23:21 - INFO - discord_bot - load_responses:250 - Loaded responses from file
2025-02-11 20:23:21 - DEBUG - asyncio - __init__:64 - Using selector: KqueueSelector
2025-02-11 20:23:21 - INFO - hypercorn.error - info:106 - Running on http://0.0.0.0:8080 (CTRL + C to quit)

View File

@@ -44,6 +44,69 @@ class EventHandler:
# Replace all mention formats with the proper mention
return re.sub(pattern, mention, response)
async def send_prompt_to_channel(self, prompt: str, channel_id: int) -> None:
"""Send a prompt to the specified channel."""
try:
channel = self.bot.get_channel(channel_id)
if not channel:
logger.error(f"Could not find channel {channel_id}")
return
# Build context for the API call
messages = [
{
"role": "system",
"content": SYSTEM_PROMPT,
"metadata": {
"bot_owner_id": str(BOT_OWNER_ID),
"current_user": {
"user_id": "0" # System user
}
}
},
{
"role": "user",
"content": prompt,
"context": {
"timeout_env": "GLHF_TIMEOUT"
}
}
]
# Get response from API
response = await self.api_manager.get_completion(messages)
if not response:
logger.error("No response received from API")
return
# Parse tool calls and get processed response
tool_calls, final_response, mentioned_users = self.tool_handler.parse_tool_calls(
response, channel_id=channel_id
)
# Execute tool calls
for tool_name, args in tool_calls:
try:
if tool_name == "create_embed":
await self.tool_handler.create_embed(
channel=channel, content=args["content"]
)
elif tool_name == "create_thread":
await self.tool_handler.create_thread(
channel.id, args["name"]
)
except Exception as e:
logger.error(f"Error executing tool {tool_name}: {e}")
# Send the response
if final_response:
logger.info(f"Bot response to prompt: {final_response}")
await self.message_handler.safe_send(channel, final_response)
except Exception as e:
logger.error(f"Error processing prompt: {e}")
raise
async def handle_reaction(self, payload: RawReactionActionEvent) -> None:
"""Handle reaction events on bot messages."""
# Ignore our own reactions

View File

@@ -4,7 +4,11 @@
# Function to stop background processes on exit
cleanup() {
echo "Stopping processes..."
if [ ! -z "$WEB_PID" ]; then
kill $WEB_PID 2>/dev/null
fi
kill $(jobs -p) 2>/dev/null
wait
exit
}
@@ -25,7 +29,11 @@ sleep 2
# Start the web interface
echo "Starting web interface on port ${WEB_PORT}..."
cd $(dirname "$0")
PYTHONPATH=/Volumes/macminissd/Projects/discord_glhf /Users/talor/Projects/discord_glhf/.venv/bin/python3 web/app.py
# Run web interface with proper Python path and virtualenv
PYTHONPATH=/Volumes/macminissd/Projects/discord_glhf /Users/talor/Projects/discord_glhf/.venv/bin/python3 web/app.py &
WEB_PID=$!
# Wait a moment for web interface to start
sleep 2
# This will be caught by the trap
wait

View File

@@ -1,55 +1,71 @@
#!/usr/bin/env python3
"""Web interface for sending prompts to the Discord bot."""
from flask import Flask, render_template, request, jsonify
import requests
from quart import Quart, render_template, request, jsonify
import os
from pathlib import Path
app = Flask(__name__)
app.template_folder = str(Path(__file__).parent / 'templates')
def async_route(f):
@wraps(f)
def wrapped(*args, **kwargs):
return asyncio.run(f(*args, **kwargs))
return wrapped
# Get configuration from environment variables
API_PORT = int(os.getenv('HTTP_PORT', '8000'))
BACKEND_API_KEY = os.getenv('BACKEND_API_KEY')
from discord_glhf.config import AUTO_RESPONSE_CHANNEL_ID
app = Quart(__name__)
app.template_folder = str(Path(__file__).parent / 'templates')
event_handler = None
def init_app(bot_event_handler):
"""Initialize the app with the bot's event handler."""
global event_handler
event_handler = bot_event_handler
return app
@app.route('/')
def index():
async def index():
"""Render the main interface."""
return render_template('index.html')
return await render_template('index.html')
@app.route('/api/prompt', methods=['POST'])
def send_prompt():
async def send_prompt():
"""Handle prompt submission."""
try:
if not event_handler:
return jsonify({'error': 'Bot not initialized'}), 503
data = request.get_json()
if not data or 'prompt' not in data:
return jsonify({'error': 'Missing prompt'}), 400
# Forward the request to the bot's HTTP server
headers = {'Content-Type': 'application/json'}
if BACKEND_API_KEY:
headers['X-API-Key'] = BACKEND_API_KEY
response = requests.post(
'http://127.0.0.1:8000/api/prompt', # Use fixed internal API port
json=data,
headers=headers
)
return response.json(), response.status_code
channel_id = data.get('channel_id', AUTO_RESPONSE_CHANNEL_ID)
await event_handler.send_prompt_to_channel(data['prompt'], channel_id)
return jsonify({'status': 'processing'}), 200
except Exception as e:
return jsonify({'error': str(e)}), 500
def run_webserver(port=5000):
"""Run the web server."""
app.run(host='0.0.0.0', port=port, debug=True)
import hypercorn.asyncio
from hypercorn.config import Config
def run():
"""Run the web server."""
port = int(os.getenv('WEB_PORT', '5000'))
app.run(host='0.0.0.0', port=port)
config = Config()
config.bind = [f"0.0.0.0:{port}"]
config.use_reloader = True
if __name__ == '__main__':
run()
import asyncio
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(hypercorn.asyncio.serve(app, config))
except KeyboardInterrupt:
pass
finally:
loop.close()
if __name__ == "__main__":
from discord_glhf.config import AUTO_RESPONSE_CHANNEL_ID
port = int(os.getenv('WEB_PORT', '8080'))
run_webserver(port)

View File

@@ -20,6 +20,7 @@ dependencies = [
"promptic>=2.3.1",
"python-dotenv>=1.0.1",
"pyyaml>=6.0.2",
"quart>=0.20.0",
"requests>=2.32.3",
"tenacity>=9.0.0",
"termcolor>=2.5.0",

View File

@@ -1,9 +1,9 @@
{
"total_processed": 1859,
"failed_messages": 46,
"last_processed_time": 1739322639.0875552,
"last_processed_time": 1739323467.1755688,
"user_queues": {},
"last_save": 1739322639.087557,
"last_save": 1739323467.1755688,
"processor_id": null,
"active": false,
"pending_messages": [],

98
uv.lock generated
View File

@@ -10,6 +10,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/fa/ea/23e756ec1fea0c685149304dda954b3b3932d6d06afbf42a66a2e6dc2184/aioconsole-0.8.1-py3-none-any.whl", hash = "sha256:e1023685cde35dde909fbf00631ffb2ed1c67fe0b7058ebb0892afbde5f213e5", size = 43324 },
]
[[package]]
name = "aiofiles"
version = "24.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896 },
]
[[package]]
name = "aiohappyeyeballs"
version = "2.4.4"
@@ -299,6 +308,7 @@ dependencies = [
{ name = "promptic" },
{ name = "python-dotenv" },
{ name = "pyyaml" },
{ name = "quart" },
{ name = "requests" },
{ name = "tenacity" },
{ name = "termcolor" },
@@ -321,6 +331,7 @@ requires-dist = [
{ name = "promptic", specifier = ">=2.3.1" },
{ name = "python-dotenv", specifier = ">=1.0.1" },
{ name = "pyyaml", specifier = ">=6.0.2" },
{ name = "quart", specifier = ">=0.20.0" },
{ name = "requests", specifier = ">=2.32.3" },
{ name = "tenacity", specifier = ">=9.0.0" },
{ name = "termcolor", specifier = ">=2.5.0" },
@@ -423,6 +434,28 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 },
]
[[package]]
name = "h2"
version = "4.2.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "hpack" },
{ name = "hyperframe" },
]
sdist = { url = "https://files.pythonhosted.org/packages/1b/38/d7f80fd13e6582fb8e0df8c9a653dcc02b03ca34f4d72f34869298c5baf8/h2-4.2.0.tar.gz", hash = "sha256:c8a52129695e88b1a0578d8d2cc6842bbd79128ac685463b887ee278126ad01f", size = 2150682 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d0/9e/984486f2d0a0bd2b024bf4bc1c62688fcafa9e61991f041fb0e2def4a982/h2-4.2.0-py3-none-any.whl", hash = "sha256:479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0", size = 60957 },
]
[[package]]
name = "hpack"
version = "4.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357 },
]
[[package]]
name = "httpcore"
version = "1.0.7"
@@ -469,6 +502,30 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/61/8c/fbdc0a88a622d9fa54e132d7bf3ee03ec602758658a2db5b339a65be2cfe/huggingface_hub-0.27.0-py3-none-any.whl", hash = "sha256:8f2e834517f1f1ddf1ecc716f91b120d7333011b7485f665a9a412eacb1a2a81", size = 450537 },
]
[[package]]
name = "hypercorn"
version = "0.17.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "h11" },
{ name = "h2" },
{ name = "priority" },
{ name = "wsproto" },
]
sdist = { url = "https://files.pythonhosted.org/packages/7e/3a/df6c27642e0dcb7aff688ca4be982f0fb5d89f2afd3096dc75347c16140f/hypercorn-0.17.3.tar.gz", hash = "sha256:1b37802ee3ac52d2d85270700d565787ab16cf19e1462ccfa9f089ca17574165", size = 44409 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/0e/3b/dfa13a8d96aa24e40ea74a975a9906cfdc2ab2f4e3b498862a57052f04eb/hypercorn-0.17.3-py3-none-any.whl", hash = "sha256:059215dec34537f9d40a69258d323f56344805efb462959e727152b0aa504547", size = 61742 },
]
[[package]]
name = "hyperframe"
version = "6.1.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007 },
]
[[package]]
name = "idna"
version = "3.10"
@@ -776,6 +833,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 },
]
[[package]]
name = "priority"
version = "2.0.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f5/3c/eb7c35f4dcede96fca1842dac5f4f5d15511aa4b52f3a961219e68ae9204/priority-2.0.0.tar.gz", hash = "sha256:c965d54f1b8d0d0b19479db3924c7c36cf672dbf2aec92d43fbdaf4492ba18c0", size = 24792 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl", hash = "sha256:6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa", size = 8946 },
]
[[package]]
name = "prompt-toolkit"
version = "3.0.48"
@@ -919,6 +985,26 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 },
]
[[package]]
name = "quart"
version = "0.20.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "aiofiles" },
{ name = "blinker" },
{ name = "click" },
{ name = "flask" },
{ name = "hypercorn" },
{ name = "itsdangerous" },
{ name = "jinja2" },
{ name = "markupsafe" },
{ name = "werkzeug" },
]
sdist = { url = "https://files.pythonhosted.org/packages/1d/9d/12e1143a5bd2ccc05c293a6f5ae1df8fd94a8fc1440ecc6c344b2b30ce13/quart-0.20.0.tar.gz", hash = "sha256:08793c206ff832483586f5ae47018c7e40bdd75d886fee3fabbdaa70c2cf505d", size = 63874 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/7e/e9/cc28f21f52913adf333f653b9e0a3bf9cb223f5083a26422968ba73edd8d/quart-0.20.0-py3-none-any.whl", hash = "sha256:003c08f551746710acb757de49d9b768986fd431517d0eb127380b656b98b8f1", size = 77960 },
]
[[package]]
name = "referencing"
version = "0.35.1"
@@ -1184,6 +1270,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", size = 224498 },
]
[[package]]
name = "wsproto"
version = "1.2.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "h11" },
]
sdist = { url = "https://files.pythonhosted.org/packages/c9/4a/44d3c295350d776427904d73c189e10aeae66d7f555bb2feee16d1e4ba5a/wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", size = 53425 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736", size = 24226 },
]
[[package]]
name = "yarl"
version = "1.18.3"