feat: 添加请求体规则功能和 UI 优化

- 添加 body_rules 支持(set/drop/rename 操作)
- 后端 apply_body_rules 函数处理请求体修改
- 保护 model/stream 字段不被修改
- 前端 UI 重构:合并请求头/请求体规则为统一区域
- 使用左边框颜色区分规则类型(H=主题色,B=灰色)

Closes #139

Co-authored-by: CC <81609553+hemo94931@users.noreply.github.com>
This commit is contained in:
fawney19
2026-02-03 18:49:17 +08:00
parent 00442c41fa
commit ddf3f5c107
8 changed files with 660 additions and 202 deletions

View File

@@ -739,6 +739,7 @@ class ProviderEndpoint(Base):
# 请求配置
header_rules = Column(JSON, nullable=True) # 请求头规则 [{action, key, value, from, to}]
body_rules = Column(JSON, nullable=True) # 请求体规则 [{action, path, value, from, to}]
max_retries = Column(Integer, default=2) # 最大重试次数
# 状态

View File

@@ -21,6 +21,15 @@ from src.models.admin_requests import ProxyConfig
HeaderRule = dict[str, Any]
# ========== Body Rule 类型定义 ==========
# 请求体规则支持三种操作:
# - set: 设置/覆盖字段 {"action": "set", "path": "metadata", "value": {"custom": "val"}}
# - drop: 删除字段 {"action": "drop", "path": "unwanted_field"}
# - rename: 重命名字段 {"action": "rename", "from": "old_key", "to": "new_key"}
# 实际验证在 request_builder.py 的 apply_body_rules 中处理
BodyRule = dict[str, Any]
# ========== ProviderEndpoint CRUD ==========
@@ -43,6 +52,12 @@ class ProviderEndpointCreate(BaseModel):
description="请求头规则列表,支持 set/drop/rename 操作",
)
# 请求体配置
body_rules: list[BodyRule] | None = Field(
default=None,
description="请求体规则列表,支持 set/drop/rename 操作",
)
max_retries: int = Field(default=2, ge=0, le=10, description="最大重试次数")
# 额外配置
@@ -93,6 +108,12 @@ class ProviderEndpointUpdate(BaseModel):
description="请求头规则列表,支持 set/drop/rename 操作",
)
# 请求体配置
body_rules: list[BodyRule] | None = Field(
default=None,
description="请求体规则列表,支持 set/drop/rename 操作",
)
max_retries: int | None = Field(default=None, ge=0, le=10, description="最大重试次数")
is_active: bool | None = Field(default=None, description="是否启用")
config: dict[str, Any] | None = Field(default=None, description="额外配置")
@@ -132,6 +153,11 @@ class ProviderEndpointResponse(BaseModel):
# 请求头配置
header_rules: list[HeaderRule] | None = Field(default=None, description="请求头规则列表")
# 请求体配置
body_rules: list[BodyRule] | None = Field(
default=None, description="请求体规则列表"
)
max_retries: int
# 状态