标签管理: - 新增 tags/tag_assignments 持久化层、迁移、/api/tags 路由 - 标签分智能体/技能/定时任务三类, 仅同类型可互打, 仅 admin 可增删改与打标签 - 三类资源列表支持按名称模糊检索与按标签筛选(走后端查询参数) - 前端新增标签管理页、TagPickerDialog(点击即时绑定)、彩色标签 chip 问答前缀: - 前缀不再拼入消息 content, 改存 additional_kwargs 由 PromptPrefixMiddleware 在调模型前临时注入, 用户界面看不到前缀但模型仍收到 - 修正 thread_existed 闸门导致首轮前缀被跳过的问题 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
73 lines
1.9 KiB
TypeScript
73 lines
1.9 KiB
TypeScript
import {
|
|
keepPreviousData,
|
|
useMutation,
|
|
useQuery,
|
|
useQueryClient,
|
|
} from "@tanstack/react-query";
|
|
|
|
import {
|
|
createAgent,
|
|
deleteAgent,
|
|
getAgent,
|
|
listAgents,
|
|
updateAgent,
|
|
} from "./api";
|
|
import type { CreateAgentRequest, UpdateAgentRequest } from "./types";
|
|
|
|
export function useAgents(params: { search?: string; tagId?: string | null } = {}) {
|
|
const search = params.search ?? "";
|
|
const tagId = params.tagId ?? null;
|
|
const { data, isLoading, error } = useQuery({
|
|
queryKey: ["agents", search, tagId],
|
|
queryFn: () => listAgents({ search, tagId }),
|
|
placeholderData: keepPreviousData,
|
|
});
|
|
return { agents: data ?? [], isLoading, error };
|
|
}
|
|
|
|
export function useAgent(id: string | null | undefined) {
|
|
const { data, isLoading, error } = useQuery({
|
|
queryKey: ["agents", id],
|
|
queryFn: () => getAgent(id!),
|
|
enabled: !!id,
|
|
});
|
|
return { agent: data ?? null, isLoading, error };
|
|
}
|
|
|
|
export function useCreateAgent() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (request: CreateAgentRequest) => createAgent(request),
|
|
onSuccess: () => {
|
|
void queryClient.invalidateQueries({ queryKey: ["agents"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useUpdateAgent() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({
|
|
id,
|
|
request,
|
|
}: {
|
|
id: string;
|
|
request: UpdateAgentRequest;
|
|
}) => updateAgent(id, request),
|
|
onSuccess: (_data, { id }) => {
|
|
void queryClient.invalidateQueries({ queryKey: ["agents"] });
|
|
void queryClient.invalidateQueries({ queryKey: ["agents", id] });
|
|
},
|
|
});
|
|
}
|
|
|
|
export function useDeleteAgent() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: (id: string) => deleteAgent(id),
|
|
onSuccess: () => {
|
|
void queryClient.invalidateQueries({ queryKey: ["agents"] });
|
|
},
|
|
});
|
|
}
|