dify_admin/api/cli.py

342 lines
15 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import argparse
import logging
import sys
from tenant_manager import TenantManager
from model_manager import ModelManager
from account_manager import AccountManager
from provider_manager import ProviderManager
from .config import CONFIG_PATHS
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
def setup_tenant_parser(subparsers):
"""设置租户管理相关的命令行参数"""
tenant_parser = subparsers.add_parser('tenant', help='租户管理')
tenant_subparsers = tenant_parser.add_subparsers(dest='tenant_command', help='租户操作')
# 创建租户
create_tenant_parser = tenant_subparsers.add_parser('create', help='创建租户')
create_tenant_parser.add_argument('name', help='租户名称')
# 查询租户
get_tenant_parser = tenant_subparsers.add_parser('get', help='查询租户')
get_tenant_parser.add_argument('name', help='租户名称')
# 列出所有租户
tenant_subparsers.add_parser('list', help='列出所有租户')
def setup_model_parser(subparsers):
"""设置模型管理相关的命令行参数"""
model_parser = subparsers.add_parser('model', help='模型管理')
model_subparsers = model_parser.add_subparsers(dest='model_command', help='模型操作')
# 添加模型
add_model_parser = model_subparsers.add_parser('add', help='添加模型')
add_model_parser.add_argument('--tenant', help='租户名称,不指定则为所有租户添加')
add_model_parser.add_argument('--config', default=CONFIG_PATHS['model_config'], help='模型配置文件路径')
# 添加火山模型
add_volc_model_parser = model_subparsers.add_parser('add-volc', help='添加火山模型')
add_volc_model_parser.add_argument('--tenant', help='租户名称,不指定则为所有租户添加')
add_volc_model_parser.add_argument('--config', default=CONFIG_PATHS['volc_model_config'], help='火山模型配置文件路径')
# 删除模型
delete_model_parser = model_subparsers.add_parser('delete', help='删除模型')
delete_model_parser.add_argument('--tenant', help='租户名称,不指定则删除所有租户下的指定模型')
delete_model_parser.add_argument('--model', required=True, help='模型名称')
# 删除租户下的所有模型
delete_all_models_parser = model_subparsers.add_parser('delete-all', help='删除租户下的所有模型')
delete_all_models_parser.add_argument('--tenant', required=True, help='租户名称')
def setup_account_parser(subparsers):
"""设置账户管理相关的命令行参数"""
account_parser = subparsers.add_parser('account', help='账户管理')
account_subparsers = account_parser.add_subparsers(dest='account_command', help='账户操作')
# 创建账户
create_account_parser = account_subparsers.add_parser('create', help='创建账户')
create_account_parser.add_argument('username', help='用户名')
create_account_parser.add_argument('email', help='邮箱')
create_account_parser.add_argument('password', help='密码')
# 查询账户
get_account_parser = account_subparsers.add_parser('get', help='查询账户')
get_account_group = get_account_parser.add_mutually_exclusive_group(required=True)
get_account_group.add_argument('--username', help='用户名')
get_account_group.add_argument('--email', help='邮箱')
# 修改密码
update_password_parser = account_subparsers.add_parser('update-password', help='修改密码')
update_password_parser.add_argument('username', help='用户名')
update_password_parser.add_argument('email', help='邮箱')
update_password_parser.add_argument('password', help='新密码')
# 关联账户与租户
associate_parser = account_subparsers.add_parser('associate', help='关联账户与租户')
associate_parser.add_argument('--username', required=True, help='用户名')
associate_parser.add_argument('--tenant', required=True, help='租户名称')
associate_parser.add_argument('--role', default='normal', choices=['owner', 'admin', 'editor', 'normal'], help='角色')
associate_parser.add_argument('--current', action='store_true', help='是否为当前使用')
# 获取租户下的所有账户
get_tenant_accounts_parser = account_subparsers.add_parser('list-tenant-accounts', help='获取租户下的所有账户')
get_tenant_accounts_parser.add_argument('--tenant', required=True, help='租户名称')
def setup_provider_parser(subparsers):
"""设置提供商管理相关的命令行参数"""
provider_parser = subparsers.add_parser('provider', help='提供商管理')
provider_subparsers = provider_parser.add_subparsers(dest='provider_command', help='提供商操作')
# 添加提供商
add_provider_parser = provider_subparsers.add_parser('add', help='添加提供商')
add_provider_parser.add_argument('--tenant', help='租户名称,不指定则为所有租户添加')
add_provider_parser.add_argument('--config', default=CONFIG_PATHS['provider_config'], help='提供商配置文件路径')
# 删除提供商
delete_provider_parser = provider_subparsers.add_parser('delete', help='删除提供商')
delete_provider_parser.add_argument('--tenant', required=True, help='租户名称')
delete_provider_parser.add_argument('--provider', required=True, help='提供商名称')
# 删除租户下的所有提供商
delete_all_providers_parser = provider_subparsers.add_parser('delete-all', help='删除租户下的所有提供商')
delete_all_providers_parser.add_argument('--tenant', required=True, help='租户名称')
# 获取租户下的所有提供商
get_providers_parser = provider_subparsers.add_parser('list', help='获取租户下的所有提供商')
get_providers_parser.add_argument('--tenant', required=True, help='租户名称')
def handle_tenant_commands(args):
"""处理租户管理相关的命令"""
if not hasattr(args, 'tenant_command') or args.tenant_command is None:
print("请指定租户操作命令")
return False
if args.tenant_command == 'create':
tenant_id = TenantManager.create_tenant(args.name)
print(f"租户创建成功ID: {tenant_id}")
elif args.tenant_command == 'get':
tenant = TenantManager.get_tenant_by_name(args.name)
if tenant:
print(f"租户信息: ID={tenant['id']}")
else:
print(f"未找到租户: {args.name}")
elif args.tenant_command == 'list':
tenants = TenantManager.get_all_tenants()
print(f"共找到 {len(tenants)} 个租户:")
for tenant in tenants:
print(f"ID: {tenant['id']}")
else:
print("请指定租户操作命令")
return False
return True
def handle_model_commands(args):
"""处理模型管理相关的命令"""
if not hasattr(args, 'model_command') or args.model_command is None:
print("请指定模型操作命令")
return False
if args.model_command == 'add':
if args.tenant:
count = ModelManager.add_models_for_tenant(args.tenant, args.config)
print(f"为租户 {args.tenant} 添加模型完成,共添加 {count} 条记录。")
else:
count = ModelManager.add_models_for_all_tenants(args.config)
print(f"为所有租户添加模型完成,共添加 {count} 条记录。")
elif args.model_command == 'add-volc':
if args.tenant:
count = ModelManager.add_volc_models_for_tenant(args.tenant, args.config)
print(f"为租户 {args.tenant} 添加火山模型完成,共添加 {count} 条记录。")
else:
count = ModelManager.add_volc_models_for_all_tenants(args.config)
print(f"为所有租户添加火山模型完成,共添加 {count} 条记录。")
elif args.model_command == 'delete':
if args.tenant:
tenant = TenantManager.get_tenant_by_name(args.tenant)
if not tenant:
print(f"未找到租户: {args.tenant}")
return False
count = ModelManager.delete_model_for_tenant(tenant['id'], args.model)
print(f"删除租户 {args.tenant} 下的模型 {args.model} 完成,共删除 {count} 条记录。")
else:
count = ModelManager.delete_specific_model_for_all_tenants(args.model)
print(f"删除所有租户下的模型 {args.model} 完成,共删除 {count} 条记录。")
elif args.model_command == 'delete-all':
tenant = TenantManager.get_tenant_by_name(args.tenant)
if not tenant:
print(f"未找到租户: {args.tenant}")
return False
count = ModelManager.delete_models_for_tenant(tenant['id'])
print(f"删除租户 {args.tenant} 下的所有模型完成,共删除 {count} 条记录。")
else:
print("请指定模型操作命令")
return False
return True
def handle_account_commands(args):
"""处理账户管理相关的命令"""
if not hasattr(args, 'account_command') or args.account_command is None:
print("请指定账户操作命令")
return False
if args.account_command == 'create':
user_id = AccountManager.create_account(args.username, args.email, args.password)
print(f"账户创建成功ID: {user_id}")
elif args.account_command == 'get':
if args.username:
user = AccountManager.get_user_by_username(args.username)
if user and len(user) >= 3:
print(f"用户信息: ID={user[0]}, 用户名={user[1]}, 邮箱={user[2]}")
else:
print(f"未找到用户: {args.username}")
elif args.email:
user = AccountManager.get_user_by_email(args.email)
if user and len(user) >= 3:
print(f"用户信息: ID={user[0]}, 用户名={user[1]}, 邮箱={user[2]}")
else:
print(f"未找到用户: {args.email}")
elif args.account_command == 'update-password':
success = AccountManager.update_password(args.username, args.email, args.password)
if success:
print(f"密码更新成功")
else:
print(f"密码更新失败,未找到用户")
elif args.account_command == 'associate':
user = AccountManager.get_user_by_username(args.username)
if not user or len(user) < 1:
print(f"未找到用户: {args.username}")
return False
tenant = TenantManager.get_tenant_by_name(args.tenant)
if not tenant:
print(f"未找到租户: {args.tenant}")
return False
success = AccountManager.associate_with_tenant(user[0], tenant['id'], args.role, None, args.current)
if success:
print(f"关联成功")
else:
print(f"关联失败")
elif args.account_command == 'list-tenant-accounts':
tenant = TenantManager.get_tenant_by_name(args.tenant)
if not tenant:
print(f"未找到租户: {args.tenant}")
return False
accounts = AccountManager.get_tenant_accounts(tenant['id'])
print(f"租户 {args.tenant} 下共有 {len(accounts)} 个账户:")
for account in accounts:
print(f"ID: {account[0]}, 用户名: {account[1]}, 邮箱: {account[2]}, 角色: {account[3]}, 当前使用: {account[4]}")
else:
print("请指定账户操作命令")
return False
return True
def handle_provider_commands(args):
"""处理提供商管理相关的命令"""
if not hasattr(args, 'provider_command') or args.provider_command is None:
print("请指定提供商操作命令")
return False
if args.provider_command == 'add':
if args.tenant:
count = ProviderManager.add_providers_for_tenant(args.tenant, args.config)
print(f"为租户 {args.tenant} 添加提供商完成,共添加 {count} 条记录。")
else:
count = ProviderManager.add_providers_for_all_tenants(args.config)
print(f"为所有租户添加提供商完成,共添加 {count} 条记录。")
elif args.provider_command == 'delete':
tenant = TenantManager.get_tenant_by_name(args.tenant)
if not tenant:
print(f"未找到租户: {args.tenant}")
return False
count = ProviderManager.delete_provider_for_tenant(tenant['id'], args.provider)
print(f"删除租户 {args.tenant} 下的提供商 {args.provider} 完成,共删除 {count} 条记录。")
elif args.provider_command == 'delete-all':
tenant = TenantManager.get_tenant_by_name(args.tenant)
if not tenant:
print(f"未找到租户: {args.tenant}")
return False
count = ProviderManager.delete_providers_for_tenant(tenant['id'])
print(f"删除租户 {args.tenant} 下的所有提供商完成,共删除 {count} 条记录。")
elif args.provider_command == 'list':
tenant = TenantManager.get_tenant_by_name(args.tenant)
if not tenant:
print(f"未找到租户: {args.tenant}")
return False
providers = ProviderManager.get_providers_for_tenant(tenant['id'])
print(f"租户 {args.tenant} 下共有 {len(providers)} 个提供商:")
for provider in providers:
print(f"ID: {provider[0]}, 名称: {provider[1]}, 类型: {provider[2]}, 有效: {provider[3]}")
else:
print("请指定提供商操作命令")
return False
return True
def main():
"""主函数"""
# 创建命令行解析器
parser = argparse.ArgumentParser(description='Dify数据库管理工具')
subparsers = parser.add_subparsers(dest='command', help='子命令')
# 设置各个子命令的解析器
setup_tenant_parser(subparsers)
setup_model_parser(subparsers)
setup_account_parser(subparsers)
setup_provider_parser(subparsers)
# 解析命令行参数
args = parser.parse_args()
# 根据命令执行相应的操作
success = False
if args.command == 'tenant':
success = handle_tenant_commands(args)
elif args.command == 'model':
success = handle_model_commands(args)
elif args.command == 'account':
success = handle_account_commands(args)
elif args.command == 'provider':
success = handle_provider_commands(args)
else:
parser.print_help()
# 根据操作结果设置退出码
sys.exit(0 if success else 1)
if __name__ == "__main__":
main()