diff --git a/backend/open_webui/models/tools.py b/backend/open_webui/models/tools.py index 3a47fa008d..48f84b3ac4 100644 --- a/backend/open_webui/models/tools.py +++ b/backend/open_webui/models/tools.py @@ -95,6 +95,8 @@ class ToolResponse(BaseModel): class ToolUserResponse(ToolResponse): user: Optional[UserResponse] = None + model_config = ConfigDict(extra="allow") + class ToolForm(BaseModel): id: str diff --git a/backend/open_webui/routers/tools.py b/backend/open_webui/routers/tools.py index e1854b65fc..eb03969ad7 100644 --- a/backend/open_webui/routers/tools.py +++ b/backend/open_webui/routers/tools.py @@ -41,7 +41,15 @@ router = APIRouter() @router.get("/", response_model=list[ToolUserResponse]) async def get_tools(request: Request, user=Depends(get_verified_user)): - tools = Tools.get_tools() + tools = [ + ToolUserResponse( + **{ + **tool.model_dump(), + "has_user_valves": "class UserValves(BaseModel):" in tool.content, + } + ) + for tool in Tools.get_tools() + ] # OpenAPI Tool Servers for server in await get_tool_servers(request): diff --git a/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte b/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte index 1abefc8aad..7f38d82745 100644 --- a/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte +++ b/src/lib/components/chat/MessageInput/IntegrationsMenu.svelte @@ -19,6 +19,7 @@ import Terminal from '$lib/components/icons/Terminal.svelte'; import ChevronRight from '$lib/components/icons/ChevronRight.svelte'; import ChevronLeft from '$lib/components/icons/ChevronLeft.svelte'; + import ValvesModal from '$lib/components/workspace/common/ValvesModal.svelte'; const i18n = getContext('i18n'); @@ -43,6 +44,11 @@ let show = false; let tab = ''; + let showValvesModal = false; + + let selectedValvesType = 'tool'; + let selectedValvesItemId = null; + let tools = null; $: if (show) { @@ -64,7 +70,8 @@ a[tool.id] = { name: tool.name, description: tool.meta.description, - enabled: selectedToolIds.includes(tool.id) + enabled: selectedToolIds.includes(tool.id), + ...tool }; return a; }, {}); @@ -87,6 +94,16 @@ }; + { + await tick(); + }} +/> + { @@ -322,6 +339,44 @@ + {#if tools[toolId]?.has_user_valves} +
+ + + +
+ {/if} +
{ - toast.error(`${error}`); - }); - } else if (type === 'function') { - res = await updateFunctionValvesById(localStorage.token, id, valves).catch((error) => { - toast.error(`${error}`); - }); + if (userValves) { + if (type === 'tool') { + res = await updateToolUserValvesById(localStorage.token, id, valves).catch((error) => { + toast.error(`${error}`); + }); + } else if (type === 'function') { + res = await updateFunctionUserValvesById(localStorage.token, id, valves).catch( + (error) => { + toast.error(`${error}`); + } + ); + } + } else { + if (type === 'tool') { + res = await updateToolValvesById(localStorage.token, id, valves).catch((error) => { + toast.error(`${error}`); + }); + } else if (type === 'function') { + res = await updateFunctionValvesById(localStorage.token, id, valves).catch((error) => { + toast.error(`${error}`); + }); + } } if (res) { @@ -67,28 +96,43 @@ valves = {}; valvesSpec = null; - if (type === 'tool') { - valves = await getToolValvesById(localStorage.token, id); - valvesSpec = await getToolValvesSpecById(localStorage.token, id); - } else if (type === 'function') { - valves = await getFunctionValvesById(localStorage.token, id); - valvesSpec = await getFunctionValvesSpecById(localStorage.token, id); - } - - if (!valves) { - valves = {}; - } - - if (valvesSpec) { - // Convert array to string - for (const property in valvesSpec.properties) { - if (valvesSpec.properties[property]?.type === 'array') { - valves[property] = (valves[property] ?? []).join(','); + try { + if (userValves) { + if (type === 'tool') { + valves = await getToolUserValvesById(localStorage.token, id); + valvesSpec = await getToolUserValvesSpecById(localStorage.token, id); + } else if (type === 'function') { + valves = await getFunctionUserValvesById(localStorage.token, id); + valvesSpec = await getFunctionUserValvesSpecById(localStorage.token, id); + } + } else { + if (type === 'tool') { + valves = await getToolValvesById(localStorage.token, id); + valvesSpec = await getToolValvesSpecById(localStorage.token, id); + } else if (type === 'function') { + valves = await getFunctionValvesById(localStorage.token, id); + valvesSpec = await getFunctionValvesSpecById(localStorage.token, id); } } - } - loading = false; + if (!valves) { + valves = {}; + } + + if (valvesSpec) { + // Convert array to string + for (const property in valvesSpec.properties) { + if (valvesSpec.properties[property]?.type === 'array') { + valves[property] = (valves[property] ?? []).join(','); + } + } + } + + loading = false; + } catch (e) { + toast.error(`Error fetching valves`); + show = false; + } }; $: if (show) {