Major changes: - Add Pydantic-based configuration system (bot/config.py, bot/config_manager.py) - Add config.yaml with all service URLs, models, and feature flags - Fix config.yaml path resolution in Docker (check /app/config.yaml first) - Remove Fish Audio API integration (tested feature that didn't work) - Remove hardcoded ERROR_WEBHOOK_URL, import from config instead - Add missing Pydantic models (LogConfigUpdateRequest, LogFilterUpdateRequest) - Enable Cheshire Cat memory system by default (USE_CHESHIRE_CAT=true) - Add .env.example template with all required environment variables - Add setup.sh script for user-friendly initialization - Update docker-compose.yml with proper env file mounting - Update .gitignore for config files and temporary files Config system features: - Static configuration from config.yaml - Runtime overrides from config_runtime.yaml - Environment variables for secrets (.env) - Web UI integration via config_manager - Graceful fallback to defaults Secrets handling: - Move ERROR_WEBHOOK_URL from hardcoded to .env - Add .env.example with all placeholder values - Document all required secrets - Fish API key and voice ID removed from .env Documentation: - CONFIG_README.md - Configuration system guide - CONFIG_SYSTEM_COMPLETE.md - Implementation summary - FISH_API_REMOVAL_COMPLETE.md - Removal record - SECRETS_CONFIGURED.md - Secrets setup record - BOT_STARTUP_FIX.md - Pydantic model fixes - MIGRATION_CHECKLIST.md - Setup checklist - WEB_UI_INTEGRATION_COMPLETE.md - Web UI config guide - Updated readmes/README.md with new features
304 lines
6.9 KiB
Markdown
304 lines
6.9 KiB
Markdown
# 🎵 Miku Discord Bot - Configuration System
|
|
|
|
## 📚 Overview
|
|
|
|
The bot now uses a modern, type-safe configuration system that separates secrets from general settings:
|
|
|
|
- **`.env`** - Secrets only (API keys, tokens) - **NEVER commit to git**
|
|
- **`config.yaml`** - All configuration settings - **Safe to commit**
|
|
- **`bot/config.py`** - Pydantic models with validation - **Type-safe loading**
|
|
|
|
---
|
|
|
|
## 🚀 Quick Setup
|
|
|
|
### 1. Run the Setup Script
|
|
|
|
```bash
|
|
chmod +x setup.sh
|
|
./setup.sh
|
|
```
|
|
|
|
This creates a `.env` file from `.env.example`.
|
|
|
|
### 2. Edit `.env` and Add Your Values
|
|
|
|
```bash
|
|
nano .env # or your preferred editor
|
|
```
|
|
|
|
Required variables:
|
|
```bash
|
|
DISCORD_BOT_TOKEN=your_actual_bot_token_here
|
|
```
|
|
|
|
Optional variables:
|
|
```bash
|
|
OWNER_USER_ID=209381657369772032 # Your Discord user ID
|
|
ERROR_WEBHOOK_URL=https://discord.com/api/webhooks/... # For error notifications
|
|
CHESHIRE_CAT_API_KEY= # Leave empty if no auth
|
|
```
|
|
|
|
### 3. (Optional) Customize `config.yaml`
|
|
|
|
Edit `config.yaml` to adjust:
|
|
- Model names
|
|
- Service URLs
|
|
- Feature flags
|
|
- Debug modes
|
|
- Timeout values
|
|
|
|
### 4. Start the Bot
|
|
|
|
```bash
|
|
docker compose up -d
|
|
```
|
|
|
|
---
|
|
|
|
## 📋 Configuration Files
|
|
|
|
### `.env` (Secrets - DO NOT COMMIT)
|
|
|
|
Contains sensitive values that should never be shared:
|
|
|
|
| Variable | Required | Description |
|
|
|----------|----------|-------------|
|
|
| `DISCORD_BOT_TOKEN` | ✅ Yes | Discord bot token |
|
|
| `CHESHIRE_CAT_API_KEY` | No | Cheshire Cat API key (leave empty if no auth) |
|
|
| `ERROR_WEBHOOK_URL` | No | Discord webhook for errors |
|
|
| `OWNER_USER_ID` | No | Bot owner Discord ID |
|
|
|
|
### `config.yaml` (Settings - Safe to Commit)
|
|
|
|
Contains all non-secret configuration:
|
|
|
|
```yaml
|
|
services:
|
|
llama:
|
|
url: http://llama-swap:8080
|
|
amd_url: http://llama-swap-amd:8080
|
|
|
|
models:
|
|
text: llama3.1
|
|
vision: vision
|
|
evil: darkidol
|
|
japanese: swallow
|
|
|
|
discord:
|
|
language_mode: english
|
|
api_port: 3939
|
|
|
|
autonomous:
|
|
debug_mode: false
|
|
|
|
voice:
|
|
debug_mode: false
|
|
```
|
|
|
|
---
|
|
|
|
## 🔧 Configuration Options
|
|
|
|
### Services
|
|
|
|
| Setting | Default | Description |
|
|
|---------|---------|-------------|
|
|
| `services.llama.url` | `http://llama-swap:8080` | LLM endpoint (NVIDIA GPU) |
|
|
| `services.llama.amd_url` | `http://llama-swap-amd:8080` | LLM endpoint (AMD GPU) |
|
|
| `services.cheshire_cat.url` | `http://cheshire-cat:80` | Memory system endpoint |
|
|
| `services.cheshire_cat.timeout_seconds` | `120` | Request timeout |
|
|
| `services.cheshire_cat.enabled` | `true` | Enable Cheshire Cat |
|
|
|
|
### Models
|
|
|
|
| Setting | Default | Description |
|
|
|---------|---------|-------------|
|
|
| `models.text` | `llama3.1` | Main text model |
|
|
| `models.vision` | `vision` | Vision model for images |
|
|
| `models.evil` | `darkidol` | Uncensored model (evil mode) |
|
|
| `models.japanese` | `swallow` | Japanese language model |
|
|
|
|
### Discord
|
|
|
|
| Setting | Default | Description |
|
|
|---------|---------|-------------|
|
|
| `discord.language_mode` | `english` | Language: `english` or `japanese` |
|
|
| `discord.api_port` | `3939` | FastAPI server port |
|
|
|
|
### Autonomous System
|
|
|
|
| Setting | Default | Description |
|
|
|---------|---------|-------------|
|
|
| `autonomous.debug_mode` | `false` | Enable detailed decision logging |
|
|
|
|
### Voice Chat
|
|
|
|
| Setting | Default | Description |
|
|
|---------|---------|-------------|
|
|
| `voice.debug_mode` | `false` | Enable voice chat debugging |
|
|
|
|
### GPU
|
|
|
|
| Setting | Default | Description |
|
|
|---------|---------|-------------|
|
|
| `gpu.prefer_amd` | `false` | Prefer AMD GPU over NVIDIA |
|
|
| `gpu.amd_models_enabled` | `true` | Enable AMD GPU models |
|
|
|
|
---
|
|
|
|
## 🐛 Debugging
|
|
|
|
### Enable Debug Mode
|
|
|
|
Set `autonomous.debug_mode: true` in `config.yaml` to see:
|
|
- Autonomous decision logs
|
|
- Mood changes
|
|
- Action selection process
|
|
|
|
### Check Configuration
|
|
|
|
The bot validates configuration on startup. If validation fails, check the logs for specific errors.
|
|
|
|
### Print Configuration Summary
|
|
|
|
When `autonomous.debug_mode` is enabled, the bot prints a configuration summary on startup showing all settings (except secrets).
|
|
|
|
---
|
|
|
|
## 🔐 Security Best Practices
|
|
|
|
### ✅ DO:
|
|
- Keep `.env` out of version control (in `.gitignore`)
|
|
- Use different API keys for development and production
|
|
- Rotate API keys periodically
|
|
- Limit API key permissions to minimum required
|
|
|
|
### ❌ DO NOT:
|
|
- Commit `.env` to git
|
|
- Share `.env` with others
|
|
- Hardcode secrets in code
|
|
- Use `.env.example` as your actual config
|
|
|
|
---
|
|
|
|
## 📦 Migration from `globals.py`
|
|
|
|
The new configuration system maintains **backward compatibility** with `globals.py`. All existing code continues to work without changes.
|
|
|
|
To migrate new code to use the config system:
|
|
|
|
**Old way:**
|
|
```python
|
|
import globals
|
|
url = globals.LLAMA_URL
|
|
model = globals.TEXT_MODEL
|
|
```
|
|
|
|
**New way:**
|
|
```python
|
|
from config import CONFIG
|
|
url = CONFIG.services.url
|
|
model = CONFIG.models.text
|
|
```
|
|
|
|
**Secrets:**
|
|
```python
|
|
from config import SECRETS
|
|
token = SECRETS.discord_bot_token
|
|
```
|
|
|
|
---
|
|
|
|
## 🔄 Environment-Specific Configs
|
|
|
|
For different environments (dev, staging, prod), create multiple config files:
|
|
|
|
```bash
|
|
config.yaml # Default
|
|
config.dev.yaml # Development
|
|
config.prod.yaml # Production
|
|
```
|
|
|
|
Then override with `CONFIG_FILE` environment variable:
|
|
|
|
```bash
|
|
docker compose run --env CONFIG_FILE=config.prod.yaml miku-bot
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 Validation
|
|
|
|
The configuration system validates:
|
|
- **Types**: All values match expected types
|
|
- **Ranges**: Numeric values within bounds
|
|
- **Patterns**: String values match regex patterns
|
|
- **Required**: All required secrets present
|
|
|
|
If validation fails, the bot will not start and will print specific errors.
|
|
|
|
---
|
|
|
|
## 📖 API Reference
|
|
|
|
### `config.load_config(config_path: str = None) -> AppConfig`
|
|
|
|
Load configuration from YAML file.
|
|
|
|
### `config.load_secrets() -> Secrets`
|
|
|
|
Load secrets from environment variables.
|
|
|
|
### `config.validate_config() -> tuple[bool, list[str]]`
|
|
|
|
Validate configuration, returns `(is_valid, list_of_errors)`.
|
|
|
|
### `config.print_config_summary()`
|
|
|
|
Print a summary of current configuration (without secrets).
|
|
|
|
---
|
|
|
|
## 🆘 Troubleshooting
|
|
|
|
### "DISCORD_BOT_TOKEN not set"
|
|
|
|
Edit `.env` and add your Discord bot token.
|
|
|
|
### "Configuration validation failed"
|
|
|
|
Check the error messages in the logs and fix the specific issues.
|
|
|
|
### "Config file not found"
|
|
|
|
Ensure `config.yaml` exists in the project root.
|
|
|
|
### Bot won't start after config changes
|
|
|
|
Check that all required variables in `.env` are set. Run validation:
|
|
|
|
```python
|
|
python -c "from config import validate_config; print(validate_config())"
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 Notes
|
|
|
|
- Configuration is loaded at module import time
|
|
- Secrets from `.env` override defaults in `config.yaml`
|
|
- The bot validates configuration on startup
|
|
- All legacy `globals.py` variables are still available
|
|
- Pydantic provides automatic type conversion and validation
|
|
|
|
---
|
|
|
|
## 🎯 Future Improvements
|
|
|
|
- [ ] Add config hot-reloading without restart
|
|
- [ ] Web UI for configuration management
|
|
- [ ] Config versioning and migration system
|
|
- [ ] Secret rotation automation
|
|
- [ ] Per-server configuration overrides
|