Prevent duplicate function module loads with caching helper and refactor

This commit is contained in:
Gunwoo Hur
2025-05-27 18:08:58 +09:00
parent a2afd6f645
commit 14c3d0c2d1
6 changed files with 47 additions and 24 deletions

View File

@@ -40,7 +40,10 @@ from open_webui.models.functions import Functions
from open_webui.models.models import Models
from open_webui.utils.plugin import load_function_module_by_id
from open_webui.utils.plugin import (
load_function_module_by_id,
get_function_module_from_cache,
)
from open_webui.utils.models import get_all_models, check_model_access
from open_webui.utils.payload import convert_payload_openai_to_ollama
from open_webui.utils.response import (
@@ -392,8 +395,7 @@ async def chat_action(request: Request, action_id: str, form_data: dict, user: A
}
)
function_module, _, _ = load_function_module_by_id(action_id)
request.app.state.FUNCTIONS[action_id] = function_module
function_module, _, _ = get_function_module_from_cache(request, action_id)
if hasattr(function_module, "valves") and hasattr(function_module, "Valves"):
valves = Functions.get_function_valves_by_id(action_id)

View File

@@ -1,7 +1,10 @@
import inspect
import logging
from open_webui.utils.plugin import load_function_module_by_id
from open_webui.utils.plugin import (
load_function_module_by_id,
get_function_module_from_cache,
)
from open_webui.models.functions import Functions
from open_webui.env import SRC_LOG_LEVELS
@@ -13,10 +16,7 @@ def get_function_module(request, function_id):
"""
Get the function module by its ID.
"""
function_module, _, _ = load_function_module_by_id(function_id)
request.app.state.FUNCTIONS[function_id] = function_module
function_module, _, _ = get_function_module_from_cache(request, function_id)
return function_module

View File

@@ -13,7 +13,10 @@ from open_webui.models.functions import Functions
from open_webui.models.models import Models
from open_webui.utils.plugin import load_function_module_by_id
from open_webui.utils.plugin import (
load_function_module_by_id,
get_function_module_from_cache,
)
from open_webui.utils.access_control import has_access
@@ -239,8 +242,7 @@ async def get_all_models(request, user: UserModel = None):
]
def get_function_module_by_id(function_id):
function_module, _, _ = load_function_module_by_id(function_id)
request.app.state.FUNCTIONS[function_id] = function_module
function_module, _, _ = get_function_module_from_cache(request, function_id)
return function_module
for model in models:

View File

@@ -166,6 +166,24 @@ def load_function_module_by_id(function_id, content=None):
os.unlink(temp_file.name)
def get_function_module_from_cache(request, function_id):
if (
hasattr(request.app.state, "FUNCTIONS")
and function_id in request.app.state.FUNCTIONS
):
return request.app.state.FUNCTIONS[function_id], None, None
function_module, function_type, frontmatter = load_function_module_by_id(
function_id
)
if not hasattr(request.app.state, "FUNCTIONS"):
request.app.state.FUNCTIONS = {}
request.app.state.FUNCTIONS[function_id] = function_module
return function_module, function_type, frontmatter
def install_frontmatter_requirements(requirements: str):
if requirements:
try: