This commit is contained in:
Timothy Jaeryang Baek 2025-06-28 19:15:52 +04:00
parent 1b064a6c85
commit 962e078a9a
2 changed files with 196 additions and 192 deletions

View file

@ -1248,12 +1248,7 @@ async def get_models(
return filtered_models return filtered_models
if request.app.state.MODELS and ( all_models = await get_all_models(request, refresh=refresh, user=user)
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)
models = [] models = []
for model in all_models: for model in all_models:

View file

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