diff --git a/backend/open_webui/models/functions.py b/backend/open_webui/models/functions.py index 2bb6d60889..e8ce3aa811 100644 --- a/backend/open_webui/models/functions.py +++ b/backend/open_webui/models/functions.py @@ -37,6 +37,7 @@ class Function(Base): class FunctionMeta(BaseModel): description: Optional[str] = None manifest: Optional[dict] = {} + model_config = ConfigDict(extra="allow") class FunctionModel(BaseModel): @@ -260,6 +261,29 @@ class FunctionsTable: except Exception: return None + def update_function_metadata_by_id( + self, id: str, metadata: dict + ) -> Optional[FunctionModel]: + with get_db() as db: + try: + function = db.get(Function, id) + + if function: + if function.meta: + function.meta = {**function.meta, **metadata} + else: + function.meta = metadata + + function.updated_at = int(time.time()) + db.commit() + db.refresh(function) + return self.get_function_by_id(id) + else: + return None + except Exception as e: + log.exception(f"Error updating function metadata by id {id}: {e}") + return None + def get_user_valves_by_id_and_user_id( self, id: str, user_id: str ) -> Optional[dict]: diff --git a/backend/open_webui/routers/functions.py b/backend/open_webui/routers/functions.py index 9ef6915709..9f0651fd3f 100644 --- a/backend/open_webui/routers/functions.py +++ b/backend/open_webui/routers/functions.py @@ -192,6 +192,9 @@ async def create_new_function( function_cache_dir = CACHE_DIR / "functions" / form_data.id function_cache_dir.mkdir(parents=True, exist_ok=True) + if function_type == "filter" and getattr(function_module, "toggle", None): + Functions.update_function_metadata_by_id(id, {"toggle": True}) + if function: return function else: @@ -308,6 +311,9 @@ async def update_function_by_id( function = Functions.update_function_by_id(id, updated) + if function_type == "filter" and getattr(function_module, "toggle", None): + Functions.update_function_metadata_by_id(id, {"toggle": True}) + if function: return function else: diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 10651f55d8..92098c8520 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -37,6 +37,7 @@ showArtifacts, tools, toolServers, + functions, selectedFolder, pinnedChats } from '$lib/stores'; @@ -88,6 +89,7 @@ import Spinner from '../common/Spinner.svelte'; import Tooltip from '../common/Tooltip.svelte'; import Sidebar from '../icons/Sidebar.svelte'; + import { getFunctions } from '$lib/apis/functions'; export let chatIdProp = ''; @@ -236,33 +238,62 @@ }; const resetInput = () => { - console.debug('resetInput'); - setToolIds(); - + selectedToolIds = []; selectedFilterIds = []; webSearchEnabled = false; imageGenerationEnabled = false; codeInterpreterEnabled = false; + + setDefaults(); }; - const setToolIds = async () => { + const setDefaults = async () => { if (!$tools) { tools.set(await getTools(localStorage.token)); } - + if (!$functions) { + functions.set(await getFunctions(localStorage.token)); + } if (selectedModels.length !== 1 && !atSelectedModel) { return; } const model = atSelectedModel ?? $models.find((m) => m.id === selectedModels[0]); - if (model && model?.info?.meta?.toolIds) { - selectedToolIds = [ - ...new Set( - [...(model?.info?.meta?.toolIds ?? [])].filter((id) => $tools.find((t) => t.id === id)) - ) - ]; - } else { - selectedToolIds = []; + if (model) { + if (model?.info?.meta?.toolIds) { + selectedToolIds = [ + ...new Set( + [...(model?.info?.meta?.toolIds ?? [])].filter((id) => $tools.find((t) => t.id === id)) + ) + ]; + } else { + selectedToolIds = []; + } + + if (model?.info?.meta?.defaultFilterIds) { + console.log('model.info.meta.defaultFilterIds', model.info.meta.defaultFilterIds); + selectedFilterIds = model.info.meta.defaultFilterIds; + console.log('selectedFilterIds', selectedFilterIds); + } else { + selectedFilterIds = []; + } + + if (model?.info?.meta?.defaultFeatureIds) { + console.log('model.info.meta.defaultFeatureIds', model.info.meta.defaultFeatureIds); + imageGenerationEnabled = model.info.meta.defaultFeatureIds.includes('image_generation'); + webSearchEnabled = model.info.meta.defaultFeatureIds.includes('web_search'); + codeInterpreterEnabled = model.info.meta.defaultFeatureIds.includes('code_interpreter'); + + console.log({ + imageGenerationEnabled, + webSearchEnabled, + codeInterpreterEnabled + }); + } else { + imageGenerationEnabled = false; + webSearchEnabled = false; + codeInterpreterEnabled = false; + } } }; diff --git a/src/lib/components/workspace/Models/ActionsSelector.svelte b/src/lib/components/workspace/Models/ActionsSelector.svelte index 8335455eda..4b3b52d4e8 100644 --- a/src/lib/components/workspace/Models/ActionsSelector.svelte +++ b/src/lib/components/workspace/Models/ActionsSelector.svelte @@ -22,18 +22,14 @@ }); -