mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-03 01:40:21 +08:00
- 新增 aether-ai-pipeline 和 aether-data-contracts crate,将 pipeline 逻辑与数据契约从 gateway 中解耦 - 重构 admin handlers:拆分单体模块为 auth/billing/endpoint/features/model/observability/provider/system 等独立子模块 - 合并 chat/cli 重复代码路径:精简 conversion、finalize、planner 中的 sync/chat/cli 分支 - 重构 scheduler/executor/data 层,引入 facade 模式降低模块间耦合 - 移除冗余的 intent 模块,将 plan_fallback/policy/stream_path/sync_path 迁移至 executor - 前端适配:调整 admin API 调用和 provider 模型测试对话框
45 lines
1.4 KiB
Rust
45 lines
1.4 KiB
Rust
use std::collections::BTreeSet;
|
|
|
|
pub(crate) fn normalize_string_list(values: Option<Vec<String>>) -> Option<Vec<String>> {
|
|
let mut out = Vec::new();
|
|
let mut seen = BTreeSet::new();
|
|
for value in values.into_iter().flatten() {
|
|
let trimmed = value.trim();
|
|
if trimmed.is_empty() || !seen.insert(trimmed.to_string()) {
|
|
continue;
|
|
}
|
|
out.push(trimmed.to_string());
|
|
}
|
|
(!out.is_empty()).then_some(out)
|
|
}
|
|
|
|
pub(crate) fn normalize_json_object(
|
|
value: Option<serde_json::Value>,
|
|
field_name: &str,
|
|
) -> Result<Option<serde_json::Value>, String> {
|
|
let Some(value) = value else {
|
|
return Ok(None);
|
|
};
|
|
match value {
|
|
serde_json::Value::Null => Ok(None),
|
|
serde_json::Value::Object(map) if map.is_empty() => Ok(None),
|
|
serde_json::Value::Object(map) => Ok(Some(serde_json::Value::Object(map))),
|
|
_ => Err(format!("{field_name} 必须是 JSON 对象")),
|
|
}
|
|
}
|
|
|
|
pub(crate) fn normalize_json_array(
|
|
value: Option<serde_json::Value>,
|
|
field_name: &str,
|
|
) -> Result<Option<serde_json::Value>, String> {
|
|
let Some(value) = value else {
|
|
return Ok(None);
|
|
};
|
|
match value {
|
|
serde_json::Value::Null => Ok(None),
|
|
serde_json::Value::Array(items) if items.is_empty() => Ok(None),
|
|
serde_json::Value::Array(items) => Ok(Some(serde_json::Value::Array(items))),
|
|
_ => Err(format!("{field_name} 必须是 JSON 数组")),
|
|
}
|
|
}
|