Spaces:
Runtime error
Runtime error
import { useQuery, useQueryClient } from "@tanstack/react-query"; | |
import { z } from "zod"; | |
import { get } from "../services/fetch-utils"; | |
import { useAgentStore } from "../stores"; | |
const Tool = z.object({ | |
name: z.string(), | |
description: z.string(), | |
color: z.string(), | |
image_url: z.string().optional(), | |
}); | |
const ToolsResponseSchema = z.object({ | |
tools: z.array(Tool), | |
}); | |
const ActiveToolSchema = Tool.extend({ | |
active: z.boolean(), | |
}); | |
export type ActiveTool = z.infer<typeof ActiveToolSchema>; | |
const loadTools = async (key: string) => { | |
const allTools = await get("/api/agent/tools", ToolsResponseSchema); | |
const data = localStorage.getItem(key); | |
let activeTools: ActiveTool[] = []; | |
try { | |
const obj = z.array(ActiveToolSchema).parse(JSON.parse(data ?? "")); | |
activeTools = allTools.tools.map((db_tool) => { | |
const tool = obj.find((t) => t.name === db_tool.name); | |
return tool ?? { ...db_tool, active: false }; | |
}); | |
} catch (error) { | |
activeTools = allTools.tools.map((toolModel) => ({ ...toolModel, active: false })); | |
} | |
return activeTools; | |
}; | |
const save = (key: string, data: object) => { | |
localStorage.setItem(key, JSON.stringify(data)); | |
}; | |
export function useTools() { | |
const setTools = useAgentStore.use.setTools(); | |
const queryClient = useQueryClient(); | |
const query = useQuery(["tools"], () => loadTools("tools"), { | |
onSuccess: (data) => { | |
updateActiveTools(data); | |
}, | |
}); | |
function updateActiveTools(data: ActiveTool[]) { | |
save("tools", data); | |
setTools(data.filter((tool) => tool.active)); | |
} | |
const setToolActive = (toolName: string, active: boolean) => { | |
queryClient.setQueriesData(["tools"], (old) => { | |
const data = (old as ActiveTool[]).map((tool) => | |
tool.name === toolName ? { ...tool, active } : tool | |
); | |
updateActiveTools(data); | |
return data; | |
}); | |
}; | |
return { | |
activeTools: query.data ?? [], | |
setToolActive, | |
isSuccess: query.isSuccess, | |
}; | |
} | |