项目文件夹

文件
T

163 行
5.5 KiB
Python

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
"""
Configuration defaults and constants for Memvid
"""
from typing import Dict, Any
# QR Code settings
QR_VERSION = 35 # 1-40, higher = more data capacity https://www.qrcode.com/en/about/version.html
QR_ERROR_CORRECTION = 'M' # L, M, Q, H
QR_BOX_SIZE = 5 # QR_BOX_SIZE * QR_VERSION dimensions (1 = 21 x 21, 20 = 97 x 97, 40 = 177×177) + QR_BORDER must be < frame height/width
QR_BORDER = 3
QR_FILL_COLOR = "black"
QR_BACK_COLOR = "white"
# Chunking settings - SIMPLIFIED
DEFAULT_CHUNK_SIZE = 1024
DEFAULT_OVERLAP = 32
# Codec Settings
VIDEO_CODEC = 'h265' # Valid options are: mpv4, h265 or hevc, h264 or avc, and av1
MP4V_PARAMETERS= {"video_file_type": "mp4",
"video_fps": 15,
"frame_height": 256,
"frame_width": 256,
"video_crf": 18, # Constant Rate Factor (0-51, lower = better quality, 18 is visually lossless)
"video_preset": "medium", # ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow
"video_profile": "high", # baseline, main, high (baseline for max compatibility)
"pix_fmt": "yuv420p",
"extra_ffmpeg_args": "-x265-params keyint=1:tune=stillimage"}
H265_PARAMETERS = {"video_file_type": "mkv", # AKA HEVC
"video_fps": 30,
"video_crf": 28,
"frame_height": 256,
"frame_width": 256,
"video_preset": "slower",
"video_profile": "mainstillpicture",
"pix_fmt": "yuv420p",
"extra_ffmpeg_args": "-x265-params keyint=1:tune=stillimage:no-scenecut:strong-intra-smoothing:constrained-intra:rect:amp"}
H264_PARAMETERS = {"video_file_type": "mkv", # AKA AVC
"video_fps": 30,
"video_crf": 28,
"frame_height": 256,
"frame_width": 256,
"video_preset": "slower",
"video_profile": "main",
"pix_fmt": "yuv420p",
"extra_ffmpeg_args": "-x265-params keyint=1:tune=stillimage:no-scenecut:strong-intra-smoothing:constrained-intra:rect:amp"}
AV1_PARAMETERS = {"video_file_type": "mkv",
"video_crf": 28,
"video_fps": 60,
"frame_height": 720,
"frame_width": 720,
"video_preset": "slower",
"video_profile": "mainstillpicture",
"pix_fmt": "yuv420p",
"extra_ffmpeg_args": "-x265-params keyint=1:tune=stillimage"}
codec_parameters = {"mp4v": MP4V_PARAMETERS,
"h265": H265_PARAMETERS, "hevc": H265_PARAMETERS,
"h264": H264_PARAMETERS, "avc": H264_PARAMETERS,
"av1": AV1_PARAMETERS}
# Retrieval settings
DEFAULT_TOP_K = 5
BATCH_SIZE = 100
MAX_WORKERS = 4 # For parallel processing
CACHE_SIZE = 1000 # Number of frames to cache
# Embedding settings
EMBEDDING_MODEL = "all-MiniLM-L6-v2" # Fast and good quality
EMBEDDING_DIMENSION = 384
# Index settings
INDEX_TYPE = "Flat" # Can be "IVF" for larger datasets, otherwise use Flat
NLIST = 100 # Number of clusters for IVF index
# LLM settings
DEFAULT_LLM_PROVIDER = "google" # google, openai, anthropic
DEFAULT_LLM_MODELS = {
"google": "gemini-2.0-flash-exp",
"openai": "gpt-4o",
"anthropic": "claude-3-5-sonnet-20241022"
}
MAX_TOKENS = 8192
TEMPERATURE = 0.1
CONTEXT_WINDOW = 32000
# Chat settings
MAX_HISTORY_LENGTH = 10
CONTEXT_CHUNKS_PER_QUERY = 5
# Performance settings
PREFETCH_FRAMES = 50
DECODE_TIMEOUT = 10 # seconds
def get_default_config() -> Dict[str, Any]:
"""Get default configuration dictionary"""
return {
"qr": {
"version": QR_VERSION,
"error_correction": QR_ERROR_CORRECTION,
"box_size": QR_BOX_SIZE,
"border": QR_BORDER,
"fill_color": QR_FILL_COLOR,
"back_color": QR_BACK_COLOR,
},
"codec": VIDEO_CODEC,
"chunking": {
"chunk_size": DEFAULT_CHUNK_SIZE,
"overlap": DEFAULT_OVERLAP,
},
"retrieval": {
"top_k": DEFAULT_TOP_K,
"batch_size": BATCH_SIZE,
"max_workers": MAX_WORKERS,
"cache_size": CACHE_SIZE,
},
"embedding": {
"model": EMBEDDING_MODEL,
"dimension": EMBEDDING_DIMENSION,
},
"index": {
"type": INDEX_TYPE,
"nlist": NLIST,
},
"llm": {
"model": DEFAULT_LLM_MODELS[DEFAULT_LLM_PROVIDER],
"max_tokens": MAX_TOKENS,
"temperature": TEMPERATURE,
"context_window": CONTEXT_WINDOW,
},
"chat": {
"max_history": MAX_HISTORY_LENGTH,
"context_chunks": CONTEXT_CHUNKS_PER_QUERY,
},
"performance": {
"prefetch_frames": PREFETCH_FRAMES,
"decode_timeout": DECODE_TIMEOUT,
}
}
def get_codec_parameters(codec_name=None):
"""
Get codec parameters for specified codec or all codecs
Args:
codec_name (str, optional): Specific codec name. If None, returns all.
Returns:
dict: Codec parameters
"""
if codec_name is None:
return codec_parameters
if codec_name not in codec_parameters:
raise ValueError(f"Unsupported codec: {codec_name}. Available: {list(codec_parameters.keys())}")
return codec_parameters[codec_name]