97 lines
3.0 KiB
Python
97 lines
3.0 KiB
Python
"""
|
|
AI Model logging configuration.
|
|
|
|
Controls whether AI model requests/responses are logged to disk.
|
|
Easy to extend with additional log targets, formats, or filters.
|
|
"""
|
|
|
|
import os
|
|
import json
|
|
import base64
|
|
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
|
from cryptography.hazmat.backends import default_backend
|
|
from cryptography.hazmat.primitives import padding
|
|
|
|
from app.config import settings
|
|
#16字节密钥
|
|
ENCRYPTION_KEY = b'videogen@202605!'
|
|
|
|
|
|
|
|
def encrypt_data(data: dict, is_encrypt: bool = False) -> str:
|
|
data_str = json.dumps(data, ensure_ascii=False, sort_keys=True)
|
|
if is_encrypt:
|
|
return data_str
|
|
|
|
data_bytes = data_str.encode("utf-8")
|
|
|
|
padder = padding.PKCS7(128).padder()
|
|
padded_data = padder.update(data_bytes) + padder.finalize()
|
|
|
|
iv = os.urandom(16)
|
|
cipher = Cipher(algorithms.AES(ENCRYPTION_KEY), modes.CBC(iv), backend=default_backend())
|
|
encryptor = cipher.encryptor()
|
|
encrypted_data = encryptor.update(padded_data) + encryptor.finalize()
|
|
|
|
return base64.b64encode(iv + encrypted_data).decode("utf-8")
|
|
|
|
|
|
def decrypt_data(encrypted_str: str) -> dict:
|
|
try:
|
|
encrypted_bytes = base64.b64decode(encrypted_str)
|
|
iv = encrypted_bytes[:16]
|
|
ciphertext = encrypted_bytes[16:]
|
|
|
|
cipher = Cipher(algorithms.AES(ENCRYPTION_KEY), modes.CBC(iv), backend=default_backend())
|
|
decryptor = cipher.decryptor()
|
|
padded_data = decryptor.update(ciphertext) + decryptor.finalize()
|
|
|
|
unpadder = padding.PKCS7(128).unpadder()
|
|
data_bytes = unpadder.update(padded_data) + unpadder.finalize()
|
|
|
|
return json.loads(data_bytes.decode("utf-8"))
|
|
except Exception:
|
|
return {}
|
|
|
|
|
|
# ── Feature toggle ──────────────────────────────────────────
|
|
AI_LOG_ENABLED: bool = True # Set True to enable logging, or use env var AI_LOG_ENABLED=true
|
|
|
|
|
|
# ── Log output settings ────────────────────────────────────
|
|
BASE_LOG_DIR = os.path.join(
|
|
os.path.dirname(os.path.dirname(os.path.dirname(__file__))),
|
|
"log",
|
|
)
|
|
LOG_DIR = os.path.join(BASE_LOG_DIR, "AiModel")
|
|
# 请求响应日志目录
|
|
LOG_R_Q_DIR = os.path.join(BASE_LOG_DIR, "RequestResponse")
|
|
# VP V3 虚拟素材库专用日志目录
|
|
VP_V3_LOG_DIR = os.path.join(BASE_LOG_DIR, "virtual_portrait_v3")
|
|
|
|
LOG_FILENAME_FORMAT = "{date}.log" # e.g. 2026-05-12.log
|
|
LOG_DATE_FORMAT = "%Y-%m-%d"
|
|
|
|
|
|
# ── Fields to include in each log entry ────────────────────
|
|
LOG_FIELDS = [
|
|
"timestamp",
|
|
"model_name",
|
|
"model_id",
|
|
"provider",
|
|
"api_base",
|
|
"request",
|
|
"response",
|
|
"error",
|
|
]
|
|
|
|
|
|
def is_enabled() -> bool:
|
|
"""Check if AI model logging is enabled."""
|
|
env_val = os.environ.get("AI_LOG_ENABLED", "").lower()
|
|
if env_val in ("true", "1", "yes"):
|
|
return True
|
|
if env_val in ("false", "0", "no"):
|
|
return False
|
|
return AI_LOG_ENABLED
|