# XiaoShi AI Hub Python SDK
[](https://badge.fury.io/py/xiaoshiai-hub)
[](https://pypi.org/project/xiaoshiai-hub/)
[](https://opensource.org/licenses/Apache-2.0)
XiaoShi AI Hub Python SDK 是一个功能强大的 Python 库,用于与 XiaoShi AI Hub 平台进行交互。它提供了简单易用的 API,支持模型和数据集的上传、下载、加密等功能。
[English](README_EN.md) | 简体中文
## ✨ 特性
- 🚀 **简单易用** - 类似 Hugging Face Hub 的 API 设计,上手即用
- 📥 **下载功能** - 支持下载单个文件或整个仓库
- 📤 **上传功能** - 支持上传文件和文件夹到仓库
- 🔐 **加密支持** - 内置多种加密算法(AES、SM4、RSA、SM2)
- 🎯 **模式匹配** - 支持使用 allow/ignore 模式过滤文件
- 📊 **进度显示** - 下载和上传时显示进度条
- 🔑 **多种认证** - 支持用户名/密码和 Token 认证
- 🌐 **环境变量配置** - 灵活的 Hub URL 配置
- 💾 **缓存支持** - 高效的文件缓存机制
- 🔍 **类型提示** - 完整的类型注解,IDE 友好
## 📦 安装
### 基础安装(仅下载功能)
```bash
pip install xiaoshiai-hub
```
### 完整安装(包含上传功能)
```bash
pip install xiaoshiai-hub[upload]
```
### 开发安装
```bash
pip install xiaoshiai-hub[dev]
```
### 完整安装(所有功能)
```bash
pip install xiaoshiai-hub[all]
```
## 🚀 快速开始
### 下载单个文件
```python
from xiaoshiai_hub import moha_hub_download
# 下载单个文件
file_path = moha_hub_download(
repo_id="demo/demo",
filename="config.yaml",
repo_type="models", # 或 "datasets"
username="your-username",
password="your-password",
)
print(f"文件已下载到: {file_path}")
```
### 下载整个仓库
```python
from xiaoshiai_hub import snapshot_download
# 下载整个仓库
repo_path = snapshot_download(
repo_id="demo/demo",
repo_type="models",
username="your-username",
password="your-password",
)
print(f"仓库已下载到: {repo_path}")
```
### 使用过滤器下载
```python
from xiaoshiai_hub import snapshot_download
# 只下载 YAML 和 Markdown 文件
repo_path = snapshot_download(
repo_id="demo/demo",
allow_patterns=["*.yaml", "*.yml", "*.md"],
ignore_patterns=[".git*", "*.log"],
username="your-username",
password="your-password",
)
```
### 上传文件
```python
from xiaoshiai_hub import upload_file
# 上传单个文件
commit_hash = upload_file(
path_or_fileobj="./config.yaml",
path_in_repo="config.yaml",
repo_id="demo/my-model",
repo_type="models",
commit_message="Upload config file",
username="your-username",
password="your-password",
)
print(f"提交哈希: {commit_hash}")
```
### 上传文件夹
```python
from xiaoshiai_hub import upload_folder
# 上传整个文件夹
commit_hash = upload_folder(
folder_path="./my_model",
repo_id="demo/my-model",
repo_type="models",
commit_message="Upload model files",
ignore_patterns=["*.log", ".git*"], # 忽略这些文件
username="your-username",
password="your-password",
)
print(f"提交哈希: {commit_hash}")
```
### 加密上传和下载
```python
from xiaoshiai_hub import upload_file, moha_hub_download
from xiaoshiai_hub.encryption import EncryptionAlgorithm
# 上传加密文件
commit_hash = upload_file(
path_or_fileobj="./secret.txt",
path_in_repo="secret.txt",
repo_id="demo/encrypted-repo",
encryption_key="your-32-character-secret-key",
encryption_algorithm=EncryptionAlgorithm.AES_256_CBC,
username="your-username",
password="your-password",
)
# 下载并解密文件
file_path = moha_hub_download(
repo_id="demo/encrypted-repo",
filename="secret.txt",
decryption_key="your-32-character-secret-key",
decryption_algorithm=EncryptionAlgorithm.AES_256_CBC,
username="your-username",
password="your-password",
)
```
### 使用 HubClient API
```python
from xiaoshiai_hub import HubClient
# 创建客户端
client = HubClient(
username="your-username",
password="your-password",
)
# 获取仓库信息
repo_info = client.get_repository_info("demo", "models", "my-model")
print(f"仓库名称: {repo_info.name}")
print(f"组织: {repo_info.organization}")
# 列出分支
branches = client.list_branches("demo", "models", "my-model")
for branch in branches:
print(f"分支: {branch.name} (commit: {branch.commit_sha})")
# 浏览仓库内容
content = client.get_repository_content("demo", "models", "my-model", "main")
for entry in content.entries:
print(f"{entry.type}: {entry.name}")
```
## 🔐 加密功能
SDK 支持多种加密算法:
### 对称加密
- **AES-256-CBC** - 标准 AES 加密
- **AES-256-GCM** - AES 加密(带认证)
- **SM4-CBC** - 国密 SM4 加密
- **SM4-GCM** - 国密 SM4 加密(带认证)
### 非对称加密
- **RSA-OAEP** - RSA 加密(推荐)
- **RSA-PKCS1V15** - RSA 加密(兼容性)
- **SM2** - 国密 SM2 加密
### 生成加密密钥
```python
import secrets
import string
# 生成对称加密密钥(32 字符)
symmetric_key = ''.join(secrets.choice(string.ascii_letters + string.digits) for _ in range(32))
print(f"对称密钥: {symmetric_key}")
# 生成 RSA 密钥对
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
public_key = private_key.public_key()
# 序列化公钥
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
).decode()
# 序列化私钥
private_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
).decode()
```
### 部分文件加密
```python
from xiaoshiai_hub import upload_folder
from xiaoshiai_hub.encryption import EncryptionAlgorithm
# 上传文件夹,只加密部分文件
commit_hash = upload_folder(
folder_path="./my_model",
repo_id="demo/my-model",
encryption_key="your-secret-key",
encryption_algorithm=EncryptionAlgorithm.AES_256_CBC,
encryption_exclude=["README.md", "*.yaml"], # 这些文件不加密
username="your-username",
password="your-password",
)
```
## ⚙️ 配置
### 环境变量
```bash
# Hub 服务端点
export MOHA_ENDPOINT="https://your-hub-url.com/moha"
# 认证信息
export MOHA_USERNAME="your-username"
export MOHA_PASSWORD="your-password"
# 加密密钥(可选)
export ENCRYPTION_KEY="your-32-character-encryption-key"
export DECRYPTION_KEY="your-32-character-decryption-key"
```
### 使用 .env 文件
创建 `.env` 文件:
```bash
MOHA_ENDPOINT=https://your-hub-url.com/moha
MOHA_USERNAME=your-username
MOHA_PASSWORD=your-password
ENCRYPTION_KEY=your-encryption-key
```
然后在代码中加载:
```python
from dotenv import load_dotenv
load_dotenv()
from xiaoshiai_hub import moha_hub_download
# 自动使用环境变量中的认证信息
file_path = moha_hub_download(
repo_id="demo/demo",
filename="config.yaml",
)
```
## 📚 示例代码
项目包含丰富的示例代码,位于 `examples/` 目录:
- **01_basic_usage.py** - 基础使用示例
- **02_download_file.py** - 下载文件示例
- **03_download_repository.py** - 下载仓库示例
- **04_upload_file.py** - 上传文件示例
- **05_upload_folder.py** - 上传文件夹示例
- **06_encryption.py** - 加密功能示例
- **07_complete_workflow.py** - 完整工作流示例
运行示例:
```bash
# 设置环境变量
export MOHA_USERNAME="your-username"
export MOHA_PASSWORD="your-password"
# 运行示例
python examples/01_basic_usage.py
python examples/07_complete_workflow.py
```
详细说明请查看 [examples/README.md](examples/README.md)
## 🧪 测试
运行测试:
```bash
# 安装开发依赖
pip install xiaoshiai-hub[dev]
# 运行所有测试
pytest
# 运行特定测试文件
pytest tests/test_client.py
# 运行测试并显示覆盖率
pytest --cov=xiaoshiai_hub --cov-report=html
# 运行测试(详细输出)
pytest -v
```
## 📖 API 文档
### 核心函数
#### `moha_hub_download()`
下载单个文件。
**参数:**
- `repo_id` (str): 仓库 ID,格式为 "organization/repo_name"
- `filename` (str): 要下载的文件名
- `repo_type` (str): 仓库类型,"models" 或 "datasets",默认 "models"
- `revision` (str, optional): 分支、标签或提交哈希,默认 "main"
- `local_dir` (str, optional): 本地保存目录
- `username` (str, optional): 用户名
- `password` (str, optional): 密码
- `token` (str, optional): 认证 Token
- `decryption_key` (str, optional): 解密密钥
- `decryption_algorithm` (str, optional): 解密算法
**返回:** 下载文件的本地路径
#### `snapshot_download()`
下载整个仓库。
**参数:**
- `repo_id` (str): 仓库 ID
- `repo_type` (str): 仓库类型,默认 "models"
- `revision` (str, optional): 分支、标签或提交哈希,默认 "main"
- `local_dir` (str, optional): 本地保存目录
- `allow_patterns` (List[str], optional): 允许下载的文件模式
- `ignore_patterns` (List[str], optional): 忽略的文件模式
- `username` (str, optional): 用户名
- `password` (str, optional): 密码
- `token` (str, optional): 认证 Token
- `decryption_key` (str, optional): 解密密钥
- `decryption_algorithm` (str, optional): 解密算法
**返回:** 下载仓库的本地路径
#### `upload_file()`
上传单个文件。
**参数:**
- `path_or_fileobj` (str | Path | bytes): 文件路径或文件对象
- `path_in_repo` (str): 仓库中的文件路径
- `repo_id` (str): 仓库 ID
- `repo_type` (str): 仓库类型,默认 "models"
- `revision` (str): 分支名称,默认 "main"
- `commit_message` (str, optional): 提交信息
- `commit_description` (str, optional): 提交描述
- `username` (str, optional): 用户名
- `password` (str, optional): 密码
- `token` (str, optional): 认证 Token
- `encryption_key` (str, optional): 加密密钥
- `encryption_algorithm` (str, optional): 加密算法
**返回:** 提交哈希
#### `upload_folder()`
上传整个文件夹。
**参数:**
- `folder_path` (str | Path): 文件夹路径
- `repo_id` (str): 仓库 ID
- `repo_type` (str): 仓库类型,默认 "models"
- `revision` (str): 分支名称,默认 "main"
- `commit_message` (str, optional): 提交信息
- `commit_description` (str, optional): 提交描述
- `ignore_patterns` (List[str], optional): 忽略的文件模式
- `username` (str, optional): 用户名
- `password` (str, optional): 密码
- `token` (str, optional): 认证 Token
- `encryption_key` (str, optional): 加密密钥
- `encryption_algorithm` (str, optional): 加密算法
- `encryption_exclude` (List[str], optional): 不加密的文件模式
**返回:** 提交哈希
### HubClient 类
#### 初始化
```python
client = HubClient(
base_url="https://hub.example.com/moha",
username="your-username",
password="your-password",
)
```
#### 方法
- `get_repository_info(org, repo_type, repo_name)` - 获取仓库信息
- `list_branches(org, repo_type, repo_name)` - 列出分支
- `list_tags(org, repo_type, repo_name)` - 列出标签
- `get_repository_content(org, repo_type, repo_name, branch, path)` - 获取仓库内容
- `download_file(org, repo_type, repo_name, branch, file_path, local_path)` - 下载文件
- `get_moha_encryption(org, repo_type, repo_name, branch)` - 获取加密元数据
## 🔧 开发
### 设置开发环境
```bash
# 克隆仓库
git clone https://github.com/poxiaoyun/XiaoShi-Moha.git
cd XiaoShi-Moha/python-sdk
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/macOS
# 或
venv\Scripts\activate # Windows
# 安装开发依赖
pip install -e .[dev]
```
### 代码格式化
```bash
# 使用 black 格式化代码
black xiaoshiai_hub tests examples
# 使用 flake8 检查代码
flake8 xiaoshiai_hub tests
# 使用 mypy 检查类型
mypy xiaoshiai_hub
```
### 构建和发布
```bash
# 构建包
python -m build
# 检查包
twine check dist/*
# 上传到 TestPyPI
twine upload --repository testpypi dist/*
# 上传到 PyPI
twine upload dist/*
```
Raw data
{
"_id": null,
"home_page": "https://github.com/poxiaoyun/moha-sdk",
"name": "xiaoshiai-hub",
"maintainer": "XiaoShi AI Team",
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": "XiaoShi AI Team <support@xiaoshiai.cn>",
"keywords": "xiaoshi, ai-hub, machine-learning, deep-learning, model-hub, dataset, encryption, sdk, api-client",
"author": "XiaoShi AI",
"author_email": "XiaoShi AI <support@xiaoshiai.cn>",
"download_url": "https://files.pythonhosted.org/packages/07/53/09073bbbbe9308c10477db62ce28421d19003c83f0bcbce3ed817a23e7bd/xiaoshiai_hub-0.1.3.tar.gz",
"platform": null,
"description": "# XiaoShi AI Hub Python SDK\n\n[](https://badge.fury.io/py/xiaoshiai-hub)\n[](https://pypi.org/project/xiaoshiai-hub/)\n[](https://opensource.org/licenses/Apache-2.0)\n\nXiaoShi AI Hub Python SDK \u662f\u4e00\u4e2a\u529f\u80fd\u5f3a\u5927\u7684 Python \u5e93\uff0c\u7528\u4e8e\u4e0e XiaoShi AI Hub \u5e73\u53f0\u8fdb\u884c\u4ea4\u4e92\u3002\u5b83\u63d0\u4f9b\u4e86\u7b80\u5355\u6613\u7528\u7684 API\uff0c\u652f\u6301\u6a21\u578b\u548c\u6570\u636e\u96c6\u7684\u4e0a\u4f20\u3001\u4e0b\u8f7d\u3001\u52a0\u5bc6\u7b49\u529f\u80fd\u3002\n\n[English](README_EN.md) | \u7b80\u4f53\u4e2d\u6587\n\n## \u2728 \u7279\u6027\n\n- \ud83d\ude80 **\u7b80\u5355\u6613\u7528** - \u7c7b\u4f3c Hugging Face Hub \u7684 API \u8bbe\u8ba1\uff0c\u4e0a\u624b\u5373\u7528\n- \ud83d\udce5 **\u4e0b\u8f7d\u529f\u80fd** - \u652f\u6301\u4e0b\u8f7d\u5355\u4e2a\u6587\u4ef6\u6216\u6574\u4e2a\u4ed3\u5e93\n- \ud83d\udce4 **\u4e0a\u4f20\u529f\u80fd** - \u652f\u6301\u4e0a\u4f20\u6587\u4ef6\u548c\u6587\u4ef6\u5939\u5230\u4ed3\u5e93\n- \ud83d\udd10 **\u52a0\u5bc6\u652f\u6301** - \u5185\u7f6e\u591a\u79cd\u52a0\u5bc6\u7b97\u6cd5\uff08AES\u3001SM4\u3001RSA\u3001SM2\uff09\n- \ud83c\udfaf **\u6a21\u5f0f\u5339\u914d** - \u652f\u6301\u4f7f\u7528 allow/ignore \u6a21\u5f0f\u8fc7\u6ee4\u6587\u4ef6\n- \ud83d\udcca **\u8fdb\u5ea6\u663e\u793a** - \u4e0b\u8f7d\u548c\u4e0a\u4f20\u65f6\u663e\u793a\u8fdb\u5ea6\u6761\n- \ud83d\udd11 **\u591a\u79cd\u8ba4\u8bc1** - \u652f\u6301\u7528\u6237\u540d/\u5bc6\u7801\u548c Token \u8ba4\u8bc1\n- \ud83c\udf10 **\u73af\u5883\u53d8\u91cf\u914d\u7f6e** - \u7075\u6d3b\u7684 Hub URL \u914d\u7f6e\n- \ud83d\udcbe **\u7f13\u5b58\u652f\u6301** - \u9ad8\u6548\u7684\u6587\u4ef6\u7f13\u5b58\u673a\u5236\n- \ud83d\udd0d **\u7c7b\u578b\u63d0\u793a** - \u5b8c\u6574\u7684\u7c7b\u578b\u6ce8\u89e3\uff0cIDE \u53cb\u597d\n\n## \ud83d\udce6 \u5b89\u88c5\n\n### \u57fa\u7840\u5b89\u88c5\uff08\u4ec5\u4e0b\u8f7d\u529f\u80fd\uff09\n\n```bash\npip install xiaoshiai-hub\n```\n\n### \u5b8c\u6574\u5b89\u88c5\uff08\u5305\u542b\u4e0a\u4f20\u529f\u80fd\uff09\n\n```bash\npip install xiaoshiai-hub[upload]\n```\n\n### \u5f00\u53d1\u5b89\u88c5\n\n```bash\npip install xiaoshiai-hub[dev]\n```\n\n### \u5b8c\u6574\u5b89\u88c5\uff08\u6240\u6709\u529f\u80fd\uff09\n\n```bash\npip install xiaoshiai-hub[all]\n```\n\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\n\n### \u4e0b\u8f7d\u5355\u4e2a\u6587\u4ef6\n\n```python\nfrom xiaoshiai_hub import moha_hub_download\n\n# \u4e0b\u8f7d\u5355\u4e2a\u6587\u4ef6\nfile_path = moha_hub_download(\n repo_id=\"demo/demo\",\n filename=\"config.yaml\",\n repo_type=\"models\", # \u6216 \"datasets\"\n username=\"your-username\",\n password=\"your-password\",\n)\nprint(f\"\u6587\u4ef6\u5df2\u4e0b\u8f7d\u5230: {file_path}\")\n```\n\n### \u4e0b\u8f7d\u6574\u4e2a\u4ed3\u5e93\n\n```python\nfrom xiaoshiai_hub import snapshot_download\n\n# \u4e0b\u8f7d\u6574\u4e2a\u4ed3\u5e93\nrepo_path = snapshot_download(\n repo_id=\"demo/demo\",\n repo_type=\"models\",\n username=\"your-username\",\n password=\"your-password\",\n)\nprint(f\"\u4ed3\u5e93\u5df2\u4e0b\u8f7d\u5230: {repo_path}\")\n```\n\n### \u4f7f\u7528\u8fc7\u6ee4\u5668\u4e0b\u8f7d\n\n```python\nfrom xiaoshiai_hub import snapshot_download\n\n# \u53ea\u4e0b\u8f7d YAML \u548c Markdown \u6587\u4ef6\nrepo_path = snapshot_download(\n repo_id=\"demo/demo\",\n allow_patterns=[\"*.yaml\", \"*.yml\", \"*.md\"],\n ignore_patterns=[\".git*\", \"*.log\"],\n username=\"your-username\",\n password=\"your-password\",\n)\n```\n\n### \u4e0a\u4f20\u6587\u4ef6\n\n```python\nfrom xiaoshiai_hub import upload_file\n\n# \u4e0a\u4f20\u5355\u4e2a\u6587\u4ef6\ncommit_hash = upload_file(\n path_or_fileobj=\"./config.yaml\",\n path_in_repo=\"config.yaml\",\n repo_id=\"demo/my-model\",\n repo_type=\"models\",\n commit_message=\"Upload config file\",\n username=\"your-username\",\n password=\"your-password\",\n)\nprint(f\"\u63d0\u4ea4\u54c8\u5e0c: {commit_hash}\")\n```\n\n### \u4e0a\u4f20\u6587\u4ef6\u5939\n\n```python\nfrom xiaoshiai_hub import upload_folder\n\n# \u4e0a\u4f20\u6574\u4e2a\u6587\u4ef6\u5939\ncommit_hash = upload_folder(\n folder_path=\"./my_model\",\n repo_id=\"demo/my-model\",\n repo_type=\"models\",\n commit_message=\"Upload model files\",\n ignore_patterns=[\"*.log\", \".git*\"], # \u5ffd\u7565\u8fd9\u4e9b\u6587\u4ef6\n username=\"your-username\",\n password=\"your-password\",\n)\nprint(f\"\u63d0\u4ea4\u54c8\u5e0c: {commit_hash}\")\n```\n\n### \u52a0\u5bc6\u4e0a\u4f20\u548c\u4e0b\u8f7d\n\n```python\nfrom xiaoshiai_hub import upload_file, moha_hub_download\nfrom xiaoshiai_hub.encryption import EncryptionAlgorithm\n\n# \u4e0a\u4f20\u52a0\u5bc6\u6587\u4ef6\ncommit_hash = upload_file(\n path_or_fileobj=\"./secret.txt\",\n path_in_repo=\"secret.txt\",\n repo_id=\"demo/encrypted-repo\",\n encryption_key=\"your-32-character-secret-key\",\n encryption_algorithm=EncryptionAlgorithm.AES_256_CBC,\n username=\"your-username\",\n password=\"your-password\",\n)\n\n# \u4e0b\u8f7d\u5e76\u89e3\u5bc6\u6587\u4ef6\nfile_path = moha_hub_download(\n repo_id=\"demo/encrypted-repo\",\n filename=\"secret.txt\",\n decryption_key=\"your-32-character-secret-key\",\n decryption_algorithm=EncryptionAlgorithm.AES_256_CBC,\n username=\"your-username\",\n password=\"your-password\",\n)\n```\n\n### \u4f7f\u7528 HubClient API\n\n```python\nfrom xiaoshiai_hub import HubClient\n\n# \u521b\u5efa\u5ba2\u6237\u7aef\nclient = HubClient(\n username=\"your-username\",\n password=\"your-password\",\n)\n\n# \u83b7\u53d6\u4ed3\u5e93\u4fe1\u606f\nrepo_info = client.get_repository_info(\"demo\", \"models\", \"my-model\")\nprint(f\"\u4ed3\u5e93\u540d\u79f0: {repo_info.name}\")\nprint(f\"\u7ec4\u7ec7: {repo_info.organization}\")\n\n# \u5217\u51fa\u5206\u652f\nbranches = client.list_branches(\"demo\", \"models\", \"my-model\")\nfor branch in branches:\n print(f\"\u5206\u652f: {branch.name} (commit: {branch.commit_sha})\")\n\n# \u6d4f\u89c8\u4ed3\u5e93\u5185\u5bb9\ncontent = client.get_repository_content(\"demo\", \"models\", \"my-model\", \"main\")\nfor entry in content.entries:\n print(f\"{entry.type}: {entry.name}\")\n```\n\n## \ud83d\udd10 \u52a0\u5bc6\u529f\u80fd\n\nSDK \u652f\u6301\u591a\u79cd\u52a0\u5bc6\u7b97\u6cd5\uff1a\n\n### \u5bf9\u79f0\u52a0\u5bc6\n\n- **AES-256-CBC** - \u6807\u51c6 AES \u52a0\u5bc6\n- **AES-256-GCM** - AES \u52a0\u5bc6\uff08\u5e26\u8ba4\u8bc1\uff09\n- **SM4-CBC** - \u56fd\u5bc6 SM4 \u52a0\u5bc6\n- **SM4-GCM** - \u56fd\u5bc6 SM4 \u52a0\u5bc6\uff08\u5e26\u8ba4\u8bc1\uff09\n\n### \u975e\u5bf9\u79f0\u52a0\u5bc6\n\n- **RSA-OAEP** - RSA \u52a0\u5bc6\uff08\u63a8\u8350\uff09\n- **RSA-PKCS1V15** - RSA \u52a0\u5bc6\uff08\u517c\u5bb9\u6027\uff09\n- **SM2** - \u56fd\u5bc6 SM2 \u52a0\u5bc6\n\n### \u751f\u6210\u52a0\u5bc6\u5bc6\u94a5\n\n```python\nimport secrets\nimport string\n\n# \u751f\u6210\u5bf9\u79f0\u52a0\u5bc6\u5bc6\u94a5\uff0832 \u5b57\u7b26\uff09\nsymmetric_key = ''.join(secrets.choice(string.ascii_letters + string.digits) for _ in range(32))\nprint(f\"\u5bf9\u79f0\u5bc6\u94a5: {symmetric_key}\")\n\n# \u751f\u6210 RSA \u5bc6\u94a5\u5bf9\nfrom cryptography.hazmat.primitives.asymmetric import rsa\nfrom cryptography.hazmat.primitives import serialization\n\nprivate_key = rsa.generate_private_key(\n public_exponent=65537,\n key_size=2048,\n)\npublic_key = private_key.public_key()\n\n# \u5e8f\u5217\u5316\u516c\u94a5\npublic_pem = public_key.public_bytes(\n encoding=serialization.Encoding.PEM,\n format=serialization.PublicFormat.SubjectPublicKeyInfo\n).decode()\n\n# \u5e8f\u5217\u5316\u79c1\u94a5\nprivate_pem = private_key.private_bytes(\n encoding=serialization.Encoding.PEM,\n format=serialization.PrivateFormat.PKCS8,\n encryption_algorithm=serialization.NoEncryption()\n).decode()\n```\n\n### \u90e8\u5206\u6587\u4ef6\u52a0\u5bc6\n\n```python\nfrom xiaoshiai_hub import upload_folder\nfrom xiaoshiai_hub.encryption import EncryptionAlgorithm\n\n# \u4e0a\u4f20\u6587\u4ef6\u5939\uff0c\u53ea\u52a0\u5bc6\u90e8\u5206\u6587\u4ef6\ncommit_hash = upload_folder(\n folder_path=\"./my_model\",\n repo_id=\"demo/my-model\",\n encryption_key=\"your-secret-key\",\n encryption_algorithm=EncryptionAlgorithm.AES_256_CBC,\n encryption_exclude=[\"README.md\", \"*.yaml\"], # \u8fd9\u4e9b\u6587\u4ef6\u4e0d\u52a0\u5bc6\n username=\"your-username\",\n password=\"your-password\",\n)\n```\n\n## \u2699\ufe0f \u914d\u7f6e\n\n### \u73af\u5883\u53d8\u91cf\n\n```bash\n# Hub \u670d\u52a1\u7aef\u70b9\nexport MOHA_ENDPOINT=\"https://your-hub-url.com/moha\"\n\n# \u8ba4\u8bc1\u4fe1\u606f\nexport MOHA_USERNAME=\"your-username\"\nexport MOHA_PASSWORD=\"your-password\"\n\n# \u52a0\u5bc6\u5bc6\u94a5\uff08\u53ef\u9009\uff09\nexport ENCRYPTION_KEY=\"your-32-character-encryption-key\"\nexport DECRYPTION_KEY=\"your-32-character-decryption-key\"\n```\n\n### \u4f7f\u7528 .env \u6587\u4ef6\n\n\u521b\u5efa `.env` \u6587\u4ef6\uff1a\n\n```bash\nMOHA_ENDPOINT=https://your-hub-url.com/moha\nMOHA_USERNAME=your-username\nMOHA_PASSWORD=your-password\nENCRYPTION_KEY=your-encryption-key\n```\n\n\u7136\u540e\u5728\u4ee3\u7801\u4e2d\u52a0\u8f7d\uff1a\n\n```python\nfrom dotenv import load_dotenv\nload_dotenv()\n\nfrom xiaoshiai_hub import moha_hub_download\n\n# \u81ea\u52a8\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u4e2d\u7684\u8ba4\u8bc1\u4fe1\u606f\nfile_path = moha_hub_download(\n repo_id=\"demo/demo\",\n filename=\"config.yaml\",\n)\n```\n\n## \ud83d\udcda \u793a\u4f8b\u4ee3\u7801\n\n\u9879\u76ee\u5305\u542b\u4e30\u5bcc\u7684\u793a\u4f8b\u4ee3\u7801\uff0c\u4f4d\u4e8e `examples/` \u76ee\u5f55\uff1a\n\n- **01_basic_usage.py** - \u57fa\u7840\u4f7f\u7528\u793a\u4f8b\n- **02_download_file.py** - \u4e0b\u8f7d\u6587\u4ef6\u793a\u4f8b\n- **03_download_repository.py** - \u4e0b\u8f7d\u4ed3\u5e93\u793a\u4f8b\n- **04_upload_file.py** - \u4e0a\u4f20\u6587\u4ef6\u793a\u4f8b\n- **05_upload_folder.py** - \u4e0a\u4f20\u6587\u4ef6\u5939\u793a\u4f8b\n- **06_encryption.py** - \u52a0\u5bc6\u529f\u80fd\u793a\u4f8b\n- **07_complete_workflow.py** - \u5b8c\u6574\u5de5\u4f5c\u6d41\u793a\u4f8b\n\n\u8fd0\u884c\u793a\u4f8b\uff1a\n\n```bash\n# \u8bbe\u7f6e\u73af\u5883\u53d8\u91cf\nexport MOHA_USERNAME=\"your-username\"\nexport MOHA_PASSWORD=\"your-password\"\n\n# \u8fd0\u884c\u793a\u4f8b\npython examples/01_basic_usage.py\npython examples/07_complete_workflow.py\n```\n\n\u8be6\u7ec6\u8bf4\u660e\u8bf7\u67e5\u770b [examples/README.md](examples/README.md)\n\n## \ud83e\uddea \u6d4b\u8bd5\n\n\u8fd0\u884c\u6d4b\u8bd5\uff1a\n\n```bash\n# \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56\npip install xiaoshiai-hub[dev]\n\n# \u8fd0\u884c\u6240\u6709\u6d4b\u8bd5\npytest\n\n# \u8fd0\u884c\u7279\u5b9a\u6d4b\u8bd5\u6587\u4ef6\npytest tests/test_client.py\n\n# \u8fd0\u884c\u6d4b\u8bd5\u5e76\u663e\u793a\u8986\u76d6\u7387\npytest --cov=xiaoshiai_hub --cov-report=html\n\n# \u8fd0\u884c\u6d4b\u8bd5\uff08\u8be6\u7ec6\u8f93\u51fa\uff09\npytest -v\n```\n\n## \ud83d\udcd6 API \u6587\u6863\n\n### \u6838\u5fc3\u51fd\u6570\n\n#### `moha_hub_download()`\n\n\u4e0b\u8f7d\u5355\u4e2a\u6587\u4ef6\u3002\n\n**\u53c2\u6570\uff1a**\n- `repo_id` (str): \u4ed3\u5e93 ID\uff0c\u683c\u5f0f\u4e3a \"organization/repo_name\"\n- `filename` (str): \u8981\u4e0b\u8f7d\u7684\u6587\u4ef6\u540d\n- `repo_type` (str): \u4ed3\u5e93\u7c7b\u578b\uff0c\"models\" \u6216 \"datasets\"\uff0c\u9ed8\u8ba4 \"models\"\n- `revision` (str, optional): \u5206\u652f\u3001\u6807\u7b7e\u6216\u63d0\u4ea4\u54c8\u5e0c\uff0c\u9ed8\u8ba4 \"main\"\n- `local_dir` (str, optional): \u672c\u5730\u4fdd\u5b58\u76ee\u5f55\n- `username` (str, optional): \u7528\u6237\u540d\n- `password` (str, optional): \u5bc6\u7801\n- `token` (str, optional): \u8ba4\u8bc1 Token\n- `decryption_key` (str, optional): \u89e3\u5bc6\u5bc6\u94a5\n- `decryption_algorithm` (str, optional): \u89e3\u5bc6\u7b97\u6cd5\n\n**\u8fd4\u56de\uff1a** \u4e0b\u8f7d\u6587\u4ef6\u7684\u672c\u5730\u8def\u5f84\n\n#### `snapshot_download()`\n\n\u4e0b\u8f7d\u6574\u4e2a\u4ed3\u5e93\u3002\n\n**\u53c2\u6570\uff1a**\n- `repo_id` (str): \u4ed3\u5e93 ID\n- `repo_type` (str): \u4ed3\u5e93\u7c7b\u578b\uff0c\u9ed8\u8ba4 \"models\"\n- `revision` (str, optional): \u5206\u652f\u3001\u6807\u7b7e\u6216\u63d0\u4ea4\u54c8\u5e0c\uff0c\u9ed8\u8ba4 \"main\"\n- `local_dir` (str, optional): \u672c\u5730\u4fdd\u5b58\u76ee\u5f55\n- `allow_patterns` (List[str], optional): \u5141\u8bb8\u4e0b\u8f7d\u7684\u6587\u4ef6\u6a21\u5f0f\n- `ignore_patterns` (List[str], optional): \u5ffd\u7565\u7684\u6587\u4ef6\u6a21\u5f0f\n- `username` (str, optional): \u7528\u6237\u540d\n- `password` (str, optional): \u5bc6\u7801\n- `token` (str, optional): \u8ba4\u8bc1 Token\n- `decryption_key` (str, optional): \u89e3\u5bc6\u5bc6\u94a5\n- `decryption_algorithm` (str, optional): \u89e3\u5bc6\u7b97\u6cd5\n\n**\u8fd4\u56de\uff1a** \u4e0b\u8f7d\u4ed3\u5e93\u7684\u672c\u5730\u8def\u5f84\n\n#### `upload_file()`\n\n\u4e0a\u4f20\u5355\u4e2a\u6587\u4ef6\u3002\n\n**\u53c2\u6570\uff1a**\n- `path_or_fileobj` (str | Path | bytes): \u6587\u4ef6\u8def\u5f84\u6216\u6587\u4ef6\u5bf9\u8c61\n- `path_in_repo` (str): \u4ed3\u5e93\u4e2d\u7684\u6587\u4ef6\u8def\u5f84\n- `repo_id` (str): \u4ed3\u5e93 ID\n- `repo_type` (str): \u4ed3\u5e93\u7c7b\u578b\uff0c\u9ed8\u8ba4 \"models\"\n- `revision` (str): \u5206\u652f\u540d\u79f0\uff0c\u9ed8\u8ba4 \"main\"\n- `commit_message` (str, optional): \u63d0\u4ea4\u4fe1\u606f\n- `commit_description` (str, optional): \u63d0\u4ea4\u63cf\u8ff0\n- `username` (str, optional): \u7528\u6237\u540d\n- `password` (str, optional): \u5bc6\u7801\n- `token` (str, optional): \u8ba4\u8bc1 Token\n- `encryption_key` (str, optional): \u52a0\u5bc6\u5bc6\u94a5\n- `encryption_algorithm` (str, optional): \u52a0\u5bc6\u7b97\u6cd5\n\n**\u8fd4\u56de\uff1a** \u63d0\u4ea4\u54c8\u5e0c\n\n#### `upload_folder()`\n\n\u4e0a\u4f20\u6574\u4e2a\u6587\u4ef6\u5939\u3002\n\n**\u53c2\u6570\uff1a**\n- `folder_path` (str | Path): \u6587\u4ef6\u5939\u8def\u5f84\n- `repo_id` (str): \u4ed3\u5e93 ID\n- `repo_type` (str): \u4ed3\u5e93\u7c7b\u578b\uff0c\u9ed8\u8ba4 \"models\"\n- `revision` (str): \u5206\u652f\u540d\u79f0\uff0c\u9ed8\u8ba4 \"main\"\n- `commit_message` (str, optional): \u63d0\u4ea4\u4fe1\u606f\n- `commit_description` (str, optional): \u63d0\u4ea4\u63cf\u8ff0\n- `ignore_patterns` (List[str], optional): \u5ffd\u7565\u7684\u6587\u4ef6\u6a21\u5f0f\n- `username` (str, optional): \u7528\u6237\u540d\n- `password` (str, optional): \u5bc6\u7801\n- `token` (str, optional): \u8ba4\u8bc1 Token\n- `encryption_key` (str, optional): \u52a0\u5bc6\u5bc6\u94a5\n- `encryption_algorithm` (str, optional): \u52a0\u5bc6\u7b97\u6cd5\n- `encryption_exclude` (List[str], optional): \u4e0d\u52a0\u5bc6\u7684\u6587\u4ef6\u6a21\u5f0f\n\n**\u8fd4\u56de\uff1a** \u63d0\u4ea4\u54c8\u5e0c\n\n### HubClient \u7c7b\n\n#### \u521d\u59cb\u5316\n\n```python\nclient = HubClient(\n base_url=\"https://hub.example.com/moha\",\n username=\"your-username\",\n password=\"your-password\",\n)\n```\n\n#### \u65b9\u6cd5\n\n- `get_repository_info(org, repo_type, repo_name)` - \u83b7\u53d6\u4ed3\u5e93\u4fe1\u606f\n- `list_branches(org, repo_type, repo_name)` - \u5217\u51fa\u5206\u652f\n- `list_tags(org, repo_type, repo_name)` - \u5217\u51fa\u6807\u7b7e\n- `get_repository_content(org, repo_type, repo_name, branch, path)` - \u83b7\u53d6\u4ed3\u5e93\u5185\u5bb9\n- `download_file(org, repo_type, repo_name, branch, file_path, local_path)` - \u4e0b\u8f7d\u6587\u4ef6\n- `get_moha_encryption(org, repo_type, repo_name, branch)` - \u83b7\u53d6\u52a0\u5bc6\u5143\u6570\u636e\n\n## \ud83d\udd27 \u5f00\u53d1\n\n### \u8bbe\u7f6e\u5f00\u53d1\u73af\u5883\n\n```bash\n# \u514b\u9686\u4ed3\u5e93\ngit clone https://github.com/poxiaoyun/XiaoShi-Moha.git\ncd XiaoShi-Moha/python-sdk\n\n# \u521b\u5efa\u865a\u62df\u73af\u5883\npython -m venv venv\nsource venv/bin/activate # Linux/macOS\n# \u6216\nvenv\\Scripts\\activate # Windows\n\n# \u5b89\u88c5\u5f00\u53d1\u4f9d\u8d56\npip install -e .[dev]\n```\n\n### \u4ee3\u7801\u683c\u5f0f\u5316\n\n```bash\n# \u4f7f\u7528 black \u683c\u5f0f\u5316\u4ee3\u7801\nblack xiaoshiai_hub tests examples\n\n# \u4f7f\u7528 flake8 \u68c0\u67e5\u4ee3\u7801\nflake8 xiaoshiai_hub tests\n\n# \u4f7f\u7528 mypy \u68c0\u67e5\u7c7b\u578b\nmypy xiaoshiai_hub\n```\n\n### \u6784\u5efa\u548c\u53d1\u5e03\n\n```bash\n# \u6784\u5efa\u5305\npython -m build\n\n# \u68c0\u67e5\u5305\ntwine check dist/*\n\n# \u4e0a\u4f20\u5230 TestPyPI\ntwine upload --repository testpypi dist/*\n\n# \u4e0a\u4f20\u5230 PyPI\ntwine upload dist/*\n```\n\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "Python SDK for XiaoShi AI Hub - Upload, download, and manage AI models and datasets with encryption support",
"version": "0.1.3",
"project_urls": {
"Homepage": "https://github.com/poxiaoyun/moha-sdk",
"Issues": "https://github.com/poxiaoyun/moha-sdk/issues",
"Repository": "https://github.com/poxiaoyun/moha-sdk"
},
"split_keywords": [
"xiaoshi",
" ai-hub",
" machine-learning",
" deep-learning",
" model-hub",
" dataset",
" encryption",
" sdk",
" api-client"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "efa7a633ca91091af7fd3086f1118a77333a2d4b473542a364a9a0b6c1dd8a24",
"md5": "acc9bf79956d346cab8ea98e01072c88",
"sha256": "6fa592b8dcd7c7485f34a733305c76e86909b6612ad6ca23a259cf0bb8905a55"
},
"downloads": -1,
"filename": "xiaoshiai_hub-0.1.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "acc9bf79956d346cab8ea98e01072c88",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 29453,
"upload_time": "2025-11-05T06:41:21",
"upload_time_iso_8601": "2025-11-05T06:41:21.057345Z",
"url": "https://files.pythonhosted.org/packages/ef/a7/a633ca91091af7fd3086f1118a77333a2d4b473542a364a9a0b6c1dd8a24/xiaoshiai_hub-0.1.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "075309073bbbbe9308c10477db62ce28421d19003c83f0bcbce3ed817a23e7bd",
"md5": "1e9e074f3d1d8e310ade60b119237c7f",
"sha256": "79d2ccfd3030cb7d97756db4404d11935c64224c08cf7fac47d621917d5db7d5"
},
"downloads": -1,
"filename": "xiaoshiai_hub-0.1.3.tar.gz",
"has_sig": false,
"md5_digest": "1e9e074f3d1d8e310ade60b119237c7f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 47894,
"upload_time": "2025-11-05T06:41:22",
"upload_time_iso_8601": "2025-11-05T06:41:22.292792Z",
"url": "https://files.pythonhosted.org/packages/07/53/09073bbbbe9308c10477db62ce28421d19003c83f0bcbce3ed817a23e7bd/xiaoshiai_hub-0.1.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-11-05 06:41:22",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "poxiaoyun",
"github_project": "moha-sdk",
"github_not_found": true,
"lcname": "xiaoshiai-hub"
}