This commit is contained in:
Timothy Jaeryang Baek
2026-05-09 01:13:16 +09:00
parent a32d26e61d
commit 4fe2de7864
8 changed files with 222 additions and 36 deletions
+43
View File
@@ -439,6 +439,7 @@ async def get_all_models_responses(request: Request, user: UserModel) -> list:
connection_type = api_config.get('connection_type', 'external')
prefix_id = api_config.get('prefix_id', None)
tags = api_config.get('tags', [])
provider = api_config.get('provider', '')
model_list = response if isinstance(response, list) else response.get('data', [])
if not isinstance(model_list, list):
@@ -459,6 +460,9 @@ async def get_all_models_responses(request: Request, user: UserModel) -> list:
if connection_type:
model['connection_type'] = connection_type
if provider:
model['provider'] = provider
log.debug(f'get_all_models:responses() {responses}')
return responses
@@ -488,6 +492,41 @@ async def get_filtered_models(models, user, db=None):
return filtered_models
async def get_openai_loaded_models(request: Request, models: dict, api_base_urls: list):
"""
Fetch loaded-model state from providers that expose it and annotate
each model dict with a ``loaded`` boolean.
Currently supports:
- **llama.cpp** – queries ``GET /slots`` and matches slot model IDs.
"""
api_configs = request.app.state.config.OPENAI_API_CONFIGS
api_keys = request.app.state.config.OPENAI_API_KEYS
for idx, url in enumerate(api_base_urls):
api_config = api_configs.get(
str(idx),
api_configs.get(url, {}),
)
provider = api_config.get('provider', '')
if provider == 'llama.cpp':
try:
root_url = url.rstrip('/').removesuffix('/v1')
key = api_keys[idx] if idx < len(api_keys) else None
slots = await send_get_request(url=f'{root_url}/slots', key=key)
loaded_model_ids = (
{s.get('model') for s in slots if s.get('model')}
if isinstance(slots, list)
else set()
)
for model_id, model in models.items():
if model.get('urlIdx') == idx:
model['loaded'] = model_id in loaded_model_ids
except Exception as e:
log.debug(f'Failed to fetch llama.cpp slots for idx {idx}: {e}')
@cached(
ttl=MODELS_CACHE_TTL,
key=lambda _, user: f'openai_all_models_{user.id}' if user else 'openai_all_models',
@@ -548,6 +587,7 @@ async def get_all_models(request: Request, user: UserModel) -> dict[str, list]:
'owned_by': 'openai',
'openai': model,
'connection_type': model.get('connection_type', 'external'),
'provider': model.get('provider', ''),
'urlIdx': idx,
}
@@ -556,6 +596,9 @@ async def get_all_models(request: Request, user: UserModel) -> dict[str, list]:
models = get_merged_models(map(extract_data, responses))
log.debug(f'models: {models}')
# Fetch loaded state for providers that support it (e.g. llama.cpp /slots)
await get_openai_loaded_models(request, models, api_base_urls)
request.app.state.OPENAI_MODELS = models
return {'data': list(models.values())}