modify: aibox_sophon_adapter plugins

This commit is contained in:
2026-07-27 14:28:07 +08:00
parent 2b7b8ee08c
commit 79eb7fe5cc
23 changed files with 1380 additions and 61 deletions
+58 -9
View File
@@ -1,22 +1,71 @@
# Example Worker 插件
演示 `@rpc_method` 与显式模型绑定的用法。
演示 `@rpc_method` 装饰器与显式模型绑定的完整用法,是学习开发新插件的**入门参考**。
---
## 实现的功能
- 加、减、乘、除四则运算(GET / POST)
- 基于 `modelvault` 的访问计数器
### 四则运算(GET / POST)
## 如何工作
| 端点 | 方法 | 路径 | 说明 |
| ---- | ---------- | ---------------- | ------------------------ |
| 加法 | GET / POST | `/calc/add` | `a + b` |
| 减法 | GET | `/calc/subtract` | `a - b` |
| 乘法 | GET | `/calc/multiply` | `a * b` |
| 除法 | GET | `/calc/divide` | `a / b`(除数为 0 报错) |
1. 配置位于 `config/workers/example/*.toml`
2. 模型由 `gen_models` 生成,位于 `models/pydantic.py`
3. 路由实现在 `router/` 下,使用 `@rpc_method` 装饰
4. 工厂函数 `create_workers` 初始化数据库并启动 Worker
### 访问计数器
| 端点 | 方法 | 路径 | 说明 |
| ---- | ---- | ------------- | ----------------- |
| 计数 | GET | `/calc/count` | 每次调用计数器 +1 |
基于内存缓存实现,用于演示 GET 端点的无参数调用模式。
---
## 调用示例
```bash
# GET 加法
curl "http://localhost:8000/api/v1/calc/add?a=3&b=4"
# {"result":7,"operation":"add","timestamp":...}
# {"result":7.0,"operation":"add","timestamp":1720000000.123}
# POST 加法
curl -X POST "http://localhost:8000/api/v1/calc/add" \
-H "Content-Type: application/json" \
-d '{"a": 3.5, "b": 2.5}'
# {"result":6.0,"operation":"add","timestamp":1720000000.456}
# 除法(除数为零)
curl "http://localhost:8000/api/v1/calc/divide?a=10&b=0"
# {"result":0.0,"operation":"divide","error":"Division by zero"}
# 计数器
curl "http://localhost:8000/api/v1/calc/count"
# {"count":1}
```
---
## 如何工作
1. **配置**:`config/workers/example/*.toml` — 定义每个端点的参数和响应结构
2. **模型**:`models/pydantic.py` — 由 `gen_models` 根据 TOML 自动生成
3. **路由**:`router/` 下每个文件实现一个 RPC 端点,使用 `@rpc_method` 装饰器
4. **工厂**:`__init__.py` 中的 `create_workers` 初始化数据库并启动 Worker
---
## 开发参考
此插件展示了以下模式:
- GET 端点的 `params` 定义与 `@rpc_method` 参数绑定
- POST 端点的 JSON body 自动解析
- `response_model` 在 TOML 中定义并在装饰器中引用
- 全局变量 (`global_var.py`) 管理共享资源
- 错误处理(如除法除零返回错误信息)
- `auth_required` 控制端点是否需要 JWT 鉴权
- `cacheable` 控制结果是否缓存
+4 -3
View File
@@ -5,31 +5,32 @@
from .pydantic import AddGetRequest
from .pydantic import AddGetResponse
from .pydantic import AddMqttRequest
from .pydantic import AddPostRequest
from .pydantic import AddPostResponse
from .pydantic import CountGetResponse
from .pydantic import DivideGetRequest
from .pydantic import DivideGetResponse
from .pydantic import ExampleResponse
from .pydantic import HeartbeatMqttRequest
from .pydantic import MultiplyGetRequest
from .pydantic import MultiplyGetResponse
from .pydantic import SubtractGetRequest
from .pydantic import SubtractGetResponse
from .counter import Counter
__all__ = [
"AddGetRequest",
"AddGetResponse",
"AddMqttRequest",
"AddPostRequest",
"AddPostResponse",
"CountGetResponse",
"DivideGetRequest",
"DivideGetResponse",
"ExampleResponse",
"HeartbeatMqttRequest",
"MultiplyGetRequest",
"MultiplyGetResponse",
"SubtractGetRequest",
"SubtractGetResponse",
"Counter"
]
+10 -1
View File
@@ -30,6 +30,11 @@ class AddPostResponse(BaseModel):
operation: str = Field(default='add')
timestamp: Optional[float] = Field(default=0.0)
class AddMqttRequest(BaseModel):
"""Add two numbers via MQTT — 请求体"""
a: float = Field(...)
b: float = Field(...)
class CountGetResponse(BaseModel):
"""Get visit count and increment — 响应体"""
name: str = Field(...)
@@ -47,6 +52,10 @@ class DivideGetResponse(BaseModel):
timestamp: Optional[float] = Field(default=0.0)
error: Optional[str] = Field(default='')
class HeartbeatMqttRequest(BaseModel):
"""Heartbeat ping (no response) — 请求体"""
worker_id: str = Field(...)
class MultiplyGetRequest(BaseModel):
"""Multiply two numbers — 请求体"""
a: float = Field(...)
@@ -71,4 +80,4 @@ class SubtractGetResponse(BaseModel):
# 所有响应模型的联合类型
ExampleResponse = SubtractGetResponse | CountGetResponse | MultiplyGetResponse | AddPostResponse | AddGetResponse | DivideGetResponse
ExampleResponse = AddPostResponse | AddGetResponse | DivideGetResponse | SubtractGetResponse | CountGetResponse | MultiplyGetResponse
+4
View File
@@ -1,4 +1,6 @@
from .add import add, add_post
from .add_mqtt import add_mqtt
from .heartbeat import heartbeat
from .subtract import subtract
from .multiply import multiply
from .divide import divide
@@ -8,6 +10,8 @@ from .count import count_get
__all__ = [
"add",
"add_post",
"add_mqtt",
"heartbeat",
"subtract",
"multiply",
"divide",
+24
View File
@@ -0,0 +1,24 @@
"""
MQTT 端点处理器 — 通过 MQTT 主题 chongming/example/add 调用
与 GET/POST 的 add 共用同一个 subject (example.add),
通过 _method="MQTT" 区分。
"""
import time
from chongming_worker import rpc_method
from ..models.pydantic import AddMqttRequest
@rpc_method(
subject="example.add",
method="MQTT",
summary="Add two numbers via MQTT",
)
async def add_mqtt(request: AddMqttRequest) -> dict:
"""MQTT 加法 — 通过 MQTT 主题 chongming/example/add 调用,返回 dict"""
return {
"result": request.a + request.b,
"operation": "add_mqtt",
"timestamp": time.time(),
}
+20
View File
@@ -0,0 +1,20 @@
"""
心跳 MQTT 端点 — 仅上报,无需响应
通过 MQTT 主题 chongming/example/heartbeat 发送心跳,
Worker 返回 None,MQTT Bridge 不发布响应。
"""
import time
from chongming_worker import rpc_method
@rpc_method(
subject="example.heartbeat",
method="MQTT",
summary="Heartbeat ping via MQTT (no response)",
)
async def heartbeat(worker_id: str = "") -> None:
"""心跳上报 — 无返回值,MQTT Bridge 跳过响应发布"""
print(f"[Heartbeat] worker={worker_id} time={time.time()}")
return None # 显式返回 None,MQTT Bridge 不发布响应