真人素材库本地完成

This commit is contained in:
2026-07-06 15:13:41 +08:00
parent 75d1f7a428
commit ab67bdf19e
52 changed files with 4131 additions and 137 deletions
+2
View File
@@ -16,3 +16,5 @@ from app.enums.team import *
from app.enums.home_material import *
from app.enums.celery_queue import *
from app.enums.audio_reference import *
from app.enums.private_portrait import *
+6
View File
@@ -6,6 +6,7 @@ class CeleryQueue(str, Enum):
GEN_PROVIDER_POLL = "gen_provider_poll"
GEN_RESULT_DOWNLOAD = "gen_result_download"
GEN_RECOVERY = "gen_recovery"
GEN_PRIVATE_PORTRAIT = "gen_private_portrait"
DEFAULT = "default"
@@ -19,3 +20,8 @@ class CeleryTaskName(str, Enum):
STARTUP_RECOVERY = "recovery.startup_recovery_once"
MODULE_ASYNC_RECOVERY = "module_async.recover_module_async_tasks_once"
SHOT_SPLIT_RECOVERY = "shot_replicate.recover_split_tasks_once"
PRIVATE_PORTRAIT_POLL_ASSET = "private_portrait.poll_asset_status"
PRIVATE_PORTRAIT_SYNC_DUE_ASSETS = "private_portrait.sync_due_assets"
PRIVATE_PORTRAIT_DELETE_ASSET = "private_portrait.delete_asset_remote"
PRIVATE_PORTRAIT_DELETE_PROJECT = "private_portrait.delete_project_remote"
PRIVATE_PORTRAIT_RECOVER_REMOTE_DELETES = "private_portrait.recover_remote_deletes"
+191
View File
@@ -0,0 +1,191 @@
from __future__ import annotations
from enum import Enum
# 用户真人素材图片默认上限。users.private_portrait_image_limit = 0 表示关闭模块;>0 表示启用并限制总量。
PRIVATE_PORTRAIT_DEFAULT_IMAGE_LIMIT = 5
# ProjectName 由服务层按 {env}-{user_id}-{项目名slug} 生成并快照到 private_portrait_projects.remote_project_name。
PRIVATE_PORTRAIT_PROJECT_ENV_LOCAL = "local"
PRIVATE_PORTRAIT_PROJECT_ENV_TEST = "test"
PRIVATE_PORTRAIT_PROJECT_ENV_ONLINE = "online"
PRIVATE_PORTRAIT_PROJECT_ENV_VALUES = {
PRIVATE_PORTRAIT_PROJECT_ENV_LOCAL,
PRIVATE_PORTRAIT_PROJECT_ENV_TEST,
PRIVATE_PORTRAIT_PROJECT_ENV_ONLINE,
}
PRIVATE_PORTRAIT_GROUP_TYPE = "LivenessFace"
PRIVATE_PORTRAIT_VERIFY_TYPE = "real_time"
PRIVATE_PORTRAIT_SUCCESS_RESULT_CODE = "10000"
PRIVATE_PORTRAIT_ASSET_URI_PREFIX = "asset://"
ARK_PRIVATE_PORTRAIT_SERVICE_NAME = "ark"
ARK_PRIVATE_PORTRAIT_VERSION = "2024-01-01"
ARK_PRIVATE_PORTRAIT_REGION = "cn-beijing"
ARK_PRIVATE_PORTRAIT_HOST = "ark.cn-beijing.volcengineapi.com"
PRIVATE_PORTRAIT_ASSET_POLL_INTERVAL_SECONDS = 20
PRIVATE_PORTRAIT_ASSET_POLL_MAX_COUNT = 60
PRIVATE_PORTRAIT_ASSET_POLL_BATCH_SIZE = 50
PRIVATE_PORTRAIT_REMOTE_DELETE_RECOVERY_BATCH_SIZE = 50
PRIVATE_PORTRAIT_VALIDATE_TOKEN_EXPIRE_MINUTES = 30
# 系统侧保守限流;火山文档 GetAsset 是 100 QPS,这里预留余量为 80。
PRIVATE_PORTRAIT_ACTION_QPS_LIMITS: dict[str, int] = {
"CreateVisualValidateSession": 3,
"GetVisualValidateResult": 3,
"CreateAsset": 1,
"ListAssetGroups": 10,
"ListAssets": 10,
"GetAsset": 80,
"GetAssetGroup": 10,
"UpdateAsset": 10,
"UpdateAssetGroup": 10,
"DeleteAsset": 10,
"DeleteAssetGroup": 5,
}
class ArkPrivatePortraitAction(str, Enum):
CREATE_VISUAL_VALIDATE_SESSION = "CreateVisualValidateSession"
GET_VISUAL_VALIDATE_RESULT = "GetVisualValidateResult"
CREATE_ASSET = "CreateAsset"
GET_ASSET = "GetAsset"
LIST_ASSETS = "ListAssets"
LIST_ASSET_GROUPS = "ListAssetGroups"
GET_ASSET_GROUP = "GetAssetGroup"
UPDATE_ASSET = "UpdateAsset"
UPDATE_ASSET_GROUP = "UpdateAssetGroup"
DELETE_ASSET = "DeleteAsset"
DELETE_ASSET_GROUP = "DeleteAssetGroup"
class PrivatePortraitProjectStatus(str, Enum):
ACTIVE = "active"
DELETED = "deleted"
class PrivatePortraitValidateSessionStatus(str, Enum):
CREATED = "created"
CALLBACK_SUCCESS = "callback_success"
CALLBACK_FAILED = "callback_failed"
GROUP_ACTIVE = "group_active"
EXPIRED = "expired"
FAILED = "failed"
class PrivatePortraitAssetGroupStatus(str, Enum):
ACTIVE = "active"
LOCAL_DELETED = "local_deleted"
REMOTE_DELETED = "remote_deleted"
DELETE_FAILED = "delete_failed"
FAILED = "failed"
class PrivatePortraitAssetStatus(str, Enum):
CREATING = "creating"
PROCESSING = "Processing"
ACTIVE = "Active"
FAILED = "Failed"
LOCAL_DELETED = "local_deleted"
REMOTE_DELETED = "remote_deleted"
DELETE_FAILED = "delete_failed"
class PrivatePortraitAssetType(str, Enum):
IMAGE = "Image"
VIDEO = "Video"
AUDIO = "Audio"
class PrivatePortraitRemoteDeleteStatus(str, Enum):
NONE = "none"
PENDING = "pending"
SUCCESS = "success"
FAILED = "failed"
SKIPPED = "skipped"
class PrivatePortraitReferenceSource(str, Enum):
PRIVATE_PORTRAIT_ASSET = "private_portrait_asset"
class PrivatePortraitEventStatus(str, Enum):
SUCCESS = "success"
FAILED = "failed"
PENDING = "pending"
SKIPPED = "skipped"
WARNING = "warning"
class PrivatePortraitEventSource(str, Enum):
API = "api"
SERVICE = "service"
CALLBACK = "callback"
CELERY = "celery"
ADMIN = "admin"
SYSTEM = "system"
class PrivatePortraitEventType(str, Enum):
PROJECT_CREATE = "PROJECT_CREATE"
PROJECT_UPDATE = "PROJECT_UPDATE"
PROJECT_DELETE = "PROJECT_DELETE"
PROJECT_REMOTE_NAME_LOCKED = "PROJECT_REMOTE_NAME_LOCKED"
VALIDATE_SESSION_CREATE = "VALIDATE_SESSION_CREATE"
VALIDATE_CALLBACK_RECEIVED = "VALIDATE_CALLBACK_RECEIVED"
VALIDATE_CALLBACK_SUCCESS = "VALIDATE_CALLBACK_SUCCESS"
VALIDATE_CALLBACK_FAILED = "VALIDATE_CALLBACK_FAILED"
VALIDATE_GET_RESULT_START = "VALIDATE_GET_RESULT_START"
VALIDATE_GET_RESULT_SUCCESS = "VALIDATE_GET_RESULT_SUCCESS"
VALIDATE_GET_RESULT_FAILED = "VALIDATE_GET_RESULT_FAILED"
ASSET_GROUP_UPDATE_REMOTE_START = "ASSET_GROUP_UPDATE_REMOTE_START"
ASSET_GROUP_UPDATE_REMOTE_SUCCESS = "ASSET_GROUP_UPDATE_REMOTE_SUCCESS"
ASSET_GROUP_UPDATE_REMOTE_FAILED = "ASSET_GROUP_UPDATE_REMOTE_FAILED"
ASSET_CREATE_REJECT_DISABLED = "ASSET_CREATE_REJECT_DISABLED"
ASSET_CREATE_REJECT_MAX_LIMIT = "ASSET_CREATE_REJECT_MAX_LIMIT"
ASSET_CREATE_START = "ASSET_CREATE_START"
ASSET_CREATE_SUCCESS = "ASSET_CREATE_SUCCESS"
ASSET_CREATE_FAILED = "ASSET_CREATE_FAILED"
ASSET_SYNC_START = "ASSET_SYNC_START"
ASSET_SYNC_SUCCESS = "ASSET_SYNC_SUCCESS"
ASSET_SYNC_FAILED = "ASSET_SYNC_FAILED"
ASSET_POLL_START = "ASSET_POLL_START"
ASSET_POLL_SUCCESS = "ASSET_POLL_SUCCESS"
ASSET_POLL_FAILED = "ASSET_POLL_FAILED"
ASSET_POLL_TIMEOUT = "ASSET_POLL_TIMEOUT"
ASSET_DELETE_LOCAL = "ASSET_DELETE_LOCAL"
ASSET_DELETE_REMOTE_START = "ASSET_DELETE_REMOTE_START"
ASSET_DELETE_REMOTE_SUCCESS = "ASSET_DELETE_REMOTE_SUCCESS"
ASSET_DELETE_REMOTE_FAILED = "ASSET_DELETE_REMOTE_FAILED"
PROJECT_DELETE_REMOTE_START = "PROJECT_DELETE_REMOTE_START"
PROJECT_DELETE_REMOTE_SUCCESS = "PROJECT_DELETE_REMOTE_SUCCESS"
PROJECT_DELETE_REMOTE_FAILED = "PROJECT_DELETE_REMOTE_FAILED"
TASK_DISPATCH_SUCCESS = "TASK_DISPATCH_SUCCESS"
TASK_DISPATCH_FAILED = "TASK_DISPATCH_FAILED"
SYNC_DUE_ASSETS_START = "SYNC_DUE_ASSETS_START"
SYNC_DUE_ASSETS_DONE = "SYNC_DUE_ASSETS_DONE"
SYNC_DUE_ASSETS_FAILED = "SYNC_DUE_ASSETS_FAILED"
REMOTE_DELETE_RECOVERY_START = "REMOTE_DELETE_RECOVERY_START"
REMOTE_DELETE_RECOVERY_DONE = "REMOTE_DELETE_RECOVERY_DONE"
REMOTE_DELETE_RECOVERY_FAILED = "REMOTE_DELETE_RECOVERY_FAILED"
REFERENCE_RESOLVE_START = "REFERENCE_RESOLVE_START"
REFERENCE_RESOLVE_SUCCESS = "REFERENCE_RESOLVE_SUCCESS"
REFERENCE_RESOLVE_FAILED = "REFERENCE_RESOLVE_FAILED"
ARK_API_CALL_START = "ARK_API_CALL_START"
ARK_API_CALL_SUCCESS = "ARK_API_CALL_SUCCESS"
ARK_API_CALL_FAILED = "ARK_API_CALL_FAILED"
ARK_API_RATE_LIMIT_WAIT = "ARK_API_RATE_LIMIT_WAIT"
ARK_API_RATE_LIMIT_REJECT = "ARK_API_RATE_LIMIT_REJECT"