chore: Upgrade lyric version

This commit is contained in:
Fangyin Cheng 2025-03-11 23:35:14 +08:00
parent 9c642b2f6c
commit 295d673396
3 changed files with 482 additions and 405 deletions

View File

@ -21,196 +21,170 @@ from typing import Dict, Any
# to access it.
class I18N:
# Define supported languages in current install help script
SUPPORTED_LANGUAGES = ['en', 'zh']
SUPPORTED_LANGUAGES = ["en", "zh"]
# The translation dictionary contains a mapping from language code to a dictionary
TRANSLATIONS = {
'en': {
"en": {
# Common
'workspace_not_found': "Workspace root not found.",
'cannot_parse': "Cannot parse {}: {}",
'no_extras_defined': "No extras defined",
'no_extras_found': "No workspace or extras found.",
'operation_canceled': "Operation canceled.",
'available_packages': "Available packages: {}",
'copy_command': "Please copy the above command to execute in terminal. For more help, run:",
'finished': "Finished!",
"workspace_not_found": "Workspace root not found.",
"cannot_parse": "Cannot parse {}: {}",
"no_extras_defined": "No extras defined",
"no_extras_found": "No workspace or extras found.",
"operation_canceled": "Operation canceled.",
"available_packages": "Available packages: {}",
"copy_command": "Please copy the above command to execute in terminal. For more help, run:",
"finished": "Finished!",
# Description of the CLI command
'cli_description': "UV Workspace Extras Helper - Manage optional dependencies in UV workspace",
'list_cmd_description': "List all extras in the workspace",
'install_cmd_description': "Generate installation commands for extras",
'deploy_cmd_description': "Use predefined deployment templates",
"cli_description": "UV Workspace Extras Helper - Manage optional dependencies in UV workspace",
"list_cmd_description": "List all extras in the workspace",
"install_cmd_description": "Generate installation commands for extras",
"deploy_cmd_description": "Use predefined deployment templates",
# Option descriptions
'verbose_option': "Show detailed dependency information",
'interactive_option': "Interactive guide to generate installation commands",
'all_option': "Generate command to install all extras",
'china_option': "Use Tsinghua PyPI mirror for faster installation in China",
'preset_option': "Use predefined deployment template",
'list_presets_option': "List all predefined deployment templates",
'language_option': "Specify language (en/zh)",
"verbose_option": "Show detailed dependency information",
"interactive_option": "Interactive guide to generate installation commands",
"all_option": "Generate command to install all extras",
"china_option": "Use Tsinghua PyPI mirror for faster installation in China",
"preset_option": "Use predefined deployment template",
"list_presets_option": "List all predefined deployment templates",
"language_option": "Specify language (en/zh)",
# List command
'extras_in_workspace': "Extras in workspace:\n",
'available_extras': "Available extras:",
'dependencies': "dependencies",
"extras_in_workspace": "Extras in workspace:\n",
"available_extras": "Available extras:",
"dependencies": "dependencies",
# Installation command
'install_all_extras': "# Install all optional features:",
'install_extras_for': "# Install {} feature for {}:",
'package_not_in_workspace': "Error: Package '{}' not in workspace or has no extras defined.",
'package_no_extras': "Package '{}' has no extras defined.",
'extra_not_in_package': "Error: Extra '{}' not found in package '{}'.",
'available_extras_in_package': "Available extras: {}",
"install_all_extras": "# Install all optional features:",
"install_extras_for": "# Install {} feature for {}:",
"package_not_in_workspace": "Error: Package '{}' not in workspace or has no extras defined.",
"package_no_extras": "Package '{}' has no extras defined.",
"extra_not_in_package": "Error: Extra '{}' not found in package '{}'.",
"available_extras_in_package": "Available extras: {}",
# Interactive installation
'welcome': "Welcome to DB-GPT Installation Assistant!",
'help_message': "This tool will help you generate the correct installation commands.\n",
'select_mode': "Please select installation mode",
'select_extras': "Please select extras to install (space to select/deselect, enter to confirm)",
'installation_info': "📋 Installation Information",
'selected_mode': "📦 Selected mode: {}",
'description': "📝 Description: {}",
'note': " Note: {}",
'will_install': "🧩 Will install the following extras: {}",
'config_file': "⚙️ Configuration file: {}",
'generate_command': "Generate installation command?",
'installation_command': "🚀 Installation Command",
'startup_command': "🏃 Startup Command",
'further_configuration': "⚠️ Further Configuration",
'set_api_key': "Please make sure you set the correct API Key in the configuration file {}",
'set_model_path': "Please make sure you set the correct model path in the configuration file {}",
"welcome": "Welcome to DB-GPT Installation Assistant!",
"help_message": "This tool will help you generate the correct installation commands.\n",
"select_mode": "Please select installation mode",
"select_extras": "Please select extras to install (space to select/deselect, enter to confirm)",
"installation_info": "📋 Installation Information",
"selected_mode": "📦 Selected mode: {}",
"description": "📝 Description: {}",
"note": " Note: {}",
"will_install": "🧩 Will install the following extras: {}",
"config_file": "⚙️ Configuration file: {}",
"generate_command": "Generate installation command?",
"installation_command": "🚀 Installation Command",
"startup_command": "🏃 Startup Command",
"further_configuration": "⚠️ Further Configuration",
"set_api_key": "Please make sure you set the correct API Key in the configuration file {}",
"set_model_path": "Please make sure you set the correct model path in the configuration file {}",
# Deployment command
'available_presets': "Available deployment presets:",
'specify_preset': "Please specify a deployment preset name, or use --list to view all presets",
'preset_not_found': "Error: Preset '{}' not found",
'available_presets_list': "Available presets: {}",
'using_preset': "Using preset '{}' to generate deployment command",
"available_presets": "Available deployment presets:",
"specify_preset": "Please specify a deployment preset name, or use --list to view all presets",
"preset_not_found": "Error: Preset '{}' not found",
"available_presets_list": "Available presets: {}",
"using_preset": "Using preset '{}' to generate deployment command",
# Preset descriptions
'openai_preset': "OpenAI Proxy Mode",
'openai_desc': "Using OpenAI API as proxy, suitable for environments without GPU",
'openai_note': "Requires OpenAI API Key",
'deepseek_preset': "DeepSeek Proxy Mode",
'deepseek_desc': "Using DeepSeek API as proxy, suitable for environments without GPU",
'deepseek_note': "Requires DeepSeek API Key",
'glm4_preset': "GLM4 Local Mode",
'glm4_desc': "Using local GLM4 model, requires GPU environment",
'glm4_note': "Requires local model path configuration",
'vllm_preset': "VLLM Local Mode",
'vllm_desc': "Using VLLM framework to load local model, requires GPU environment",
'vllm_note': "Requires local model path configuration",
'llama_cpp_preset': "LLAMA_CPP Local Mode",
'llama_cpp_desc': "Using LLAMA.cpp framework to load local model, can run on CPU but GPU recommended",
'llama_cpp_note': "Requires local model path configuration, for CUDA support set CMAKE_ARGS=\"-DGGML_CUDA=ON\"",
'ollama_preset': "Ollama Proxy Mode",
'ollama_desc': "Using Ollama as proxy, suitable for environments without GPU",
'ollama_note': "Requires Ollama API Base",
'custom_preset': "Custom Mode",
'custom_desc': "Manually select needed extras",
'custom_note': "Suitable for advanced users"
"openai_preset": "OpenAI Proxy Mode",
"openai_desc": "Using OpenAI API as proxy, suitable for environments without GPU",
"openai_note": "Requires OpenAI API Key",
"deepseek_preset": "DeepSeek Proxy Mode",
"deepseek_desc": "Using DeepSeek API as proxy, suitable for environments without GPU",
"deepseek_note": "Requires DeepSeek API Key",
"glm4_preset": "GLM4 Local Mode",
"glm4_desc": "Using local GLM4 model, requires GPU environment",
"glm4_note": "Requires local model path configuration",
"vllm_preset": "VLLM Local Mode",
"vllm_desc": "Using VLLM framework to load local model, requires GPU environment",
"vllm_note": "Requires local model path configuration",
"llama_cpp_preset": "LLAMA_CPP Local Mode",
"llama_cpp_desc": "Using LLAMA.cpp framework to load local model, can run on CPU but GPU recommended",
"llama_cpp_note": 'Requires local model path configuration, for CUDA support set CMAKE_ARGS="-DGGML_CUDA=ON"',
"ollama_preset": "Ollama Proxy Mode",
"ollama_desc": "Using Ollama as proxy, suitable for environments without GPU",
"ollama_note": "Requires Ollama API Base",
"custom_preset": "Custom Mode",
"custom_desc": "Manually select needed extras",
"custom_note": "Suitable for advanced users",
},
'zh': {
"zh": {
# Common
'workspace_not_found': "未找到工作区根目录",
'cannot_parse': "无法解析 {}: {}",
'no_extras_defined': "没有定义 extras",
'no_extras_found': "未找到工作区或没有可选依赖。",
'operation_canceled': "操作已取消。",
'available_packages': "可用的包: {}",
'copy_command': "请复制上面的命令到终端执行。如需更多帮助,请运行:",
'finished': "完成!",
"workspace_not_found": "未找到工作区根目录",
"cannot_parse": "无法解析 {}: {}",
"no_extras_defined": "没有定义 extras",
"no_extras_found": "未找到工作区或没有可选依赖。",
"operation_canceled": "操作已取消。",
"available_packages": "可用的包: {}",
"copy_command": "请复制上面的命令到终端执行。如需更多帮助,请运行:",
"finished": "完成!",
# Description of the CLI command
'cli_description': "UV Workspace Extras Helper - 管理UV工作区的可选依赖",
'list_cmd_description': "列出工作区中的所有extras",
'install_cmd_description': "生成安装extras的命令",
'deploy_cmd_description': "使用预设的部署方案",
"cli_description": "UV Workspace Extras Helper - 管理UV工作区的可选依赖",
"list_cmd_description": "列出工作区中的所有extras",
"install_cmd_description": "生成安装extras的命令",
"deploy_cmd_description": "使用预设的部署方案",
# Option descriptions
'verbose_option': "显示详细依赖信息",
'interactive_option': "交互式引导生成安装命令",
'all_option': "生成安装所有extras的命令",
'china_option': "使用清华pip镜像源加速安装",
'preset_option': "使用预设的部署方案",
'list_presets_option': "列出所有预设部署方案",
'language_option': "指定语言 (en/zh)",
"verbose_option": "显示详细依赖信息",
"interactive_option": "交互式引导生成安装命令",
"all_option": "生成安装所有extras的命令",
"china_option": "使用清华pip镜像源加速安装",
"preset_option": "使用预设的部署方案",
"list_presets_option": "列出所有预设部署方案",
"language_option": "指定语言 (en/zh)",
# List command
'extras_in_workspace': "工作区中的可选依赖 (extras):\n",
'available_extras': "可用的 extras:",
'dependencies': "个依赖",
"extras_in_workspace": "工作区中的可选依赖 (extras):\n",
"available_extras": "可用的 extras:",
"dependencies": "个依赖",
# Installation command
'install_all_extras': "# 安装所有可选功能:",
'install_extras_for': "# 安装 {}{} 功能:",
'package_not_in_workspace': "错误: 包 '{}' 不在工作区中或没有定义extras。",
'package_no_extras': "'{}' 没有定义extras。",
'extra_not_in_package': "错误: 包 '{}' 中没有名为 '{}' 的extra。",
'available_extras_in_package': "可用的extras: {}",
"install_all_extras": "# 安装所有可选功能:",
"install_extras_for": "# 安装 {}{} 功能:",
"package_not_in_workspace": "错误: 包 '{}' 不在工作区中或没有定义extras。",
"package_no_extras": "'{}' 没有定义extras。",
"extra_not_in_package": "错误: 包 '{}' 中没有名为 '{}' 的extra。",
"available_extras_in_package": "可用的extras: {}",
# Interactive installation
'welcome': "欢迎使用 DB-GPT 安装引导助手!",
'help_message': "这个工具将帮助你生成正确的安装命令。\n",
'select_mode': "请选择安装模式",
'select_extras': "请选择需要安装的extras空格选择/取消,回车确认)",
'installation_info': "📋 安装信息",
'selected_mode': "📦 选择的模式: {}",
'description': "📝 描述: {}",
'note': " 注意事项: {}",
'will_install': "🧩 将安装以下extras: {}",
'config_file': "⚙️ 配置文件: {}",
'generate_command': "是否生成安装命令?",
'installation_command': "🚀 安装命令",
'startup_command': "🏃 启动命令",
'further_configuration': "⚠️ 后续配置",
'set_api_key': "请确保在配置文件 {} 中设置了正确的API Key",
'set_model_path': "请确保在配置文件 {} 中设置了正确的模型路径",
"welcome": "欢迎使用 DB-GPT 安装引导助手!",
"help_message": "这个工具将帮助你生成正确的安装命令。\n",
"select_mode": "请选择安装模式",
"select_extras": "请选择需要安装的extras空格选择/取消,回车确认)",
"installation_info": "📋 安装信息",
"selected_mode": "📦 选择的模式: {}",
"description": "📝 描述: {}",
"note": " 注意事项: {}",
"will_install": "🧩 将安装以下extras: {}",
"config_file": "⚙️ 配置文件: {}",
"generate_command": "是否生成安装命令?",
"installation_command": "🚀 安装命令",
"startup_command": "🏃 启动命令",
"further_configuration": "⚠️ 后续配置",
"set_api_key": "请确保在配置文件 {} 中设置了正确的API Key",
"set_model_path": "请确保在配置文件 {} 中设置了正确的模型路径",
# Deployment command
'available_presets': "可用的部署预设:",
'specify_preset': "请指定部署预设名称,或使用 --list 查看所有预设",
'preset_not_found': "错误: 未找到预设 '{}'",
'available_presets_list': "可用的预设: {}",
'using_preset': "使用预设 '{}' 生成部署命令",
"available_presets": "可用的部署预设:",
"specify_preset": "请指定部署预设名称,或使用 --list 查看所有预设",
"preset_not_found": "错误: 未找到预设 '{}'",
"available_presets_list": "可用的预设: {}",
"using_preset": "使用预设 '{}' 生成部署命令",
# Preset descriptions
'openai_preset': "OpenAI 代理模式",
'openai_desc': "使用OpenAI API作为代理适合无GPU环境",
'openai_note': "需要提供OpenAI API Key",
'deepseek_preset': "DeepSeek 代理模式",
'deepseek_desc': "使用DeepSeek API作为代理适合无GPU环境",
'deepseek_note': "需要提供DeepSeek API Key",
'glm4_preset': "GLM4 本地模式",
'glm4_desc': "使用本地GLM4模型需要GPU环境",
'glm4_note': "需要配置本地模型路径",
'vllm_preset': "VLLM 本地模式",
'vllm_desc': "使用VLLM框架加载本地模型需要GPU环境",
'vllm_note': "需要配置本地模型路径",
'llama_cpp_preset': "LLAMA_CPP 本地模式",
'llama_cpp_desc': "使用LLAMA.cpp框架加载本地模型CPU也可运行但推荐GPU",
'llama_cpp_note': "需要配置本地模型路径启用CUDA需设置CMAKE_ARGS=\"-DGGML_CUDA=ON\"",
'ollama_preset': "Ollama 代理模式",
'ollama_desc': "使用Ollama作为代理适合无GPU环境",
'ollama_note': "需要提供Ollama API Base",
'custom_preset': "自定义模式",
'custom_desc': "手动选择需要的extras",
'custom_note': "适合高级用户"
}
"openai_preset": "OpenAI 代理模式",
"openai_desc": "使用OpenAI API作为代理适合无GPU环境",
"openai_note": "需要提供OpenAI API Key",
"deepseek_preset": "DeepSeek 代理模式",
"deepseek_desc": "使用DeepSeek API作为代理适合无GPU环境",
"deepseek_note": "需要提供DeepSeek API Key",
"glm4_preset": "GLM4 本地模式",
"glm4_desc": "使用本地GLM4模型需要GPU环境",
"glm4_note": "需要配置本地模型路径",
"vllm_preset": "VLLM 本地模式",
"vllm_desc": "使用VLLM框架加载本地模型需要GPU环境",
"vllm_note": "需要配置本地模型路径",
"llama_cpp_preset": "LLAMA_CPP 本地模式",
"llama_cpp_desc": "使用LLAMA.cpp框架加载本地模型CPU也可运行但推荐GPU",
"llama_cpp_note": '需要配置本地模型路径启用CUDA需设置CMAKE_ARGS="-DGGML_CUDA=ON"',
"ollama_preset": "Ollama 代理模式",
"ollama_desc": "使用Ollama作为代理适合无GPU环境",
"ollama_note": "需要提供Ollama API Base",
"custom_preset": "自定义模式",
"custom_desc": "手动选择需要的extras",
"custom_note": "适合高级用户",
},
}
def __init__(self, lang=None):
@ -219,6 +193,7 @@ class I18N:
if not lang:
try:
import locale
try:
# First try to get the locale from the environment
lang = locale.getlocale()[0]
@ -226,18 +201,18 @@ class I18N:
try:
lang = locale.getdefaultlocale()[0]
except (AttributeError, ValueError):
lang = 'en'
lang = "en"
if lang:
lang = lang.split('_')[0]
lang = lang.split("_")[0]
else:
lang = 'en'
lang = "en"
except (ImportError, AttributeError, ValueError):
lang = 'en'
lang = "en"
# If the language is not supported, default to English
if lang not in self.SUPPORTED_LANGUAGES:
lang = 'en'
lang = "en"
self.lang = lang
@ -246,7 +221,6 @@ class I18N:
return self.TRANSLATIONS.get(self.lang, {}).get(key, key)
i18n = I18N()
@ -274,11 +248,11 @@ def extract_workspace_extras():
workspace_root = current_dir
break
except Exception as e:
print(i18n.get('cannot_parse').format(pyproject_path, e))
print(i18n.get("cannot_parse").format(pyproject_path, e))
current_dir = os.path.dirname(current_dir)
if not workspace_root:
print(i18n.get('workspace_not_found'))
print(i18n.get("workspace_not_found"))
return {}
# Read the workspace configuration
@ -297,7 +271,9 @@ def extract_workspace_extras():
matches = glob.glob(full_pattern, recursive=True)
for match in matches:
if os.path.isdir(match) and os.path.exists(os.path.join(match, "pyproject.toml")):
if os.path.isdir(match) and os.path.exists(
os.path.join(match, "pyproject.toml")
):
# Check if the directory should be excluded
should_exclude = False
for exclude_pattern in exclude_patterns:
@ -320,18 +296,22 @@ def extract_workspace_extras():
with open(member_path, "rb") as f:
member_data = tomli.load(f)
project_name = member_data.get("project", {}).get("name", os.path.basename(member_dir))
optional_deps = member_data.get("project", {}).get("optional-dependencies", {})
project_name = member_data.get("project", {}).get(
"name", os.path.basename(member_dir)
)
optional_deps = member_data.get("project", {}).get(
"optional-dependencies", {}
)
if optional_deps:
all_extras[project_name] = {
"path": member_dir,
"extras": list(optional_deps.keys()),
"details": optional_deps
"details": optional_deps,
}
except Exception as e:
print(i18n.get('cannot_parse').format(member_path, e))
print(i18n.get("cannot_parse").format(member_path, e))
return all_extras
@ -340,84 +320,120 @@ def extract_workspace_extras():
def get_deployment_presets():
"""Get localized deployment presets"""
return {
i18n.get('openai_preset'): {
i18n.get("openai_preset"): {
"extras": ["base", "proxy_openai", "rag", "storage_chromadb", "dbgpts"],
"config": "configs/dbgpt-proxy-openai.toml",
"description": i18n.get('openai_desc'),
"note": i18n.get('openai_note')
"description": i18n.get("openai_desc"),
"note": i18n.get("openai_note"),
},
i18n.get('deepseek_preset'): {
i18n.get("deepseek_preset"): {
"extras": ["base", "proxy_openai", "rag", "storage_chromadb", "dbgpts"],
"config": "configs/dbgpt-proxy-deepseek.toml",
"description": i18n.get('deepseek_desc'),
"note": i18n.get('deepseek_note')
"description": i18n.get("deepseek_desc"),
"note": i18n.get("deepseek_note"),
},
i18n.get('glm4_preset'): {
"extras": ["base", "hf", "cuda121", "rag", "storage_chromadb", "quant_bnb", "dbgpts"],
i18n.get("glm4_preset"): {
"extras": [
"base",
"hf",
"cuda121",
"rag",
"storage_chromadb",
"quant_bnb",
"dbgpts",
],
"config": "configs/dbgpt-local-glm.toml",
"description": i18n.get('glm4_desc'),
"note": i18n.get('glm4_note')
"description": i18n.get("glm4_desc"),
"note": i18n.get("glm4_note"),
},
i18n.get('vllm_preset'): {
"extras": ["base", "hf", "cuda121", "vllm", "rag", "storage_chromadb", "quant_bnb", "dbgpts"],
i18n.get("vllm_preset"): {
"extras": [
"base",
"hf",
"cuda121",
"vllm",
"rag",
"storage_chromadb",
"quant_bnb",
"dbgpts",
],
"config": "configs/dbgpt-local-vllm.toml",
"description": i18n.get('vllm_desc'),
"note": i18n.get('vllm_note')
"description": i18n.get("vllm_desc"),
"note": i18n.get("vllm_note"),
},
i18n.get('llama_cpp_preset'): {
"extras": ["base", "hf", "cuda121", "llama_cpp", "rag", "storage_chromadb", "quant_bnb", "dbgpts"],
i18n.get("llama_cpp_preset"): {
"extras": [
"base",
"hf",
"cuda121",
"llama_cpp",
"rag",
"storage_chromadb",
"quant_bnb",
"dbgpts",
],
"config": "configs/dbgpt-local-llama-cpp.toml",
"description": i18n.get('llama_cpp_desc'),
"note": i18n.get('llama_cpp_note')
"description": i18n.get("llama_cpp_desc"),
"note": i18n.get("llama_cpp_note"),
},
i18n.get('ollama_preset'): {
i18n.get("ollama_preset"): {
"extras": ["base", "proxy_ollama", "rag", "storage_chromadb", "dbgpts"],
"config": "configs/dbgpt-proxy-ollama.toml",
"description": i18n.get('ollama_desc'),
"note": i18n.get('ollama_note')
"description": i18n.get("ollama_desc"),
"note": i18n.get("ollama_note"),
},
i18n.get('custom_preset'): {
i18n.get("custom_preset"): {
"extras": [],
"config": "",
"description": i18n.get('custom_desc'),
"note": i18n.get('custom_note')
}
"description": i18n.get("custom_desc"),
"note": i18n.get("custom_note"),
},
}
@click.group()
@click.option('--language', '-l', type=click.Choice(['en', 'zh']), help=I18N().get('language_option'))
@click.option(
"--language",
"-l",
type=click.Choice(["en", "zh"]),
help=I18N().get("language_option"),
)
def cli(language):
"""UV Workspace Extras Helper - Manage optional dependencies in UV workspace"""
if language:
set_language(language)
# Update command descriptions to the current language
cli.help = i18n.get('cli_description')
list_extras.help = i18n.get('list_cmd_description')
install_command.help = i18n.get('install_cmd_description')
deploy_preset.help = i18n.get('deploy_cmd_description')
cli.help = i18n.get("cli_description")
list_extras.help = i18n.get("list_cmd_description")
install_command.help = i18n.get("install_cmd_description")
deploy_preset.help = i18n.get("deploy_cmd_description")
@cli.command('list')
@click.option('--verbose', '-v', is_flag=True, help=i18n.get('verbose_option'))
@cli.command("list")
@click.option("--verbose", "-v", is_flag=True, help=i18n.get("verbose_option"))
def list_extras(verbose):
"""List all extras in the workspace"""
extras = extract_workspace_extras()
if not extras:
click.echo(i18n.get('no_extras_found'))
click.echo(i18n.get("no_extras_found"))
return
click.echo(i18n.get('extras_in_workspace'))
click.echo(i18n.get("extras_in_workspace"))
for package, info in extras.items():
click.echo(click.style(f"📦 {package}", fg="green") +
click.style(f" ({os.path.relpath(info['path'])})", fg="blue"))
click.echo(
click.style(f"📦 {package}", fg="green")
+ click.style(f" ({os.path.relpath(info['path'])})", fg="blue")
)
if info['extras']:
if info["extras"]:
click.echo(f" {i18n.get('available_extras')}")
for extra in info['extras']:
deps = info['details'][extra]
click.echo(f" - {click.style(extra, fg='yellow')}: {len(deps)} {i18n.get('dependencies')}")
for extra in info["extras"]:
deps = info["details"][extra]
click.echo(
f" - {click.style(extra, fg='yellow')}: {len(deps)} {i18n.get('dependencies')}"
)
if verbose:
for dep in deps:
@ -427,18 +443,18 @@ def list_extras(verbose):
click.echo()
@cli.command('install-cmd')
@click.option('--interactive', '-i', is_flag=True, help=i18n.get('interactive_option'))
@click.option('--all', 'install_all', is_flag=True, help=i18n.get('all_option'))
@click.option('--china', is_flag=True, help=i18n.get('china_option'))
@click.argument('package', required=False)
@click.argument('extra', required=False)
@cli.command("install-cmd")
@click.option("--interactive", "-i", is_flag=True, help=i18n.get("interactive_option"))
@click.option("--all", "install_all", is_flag=True, help=i18n.get("all_option"))
@click.option("--china", is_flag=True, help=i18n.get("china_option"))
@click.argument("package", required=False)
@click.argument("extra", required=False)
def install_command(interactive, install_all, china, package, extra):
"""Generate installation commands for extras"""
extras = extract_workspace_extras()
if not extras:
click.echo(i18n.get('no_extras_found'))
click.echo(i18n.get("no_extras_found"))
return
# Interactive mode
@ -450,202 +466,254 @@ def install_command(interactive, install_all, china, package, extra):
if install_all:
all_extras = []
for pkg_info in extras.values():
all_extras.extend(pkg_info['extras'])
all_extras.extend(pkg_info["extras"])
if all_extras:
cmd = "uv sync --all-packages " + " ".join([f"--extra \"{e}\"" for e in all_extras])
cmd = "uv sync --all-packages " + " ".join(
[f'--extra "{e}"' for e in all_extras]
)
if china:
cmd += " --index-url=https://pypi.tuna.tsinghua.edu.cn/simple"
click.echo(i18n.get('install_all_extras'))
click.echo(i18n.get("install_all_extras"))
click.echo(cmd)
else:
click.echo(i18n.get('no_extras_found'))
click.echo(i18n.get("no_extras_found"))
return
# If no package or extra is provided, show all possible installation commands
if not package:
for pkg, info in extras.items():
if info['extras']:
for e in info['extras']:
cmd = f"uv sync --extra \"{e}\""
if info["extras"]:
for e in info["extras"]:
cmd = f'uv sync --extra "{e}"'
if china:
cmd += " --index-url=https://pypi.tuna.tsinghua.edu.cn/simple"
click.echo(i18n.get('install_extras_for').format(pkg, e))
click.echo(i18n.get("install_extras_for").format(pkg, e))
click.echo(cmd)
click.echo()
return
# Check if the specified package exists
if package not in extras:
click.echo(i18n.get('package_not_in_workspace').format(package))
click.echo(i18n.get('available_packages').format(', '.join(extras.keys())))
click.echo(i18n.get("package_not_in_workspace").format(package))
click.echo(i18n.get("available_packages").format(", ".join(extras.keys())))
return
# If no extra is provided, show all extras for the package
if not extra:
pkg_extras = extras[package]['extras']
pkg_extras = extras[package]["extras"]
if not pkg_extras:
click.echo(i18n.get('package_no_extras').format(package))
click.echo(i18n.get("package_no_extras").format(package))
return
cmd = "uv sync " + " ".join([f"--extra \"{e}\"" for e in pkg_extras])
cmd = "uv sync " + " ".join([f'--extra "{e}"' for e in pkg_extras])
if china:
cmd += " --index-url=https://pypi.tuna.tsinghua.edu.cn/simple"
click.echo(i18n.get('install_extras_for').format(package, ' '.join(pkg_extras)))
click.echo(i18n.get("install_extras_for").format(package, " ".join(pkg_extras)))
click.echo(cmd)
return
# Check if the specified extra exists
if extra not in extras[package]['extras']:
click.echo(i18n.get('extra_not_in_package').format(extra, package))
click.echo(i18n.get('available_extras_in_package').format(', '.join(extras[package]['extras'])))
if extra not in extras[package]["extras"]:
click.echo(i18n.get("extra_not_in_package").format(extra, package))
click.echo(
i18n.get("available_extras_in_package").format(
", ".join(extras[package]["extras"])
)
)
return
# Show the command to install the specified extra
cmd = f"uv sync --extra \"{extra}\""
cmd = f'uv sync --extra "{extra}"'
if china:
cmd += " --index-url=https://pypi.tuna.tsinghua.edu.cn/simple"
click.echo(i18n.get('install_extras_for').format(package, extra))
click.echo(i18n.get("install_extras_for").format(package, extra))
click.echo(cmd)
def _interactive_install_guide(extras: Dict[str, Any], use_china_mirror: bool = False):
"""Interactive installation guide"""
click.echo(click.style(i18n.get('welcome'), fg="green", bold=True))
click.echo(i18n.get('help_message'))
click.echo(click.style(i18n.get("welcome"), fg="green", bold=True))
click.echo(i18n.get("help_message"))
# Get deployment presets
deployment_presets = get_deployment_presets()
# First step: select installation mode
questions = [
inquirer.List('preset',
message=i18n.get('select_mode'),
choices=[(f"{name} - {info['description']}", name) for name, info in deployment_presets.items()],
carousel=True)
inquirer.List(
"preset",
message=i18n.get("select_mode"),
choices=[
(f"{name} - {info['description']}", name)
for name, info in deployment_presets.items()
],
carousel=True,
)
]
answers = inquirer.prompt(questions)
if not answers:
return # Operation canceled
selected_preset = answers['preset']
selected_preset = answers["preset"]
preset_info = deployment_presets[selected_preset]
# Custom mode: let user select extras
if selected_preset == i18n.get('custom_preset'):
if selected_preset == i18n.get("custom_preset"):
# Collect all available extras
all_available_extras = set()
for pkg_info in extras.values():
all_available_extras.update(pkg_info["extras"])
questions = [
inquirer.Checkbox('selected_extras',
message=i18n.get('select_extras'),
choices=sorted(list(all_available_extras)),
carousel=True)
inquirer.Checkbox(
"selected_extras",
message=i18n.get("select_extras"),
choices=sorted(list(all_available_extras)),
carousel=True,
)
]
answers = inquirer.prompt(questions)
if not answers or not answers['selected_extras']:
click.echo(i18n.get('operation_canceled'))
if not answers or not answers["selected_extras"]:
click.echo(i18n.get("operation_canceled"))
return
preset_info['extras'] = answers['selected_extras']
preset_info["extras"] = answers["selected_extras"]
# Show installation information
click.echo("\n" + click.style(i18n.get('installation_info'), fg="blue", bold=True))
click.echo(f"{i18n.get('selected_mode')} {click.style(selected_preset, fg='green')}")
click.echo("\n" + click.style(i18n.get("installation_info"), fg="blue", bold=True))
click.echo(
f"{i18n.get('selected_mode')} {click.style(selected_preset, fg='green')}"
)
click.echo(f"{i18n.get('description')} {preset_info['description']}")
click.echo(f"{i18n.get('note')} {preset_info['note']}")
click.echo(f"{i18n.get('will_install')} {', '.join(preset_info['extras'])}")
if preset_info['config']:
if preset_info["config"]:
click.echo(f"{i18n.get('config_file')} {preset_info['config']}")
# Confirm installation
questions = [
inquirer.Confirm('confirm',
message=i18n.get('generate_command'),
default=True)
inquirer.Confirm("confirm", message=i18n.get("generate_command"), default=True)
]
answers = inquirer.prompt(questions)
if not answers or not answers['confirm']:
click.echo(i18n.get('operation_canceled'))
if not answers or not answers["confirm"]:
click.echo(i18n.get("operation_canceled"))
return
# Create installation command
cmd = "uv sync --all-packages " + " ".join([f"--extra \"{e}\"" for e in preset_info['extras']])
cmd = "uv sync --all-packages " + " ".join(
[f'--extra "{e}"' for e in preset_info["extras"]]
)
if use_china_mirror:
cmd += " --index-url=https://pypi.tuna.tsinghua.edu.cn/simple"
click.echo("\n" + click.style(i18n.get('installation_command'), fg="green", bold=True))
click.echo(
"\n" + click.style(i18n.get("installation_command"), fg="green", bold=True)
)
click.echo(cmd)
if preset_info.get('config'):
click.echo("\n" + click.style(i18n.get('startup_command'), fg="green", bold=True))
if preset_info.get("config"):
click.echo(
"\n" + click.style(i18n.get("startup_command"), fg="green", bold=True)
)
click.echo(f"uv run dbgpt start webserver --config {preset_info['config']}")
# The step to configure the API key or model path
if i18n.get('openai_note') in preset_info['note'] or i18n.get('deepseek_note') in preset_info['note']:
click.echo("\n" + click.style(i18n.get('further_configuration'), fg="yellow", bold=True))
if i18n.get('openai_note') in preset_info['note'] or i18n.get('deepseek_note') in preset_info['note']:
click.echo(i18n.get('set_api_key').format(preset_info['config']))
elif i18n.get('glm4_note') in preset_info['note'] or i18n.get('vllm_note') in preset_info['note'] or i18n.get('llama_cpp_note') in preset_info['note']:
click.echo("\n" + click.style(i18n.get('further_configuration'), fg="yellow", bold=True))
if i18n.get('glm4_note') in preset_info['note'] or i18n.get('vllm_note') in preset_info['note'] or i18n.get('llama_cpp_note') in preset_info['note']:
click.echo(i18n.get('set_model_path').format(preset_info['config']))
if (
i18n.get("openai_note") in preset_info["note"]
or i18n.get("deepseek_note") in preset_info["note"]
):
click.echo(
"\n"
+ click.style(i18n.get("further_configuration"), fg="yellow", bold=True)
)
if (
i18n.get("openai_note") in preset_info["note"]
or i18n.get("deepseek_note") in preset_info["note"]
):
click.echo(i18n.get("set_api_key").format(preset_info["config"]))
elif (
i18n.get("glm4_note") in preset_info["note"]
or i18n.get("vllm_note") in preset_info["note"]
or i18n.get("llama_cpp_note") in preset_info["note"]
):
click.echo(
"\n"
+ click.style(i18n.get("further_configuration"), fg="yellow", bold=True)
)
if (
i18n.get("glm4_note") in preset_info["note"]
or i18n.get("vllm_note") in preset_info["note"]
or i18n.get("llama_cpp_note") in preset_info["note"]
):
click.echo(i18n.get("set_model_path").format(preset_info["config"]))
click.echo("\n" + click.style(f"🎉 {i18n.get('finished')}", fg="green", bold=True))
click.echo(i18n.get('copy_command'))
click.echo(i18n.get("copy_command"))
click.echo("uv run install_help.py --help")
@cli.command('deploy')
@click.option('--preset', '-p', help=i18n.get('preset_option'))
@click.option('--china', is_flag=True, help=i18n.get('china_option'))
@click.option('--list', 'list_presets', is_flag=True, help=i18n.get('list_presets_option'))
@cli.command("deploy")
@click.option("--preset", "-p", help=i18n.get("preset_option"))
@click.option("--china", is_flag=True, help=i18n.get("china_option"))
@click.option(
"--list", "list_presets", is_flag=True, help=i18n.get("list_presets_option")
)
def deploy_preset(preset, china, list_presets):
"""Use predefined deployment templates"""
deployment_presets = get_deployment_presets()
if list_presets:
click.echo(click.style(i18n.get('available_presets'), fg="green", bold=True))
click.echo(click.style(i18n.get("available_presets"), fg="green", bold=True))
for name, info in deployment_presets.items():
click.echo(f"\n{click.style(name, fg='yellow', bold=True)}")
click.echo(f"{i18n.get('description')} {info['description']}")
click.echo(f"{i18n.get('note')} {info['note']}")
click.echo(f"Extras: {', '.join(info['extras'])}")
if info['config']:
if info["config"]:
click.echo(f"{i18n.get('config_file')} {info['config']}")
return
if not preset:
click.echo(i18n.get('specify_preset'))
click.echo(i18n.get("specify_preset"))
return
if preset not in deployment_presets:
click.echo(i18n.get('preset_not_found').format(preset))
click.echo(i18n.get('available_presets_list').format(', '.join(deployment_presets.keys())))
click.echo(i18n.get("preset_not_found").format(preset))
click.echo(
i18n.get("available_presets_list").format(
", ".join(deployment_presets.keys())
)
)
return
preset_info = deployment_presets[preset]
click.echo(i18n.get('using_preset').format(preset))
click.echo(i18n.get("using_preset").format(preset))
click.echo(f"{i18n.get('description')} {preset_info['description']}")
click.echo(f"{i18n.get('note')} {preset_info['note']}")
cmd = "uv sync --all-packages " + " ".join([f"--extra \"{e}\"" for e in preset_info['extras']])
cmd = "uv sync --all-packages " + " ".join(
[f'--extra "{e}"' for e in preset_info["extras"]]
)
if china:
cmd += " --index-url=https://pypi.tuna.tsinghua.edu.cn/simple"
click.echo("\n" + click.style(i18n.get('installation_command'), fg="green", bold=True))
click.echo(
"\n" + click.style(i18n.get("installation_command"), fg="green", bold=True)
)
click.echo(cmd)
if preset_info.get('config'):
click.echo("\n" + click.style(i18n.get('startup_command'), fg="green", bold=True))
if preset_info.get("config"):
click.echo(
"\n" + click.style(i18n.get("startup_command"), fg="green", bold=True)
)
click.echo(f"uv run dbgpt start webserver --config {preset_info['config']}")
if __name__ == '__main__':
if __name__ == "__main__":
cli()

View File

@ -107,10 +107,10 @@ code = [
"msgpack",
# for AWEL operator serialization
"cloudpickle",
"lyric-py>=0.1.7rc0",
"lyric-py-worker>=0.1.7rc0",
"lyric-js-worker>=0.1.7rc0",
"lyric-component-ts-transpiling>=0.1.7rc0",
"lyric-py>=0.1.7",
"lyric-py-worker>=0.1.7",
"lyric-js-worker>=0.1.7",
"lyric-component-ts-transpiling>=0.1.7",
]
llama_cpp = [
"llama-cpp-python",

85
uv.lock
View File

@ -1542,10 +1542,10 @@ requires-dist = [
{ name = "llama-cpp-python", marker = "extra == 'llama-cpp'" },
{ name = "llama-cpp-server-py", marker = "extra == 'llama-cpp-server'", specifier = ">=0.1.3" },
{ name = "llama-cpp-server-py-core", marker = "extra == 'llama-cpp-server'", specifier = ">=0.1.3" },
{ name = "lyric-component-ts-transpiling", marker = "extra == 'code'", specifier = ">=0.1.7rc0" },
{ name = "lyric-js-worker", marker = "extra == 'code'", specifier = ">=0.1.7rc0" },
{ name = "lyric-py", marker = "extra == 'code'", specifier = ">=0.1.7rc0" },
{ name = "lyric-py-worker", marker = "extra == 'code'", specifier = ">=0.1.7rc0" },
{ name = "lyric-component-ts-transpiling", marker = "extra == 'code'", specifier = ">=0.1.7" },
{ name = "lyric-js-worker", marker = "extra == 'code'", specifier = ">=0.1.7" },
{ name = "lyric-py", marker = "extra == 'code'", specifier = ">=0.1.7" },
{ name = "lyric-py-worker", marker = "extra == 'code'", specifier = ">=0.1.7" },
{ name = "msgpack", marker = "extra == 'code'" },
{ name = "msgpack", marker = "extra == 'simple-framework'" },
{ name = "numpy", marker = "extra == 'agent'", specifier = ">=1.21.0,<2.0.0" },
@ -3943,74 +3943,83 @@ wheels = [
[[package]]
name = "lyric-component-ts-transpiling"
version = "0.1.7rc0"
version = "0.1.7"
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
dependencies = [
{ name = "lyric-task" },
]
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/7b/ae751c249f7c0f49b9d8332162ed3cbf27b14de5f364af22d875d86e403c/lyric_component_ts_transpiling-0.1.7rc0.tar.gz", hash = "sha256:d87fe969a6d76f0e320a5e5fb774e6f845bb99f0078d69011f35a470d3747537", size = 1796524 }
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/40/116331e511aa8dfd6182ba24c7f7f1f9823d3fd382206395dd0035e56eb6/lyric_component_ts_transpiling-0.1.7.tar.gz", hash = "sha256:05a1f1258d7c2784a594803edd47ab285a72541ab903bf324fa366a1c343e4db", size = 1796527 }
wheels = [
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/59/04941941277f791d264affc36890aa66ad9d2d14d28349747a4212aaf922/lyric_component_ts_transpiling-0.1.7rc0-py3-none-any.whl", hash = "sha256:dc235861143cb49d8b12b0bdcda52eb992245649bd7b235f94efad308b6aecfd", size = 1815811 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/4b/186499ebecaf8b784c9002355d167280b47f95a9ca89aa00f3c26157f640/lyric_component_ts_transpiling-0.1.7-py3-none-any.whl", hash = "sha256:db0de08b1f623c65a261ec0d085652e7804497c28ca6bc524a93e373bfde7fe0", size = 1815838 },
]
[[package]]
name = "lyric-js-worker"
version = "0.1.7rc0"
version = "0.1.7"
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
dependencies = [
{ name = "lyric-task" },
]
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/9a/c23325b8ee6ad0d5cd605950a0896660fdfad507fd9f33fbb0166af6a4e1/lyric_js_worker-0.1.7rc0.tar.gz", hash = "sha256:c3a86d189c66030261ecc5de6eabe6da7b165af2a67f45a1c2d657e904368e33", size = 3472221 }
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d7/ae/93ad17f2013cf9c649e771314da49224d3b95e534010937726b556970efb/lyric_js_worker-0.1.7.tar.gz", hash = "sha256:3c18e565d230fabc1b1d5b08d2a3a9472b40446faa18f43ad03e2f66c5d3022c", size = 3472342 }
wheels = [
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/54/c8ac53a2d931dd71d03e295f79f525f89b2fa8a106244858c368fa85e65d/lyric_js_worker-0.1.7rc0-py3-none-any.whl", hash = "sha256:12998e55a2935ce592bb47a34dc5297ca0164958424b7e592cf3523321b86c4a", size = 3489140 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/24/93f0bce612b93070a19265ffe0d9ac37ed4b2d310de3cadc4c9949fd5773/lyric_js_worker-0.1.7-py3-none-any.whl", hash = "sha256:156b33e3d2d8b684b737445773a46281e2ef99d07dd452e01455c1be782f2097", size = 3489210 },
]
[[package]]
name = "lyric-py"
version = "0.1.7rc0"
version = "0.1.7"
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
dependencies = [
{ name = "cloudpickle" },
{ name = "lyric-task" },
{ name = "msgpack" },
]
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/73/77/943fcd492efbb718ddcb93d0fd2f3f3ed0b5400e40b10c15e692d06fb7dc/lyric_py-0.1.7rc0.tar.gz", hash = "sha256:d979988598c827d4b903fb24bf17446e5048129ba8a2b3fbbb4a6cd7efc649af", size = 158862 }
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/0a/1e171f6ca212c31cecc0d06800f388822e8db543346ac7d30bc3f79e5a29/lyric_py-0.1.7.tar.gz", hash = "sha256:1a849c5395fe47843e35b2b440fe343ef7a1ea3c3527cd56067c4349364ba586", size = 156709 }
wheels = [
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/45/27e242de48a4c678b40ca5fd9c30690af2c1dc98339c2653e988c2514346/lyric_py-0.1.7rc0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e85e49925858496df0b713fb0f8a8bfc94ec8948d6a92f0d98b28530695f6a70", size = 12246263 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/9d/da022135c016ad947ad431be8186231be939298ea30ae135b158e106e19e/lyric_py-0.1.7rc0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f55dfb8c8fbfa2ef5627c62b51bf188f851b5a2477dac3fb2657c0e18cc7c3fd", size = 11673629 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/7a/30b86172fe31517fbdb751f22cde523d5b9a15b9cc8f3d62b99948e4727f/lyric_py-0.1.7rc0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821b0e76410ced544f13687e0fe8bc6cf42ac8ce14c046a651ba4109df503a9b", size = 13541958 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/9b/603cfd081a97ba29412bf820627c794ebda0b93d66d5a6df8177116ad9fd/lyric_py-0.1.7rc0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bdb9214350b26c77fa5e4c34c952fca1dbeebae65842e2ad3eb1fdff309abecc", size = 13707959 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/9f/6e87cb2239a87ca60d6ecb13d98a19f8e20672a50b8c0615693432b54a08/lyric_py-0.1.7rc0-cp310-cp310-win_amd64.whl", hash = "sha256:a950e7e91e44b6f289d2df6fc45edecfc2ed919d492e19dfe0899b80b8cd817c", size = 10667631 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/4c/e637818cf8cb162a886ee2878e102b8ebeaafa33011ac6d43bc426a7a051/lyric_py-0.1.7rc0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:546e32bcb67c0a1f85404e5e1966dc69a55e155aad012851506e2d8275a43c9b", size = 12235882 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/54/c0a5635d1fedaa4bd653ef6913f4f9df819aca1a197fcf05c88c1c5a752a/lyric_py-0.1.7rc0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d7d1fa031c2c41a789a2d2423d35d9adffcb4bd0c1b87c17fb5ac042ff39ce38", size = 11670360 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/6d/ae5439ae5a6c50ca241a2df08ea4e5b06bb573fbecc9419a65fb154f42f9/lyric_py-0.1.7rc0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0311141e33e00df54ac5942fde8bbc47263ac9c8fb95747fca178c71d001c6c", size = 13549473 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/bb/6b1acb09ece4187bb6805b635018abf59816b05e1aa935059e4043e6fdd2/lyric_py-0.1.7rc0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d6a943b349e0fba77526bb76abcde258a94f4e9c148a81fe2bb1754e7a89226a", size = 13710846 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/24/3a2c49e8fc71672f95d20407715919557ba97e9038c70598f6f762a935bb/lyric_py-0.1.7rc0-cp311-cp311-win_amd64.whl", hash = "sha256:4af2fb4f727e6fc6aba5e74cfd721a17e7d5dcf1279b9175de0e49e102b3c45a", size = 10669142 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/47/ff105288ec48557e0fa38d2a11e1ff281c642beaff55acf708d4e26a788b/lyric_py-0.1.7rc0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d8e0f70bbba90b6904ceae8d962a5b1625c34f8ec25e8b95c3f9051aa014d813", size = 12246437 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/44/5b/6993e70f9284d3204fe50751158a03f01815b171970118453de1fd988024/lyric_py-0.1.7rc0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fbcb20ea05aee9c2119812c5914a7739b39179fb5eed90a8164d1da42d0ade57", size = 11638092 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/93/d3/c684c7c78048fc0f30ecea1747217e60d4e2acf0c0cd497c6ccea364a65f/lyric_py-0.1.7rc0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:952e3e0c1d35355d57cb4ff157c9a3ba1a0aa04fb8262286e3198f1421e8e1ad", size = 13553789 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/84/046644ec4c2f5476d96f3bca8cbcf84f9fe0a7a426e4768f12b4625cf6a0/lyric_py-0.1.7rc0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f1cbc0517ec709368cf7abda095a34dbebd7759202c683065169b9f83651cc8a", size = 13716242 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/4b/32/02c53749fde4ccbd0a37b736ee2cb8194fbda8c0af67cd26680700d30c8f/lyric_py-0.1.7rc0-cp312-cp312-win_amd64.whl", hash = "sha256:3addb063c80992fdc3b7aa943ee3b6dcf14109057e81734b6489b27ab539bed3", size = 10665653 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/dd/bf/d369a2eea50df25dd02d41e4ac7df9848c7153a3a2982e9fae03706f31d3/lyric_py-0.1.7rc0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b9034b87418aab64be11ccc73fa918fc264dce0d553af1be3988d16d59c269c", size = 12246037 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/a8/93/476b0b1697a9285ba0c99c5600071f347b1bb58887486f578b75144e7968/lyric_py-0.1.7rc0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4297520c177b100bd2d29e7fa3c34fa024fce7b5a13ef8a27c75cc4fa9a88094", size = 11637795 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/dc/6cf536c3a11d88f41d7b251977013ce27174c634f72c7aa55bb7094765b7/lyric_py-0.1.7rc0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d99980b8522c08c22a11a724d40e5226c8d16cda4e283e7758aca492bbe17bc", size = 13553737 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/b5/c523cbbfd3b05d8c6a51df2a29a4f1f283ac0e55353d8949790c1d85119a/lyric_py-0.1.7rc0-cp313-cp313-win_amd64.whl", hash = "sha256:428f8b08169dd19936533674fa3deaddb5d68bc47653d30f2880c98358125138", size = 10665592 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/77/a500c5f054efb9b225f65ffa9d6709e37b5a5ae1bf47deb2d26446808300/lyric_py-0.1.7rc0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d4b68964c52e69ffc44223b01833c1dc5d51463a2d2fcc7248236b21adf9f0d5", size = 12274277 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/19/53acc9659db9b8f2a34c141758931c1d0f1c3446648624e1d6ec0b064df1/lyric_py-0.1.7rc0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8339a19e70a36bb18eac8f789052f89482b8d55a88de17bd9453331e1fb11ea4", size = 11674071 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/35/70/5ee1163f21ba965278a2082901b1b480f348249f4e5bc4ca59f6e72d907c/lyric_py-0.1.7rc0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35da9a1fe118777a25fb9103c2518be8140f541155f77d0e7e35f6eda12a1687", size = 13547992 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/8f/fc53ac11eb9f749b17916db43b9a2003f94a2d547794024e122fcb4d9063/lyric_py-0.1.7rc0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3e85bc1552c0771d0e3ca7d017893a6b9e329f311a563461c41a2dbfd1476fc9", size = 13709922 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/41/e1/bd910e29ea5f54a5e6ec0b921de3af7922a2c053c3e2409f0639e5a91bd6/lyric_py-0.1.7-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2cd0ce43296dff4a689675df0a220bb4559202dfe04e0edc258940648c7796c4", size = 12371233 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/d4/85478b5d8655f1a697707013bcbe74c4053ebce27d62fddef58550a3998d/lyric_py-0.1.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d55a9a0a5ff6652c0f10888ed3fb5e59753499d4bdd3380ee7831aded11ad726", size = 11673449 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/23/b48ed3b560e5d13ed0ebfc1a87aee78badb7fc0b3ac6be6341166700d901/lyric_py-0.1.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95406d45ccb44dd6975a1a779d9de15fabe55bb83fa87fd2754cae3000d12f15", size = 13540705 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/aa/5f2d3c68e25ce3ebb3bb1208370627bd8083b38337c158d0fa8fa0a80ba7/lyric_py-0.1.7-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:71b38e9e18a8575280d0689aa08809ab172eb1b6d9b9902f96dacb84779411b5", size = 12991487 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/98/ab0365bbd8e187c187e125ee68739a7030bbf7ef399b48196df9ec400943/lyric_py-0.1.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:21316fe76eb1bccefcb4eb085c69ef57d9d952bb5a622bf868cdf1753b5ec91a", size = 13116942 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/c8/26/a28126de7837aad8500561191a8f3e07c45d546bff877aa5deb172a98e60/lyric_py-0.1.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:57d8dff2fb67602a0fee73927c2f959fc0d355128929b9949ca74a4501aa7198", size = 13708670 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/4e/44475b49f74132ebe234c764f626509505fafad8388d18a0f9f6b0ace878/lyric_py-0.1.7-cp310-cp310-win_amd64.whl", hash = "sha256:144a7f3525b02181ac1055eb7fe97e791bb9ee3808d51e639070190dd9823c14", size = 10665386 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/41/e481feb8d409ed5ba330a2e1e7ec12f9de5d9e91ecbd862bdd7e84e94ade/lyric_py-0.1.7-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d95a648765699a8fb81fc2312c3211d144ca700b0c5bf05bc1f02356167cdfa6", size = 12371152 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/3d/76/ad7258506275498b62a84e321c0031186afd417c6ff93a66281179bf8691/lyric_py-0.1.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23999e0fea77ce4d540c11366e59696fc2e50124d46cbb504f4af8c9dfd62808", size = 11670480 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/74/50be68011ba8ecc1808257fa02281eaa17c7236c4b14b5c299fbd5712136/lyric_py-0.1.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e07d6fbe4263c269576eae64f76c493edf53aa5bef8a65812ee7e9f9fdfd73f", size = 13544644 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/09/4235cda12702553710bf842fa74b60e4b5746d42ee00df631aa49bcc0276/lyric_py-0.1.7-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1b30cc4a432b1f23ced3cb5f3460bd932079af5e4802e43b3d3239af0260f524", size = 12992074 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/b0/35c2967558db3bf568a9277a318fae583642d41e96512296efbb0443c0bf/lyric_py-0.1.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:57483fc83257c949a5d1037b402478bdf292eb75c84033638e2bc6e13bd254a3", size = 13115294 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/83/8c4ad24361e6a4f62c120958f3ebdd24555c42745e7e4f00eb12116ea679/lyric_py-0.1.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e135ee2418120d635e8f613a7c198242d2bb98e4dad28cff7ce490d1c8249f91", size = 13709620 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/6c/4c881949052dcea213f1290c11e0a5f9558daa59b12fbf1868ab7fbf58b3/lyric_py-0.1.7-cp311-cp311-win_amd64.whl", hash = "sha256:14db456ff7797ad1ca638f8c3f85b3babaaaac58285105c9467727cd8bba9049", size = 10667268 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/74/3f210d9d0ec6a5faafb475e152056bda990794b644e45bb73776fafc7ee4/lyric_py-0.1.7-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b87c071ea24540750f1bbada717b17b0d4683f2998f88186097410f18aebaa6c", size = 12386712 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/01/5cb2849362654b12a397573feb8680082d358aa72352fb929fddefe30ac5/lyric_py-0.1.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e58669260ba9bd52f78a7ebf411d48668fcc1ebf6faa556bb8195fb9bf624e5", size = 11637672 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/b4/75/1c048ad1812ba6fa10217ba47d491469dcdf51f5ef9490c14ab17ae389be/lyric_py-0.1.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4416cc119bc73bfd432781c8e723727a8b03760c980ec0113b815acf01087400", size = 13554033 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/5e/eb/b0f16a7c75584b9f493880d043b90676898dd88d5540cf83a9c45d124883/lyric_py-0.1.7-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:97cd515ad7882d23bfa4329e7fc39be9f7059411ca7965fc1660289a7d9ac88c", size = 13022031 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/de/25f96ca38b3604753d509ddfdb786c691bab0e2fea6365c5f48a0dfad69d/lyric_py-0.1.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6df6505107390d357948e1b5c5b285247172d466d711223dc39f9ec26c19704e", size = 13147680 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/e0/2bea1f74a4e4f2ce0009e1d877920ba9aec14e4b631f87d073f072b01eee/lyric_py-0.1.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:53a4f133e9f833791cb18244bdf0d3793a8a818affd8cba367e1c1ed3bab9258", size = 13713784 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/4f/3b/13f70c57292ce6f52d0d76f3c6e3f2217974d7dcd3aa62348ab7acde7efc/lyric_py-0.1.7-cp312-cp312-win_amd64.whl", hash = "sha256:139e750b261ae054708692d76a64226ceb57ff62ed7c5696099eff04d43a700f", size = 10662075 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/09/c36154ef75cacb45f0b8ab030da10247181b55f96bd9cdb90c9f8743d85b/lyric_py-0.1.7-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3e7de185daf1046baad7a221be2b584f4769f7f08a7425a61e8f338377921eaf", size = 12386416 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/7a/a98712c2863cb15a0e131e650f5cae8e5015239cc6d9dca15b75fb00c37e/lyric_py-0.1.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:622b867a832da16d4d26c84022256dfc41c10a142165c9671bac7711249e7c9c", size = 11637517 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/4c/b2cb0e090452025525ba6e1def7a7de54ea7ab0e42183290e0d62904b5b7/lyric_py-0.1.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:088c318299fc92695b9df9d21347a3adef72451c39cd6e712b91973963ead211", size = 13553037 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/91/aa7c4e39ba94530dcec7269b5826d3ba8c2487a9100f0237df5cd0c68b74/lyric_py-0.1.7-cp313-cp313-manylinux_2_24_aarch64.whl", hash = "sha256:4f3bb6b56cdaeaf9107bf3ce4e8db427d293f7b7f226e931e8a47698896a52de", size = 13021092 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/e7/eda1feec526711a441198c5f7e69f5c69c98111e9ddbb0efb6f78bbae6cc/lyric_py-0.1.7-cp313-cp313-win_amd64.whl", hash = "sha256:187bc4388576fead5883b10b295b8ee46b20bb64e02d2f56d1d7685df22a46f9", size = 10661808 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/d0/28837d5bb765871056b77e65c8f826b5f697777b115a26e6368b98da72e5/lyric_py-0.1.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1ee2012bba3155d3d8e15de9bfc2e3434c543d1008b0693e35e79b00b1f4aaf3", size = 12370209 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/be/fd/eaff266b9f7300c27b57e7f5cb0a3a5e5f2993075622420eeac79331adf5/lyric_py-0.1.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:753b5836d04d9febd8306d62c6e61cc1e8100e9d64db0a714ee411c32c6b63dd", size = 11666626 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/74/43/f63ccd77985002e5ce7bddc834c1a2ad06d74c5020bc59ab4074b3648490/lyric_py-0.1.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12cd99aa920eb1456bde6d0f5edae3d5cd4047ca45bf2205be3fc97bd9f7c5b7", size = 13542245 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/71/1a76601c9803f2eea22bb87b259b5259258ccc27124db08d09dabfd75452/lyric_py-0.1.7-pp310-pypy310_pp73-manylinux_2_24_aarch64.whl", hash = "sha256:19f778f76b1c40c69676a597624f30afcf28df3128110cd7b35b825ffe06a355", size = 13021359 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/43/f8783142dfc0b8fc726ff4123f4bcebb99ecebb73e9cccb2832f0b6bf5c2/lyric_py-0.1.7-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:16b9e5619413bf79ff892a6112391046d5f08a3d51265dd45ed9564c7d898f6f", size = 13149903 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/69/e2b92ed5273dcdf1346db614240d1e5e1fbb4862a6849dd99b9847e876d7/lyric_py-0.1.7-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:66ceb33a1b9882437a9b243c3f2ce949cf2b46788928c0f2f2f30237e062642c", size = 13710527 },
]
[[package]]
name = "lyric-py-worker"
version = "0.1.7rc0"
version = "0.1.7"
source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple" }
dependencies = [
{ name = "lyric-task" },
]
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/23/266504f14d149c6e5d073950b55550542b9a0b39b4af43df49e191ff25af/lyric_py_worker-0.1.7rc0.tar.gz", hash = "sha256:e7e39fa3a231caf680d66cc6c9694bf29ca8b6e5512a66559d27a956b22595ba", size = 10812622 }
sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/6e/674988e462db7e9748688713a8b3e24034848c3a5518f1bbed7f7ec9b183/lyric_py_worker-0.1.7.tar.gz", hash = "sha256:06328b3806bddac258fcc81eab444c351d22157839c0f7d2f5ac1a1df5bfe179", size = 10796820 }
wheels = [
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/99/a48e5de3c61bb4b4c557a8c2892d26bfe9a08b1de7b7e59606e170ff8860/lyric_py_worker-0.1.7rc0-py3-none-any.whl", hash = "sha256:357595c8b192239b45b06adee8b7e62964cacadec5d6225bb2a49cd632922f95", size = 10920751 },
{ url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/c4/4d68e8d32a5e0876ede77af11c4a10739e47a0688c91eae9194935cec86a/lyric_py_worker-0.1.7-py3-none-any.whl", hash = "sha256:fb2f437bad7638185f1ef182722d449523dd7a518400744dc42a99cb3d8e25a3", size = 10905875 },
]
[[package]]