feat: wire hybrid provider into CLI
This commit is contained in:
@@ -4,6 +4,7 @@ from __future__ import annotations
|
||||
|
||||
import json
|
||||
import socket
|
||||
from dataclasses import dataclass
|
||||
from urllib.error import HTTPError, URLError
|
||||
from urllib.request import Request, urlopen
|
||||
|
||||
@@ -17,14 +18,40 @@ from javis.providers.base import (
|
||||
)
|
||||
|
||||
|
||||
@dataclass(frozen=True, slots=True)
|
||||
class OllamaStatus:
|
||||
reachable: bool
|
||||
model_available: bool
|
||||
|
||||
|
||||
class OllamaProvider:
|
||||
name = "ollama"
|
||||
|
||||
def __init__(self, model: str, base_url: str, timeout_seconds: float) -> None:
|
||||
self.model = model
|
||||
self._endpoint = f"{base_url.rstrip('/')}/api/chat"
|
||||
self._base_url = base_url.rstrip("/")
|
||||
self._endpoint = f"{self._base_url}/api/chat"
|
||||
self._timeout_seconds = timeout_seconds
|
||||
|
||||
def probe(self) -> OllamaStatus:
|
||||
request = Request(f"{self._base_url}/api/tags", method="GET")
|
||||
try:
|
||||
with urlopen(request, timeout=min(self._timeout_seconds, 3)) as response:
|
||||
result = json.loads(response.read())
|
||||
except (HTTPError, URLError, TimeoutError, OSError, json.JSONDecodeError):
|
||||
return OllamaStatus(False, False)
|
||||
models = result.get("models")
|
||||
if not isinstance(models, list):
|
||||
return OllamaStatus(True, False)
|
||||
names = {
|
||||
value
|
||||
for item in models
|
||||
if isinstance(item, dict)
|
||||
for value in (item.get("name"), item.get("model"))
|
||||
if isinstance(value, str)
|
||||
}
|
||||
return OllamaStatus(True, self.model in names)
|
||||
|
||||
def chat(self, messages: list[ChatMessage]) -> str:
|
||||
payload = {
|
||||
"model": self.model,
|
||||
|
||||
Reference in New Issue
Block a user