fix(desktop): DeerFlow UI — ChatArea refactor + ai-elements + dead CSS cleanup
ChatArea retry button uses setInput instead of direct sendToGateway, fix bootstrap spinner stuck for non-logged-in users, remove dead CSS (aurora-title/sidebar-open/quick-action-chips), add ai components (ReasoningBlock/StreamingText/ChatMode/ModelSelector/TaskProgress), add ClassroomPlayer + ResizableChatLayout + artifact panel Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -281,6 +281,39 @@ pub async fn delete_provider_key(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Key 使用窗口统计
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct KeyUsageStats {
|
||||
pub key_id: String,
|
||||
pub window_minute: String,
|
||||
pub request_count: i32,
|
||||
pub token_count: i64,
|
||||
}
|
||||
|
||||
/// 查询指定 Key 的最近使用窗口统计
|
||||
pub async fn get_key_usage_stats(
|
||||
db: &PgPool,
|
||||
key_id: &str,
|
||||
limit: i64,
|
||||
) -> SaasResult<Vec<KeyUsageStats>> {
|
||||
let limit = limit.min(60).max(1);
|
||||
let rows: Vec<(String, String, i32, i64)> = sqlx::query_as(
|
||||
"SELECT key_id, window_minute, request_count, token_count \
|
||||
FROM key_usage_window \
|
||||
WHERE key_id = $1 \
|
||||
ORDER BY window_minute DESC \
|
||||
LIMIT $2"
|
||||
)
|
||||
.bind(key_id)
|
||||
.bind(limit)
|
||||
.fetch_all(db)
|
||||
.await?;
|
||||
|
||||
Ok(rows.into_iter().map(|(key_id, window_minute, request_count, token_count)| {
|
||||
KeyUsageStats { key_id, window_minute, request_count, token_count }
|
||||
}).collect())
|
||||
}
|
||||
|
||||
/// 解析冷却剩余时间(秒)
|
||||
fn parse_cooldown_remaining(cooldown_until: &str, now: &str) -> i64 {
|
||||
let cooldown = chrono::DateTime::parse_from_rfc3339(cooldown_until);
|
||||
|
||||
Reference in New Issue
Block a user