Spaces:
Sleeping
Sleeping
Upload 116 files
Browse files- Dockerfile +4 -2
- main.py +47 -18
- protobuf2openai/logging.py +40 -26
- warp2protobuf/config/settings.py +7 -5
- warp2protobuf/core/logging.py +48 -40
Dockerfile
CHANGED
|
@@ -7,11 +7,13 @@ RUN pip install --no-cache-dir -r requirements.txt
|
|
| 7 |
|
| 8 |
COPY . .
|
| 9 |
|
| 10 |
-
RUN mkdir -p /data
|
|
|
|
| 11 |
|
| 12 |
ENV OPENAI_COMPAT_PORT=7860 \
|
| 13 |
PORT=7860 \
|
| 14 |
-
DATA_DIR=/data
|
|
|
|
| 15 |
|
| 16 |
EXPOSE 7860
|
| 17 |
|
|
|
|
| 7 |
|
| 8 |
COPY . .
|
| 9 |
|
| 10 |
+
RUN mkdir -p /app/logs /data/logs \
|
| 11 |
+
&& chmod -R 777 /app/logs /data
|
| 12 |
|
| 13 |
ENV OPENAI_COMPAT_PORT=7860 \
|
| 14 |
PORT=7860 \
|
| 15 |
+
DATA_DIR=/data \
|
| 16 |
+
LOG_DIR=/data/logs
|
| 17 |
|
| 18 |
EXPOSE 7860
|
| 19 |
|
main.py
CHANGED
|
@@ -9,8 +9,9 @@ import time
|
|
| 9 |
import sys
|
| 10 |
import os
|
| 11 |
import importlib
|
| 12 |
-
import logging
|
| 13 |
-
import asyncio
|
|
|
|
| 14 |
|
| 15 |
# 在导入项目模块之前,确保项目根目录在sys.path中
|
| 16 |
# 这有助于解决在不同环境下模块导入失败的问题
|
|
@@ -18,14 +19,38 @@ project_root = os.path.dirname(os.path.abspath(__file__))
|
|
| 18 |
if project_root not in sys.path:
|
| 19 |
sys.path.insert(0, project_root)
|
| 20 |
|
| 21 |
-
import config
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
|
| 30 |
|
| 31 |
# ==================== 服务启动函数 ====================
|
|
@@ -101,13 +126,17 @@ def run_warp_register():
|
|
| 101 |
|
| 102 |
# ==================== 进程管理 ====================
|
| 103 |
|
| 104 |
-
SERVICES = {
|
| 105 |
-
"server": run_server,
|
| 106 |
-
"openai": run_openai_compat,
|
| 107 |
-
"pool_service": run_pool_service,
|
| 108 |
-
"pool_maintenance": run_pool_maintenance,
|
| 109 |
-
"register": run_warp_register,
|
| 110 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 111 |
|
| 112 |
|
| 113 |
def start_all_services():
|
|
@@ -175,4 +204,4 @@ if __name__ == "__main__":
|
|
| 175 |
else:
|
| 176 |
print(f"错误: 未知命令 '{command}'\n")
|
| 177 |
print_usage()
|
| 178 |
-
sys.exit(1)
|
|
|
|
| 9 |
import sys
|
| 10 |
import os
|
| 11 |
import importlib
|
| 12 |
+
import logging
|
| 13 |
+
import asyncio
|
| 14 |
+
import shutil
|
| 15 |
|
| 16 |
# 在导入项目模块之前,确保项目根目录在sys.path中
|
| 17 |
# 这有助于解决在不同环境下模块导入失败的问题
|
|
|
|
| 19 |
if project_root not in sys.path:
|
| 20 |
sys.path.insert(0, project_root)
|
| 21 |
|
| 22 |
+
import config
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
def prepare_runtime_environment():
|
| 26 |
+
data_dir = os.path.dirname(config.DATABASE_PATH)
|
| 27 |
+
log_dir = os.getenv("LOG_DIR") or os.path.join(os.getenv("DATA_DIR", "/data"), "logs")
|
| 28 |
+
|
| 29 |
+
for path in {data_dir, log_dir}:
|
| 30 |
+
if not path:
|
| 31 |
+
continue
|
| 32 |
+
try:
|
| 33 |
+
os.makedirs(path, exist_ok=True)
|
| 34 |
+
except Exception as exc:
|
| 35 |
+
logger = logging.getLogger(__name__)
|
| 36 |
+
logger.warning(f"无法创建目录 {path}: {exc}")
|
| 37 |
+
|
| 38 |
+
default_db = os.path.join(project_root, "warp_accounts.db")
|
| 39 |
+
if config.DATABASE_PATH and not os.path.exists(config.DATABASE_PATH) and os.path.exists(default_db):
|
| 40 |
+
try:
|
| 41 |
+
shutil.copy2(default_db, config.DATABASE_PATH)
|
| 42 |
+
logging.getLogger(__name__).info(f"已初始化数据库文件: {config.DATABASE_PATH}")
|
| 43 |
+
except Exception as exc:
|
| 44 |
+
logging.getLogger(__name__).warning(f"初始化数据库失败: {exc}")
|
| 45 |
+
|
| 46 |
+
# 配置日志
|
| 47 |
+
logging.basicConfig(
|
| 48 |
+
level=config.LOG_LEVEL,
|
| 49 |
+
format=config.LOG_FORMAT
|
| 50 |
+
)
|
| 51 |
+
logger = logging.getLogger(__name__)
|
| 52 |
+
|
| 53 |
+
prepare_runtime_environment()
|
| 54 |
|
| 55 |
|
| 56 |
# ==================== 服务启动函数 ====================
|
|
|
|
| 126 |
|
| 127 |
# ==================== 进程管理 ====================
|
| 128 |
|
| 129 |
+
SERVICES = {
|
| 130 |
+
"server": run_server,
|
| 131 |
+
"openai": run_openai_compat,
|
| 132 |
+
"pool_service": run_pool_service,
|
| 133 |
+
"pool_maintenance": run_pool_maintenance,
|
| 134 |
+
"register": run_warp_register,
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
if not getattr(config, "ENABLE_AUTO_REGISTER", True):
|
| 138 |
+
for name in ("pool_maintenance", "register"):
|
| 139 |
+
SERVICES.pop(name, None)
|
| 140 |
|
| 141 |
|
| 142 |
def start_all_services():
|
|
|
|
| 204 |
else:
|
| 205 |
print(f"错误: 未知命令 '{command}'\n")
|
| 206 |
print_usage()
|
| 207 |
+
sys.exit(1)
|
protobuf2openai/logging.py
CHANGED
|
@@ -3,30 +3,44 @@
|
|
| 3 |
"""
|
| 4 |
Local logging for protobuf2openai package to avoid cross-package dependencies.
|
| 5 |
"""
|
| 6 |
-
import logging
|
| 7 |
-
|
| 8 |
-
from
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
_logger.
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
file_handler.
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
_logger.
|
| 31 |
-
|
| 32 |
-
logger = _logger
|
|
|
|
| 3 |
"""
|
| 4 |
Local logging for protobuf2openai package to avoid cross-package dependencies.
|
| 5 |
"""
|
| 6 |
+
import logging
|
| 7 |
+
import os
|
| 8 |
+
from logging.handlers import RotatingFileHandler
|
| 9 |
+
from pathlib import Path
|
| 10 |
+
|
| 11 |
+
_default_log_dir = os.getenv("LOG_DIR") or os.path.join(os.getenv("DATA_DIR", "/data"), "logs")
|
| 12 |
+
LOG_DIR = Path(_default_log_dir)
|
| 13 |
+
|
| 14 |
+
try:
|
| 15 |
+
LOG_DIR.mkdir(parents=True, exist_ok=True)
|
| 16 |
+
except Exception as e:
|
| 17 |
+
fallback = Path("/tmp/protobuf2openai_logs")
|
| 18 |
+
try:
|
| 19 |
+
fallback.mkdir(parents=True, exist_ok=True)
|
| 20 |
+
LOG_DIR = fallback
|
| 21 |
+
except Exception:
|
| 22 |
+
LOG_DIR = None
|
| 23 |
|
| 24 |
+
_logger = logging.getLogger("protobuf2openai")
|
| 25 |
+
_logger.setLevel(logging.INFO)
|
| 26 |
+
|
| 27 |
+
for h in _logger.handlers[:]:
|
| 28 |
+
_logger.removeHandler(h)
|
| 29 |
+
|
| 30 |
+
console_handler = logging.StreamHandler()
|
| 31 |
+
console_handler.setLevel(logging.INFO)
|
| 32 |
+
|
| 33 |
+
fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s')
|
| 34 |
+
console_handler.setFormatter(fmt)
|
| 35 |
+
_logger.addHandler(console_handler)
|
| 36 |
+
|
| 37 |
+
if LOG_DIR is not None:
|
| 38 |
+
try:
|
| 39 |
+
file_handler = RotatingFileHandler(LOG_DIR / "openai_compat.log", maxBytes=5*1024*1024, backupCount=3, encoding="utf-8")
|
| 40 |
+
file_handler.setLevel(logging.INFO)
|
| 41 |
+
file_handler.setFormatter(fmt)
|
| 42 |
+
_logger.addHandler(file_handler)
|
| 43 |
+
except Exception as e:
|
| 44 |
+
_logger.warning(f"Unable to create file logger under {LOG_DIR}: {e}")
|
| 45 |
+
|
| 46 |
+
logger = _logger
|
warp2protobuf/config/settings.py
CHANGED
|
@@ -12,10 +12,12 @@ from dotenv import load_dotenv
|
|
| 12 |
# Load environment variables
|
| 13 |
load_dotenv()
|
| 14 |
|
| 15 |
-
# Path configurations
|
| 16 |
-
SCRIPT_DIR = pathlib.Path(__file__).resolve().parent.parent.parent
|
| 17 |
-
PROTO_DIR = SCRIPT_DIR / "proto"
|
| 18 |
-
|
|
|
|
|
|
|
| 19 |
|
| 20 |
# API configuration
|
| 21 |
WARP_URL = "https://app.warp.dev/ai/multi-agent"
|
|
@@ -40,4 +42,4 @@ SYSTEM_STR = {"agent_output.text", "server_message_data", "USER_INITIATED", "age
|
|
| 40 |
|
| 41 |
# JWT refresh configuration
|
| 42 |
REFRESH_TOKEN_B64 = "Z3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuJnJlZnJlc2hfdG9rZW49QU1mLXZCeFNSbWRodmVHR0JZTTY5cDA1a0RoSW4xaTd3c2NBTEVtQzlmWURScEh6akVSOWRMN2trLWtIUFl3dlk5Uk9rbXk1MHFHVGNJaUpaNEFtODZoUFhrcFZQTDkwSEptQWY1Zlo3UGVqeXBkYmNLNHdzbzhLZjNheGlTV3RJUk9oT2NuOU56R2FTdmw3V3FSTU5PcEhHZ0JyWW40SThrclc1N1I4X3dzOHU3WGNTdzh1MERpTDlIcnBNbTBMdHdzQ2g4MWtfNmJiMkNXT0ViMWxJeDNIV1NCVGVQRldzUQ=="
|
| 43 |
-
REFRESH_URL = "https://app.warp.dev/proxy/token?key=AIzaSyBdy3O3S9hrdayLJxJ7mriBR4qgUaUygAs"
|
|
|
|
| 12 |
# Load environment variables
|
| 13 |
load_dotenv()
|
| 14 |
|
| 15 |
+
# Path configurations
|
| 16 |
+
SCRIPT_DIR = pathlib.Path(__file__).resolve().parent.parent.parent
|
| 17 |
+
PROTO_DIR = SCRIPT_DIR / "proto"
|
| 18 |
+
|
| 19 |
+
_log_base = os.getenv("WARP_LOG_DIR") or os.getenv("LOG_DIR") or os.path.join(os.getenv("DATA_DIR", "/data"), "logs")
|
| 20 |
+
LOGS_DIR = pathlib.Path(_log_base)
|
| 21 |
|
| 22 |
# API configuration
|
| 23 |
WARP_URL = "https://app.warp.dev/ai/multi-agent"
|
|
|
|
| 42 |
|
| 43 |
# JWT refresh configuration
|
| 44 |
REFRESH_TOKEN_B64 = "Z3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuJnJlZnJlc2hfdG9rZW49QU1mLXZCeFNSbWRodmVHR0JZTTY5cDA1a0RoSW4xaTd3c2NBTEVtQzlmWURScEh6akVSOWRMN2trLWtIUFl3dlk5Uk9rbXk1MHFHVGNJaUpaNEFtODZoUFhrcFZQTDkwSEptQWY1Zlo3UGVqeXBkYmNLNHdzbzhLZjNheGlTV3RJUk9oT2NuOU56R2FTdmw3V3FSTU5PcEhHZ0JyWW40SThrclc1N1I4X3dzOHU3WGNTdzh1MERpTDlIcnBNbTBMdHdzQ2g4MWtfNmJiMkNXT0ViMWxJeDNIV1NCVGVQRldzUQ=="
|
| 45 |
+
REFRESH_URL = "https://app.warp.dev/proxy/token?key=AIzaSyBdy3O3S9hrdayLJxJ7mriBR4qgUaUygAs"
|
warp2protobuf/core/logging.py
CHANGED
|
@@ -5,12 +5,14 @@ Logging system for Warp API server
|
|
| 5 |
|
| 6 |
Provides comprehensive logging with file rotation and console output.
|
| 7 |
"""
|
| 8 |
-
import logging
|
| 9 |
-
import os
|
| 10 |
-
import shutil
|
| 11 |
-
from datetime import datetime
|
| 12 |
-
from logging.handlers import RotatingFileHandler
|
| 13 |
-
from
|
|
|
|
|
|
|
| 14 |
|
| 15 |
|
| 16 |
def backup_existing_log():
|
|
@@ -29,39 +31,45 @@ def backup_existing_log():
|
|
| 29 |
print(f"Warning: Could not backup log file: {e}")
|
| 30 |
|
| 31 |
|
| 32 |
-
def setup_logging():
|
| 33 |
-
"""Configure comprehensive logging system"""
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
)
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
|
| 66 |
|
| 67 |
# Initialize logger
|
|
@@ -118,4 +126,4 @@ def set_log_file(log_file_name: str) -> None:
|
|
| 118 |
try:
|
| 119 |
logger.info(f"Logging redirected to: {LOGS_DIR / log_file_name}")
|
| 120 |
except Exception:
|
| 121 |
-
pass
|
|
|
|
| 5 |
|
| 6 |
Provides comprehensive logging with file rotation and console output.
|
| 7 |
"""
|
| 8 |
+
import logging
|
| 9 |
+
import os
|
| 10 |
+
import shutil
|
| 11 |
+
from datetime import datetime
|
| 12 |
+
from logging.handlers import RotatingFileHandler
|
| 13 |
+
from pathlib import Path
|
| 14 |
+
|
| 15 |
+
from ..config.settings import LOGS_DIR
|
| 16 |
|
| 17 |
|
| 18 |
def backup_existing_log():
|
|
|
|
| 31 |
print(f"Warning: Could not backup log file: {e}")
|
| 32 |
|
| 33 |
|
| 34 |
+
def setup_logging():
|
| 35 |
+
"""Configure comprehensive logging system"""
|
| 36 |
+
log_dir = Path(LOGS_DIR)
|
| 37 |
+
file_handler = None
|
| 38 |
+
|
| 39 |
+
try:
|
| 40 |
+
log_dir.mkdir(parents=True, exist_ok=True)
|
| 41 |
+
backup_existing_log()
|
| 42 |
+
file_handler = RotatingFileHandler(
|
| 43 |
+
log_dir / 'warp_api.log',
|
| 44 |
+
maxBytes=10*1024*1024,
|
| 45 |
+
backupCount=5,
|
| 46 |
+
encoding='utf-8'
|
| 47 |
+
)
|
| 48 |
+
file_handler.setLevel(logging.DEBUG)
|
| 49 |
+
except Exception as e:
|
| 50 |
+
print(f"Warning: Cannot use log directory {log_dir}: {e}")
|
| 51 |
+
|
| 52 |
+
logger = logging.getLogger('warp_api')
|
| 53 |
+
logger.setLevel(logging.DEBUG)
|
| 54 |
+
|
| 55 |
+
for handler in logger.handlers[:]:
|
| 56 |
+
logger.removeHandler(handler)
|
| 57 |
+
|
| 58 |
+
console_handler = logging.StreamHandler()
|
| 59 |
+
console_handler.setLevel(logging.INFO)
|
| 60 |
+
|
| 61 |
+
formatter = logging.Formatter(
|
| 62 |
+
'%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s'
|
| 63 |
+
)
|
| 64 |
+
|
| 65 |
+
console_handler.setFormatter(formatter)
|
| 66 |
+
logger.addHandler(console_handler)
|
| 67 |
+
|
| 68 |
+
if file_handler is not None:
|
| 69 |
+
file_handler.setFormatter(formatter)
|
| 70 |
+
logger.addHandler(file_handler)
|
| 71 |
+
|
| 72 |
+
return logger
|
| 73 |
|
| 74 |
|
| 75 |
# Initialize logger
|
|
|
|
| 126 |
try:
|
| 127 |
logger.info(f"Logging redirected to: {LOGS_DIR / log_file_name}")
|
| 128 |
except Exception:
|
| 129 |
+
pass
|