myrmidon / python /src /server /services /discovery /providers /ollama_handler.py
tek Atrust
chore(deploy): build monolithic server for Hugging Face
d5ef46f
Raw
History Blame Contribute Delete
2.87 kB
from urllib.parse import urlparse
import aiohttp
from ...config.logfire_config import get_logger
from ..models import (
EMBEDDING_DIMENSIONS,
EMBEDDING_MODEL_PATTERNS,
MODEL_CONTEXT_WINDOWS,
VISION_MODEL_PATTERNS,
ModelSpec,
)
logger = get_logger(__name__)
async def discover_ollama_models(base_urls: list[str], session: aiohttp.ClientSession, test_tool_fn) -> list[ModelSpec]:
"""1:1 Physical Parity Implementation from ProviderDiscoveryService."""
all_models = []
for base_url in base_urls:
try:
parsed = urlparse(base_url)
api_url = base_url.replace("/v1", "") if parsed.path.endswith("/v1") else base_url
async with session.get(f"{api_url}/api/tags") as response:
if response.status == 200:
data = await response.json()
models = []
for model_info in data.get("models", []):
full_name = model_info.get("name", "")
model_name = full_name.split(":")[0]
supports_tools = await test_tool_fn(model_name, api_url)
supports_vision = any(p in model_name.lower() for p in VISION_MODEL_PATTERNS)
supports_embeddings = any(p in model_name.lower() for p in EMBEDDING_MODEL_PATTERNS)
context_window = 4096
for family, window_size in MODEL_CONTEXT_WINDOWS.items():
if family in model_name.lower():
context_window = window_size
break
embedding_dims = next(
(dims for pattern, dims in EMBEDDING_DIMENSIONS.items() if pattern in model_name.lower()),
None,
)
models.append(
ModelSpec(
name=full_name,
provider="ollama",
context_window=context_window,
supports_tools=supports_tools,
supports_vision=supports_vision,
supports_embeddings=supports_embeddings,
embedding_dimensions=embedding_dims,
description=f"Ollama model on {base_url}",
aliases=[model_name] if ":" in full_name else [],
)
)
all_models.extend(models)
logger.info(f"Discovered {len(models)} Ollama models from {base_url}")
except Exception as e:
logger.error(f"Error discovering Ollama models from {base_url}: {e}")
return all_models