mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-03 01:40:21 +08:00
后端: - 扩展 pool_admin payloads 和 provider query models,增强 endpoint key 管理 - 完善 scheduler-core 候选排序与请求候选逻辑 - 增强 usage-runtime 写入、provider-transport 网络层与 OAuth 刷新 - 改进 AI pipeline 响应转换与流式处理 - 扩展 global_models/provider_catalog 数据层查询能力 - 增强 video-tasks-core 多 provider 支持 - 新增大量集成测试覆盖 pool/keys/provider_query/frontdoor 前端: - 重构 PoolManagement 页面,拆分状态管理/对话框逻辑到独立模块 - 新增 poolAdvancedDialog/poolSchedulingDialog/poolManagementState/poolMobilePresentation 工具函数及测试 - 改进 Dialog 组件与 provider tabs 显示 部署: - 更新 Rust CI workflow 和 Dockerfile 构建配置 Closes #275 Co-authored-by: AAEE86 <ppk0227@hotmail.com>
144 lines
4.6 KiB
Rust
144 lines
4.6 KiB
Rust
use serde_json::{Map, Value};
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
pub struct VideoFollowUpReportContextInput<'a> {
|
|
pub request_id: &'a str,
|
|
pub user_id: &'a str,
|
|
pub api_key_id: &'a str,
|
|
pub task_id: &'a str,
|
|
pub provider_id: &'a str,
|
|
pub endpoint_id: &'a str,
|
|
pub key_id: &'a str,
|
|
pub provider_name: Option<&'a str>,
|
|
pub model_name: Option<&'a str>,
|
|
pub client_api_format: &'a str,
|
|
pub provider_api_format: &'a str,
|
|
}
|
|
|
|
pub fn build_video_follow_up_report_context(input: VideoFollowUpReportContextInput<'_>) -> Value {
|
|
let VideoFollowUpReportContextInput {
|
|
request_id,
|
|
user_id,
|
|
api_key_id,
|
|
task_id,
|
|
provider_id,
|
|
endpoint_id,
|
|
key_id,
|
|
provider_name,
|
|
model_name,
|
|
client_api_format,
|
|
provider_api_format,
|
|
} = input;
|
|
|
|
let mut context = Map::new();
|
|
context.insert(
|
|
"request_id".to_string(),
|
|
Value::String(request_id.to_string()),
|
|
);
|
|
context.insert("user_id".to_string(), Value::String(user_id.to_string()));
|
|
context.insert(
|
|
"api_key_id".to_string(),
|
|
Value::String(api_key_id.to_string()),
|
|
);
|
|
context.insert("task_id".to_string(), Value::String(task_id.to_string()));
|
|
context.insert(
|
|
"provider_id".to_string(),
|
|
Value::String(provider_id.to_string()),
|
|
);
|
|
context.insert(
|
|
"endpoint_id".to_string(),
|
|
Value::String(endpoint_id.to_string()),
|
|
);
|
|
context.insert("key_id".to_string(), Value::String(key_id.to_string()));
|
|
context.insert(
|
|
"client_api_format".to_string(),
|
|
Value::String(client_api_format.to_string()),
|
|
);
|
|
context.insert(
|
|
"provider_api_format".to_string(),
|
|
Value::String(provider_api_format.to_string()),
|
|
);
|
|
if let Some(provider_name) = provider_name.filter(|value| !value.is_empty()) {
|
|
context.insert(
|
|
"provider_name".to_string(),
|
|
Value::String(provider_name.to_string()),
|
|
);
|
|
}
|
|
if let Some(model_name) = model_name.filter(|value| !value.is_empty()) {
|
|
context.insert("model".to_string(), Value::String(model_name.to_string()));
|
|
}
|
|
Value::Object(context)
|
|
}
|
|
|
|
pub fn resolve_follow_up_auth(
|
|
user_id: Option<&str>,
|
|
api_key_id: Option<&str>,
|
|
fallback_user_id: Option<&str>,
|
|
fallback_api_key_id: Option<&str>,
|
|
) -> Option<(String, String)> {
|
|
let resolved_user_id = user_id
|
|
.map(str::trim)
|
|
.filter(|value| !value.is_empty())
|
|
.map(str::to_string)
|
|
.or_else(|| {
|
|
fallback_user_id
|
|
.map(str::trim)
|
|
.filter(|value| !value.is_empty())
|
|
.map(str::to_string)
|
|
})?;
|
|
let resolved_api_key_id = api_key_id
|
|
.map(str::trim)
|
|
.filter(|value| !value.is_empty())
|
|
.map(str::to_string)
|
|
.or_else(|| {
|
|
fallback_api_key_id
|
|
.map(str::trim)
|
|
.filter(|value| !value.is_empty())
|
|
.map(str::to_string)
|
|
})?;
|
|
Some((resolved_user_id, resolved_api_key_id))
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::{
|
|
build_video_follow_up_report_context, resolve_follow_up_auth,
|
|
VideoFollowUpReportContextInput,
|
|
};
|
|
|
|
#[test]
|
|
fn builds_follow_up_report_context_with_transport_metadata() {
|
|
let context = build_video_follow_up_report_context(VideoFollowUpReportContextInput {
|
|
request_id: "req_123",
|
|
user_id: "user_123",
|
|
api_key_id: "key_123",
|
|
task_id: "task_123",
|
|
provider_id: "provider_123",
|
|
endpoint_id: "endpoint_123",
|
|
key_id: "transport_key_123",
|
|
provider_name: Some("provider-name"),
|
|
model_name: Some("model-name"),
|
|
client_api_format: "openai:video",
|
|
provider_api_format: "openai:video",
|
|
});
|
|
|
|
assert_eq!(context["request_id"].as_str(), Some("req_123"));
|
|
assert_eq!(context["provider_id"].as_str(), Some("provider_123"));
|
|
assert_eq!(context["provider_name"].as_str(), Some("provider-name"));
|
|
assert_eq!(context["model"].as_str(), Some("model-name"));
|
|
}
|
|
|
|
#[test]
|
|
fn resolves_follow_up_auth_from_primary_or_fallback_values() {
|
|
assert_eq!(
|
|
resolve_follow_up_auth(Some(" user_123 "), Some(" key_123 "), None, None),
|
|
Some(("user_123".to_string(), "key_123".to_string()))
|
|
);
|
|
assert_eq!(
|
|
resolve_follow_up_auth(None, None, Some("user_fallback"), Some("key_fallback")),
|
|
Some(("user_fallback".to_string(), "key_fallback".to_string()))
|
|
);
|
|
assert_eq!(resolve_follow_up_auth(None, None, None, None), None);
|
|
}
|
|
}
|