完成请求推送,但组装mes还有问题
This commit is contained in:
122
frontend/src/Store/SideBarLeft/TokenUsageSlice.jsx
Normal file
122
frontend/src/Store/SideBarLeft/TokenUsageSlice.jsx
Normal 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;
|
||||
Reference in New Issue
Block a user