1
0
Files
nex/frontend/src/hooks/useModels.ts
lanyuanxiaoyao feff97acbd feat: 前端适配后端新接口
适配后端统一模型 ID、协议字段、UUID 自动生成和结构化错误响应:

- 类型定义:Provider 新增 protocol 字段,Model 新增 unifiedId,CreateModelInput 移除 id
- API 客户端:提取结构化错误响应中的错误码
- 供应商管理:添加协议选择下拉框和表格列
- 模型管理:移除 ID 输入,显示统一模型 ID(只读)
- Hooks:错误码映射为友好中文消息
- 测试:所有组件测试通过,mock 数据适配新字段
- 文档:更新 README 说明协议字段和统一模型 ID
2026-04-21 20:49:37 +08:00

74 lines
2.2 KiB
TypeScript

import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { MessagePlugin } from 'tdesign-react';
import type { CreateModelInput, UpdateModelInput, ApiError } from '@/types';
import * as api from '@/api/models';
const ERROR_MESSAGES: Record<string, string> = {
duplicate_model: '同一供应商下模型名称已存在',
invalid_provider_id: '供应商 ID 仅允许字母、数字、下划线,长度 1-64',
immutable_field: '供应商 ID 不允许修改',
provider_not_found: '供应商不存在',
};
function getErrorMessage(error: ApiError): string {
return error.code ? ERROR_MESSAGES[error.code] || error.message : error.message;
}
export const modelKeys = {
all: ['models'] as const,
filtered: (providerId?: string) => ['models', providerId] as const,
};
export function useModels(providerId?: string) {
return useQuery({
queryKey: modelKeys.filtered(providerId),
queryFn: () => api.listModels(providerId),
});
}
export function useCreateModel() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (input: CreateModelInput) => api.createModel(input),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: modelKeys.all });
MessagePlugin.success('模型创建成功');
},
onError: (error: ApiError) => {
MessagePlugin.error(getErrorMessage(error));
},
});
}
export function useUpdateModel() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ id, input }: { id: string; input: UpdateModelInput }) =>
api.updateModel(id, input),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: modelKeys.all });
MessagePlugin.success('模型更新成功');
},
onError: (error: ApiError) => {
MessagePlugin.error(getErrorMessage(error));
},
});
}
export function useDeleteModel() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: string) => api.deleteModel(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: modelKeys.all });
MessagePlugin.success('模型删除成功');
},
onError: (error: Error) => {
MessagePlugin.error(error.message);
},
});
}