# SAGE CLI
SAGE Framework 的命令行工具包,提供集群管理、作业部署和配置管理功能。
## 功能特性
### 🚀 核心功能
- **集群管理**: Ray 集群的启动、停止和监控
- **作业管理**: SAGE 作业的提交、监控和管理
- **部署管理**: 系统组件的一键部署和配置
- **配置管理**: 统一的配置文件管理和环境设置
### 📋 命令概览
- `sage config` - 配置管理
- `sage deploy` - 系统部署
- `sage job` - 作业管理
- `sage cluster` - 集群管理
- `sage worker` - Worker 节点管理
- `sage head` - Head 节点管理
## 安装
```bash
pip install intsage-cli
```
### 开发安装
```bash
pip install intsage-cli[dev]
```
### 完整功能安装
```bash
pip install intsage-cli[full]
```
## 快速开始
### 1. 初始化配置
```bash
sage config init
```
### 2. 启动 SAGE 系统
```bash
sage deploy start
```
### 3. 检查系统状态
```bash
sage cluster status
```
### 4. 提交作业
```bash
sage job submit my_job.py
```
## 命令参考
### 配置管理 (`sage config`)
```bash
# 显示所有配置
sage config show
# 设置配置项
sage config set ray.head_port 10001
# 获取配置项
sage config get ray.head_port
```
### 部署管理 (`sage deploy`)
```bash
# 启动完整系统 (Ray + JobManager)
sage deploy start
# 仅启动 Ray 集群
sage deploy start --ray-only
# 仅启动 JobManager
sage deploy start --daemon-only
# 停止系统
sage deploy stop
```
### 集群管理 (`sage cluster`)
```bash
# 查看集群状态
sage cluster status
# 启动集群
sage cluster start
# 停止集群
sage cluster stop
# 重启集群
sage cluster restart
```
### 作业管理 (`sage job`)
```bash
# 提交作业
sage job submit script.py
# 查看作业状态
sage job status [job_id]
# 列出所有作业
sage job list
# 取消作业
sage job cancel job_id
# 查看作业日志
sage job logs job_id
```
## 配置文件
CLI 工具使用 `~/.sage/config.yaml` 作为默认配置文件:
```yaml
ray:
head_port: 10001
dashboard_port: 8265
object_store_memory: 1000000000
jobmanager:
port: 8080
max_jobs: 100
deployment:
log_level: INFO
auto_scaling: true
```
## 环境变量
- `SAGE_CONFIG_PATH`: 自定义配置文件路径
- `SAGE_LOG_LEVEL`: 日志级别 (DEBUG, INFO, WARNING, ERROR)
- `RAY_ADDRESS`: Ray 集群地址
- `SAGE_HOME`: SAGE 安装目录
## 开发
### 项目结构
```
src/sage/cli/
├── __init__.py # CLI 模块初始化
├── main.py # 主命令入口点
├── config_manager.py # 配置管理
├── deploy.py # 部署管理
├── job.py # 作业管理
├── cluster_manager.py # 集群管理
├── worker_manager.py # Worker 管理
├── head_manager.py # Head 节点管理
├── jobmanager_controller.py # JobManager 控制器
└── extensions.py # 扩展管理
```
### 运行测试
```bash
pytest tests/
```
### 代码格式化
```bash
black src/sage/cli/
ruff check src/sage/cli/
```
## 许可证
MIT License - 详见 [LICENSE](../../LICENSE) 文件。
## 贡献
欢迎贡献代码!请查看 [CONTRIBUTING.md](../../CONTRIBUTING.md) 了解详细指南。
## 支持
- 📖 [文档](https://intellistream.github.io/SAGE-Pub/)
- 🐛 [问题报告](https://github.com/intellistream/SAGE/issues)
- 💬 [讨论](https://github.com/intellistream/SAGE/discussions)
Raw data
{
"_id": null,
"home_page": null,
"name": "intellistream-sage-cli",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "cli, command-line, sage, cluster, management, deployment, job, ray, intellistream",
"author": null,
"author_email": "IntelliStream Team <intellistream@outlook.com>",
"download_url": null,
"platform": null,
"description": "# SAGE CLI\n\nSAGE Framework \u7684\u547d\u4ee4\u884c\u5de5\u5177\u5305\uff0c\u63d0\u4f9b\u96c6\u7fa4\u7ba1\u7406\u3001\u4f5c\u4e1a\u90e8\u7f72\u548c\u914d\u7f6e\u7ba1\u7406\u529f\u80fd\u3002\n\n## \u529f\u80fd\u7279\u6027\n\n### \ud83d\ude80 \u6838\u5fc3\u529f\u80fd\n- **\u96c6\u7fa4\u7ba1\u7406**: Ray \u96c6\u7fa4\u7684\u542f\u52a8\u3001\u505c\u6b62\u548c\u76d1\u63a7\n- **\u4f5c\u4e1a\u7ba1\u7406**: SAGE \u4f5c\u4e1a\u7684\u63d0\u4ea4\u3001\u76d1\u63a7\u548c\u7ba1\u7406 \n- **\u90e8\u7f72\u7ba1\u7406**: \u7cfb\u7edf\u7ec4\u4ef6\u7684\u4e00\u952e\u90e8\u7f72\u548c\u914d\u7f6e\n- **\u914d\u7f6e\u7ba1\u7406**: \u7edf\u4e00\u7684\u914d\u7f6e\u6587\u4ef6\u7ba1\u7406\u548c\u73af\u5883\u8bbe\u7f6e\n\n### \ud83d\udccb \u547d\u4ee4\u6982\u89c8\n- `sage config` - \u914d\u7f6e\u7ba1\u7406\n- `sage deploy` - \u7cfb\u7edf\u90e8\u7f72\n- `sage job` - \u4f5c\u4e1a\u7ba1\u7406\n- `sage cluster` - \u96c6\u7fa4\u7ba1\u7406\n- `sage worker` - Worker \u8282\u70b9\u7ba1\u7406\n- `sage head` - Head \u8282\u70b9\u7ba1\u7406\n\n## \u5b89\u88c5\n\n```bash\npip install intsage-cli\n```\n\n### \u5f00\u53d1\u5b89\u88c5\n```bash\npip install intsage-cli[dev]\n```\n\n### \u5b8c\u6574\u529f\u80fd\u5b89\u88c5\n```bash\npip install intsage-cli[full]\n```\n\n## \u5feb\u901f\u5f00\u59cb\n\n### 1. \u521d\u59cb\u5316\u914d\u7f6e\n```bash\nsage config init\n```\n\n### 2. \u542f\u52a8 SAGE \u7cfb\u7edf\n```bash\nsage deploy start\n```\n\n### 3. \u68c0\u67e5\u7cfb\u7edf\u72b6\u6001\n```bash\nsage cluster status\n```\n\n### 4. \u63d0\u4ea4\u4f5c\u4e1a\n```bash\nsage job submit my_job.py\n```\n\n## \u547d\u4ee4\u53c2\u8003\n\n### \u914d\u7f6e\u7ba1\u7406 (`sage config`)\n```bash\n# \u663e\u793a\u6240\u6709\u914d\u7f6e\nsage config show\n\n# \u8bbe\u7f6e\u914d\u7f6e\u9879\nsage config set ray.head_port 10001\n\n# \u83b7\u53d6\u914d\u7f6e\u9879\nsage config get ray.head_port\n```\n\n### \u90e8\u7f72\u7ba1\u7406 (`sage deploy`)\n```bash\n# \u542f\u52a8\u5b8c\u6574\u7cfb\u7edf (Ray + JobManager)\nsage deploy start\n\n# \u4ec5\u542f\u52a8 Ray \u96c6\u7fa4\nsage deploy start --ray-only\n\n# \u4ec5\u542f\u52a8 JobManager\nsage deploy start --daemon-only\n\n# \u505c\u6b62\u7cfb\u7edf\nsage deploy stop\n```\n\n### \u96c6\u7fa4\u7ba1\u7406 (`sage cluster`)\n```bash\n# \u67e5\u770b\u96c6\u7fa4\u72b6\u6001\nsage cluster status\n\n# \u542f\u52a8\u96c6\u7fa4\nsage cluster start\n\n# \u505c\u6b62\u96c6\u7fa4\nsage cluster stop\n\n# \u91cd\u542f\u96c6\u7fa4\nsage cluster restart\n```\n\n### \u4f5c\u4e1a\u7ba1\u7406 (`sage job`)\n```bash\n# \u63d0\u4ea4\u4f5c\u4e1a\nsage job submit script.py\n\n# \u67e5\u770b\u4f5c\u4e1a\u72b6\u6001\nsage job status [job_id]\n\n# \u5217\u51fa\u6240\u6709\u4f5c\u4e1a\nsage job list\n\n# \u53d6\u6d88\u4f5c\u4e1a\nsage job cancel job_id\n\n# \u67e5\u770b\u4f5c\u4e1a\u65e5\u5fd7\nsage job logs job_id\n```\n\n## \u914d\u7f6e\u6587\u4ef6\n\nCLI \u5de5\u5177\u4f7f\u7528 `~/.sage/config.yaml` \u4f5c\u4e3a\u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\uff1a\n\n```yaml\nray:\n head_port: 10001\n dashboard_port: 8265\n object_store_memory: 1000000000\n\njobmanager:\n port: 8080\n max_jobs: 100\n\ndeployment:\n log_level: INFO\n auto_scaling: true\n```\n\n## \u73af\u5883\u53d8\u91cf\n\n- `SAGE_CONFIG_PATH`: \u81ea\u5b9a\u4e49\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\n- `SAGE_LOG_LEVEL`: \u65e5\u5fd7\u7ea7\u522b (DEBUG, INFO, WARNING, ERROR)\n- `RAY_ADDRESS`: Ray \u96c6\u7fa4\u5730\u5740\n- `SAGE_HOME`: SAGE \u5b89\u88c5\u76ee\u5f55\n\n## \u5f00\u53d1\n\n### \u9879\u76ee\u7ed3\u6784\n```\nsrc/sage/cli/\n\u251c\u2500\u2500 __init__.py # CLI \u6a21\u5757\u521d\u59cb\u5316\n\u251c\u2500\u2500 main.py # \u4e3b\u547d\u4ee4\u5165\u53e3\u70b9\n\u251c\u2500\u2500 config_manager.py # \u914d\u7f6e\u7ba1\u7406\n\u251c\u2500\u2500 deploy.py # \u90e8\u7f72\u7ba1\u7406\n\u251c\u2500\u2500 job.py # \u4f5c\u4e1a\u7ba1\u7406 \n\u251c\u2500\u2500 cluster_manager.py # \u96c6\u7fa4\u7ba1\u7406\n\u251c\u2500\u2500 worker_manager.py # Worker \u7ba1\u7406\n\u251c\u2500\u2500 head_manager.py # Head \u8282\u70b9\u7ba1\u7406\n\u251c\u2500\u2500 jobmanager_controller.py # JobManager \u63a7\u5236\u5668\n\u2514\u2500\u2500 extensions.py # \u6269\u5c55\u7ba1\u7406\n```\n\n### \u8fd0\u884c\u6d4b\u8bd5\n```bash\npytest tests/\n```\n\n### \u4ee3\u7801\u683c\u5f0f\u5316\n```bash\nblack src/sage/cli/\nruff check src/sage/cli/\n```\n\n## \u8bb8\u53ef\u8bc1\n\nMIT License - \u8be6\u89c1 [LICENSE](../../LICENSE) \u6587\u4ef6\u3002\n\n## \u8d21\u732e\n\n\u6b22\u8fce\u8d21\u732e\u4ee3\u7801\uff01\u8bf7\u67e5\u770b [CONTRIBUTING.md](../../CONTRIBUTING.md) \u4e86\u89e3\u8be6\u7ec6\u6307\u5357\u3002\n\n## \u652f\u6301\n\n- \ud83d\udcd6 [\u6587\u6863](https://intellistream.github.io/SAGE-Pub/)\n- \ud83d\udc1b [\u95ee\u9898\u62a5\u544a](https://github.com/intellistream/SAGE/issues)\n- \ud83d\udcac [\u8ba8\u8bba](https://github.com/intellistream/SAGE/discussions)\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "SAGE Framework - \u547d\u4ee4\u884c\u5de5\u5177\u5305\uff0c\u63d0\u4f9b\u96c6\u7fa4\u7ba1\u7406\u3001\u4f5c\u4e1a\u90e8\u7f72\u548c\u914d\u7f6e\u7ba1\u7406\u529f\u80fd",
"version": "0.1.4",
"project_urls": {
"Documentation": "https://intellistream.github.io/SAGE-Pub/",
"Homepage": "https://github.com/intellistream/SAGE",
"Issues": "https://github.com/intellistream/SAGE/issues",
"Repository": "https://github.com/intellistream/SAGE.git"
},
"split_keywords": [
"cli",
" command-line",
" sage",
" cluster",
" management",
" deployment",
" job",
" ray",
" intellistream"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "f05b93211f9ae38ddaf03bad34ed3e5455ed594cbb8fa11a9571384c1f2faae2",
"md5": "07af2176b8ef86c79c045298e1fdc0e5",
"sha256": "77ca5b3e5bfe73b10f0621b43eed9ae554a050d7f448b988adb68879ec0d1610"
},
"downloads": -1,
"filename": "intellistream_sage_cli-0.1.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "07af2176b8ef86c79c045298e1fdc0e5",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 372177,
"upload_time": "2025-08-08T13:33:20",
"upload_time_iso_8601": "2025-08-08T13:33:20.307896Z",
"url": "https://files.pythonhosted.org/packages/f0/5b/93211f9ae38ddaf03bad34ed3e5455ed594cbb8fa11a9571384c1f2faae2/intellistream_sage_cli-0.1.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-08 13:33:20",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "intellistream",
"github_project": "SAGE",
"github_not_found": true,
"lcname": "intellistream-sage-cli"
}