完成请求推送,但组装mes还有问题

This commit is contained in:
2026-05-04 00:33:29 +08:00
parent 7fc9e10c99
commit 2050a30a52
93 changed files with 9499 additions and 2719 deletions

View File

@@ -0,0 +1,122 @@
/**
* Token 使用统计 Store
*/
import { create } from 'zustand';
const useTokenUsageStore = create((set, get) => ({
// 状态
months: [],
currentMonth: null,
stats: null,
roles: [],
chats: [],
selectedRole: null,
selectedChat: null,
loading: false,
error: null,
// Actions
fetchMonths: async () => {
try {
set({ loading: true, error: null });
const response = await fetch('/api/token-usage/months');
if (!response.ok) throw new Error('Failed to fetch months');
const months = await response.json();
set({ months, loading: false });
// 默认选择最新的月份
if (months.length > 0) {
const latest = months[months.length - 1];
await get().fetchStats(latest.year, latest.month);
}
} catch (error) {
set({ error: error.message, loading: false });
}
},
fetchStats: async (year, month, role = null, chat = null) => {
try {
set({ loading: true, error: null, currentMonth: { year, month } });
let url = `/api/token-usage/stats/${year}/${month}`;
const params = new URLSearchParams();
if (role) params.append('role_name', role);
if (chat) params.append('chat_name', chat);
if (params.toString()) {
url += `?${params.toString()}`;
}
const response = await fetch(url);
if (!response.ok) throw new Error('Failed to fetch stats');
const stats = await response.json();
set({ stats, loading: false });
} catch (error) {
set({ error: error.message, loading: false });
}
},
fetchRoles: async (year, month) => {
try {
const response = await fetch(`/api/token-usage/roles/${year}/${month}`);
if (!response.ok) throw new Error('Failed to fetch roles');
const data = await response.json();
set({ roles: data.roles });
} catch (error) {
console.error('Failed to fetch roles:', error);
}
},
fetchChats: async (year, month, role = null) => {
try {
let url = `/api/token-usage/chats/${year}/${month}`;
if (role) {
url += `?role_name=${encodeURIComponent(role)}`;
}
const response = await fetch(url);
if (!response.ok) throw new Error('Failed to fetch chats');
const data = await response.json();
set({ chats: data.chats });
} catch (error) {
console.error('Failed to fetch chats:', error);
}
},
setSelectedRole: (role) => {
set({ selectedRole: role });
const { currentMonth } = get();
if (currentMonth) {
get().fetchStats(currentMonth.year, currentMonth.month, role, get().selectedChat);
}
},
setSelectedChat: (chat) => {
set({ selectedChat: chat });
const { currentMonth } = get();
if (currentMonth) {
get().fetchStats(currentMonth.year, currentMonth.month, get().selectedRole, chat);
}
},
setCurrentMonth: (year, month) => {
set({ currentMonth: { year, month } });
get().fetchStats(year, month, get().selectedRole, get().selectedChat);
get().fetchRoles(year, month);
get().fetchChats(year, month, get().selectedRole);
},
resetFilters: () => {
set({ selectedRole: null, selectedChat: null });
const { currentMonth } = get();
if (currentMonth) {
get().fetchStats(currentMonth.year, currentMonth.month);
}
},
}));
export default useTokenUsageStore;