Timothy Jaeryang Baek 3 bulan lalu
induk
melakukan
962e078a9a
2 mengubah file dengan 207 tambahan dan 203 penghapusan
  1. 1 6
      backend/open_webui/main.py
  2. 206 197
      backend/open_webui/utils/models.py

+ 1 - 6
backend/open_webui/main.py

@@ -1248,12 +1248,7 @@ async def get_models(
 
         return filtered_models
 
-    if request.app.state.MODELS and (
-        request.app.state.config.ENABLE_MODEL_LIST_CACHE and not refresh
-    ):
-        all_models = list(request.app.state.MODELS.values())
-    else:
-        all_models = await get_all_models(request, user=user)
+    all_models = await get_all_models(request, refresh=refresh, user=user)
 
     models = []
     for model in all_models:

+ 206 - 197
backend/open_webui/utils/models.py

@@ -76,159 +76,177 @@ async def get_all_base_models(request: Request, user: UserModel = None):
     return function_models + openai_models + ollama_models
 
 
-async def get_all_models(request, user: UserModel = None):
-    models = await get_all_base_models(request, user=user)
-
-    # If there are no models, return an empty list
-    if len(models) == 0:
-        return []
-
-    # Add arena models
-    if request.app.state.config.ENABLE_EVALUATION_ARENA_MODELS:
-        arena_models = []
-        if len(request.app.state.config.EVALUATION_ARENA_MODELS) > 0:
-            arena_models = [
-                {
-                    "id": model["id"],
-                    "name": model["name"],
-                    "info": {
-                        "meta": model["meta"],
-                    },
-                    "object": "model",
-                    "created": int(time.time()),
-                    "owned_by": "arena",
-                    "arena": True,
-                }
-                for model in request.app.state.config.EVALUATION_ARENA_MODELS
-            ]
-        else:
-            # Add default arena model
-            arena_models = [
-                {
-                    "id": DEFAULT_ARENA_MODEL["id"],
-                    "name": DEFAULT_ARENA_MODEL["name"],
-                    "info": {
-                        "meta": DEFAULT_ARENA_MODEL["meta"],
-                    },
-                    "object": "model",
-                    "created": int(time.time()),
-                    "owned_by": "arena",
-                    "arena": True,
-                }
-            ]
-        models = models + arena_models
-
-    global_action_ids = [
-        function.id for function in Functions.get_global_action_functions()
-    ]
-    enabled_action_ids = [
-        function.id
-        for function in Functions.get_functions_by_type("action", active_only=True)
-    ]
-
-    global_filter_ids = [
-        function.id for function in Functions.get_global_filter_functions()
-    ]
-    enabled_filter_ids = [
-        function.id
-        for function in Functions.get_functions_by_type("filter", active_only=True)
-    ]
-
-    custom_models = Models.get_all_models()
-    for custom_model in custom_models:
-        if custom_model.base_model_id is None:
-            for model in models:
-                if custom_model.id == model["id"] or (
-                    model.get("owned_by") == "ollama"
-                    and custom_model.id
-                    == model["id"].split(":")[
-                        0
-                    ]  # Ollama may return model ids in different formats (e.g., 'llama3' vs. 'llama3:7b')
-                ):
-                    if custom_model.is_active:
-                        model["name"] = custom_model.name
-                        model["info"] = custom_model.model_dump()
-
-                        # Set action_ids and filter_ids
-                        action_ids = []
-                        filter_ids = []
-
-                        if "info" in model and "meta" in model["info"]:
-                            action_ids.extend(
-                                model["info"]["meta"].get("actionIds", [])
-                            )
-                            filter_ids.extend(
-                                model["info"]["meta"].get("filterIds", [])
-                            )
-
-                        model["action_ids"] = action_ids
-                        model["filter_ids"] = filter_ids
-                    else:
-                        models.remove(model)
-
-        elif custom_model.is_active and (
-            custom_model.id not in [model["id"] for model in models]
-        ):
-            owned_by = "openai"
-            pipe = None
-
-            action_ids = []
-            filter_ids = []
-
-            for model in models:
-                if (
-                    custom_model.base_model_id == model["id"]
-                    or custom_model.base_model_id == model["id"].split(":")[0]
-                ):
-                    owned_by = model.get("owned_by", "unknown owner")
-                    if "pipe" in model:
-                        pipe = model["pipe"]
-                    break
-
-            if custom_model.meta:
-                meta = custom_model.meta.model_dump()
-
-                if "actionIds" in meta:
-                    action_ids.extend(meta["actionIds"])
+async def get_all_models(request, refresh: bool = False, user: UserModel = None):
+    if request.app.state.MODELS and (
+        request.app.state.config.ENABLE_MODEL_LIST_CACHE and not refresh
+    ):
+        return list(request.app.state.MODELS.values())
+    else:
+        models = await get_all_base_models(request, user=user)
+
+        # If there are no models, return an empty list
+        if len(models) == 0:
+            return []
+
+        # Add arena models
+        if request.app.state.config.ENABLE_EVALUATION_ARENA_MODELS:
+            arena_models = []
+            if len(request.app.state.config.EVALUATION_ARENA_MODELS) > 0:
+                arena_models = [
+                    {
+                        "id": model["id"],
+                        "name": model["name"],
+                        "info": {
+                            "meta": model["meta"],
+                        },
+                        "object": "model",
+                        "created": int(time.time()),
+                        "owned_by": "arena",
+                        "arena": True,
+                    }
+                    for model in request.app.state.config.EVALUATION_ARENA_MODELS
+                ]
+            else:
+                # Add default arena model
+                arena_models = [
+                    {
+                        "id": DEFAULT_ARENA_MODEL["id"],
+                        "name": DEFAULT_ARENA_MODEL["name"],
+                        "info": {
+                            "meta": DEFAULT_ARENA_MODEL["meta"],
+                        },
+                        "object": "model",
+                        "created": int(time.time()),
+                        "owned_by": "arena",
+                        "arena": True,
+                    }
+                ]
+            models = models + arena_models
+
+        global_action_ids = [
+            function.id for function in Functions.get_global_action_functions()
+        ]
+        enabled_action_ids = [
+            function.id
+            for function in Functions.get_functions_by_type("action", active_only=True)
+        ]
 
-                if "filterIds" in meta:
-                    filter_ids.extend(meta["filterIds"])
+        global_filter_ids = [
+            function.id for function in Functions.get_global_filter_functions()
+        ]
+        enabled_filter_ids = [
+            function.id
+            for function in Functions.get_functions_by_type("filter", active_only=True)
+        ]
 
-            models.append(
-                {
-                    "id": f"{custom_model.id}",
-                    "name": custom_model.name,
-                    "object": "model",
-                    "created": custom_model.created_at,
-                    "owned_by": owned_by,
-                    "info": custom_model.model_dump(),
-                    "preset": True,
-                    **({"pipe": pipe} if pipe is not None else {}),
-                    "action_ids": action_ids,
-                    "filter_ids": filter_ids,
-                }
-            )
+        custom_models = Models.get_all_models()
+        for custom_model in custom_models:
+            if custom_model.base_model_id is None:
+                for model in models:
+                    if custom_model.id == model["id"] or (
+                        model.get("owned_by") == "ollama"
+                        and custom_model.id
+                        == model["id"].split(":")[
+                            0
+                        ]  # Ollama may return model ids in different formats (e.g., 'llama3' vs. 'llama3:7b')
+                    ):
+                        if custom_model.is_active:
+                            model["name"] = custom_model.name
+                            model["info"] = custom_model.model_dump()
+
+                            # Set action_ids and filter_ids
+                            action_ids = []
+                            filter_ids = []
+
+                            if "info" in model and "meta" in model["info"]:
+                                action_ids.extend(
+                                    model["info"]["meta"].get("actionIds", [])
+                                )
+                                filter_ids.extend(
+                                    model["info"]["meta"].get("filterIds", [])
+                                )
+
+                            model["action_ids"] = action_ids
+                            model["filter_ids"] = filter_ids
+                        else:
+                            models.remove(model)
+
+            elif custom_model.is_active and (
+                custom_model.id not in [model["id"] for model in models]
+            ):
+                owned_by = "openai"
+                pipe = None
+
+                action_ids = []
+                filter_ids = []
+
+                for model in models:
+                    if (
+                        custom_model.base_model_id == model["id"]
+                        or custom_model.base_model_id == model["id"].split(":")[0]
+                    ):
+                        owned_by = model.get("owned_by", "unknown owner")
+                        if "pipe" in model:
+                            pipe = model["pipe"]
+                        break
+
+                if custom_model.meta:
+                    meta = custom_model.meta.model_dump()
+
+                    if "actionIds" in meta:
+                        action_ids.extend(meta["actionIds"])
+
+                    if "filterIds" in meta:
+                        filter_ids.extend(meta["filterIds"])
+
+                models.append(
+                    {
+                        "id": f"{custom_model.id}",
+                        "name": custom_model.name,
+                        "object": "model",
+                        "created": custom_model.created_at,
+                        "owned_by": owned_by,
+                        "info": custom_model.model_dump(),
+                        "preset": True,
+                        **({"pipe": pipe} if pipe is not None else {}),
+                        "action_ids": action_ids,
+                        "filter_ids": filter_ids,
+                    }
+                )
 
-    # Process action_ids to get the actions
-    def get_action_items_from_module(function, module):
-        actions = []
-        if hasattr(module, "actions"):
-            actions = module.actions
-            return [
-                {
-                    "id": f"{function.id}.{action['id']}",
-                    "name": action.get("name", f"{function.name} ({action['id']})"),
-                    "description": function.meta.description,
-                    "icon": action.get(
-                        "icon_url",
-                        function.meta.manifest.get("icon_url", None)
+        # Process action_ids to get the actions
+        def get_action_items_from_module(function, module):
+            actions = []
+            if hasattr(module, "actions"):
+                actions = module.actions
+                return [
+                    {
+                        "id": f"{function.id}.{action['id']}",
+                        "name": action.get("name", f"{function.name} ({action['id']})"),
+                        "description": function.meta.description,
+                        "icon": action.get(
+                            "icon_url",
+                            function.meta.manifest.get("icon_url", None)
+                            or getattr(module, "icon_url", None)
+                            or getattr(module, "icon", None),
+                        ),
+                    }
+                    for action in actions
+                ]
+            else:
+                return [
+                    {
+                        "id": function.id,
+                        "name": function.name,
+                        "description": function.meta.description,
+                        "icon": function.meta.manifest.get("icon_url", None)
                         or getattr(module, "icon_url", None)
                         or getattr(module, "icon", None),
-                    ),
-                }
-                for action in actions
-            ]
-        else:
+                    }
+                ]
+
+        # Process filter_ids to get the filters
+        def get_filter_items_from_module(function, module):
             return [
                 {
                     "id": function.id,
@@ -240,63 +258,54 @@ async def get_all_models(request, user: UserModel = None):
                 }
             ]
 
-    # Process filter_ids to get the filters
-    def get_filter_items_from_module(function, module):
-        return [
-            {
-                "id": function.id,
-                "name": function.name,
-                "description": function.meta.description,
-                "icon": function.meta.manifest.get("icon_url", None)
-                or getattr(module, "icon_url", None)
-                or getattr(module, "icon", None),
-            }
-        ]
-
-    def get_function_module_by_id(function_id):
-        function_module, _, _ = get_function_module_from_cache(request, function_id)
-        return function_module
+        def get_function_module_by_id(function_id):
+            function_module, _, _ = get_function_module_from_cache(request, function_id)
+            return function_module
 
-    for model in models:
-        action_ids = [
-            action_id
-            for action_id in list(set(model.pop("action_ids", []) + global_action_ids))
-            if action_id in enabled_action_ids
-        ]
-        filter_ids = [
-            filter_id
-            for filter_id in list(set(model.pop("filter_ids", []) + global_filter_ids))
-            if filter_id in enabled_filter_ids
-        ]
+        for model in models:
+            action_ids = [
+                action_id
+                for action_id in list(
+                    set(model.pop("action_ids", []) + global_action_ids)
+                )
+                if action_id in enabled_action_ids
+            ]
+            filter_ids = [
+                filter_id
+                for filter_id in list(
+                    set(model.pop("filter_ids", []) + global_filter_ids)
+                )
+                if filter_id in enabled_filter_ids
+            ]
 
-        model["actions"] = []
-        for action_id in action_ids:
-            action_function = Functions.get_function_by_id(action_id)
-            if action_function is None:
-                raise Exception(f"Action not found: {action_id}")
+            model["actions"] = []
+            for action_id in action_ids:
+                action_function = Functions.get_function_by_id(action_id)
+                if action_function is None:
+                    raise Exception(f"Action not found: {action_id}")
 
-            function_module = get_function_module_by_id(action_id)
-            model["actions"].extend(
-                get_action_items_from_module(action_function, function_module)
-            )
+                function_module = get_function_module_by_id(action_id)
+                model["actions"].extend(
+                    get_action_items_from_module(action_function, function_module)
+                )
 
-        model["filters"] = []
-        for filter_id in filter_ids:
-            filter_function = Functions.get_function_by_id(filter_id)
-            if filter_function is None:
-                raise Exception(f"Filter not found: {filter_id}")
+            model["filters"] = []
+            for filter_id in filter_ids:
+                filter_function = Functions.get_function_by_id(filter_id)
+                if filter_function is None:
+                    raise Exception(f"Filter not found: {filter_id}")
 
-            function_module = get_function_module_by_id(filter_id)
+                function_module = get_function_module_by_id(filter_id)
 
-            if getattr(function_module, "toggle", None):
-                model["filters"].extend(
-                    get_filter_items_from_module(filter_function, function_module)
-                )
+                if getattr(function_module, "toggle", None):
+                    model["filters"].extend(
+                        get_filter_items_from_module(filter_function, function_module)
+                    )
 
-    log.debug(f"get_all_models() returned {len(models)} models")
+        log.debug(f"get_all_models() returned {len(models)} models")
 
-    request.app.state.MODELS = {model["id"]: model for model in models}
-    return models
+        request.app.state.MODELS = {model["id"]: model for model in models}
+        return models
 
 
 def check_model_access(user, model):