@@ -89,19 +153,37 @@ const FilterBar: React.FC
= (props) => {
value={query.user_ids}
onChange={handleUsersChange}
>
-
+ options={modelList}
+ value={selectedModels}
+ showCheckedStrategy="SHOW_CHILD"
+ displayRender={displayRender}
+ optionNode={optionRender}
+ getPopupContainer={(triggerNode) => triggerNode.parentNode}
+ >
{url === DASHBOARD_STATS_API && (
} onClick={handleExport}>
diff --git a/src/pages/dashboard/components/usage-inner/index.tsx b/src/pages/dashboard/components/usage-inner/index.tsx
index 2bf9b913..11a7862f 100644
--- a/src/pages/dashboard/components/usage-inner/index.tsx
+++ b/src/pages/dashboard/components/usage-inner/index.tsx
@@ -16,6 +16,7 @@ import useUsageData from './use-usage-data';
const TitleWrapper = styled.div`
margin: 0;
font-weight: 700;
+ min-width: max-content;
`;
const UsageInner: FC<{ maxWidth: number }> = ({ maxWidth }) => {
@@ -27,6 +28,7 @@ const UsageInner: FC<{ maxWidth: number }> = ({ maxWidth }) => {
query,
userList,
modelList,
+ selectedModels,
handleOnCancel,
init,
handleExport,
@@ -109,6 +111,7 @@ const UsageInner: FC<{ maxWidth: number }> = ({ maxWidth }) => {
query={query}
userList={userList}
modelList={modelList}
+ selectedModels={selectedModels}
disabledDate={true}
handleDateChange={handleDateChange}
handleUsersChange={handleUsersChange}
diff --git a/src/pages/dashboard/components/usage-inner/use-usage-data.tsx b/src/pages/dashboard/components/usage-inner/use-usage-data.tsx
index e3f0824f..a6d24f43 100644
--- a/src/pages/dashboard/components/usage-inner/use-usage-data.tsx
+++ b/src/pages/dashboard/components/usage-inner/use-usage-data.tsx
@@ -1,5 +1,6 @@
import { queryModelsList } from '@/pages/llmodels/apis';
import { ListItem as ModelListItem } from '@/pages/llmodels/config/types';
+import useTargetSourceModels from '@/pages/model-routes/hooks/use-target-source-models';
import { queryUsersList } from '@/pages/users/apis';
import dayjs from 'dayjs';
import _ from 'lodash';
@@ -93,6 +94,7 @@ export default function useUseageData(config: {
start_date: string;
end_date: string;
model_ids: number[];
+ provider_model_names: string[];
user_ids: number[];
}>({
start_date: dayjs()
@@ -100,12 +102,15 @@ export default function useUseageData(config: {
.format('YYYY-MM-DD'),
end_date: dayjs().format('YYYY-MM-DD'),
model_ids: [],
- user_ids: []
+ user_ids: [],
+ provider_model_names: []
});
-
- const [modelList, setModelList] = useState[]>([]);
+ const { sourceModels: modelList, fetchSourceModels } =
+ useTargetSourceModels();
+ const [models, setModelList] = useState[]>([]);
const [userList, setUserList] = useState[]>([]);
const [loading, setLoading] = useState(false);
+ const [selectedModels, setSelectedModels] = useState([]);
const usageData = useMemo<{
requestTokenData: RequestTokenData;
@@ -301,19 +306,36 @@ export default function useUseageData(config: {
});
fetchUsageData({ ...query, user_ids: value });
};
- const handleModelsChange = (value: number[]) => {
+
+ const generateModelsValue = (value: string[][]) => {
+ const modelIds = [] as number[];
+ const providerModelNames = [] as string[];
+ value.forEach((item: Array) => {
+ if (item[0] === 'deployments') {
+ modelIds.push(item[1] as number);
+ } else {
+ providerModelNames.push(`${item[0]}:${item[1]}`);
+ }
+ });
+ return {
+ model_ids: modelIds,
+ provider_model_names: providerModelNames
+ };
+ };
+ const handleModelsChange = (value: string[][]) => {
+ setSelectedModels(value);
setQuery((pre) => {
return {
...pre,
- model_ids: value
+ ...generateModelsValue(value)
};
});
- fetchUsageData({ ...query, model_ids: value });
+ fetchUsageData({ ...query, ...generateModelsValue(value) });
};
const init = () => {
fetchUsageData(query);
- fetchModelsList();
+ fetchSourceModels();
fetchUsersList();
};
@@ -325,6 +347,7 @@ export default function useUseageData(config: {
userList,
modelList,
query,
+ selectedModels,
setQuery,
init,
setResult,
diff --git a/src/pages/model-routes/components/route-targets.tsx b/src/pages/model-routes/components/route-targets.tsx
index 8944fa5c..90ca8ca5 100644
--- a/src/pages/model-routes/components/route-targets.tsx
+++ b/src/pages/model-routes/components/route-targets.tsx
@@ -90,26 +90,24 @@ const RouteItem: React.FC = ({
- {data.weight > 0 && (
+ {data.fallback_status_codes &&
+ data.fallback_status_codes?.length > 0 ? (
+ <>
+ {data.weight > 0 && (
+ /
+ )}
+
+ {intl.formatMessage({
+ id: 'routes.table.label.fallback'
+ })}
+
+ >
+ ) : (
{intl.formatMessage({ id: 'routes.form.target.weight' })}:{' '}
- {data.weight}
+ {data.weight || 0}
)}
-
- {data.fallback_status_codes &&
- data.fallback_status_codes?.length > 0 && (
- <>
- {data.weight > 0 && (
- /
- )}
-
- {intl.formatMessage({
- id: 'routes.table.label.fallback'
- })}
-
- >
- )}
diff --git a/src/pages/model-routes/forms/targets.tsx b/src/pages/model-routes/forms/targets.tsx
index ab430233..0aef7e6c 100644
--- a/src/pages/model-routes/forms/targets.tsx
+++ b/src/pages/model-routes/forms/targets.tsx
@@ -257,13 +257,6 @@ const TargetsForm = forwardRef((props, ref) => {
{
validator(rule, value) {
if (value && value?.length > 0) {
- // if (_.some(value, (item: any) => !item.weight)) {
- // setValidTriggered(true);
- // return Promise.reject(
- // getRuleMessage('input', 'routes.form.target.weight')
- // );
- // }
-
if (
_.some(
dataList,