baohuixiao commited on
Commit
8c4d9ff
·
verified ·
1 Parent(s): 3941d66

Upload 116 files

Browse files
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
- logging.basicConfig(
25
- level=config.LOG_LEVEL,
26
- format=config.LOG_FORMAT
27
- )
28
- logger = logging.getLogger(__name__)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- from logging.handlers import RotatingFileHandler
8
- from pathlib import Path
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
- LOG_DIR = Path("logs")
11
- LOG_DIR.mkdir(exist_ok=True)
12
-
13
- _logger = logging.getLogger("protobuf2openai")
14
- _logger.setLevel(logging.INFO)
15
-
16
- # Remove existing handlers to prevent duplication
17
- for h in _logger.handlers[:]:
18
- _logger.removeHandler(h)
19
-
20
- file_handler = RotatingFileHandler(LOG_DIR / "openai_compat.log", maxBytes=5*1024*1024, backupCount=3, encoding="utf-8")
21
- file_handler.setLevel(logging.INFO)
22
- console_handler = logging.StreamHandler()
23
- console_handler.setLevel(logging.INFO)
24
-
25
- fmt = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s')
26
- file_handler.setFormatter(fmt)
27
- console_handler.setFormatter(fmt)
28
-
29
- _logger.addHandler(file_handler)
30
- _logger.addHandler(console_handler)
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
- LOGS_DIR = SCRIPT_DIR / "logs"
 
 
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 ..config.settings import LOGS_DIR
 
 
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
- LOGS_DIR.mkdir(exist_ok=True)
35
-
36
- backup_existing_log()
37
-
38
- logger = logging.getLogger('warp_api')
39
- logger.setLevel(logging.DEBUG)
40
-
41
- for handler in logger.handlers[:]:
42
- logger.removeHandler(handler)
43
-
44
- file_handler = RotatingFileHandler(
45
- LOGS_DIR / 'warp_api.log',
46
- maxBytes=10*1024*1024,
47
- backupCount=5,
48
- encoding='utf-8'
49
- )
50
- file_handler.setLevel(logging.DEBUG)
51
-
52
- console_handler = logging.StreamHandler()
53
- console_handler.setLevel(logging.INFO)
54
-
55
- formatter = logging.Formatter(
56
- '%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s'
57
- )
58
- file_handler.setFormatter(formatter)
59
- console_handler.setFormatter(formatter)
60
-
61
- logger.addHandler(file_handler)
62
- logger.addHandler(console_handler)
63
-
64
- return logger
 
 
 
 
 
 
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