Files
chongming-skills/chongming.agent.md
T
2026-07-23 17:57:38 +08:00

305 lines
11 KiB
Markdown
Raw 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.
---
name: chongming
description: >
用于 chongming-zenoh 项目的开发指导。当用户需要在此项目中添加新 Worker 插件、新增 RPC 端点、
修改配置驱动路由、开发前端页面、修改工具包、或进行构建部署时,使用此 skill 获取项目架构知识和开发规范。
keywords:
- chongming
- worker
- plugin
- rpc_method
- zenoh
- fastapi
- 路由
- 配置
- 端点
- 插件开发
- 前端
- Vue
---
# Chongming-Zenoh 项目开发指导
## 项目总览
Chongming-Zenoh 是一个基于 **FastAPI + Zenoh + Vue 3** 的**配置驱动微服务网关平台**。
核心理念:通过 TOML 配置文件定义 RPC 端点,自动生成 Pydantic 模型和 FastAPI 路由,
底层通过 Zenoh 分布式消息协议进行 RPC 通信。
### 项目五大部分
| 部分 | 路径 | 说明 |
| --------------------- | -------------------- | -------------------------------------------------------------------------------- |
| **chongming-core** | `src/chongming/` | 核心应用:FastAPI 工厂、Zenoh 集成、动态路由生成、Worker 管理 |
| **chongming-web** | `src/chongming-web/` | Vue 3 前端:Element Plus UI、Pinia 状态管理、自动生成的 API 客户端 |
| **chongming-utils** | `utils/` | 7 个子工具包:config, database, jwt(Rust), lock, password(Rust), request, worker |
| **chongming-plugins** | `src/plugins/` | Worker 插件:auth, doubao, example,每个插件独立封装业务逻辑 |
| **chongming-config** | `config/` | 配置文件:Zenoh 配置、Worker 路由 TOML 定义 |
## 核心架构与数据流
```
用户请求 → FastAPI 路由(自动生成)→ WorkerManager.call(subject, params)
→ Zenoh Query → Worker Queryable 回调 → 插件业务逻辑 → 响应
```
### 启动流程
```
serve() → FastAPI lifespan:
1. setup_nanio() — 本地 S3 子进程
2. setup_s3() — boto3 S3 客户端
3. setup_zenoh() — Zenoh peer 会话
4. setup_worker_manager() — WorkerManager + 定期刷新
5. load_workers() — 动态 import 插件
6. register_routes() — 扫描 config/workers/ 生成路由
```
### 关键组件
- **`WorkerManager`** (`src/chongming/app/core/worker_manager.py`): Zenoh liveliness 发现 + 本地注册,负载均衡、超时重试、diskcache 缓存
- **`RouteGenerator`** (`src/chongming/app/core/route_generator.py`): 扫描 `config/workers/<type>/*.toml`,自动生成 FastAPI 端点
- **`chongming-worker`** (`utils/worker/`): Worker 框架,提供 `@rpc_method` 装饰器、`create_worker()` 运行时
---
## 开发工作流
### 一、添加新的 Worker 插件
创建新插件时需要以下步骤:
#### 1. 创建插件目录结构
```
src/plugins/<新插件名>/
├── __init__.py # create_workers() 工厂 + cleanup()
├── global_var.py # 模块级全局变量
├── router/ # RPC 端点实现
│ ├── __init__.py # 从各文件导入,__all__ 导出
│ └── <操作名>.py # 每个操作一个文件
└── models/ # 数据模型
├── __init__.py # 模型导出
├── pydantic.py # 自动生成(由 gen_models.py)
└── <表名>.py # SQLModel ORM 模型(如需要)
```
#### 2. 添加 Worker 注册配置
在 `config/workers/config.toml` 的 `[[workers]]` 中添加:
```toml
[[workers]]
type = "<新插件名>"
module = "plugins.<新插件名>"
factory = "create_workers"
cleanup = "cleanup"
count = 3
```
#### 3. 创建端点 TOML 配置文件
`config/workers/<新插件名>/config.toml`:
```toml
[worker]
defaults.timeout = 30
defaults.cacheable = false
[worker.registration]
router_prefix = "/<prefix>"
```
`config/workers/<新插件名>/<operation>.toml`:
```toml
[GET] # 或 [POST]
cacheable = true
summary = "操作描述"
params = ["param1: str", "param2: int"] # 仅 GET
auth_required = false
[GET.response_model] # 或 [POST.response_model]
field_name = { type = "str", required = true }
another_field = { type = "int", default = 0 }
```
#### 4. 生成 Pydantic 模型
```bash
uv run python -m chongming.scripts.gen_models
```
这会根据 TOML 配置自动生成 `src/plugins/<新插件名>/models/pydantic.py`,包含请求和响应的 Pydantic 模型类。
#### 5. 编写 RPC 端点实现 (`router/<操作>.py`)
```python
# src/plugins/<name>/router/<operation>.py
from chongming_worker.decorators import rpc_method
from ..models.pydantic import SomeRequest, SomeResponse
@rpc_method(subject="<name>.<operation>", method="GET",
response_model=SomeResponse)
async def my_operation(request: SomeRequest) -> SomeResponse:
"""业务逻辑实现"""
# 使用 global_var 中的资源
result = await do_something(request)
return SomeResponse(result=result)
```
**注意**: 此处的 `SomeRequest` / `SomeResponse` 等 Pydantic 模型必须来自步骤 4 生成的 `models/pydantic.py`。编写端点代码前必须先完成模型生成。
#### 6. 编写 `router/__init__.py`
```python
# src/plugins/<name>/router/__init__.py
from . import operation1, operation2
__all__ = ["operation1", "operation2"]
```
#### 7. 编写 `__init__.py` 工厂函数
```python
# src/plugins/<name>/__init__.py
from chongming_worker.runtime import create_workers as _create_workers
def create_workers(session, config, count, worker_manager):
"""插件入口:初始化全局资源,创建 Worker 副本"""
from . import router # 触发 @rpc_method 注册
from .global_var import set_db, set_client # 设置全局变量
# 初始化数据库、客户端等...
_create_workers(session, config, count, worker_manager)
async def cleanup(worker_manager):
"""清理资源"""
# 关闭连接、清理缓存等...
```
### 二、为现有插件添加新 RPC 端点
1. 在 `config/workers/<插件名>/` 下创建 `<新操作>.toml`,定义端点参数和响应模型
2. 运行 `uv run python -m chongming.scripts.gen_models` 生成 Pydantic 模型
3. 在 `src/plugins/<插件名>/router/` 下创建 `<新操作>.py`,引用生成的模型编写业务逻辑
4. 更新 `src/plugins/<插件名>/router/__init__.py`,添加 import
5. 重启服务
### 三、修改配置驱动路由
- **修改路由前缀**: 编辑 `config/workers/<插件名>/config.toml` 的 `router_prefix`
- **添加/修改端点参数**: 编辑 `<操作>.toml`,然后重新生成模型
- **调整 Worker 副本数**: 编辑 `config/workers/config.toml` 的 `count`
### 四、前端开发 (`chongming-web`)
位于 `src/chongming-web/`:
- **UI 框架**: Element Plus
- **状态管理**: Pinia
- **路由**: Vue Router (Hash History)
- **API 调用**: `src/api/generated/` 中由 `@hey-api/openapi-ts` 自动生成的类型安全客户端
添加新页面流程:
1. 在 `src/views/` 创建 Vue 组件
2. 在 `src/router/index.ts` 添加路由
3. 在 `src/App.vue` 导航菜单添加入口
4. 如需要,在 `src/api/generated/sdk.gen.ts` 添加或重新生成 API 调用函数
### 五、工具包开发 (`chongming-utils`)
每个 `utils/<name>/` 下的子包是独立的 Python 包,有各自的 `pyproject.toml`:
- **config**: 加载 `config.toml`,TypedDict 配置结构
- **database**: 异步 SQLite (aiosqlite + SQLModel)
- **jwt**: Rust 实现的 JWT 编码/验证 (maturin + jsonwebtoken)
- **lock**: 基于 diskcache 的跨进程分布式锁
- **password**: Rust 实现的 Argon2id 密码哈希
- **request**: Zenoh 客户端封装
- **worker**: Worker 框架核心(`@rpc_method` 装饰器、`create_worker` 运行时)
修改工具包后需要重新安装:
```bash
uv pip install -e utils/<name>
```
## 核心约定与规范
### 命名约定
- **插件名**: 小写下划线,如 `doubao`, `auth`, `example`
- **操作名**: 小写下划线,如 `analyze`, `add`, `count`
- **Zenoh subject**: `<插件名>.<操作名>`,如 `example.add`, `doubao.analyze`
- **TOML 文件名**: 与操作名一致,如 `analyze.toml`, `add.toml`
- **Python 文件名**: 与操作名一致,如 `analyze.py`, `add.py`
### 装饰器使用
```python
@rpc_method(
subject="plugin.operation", # Zenoh 主题 (必需)
method="GET", # HTTP 方法: GET 或 POST
response_model=ResponseCls, # Pydantic 响应模型
)
async def handler(request: RequestCls) -> ResponseCls:
...
```
- GET 端点:参数通过 URL query string 传递,在 TOML 中用 `params` 定义
- POST 端点:参数通过 JSON body 传递,自动绑定到 Pydantic 请求模型
### 全局变量模式
每个插件通过 `global_var.py` 管理模块级共享资源:
```python
# global_var.py
db: Database = None
def set_db(database: Database):
global db
db = database
```
### TOML 配置字段说明
| 字段 | 位置 | 说明 |
| -------------------- | --------------------- | ---------------------------------- |
| `count` | `workers/config.toml` | Worker 副本数 |
| `router_prefix` | `<插件>/config.toml` | API 路由前缀 |
| `defaults.timeout` | `<插件>/config.toml` | 默认超时 (秒) |
| `defaults.cacheable` | `<插件>/config.toml` | 是否缓存 RPC 结果 |
| `params` | `<操作>.toml` `[GET]` | GET 参数列表 (`"name: type"` 格式) |
| `auth_required` | `<操作>.toml` | 是否需要 JWT 鉴权 |
| `cacheable` | `<操作>.toml` | 端点是否可缓存 |
| `summary` | `<操作>.toml` | 端点描述 (用于 OpenAPI docs) |
## 常用命令
```bash
# 开发启动
uv run serve
# 生成 Pydantic 模型
uv run python -m chongming.scripts.gen_models
# 构建
uv run python -m chongming.scripts.build
# 安装/更新工具包子包
uv pip install -e utils/<name>
# 前端开发
cd src/chongming-web && npm run dev
```
## 注意事项
1. **修改 TOML 配置后必须重新生成模型**: `uv run python -m chongming.scripts.gen_models`
2. **新增插件后需要在 `config/workers/config.toml` 注册**: 否则插件不会被加载
3. **Rust 工具包 (jwt, password) 需要 maturin**: 通过 `uv run maturin develop --release -m utils/<name>/Cargo.toml` 编译
4. **插件间隔离**: 每个插件有独立的全局变量,不要跨插件直接引用
5. **数据库路径约定**: SQLite 数据库文件放在 `data/storage/chongming/` 下
6. **日志**: 使用标准 `logging.getLogger(__name__)`,核心已配置 ANSI 颜色格式化器