176 lines
6.6 KiB
Python
176 lines
6.6 KiB
Python
import json
|
|
|
|
|
|
class FakeResponse:
|
|
def __init__(self, status_code=200, payload=None, text=""):
|
|
self.status_code = status_code
|
|
self._payload = payload or {}
|
|
self.text = text
|
|
|
|
def json(self):
|
|
return self._payload
|
|
|
|
|
|
def test_pixelrag_vlm_route_readiness_selects_installed_candidate(monkeypatch):
|
|
from services import pixelrag_vlm_route_readiness_service as service
|
|
|
|
hosts = [
|
|
"http://primary:11434",
|
|
"http://secondary:11434",
|
|
]
|
|
monkeypatch.setattr(service, "_approved_hosts", lambda: hosts)
|
|
|
|
def fake_get(url, timeout):
|
|
if url.startswith("http://primary"):
|
|
raise TimeoutError("primary timeout")
|
|
return FakeResponse(
|
|
payload={
|
|
"models": [
|
|
{"name": "gemma3:4b"},
|
|
{"name": "bge-m3:latest"},
|
|
]
|
|
}
|
|
)
|
|
|
|
monkeypatch.setattr(service.requests, "get", fake_get)
|
|
payload = service.build_pixelrag_vlm_route_readiness(
|
|
model="minicpm-v:latest",
|
|
timeout_seconds=1,
|
|
)
|
|
|
|
assert payload["policy"] == "read_only_pixelrag_vlm_route_readiness_v1"
|
|
assert payload["status"] == "warning"
|
|
assert payload["summary"]["reachable_host_count"] == 1
|
|
assert payload["summary"]["configured_model_available_count"] == 0
|
|
assert payload["summary"]["candidate_model"] == "gemma3:4b"
|
|
assert payload["summary"]["model_route_ready"] is True
|
|
assert payload["controlled_apply"]["model_call"] is False
|
|
assert payload["controlled_apply"]["writes_database"] is False
|
|
assert payload["next_machine_action"] == "run_pixelrag_vlm_replay_worker_execute_with_selected_model"
|
|
|
|
|
|
def test_pixelrag_vlm_route_readiness_critical_when_no_candidate(monkeypatch):
|
|
from services import pixelrag_vlm_route_readiness_service as service
|
|
|
|
monkeypatch.setattr(service, "_approved_hosts", lambda: ["http://secondary:11434"])
|
|
monkeypatch.setattr(
|
|
service.requests,
|
|
"get",
|
|
lambda url, timeout: FakeResponse(payload={"models": [{"name": "bge-m3:latest"}]}),
|
|
)
|
|
|
|
payload = service.build_pixelrag_vlm_route_readiness(model="minicpm-v:latest")
|
|
|
|
assert payload["status"] == "critical"
|
|
assert payload["success"] is False
|
|
assert payload["summary"]["model_route_ready"] is False
|
|
assert payload["next_machine_action"] == "install_or_configure_pixelrag_vlm_model_on_approved_ollama_host"
|
|
|
|
|
|
def test_pixelrag_vlm_route_readiness_generate_probe_success(monkeypatch):
|
|
from services import pixelrag_vlm_route_readiness_service as service
|
|
|
|
monkeypatch.setattr(service, "_approved_hosts", lambda: ["http://secondary:11434"])
|
|
monkeypatch.setattr(
|
|
service.requests,
|
|
"get",
|
|
lambda url, timeout: FakeResponse(payload={"models": [{"name": "gemma3:4b"}]}),
|
|
)
|
|
monkeypatch.setattr(
|
|
service.requests,
|
|
"post",
|
|
lambda url, json, timeout: FakeResponse(payload={"response": "OK", "done": True}),
|
|
)
|
|
|
|
payload = service.build_pixelrag_vlm_route_readiness(
|
|
model="minicpm-v:latest",
|
|
probe_generate=True,
|
|
probe_timeout_seconds=1,
|
|
)
|
|
|
|
assert payload["status"] == "warning"
|
|
assert payload["summary"]["candidate_model"] == "gemma3:4b"
|
|
assert payload["summary"]["tag_model_route_ready"] is True
|
|
assert payload["summary"]["model_route_ready"] is True
|
|
assert payload["summary"]["generate_probe_performed"] is True
|
|
assert payload["summary"]["generate_probe_ok_count"] == 1
|
|
assert payload["summary"]["generate_route_ready"] is True
|
|
assert payload["summary"]["generate_ready_host"] == "http://secondary:11434"
|
|
assert payload["controlled_apply"]["model_call"] is True
|
|
|
|
|
|
def test_pixelrag_vlm_route_readiness_generate_probe_failure_blocks_route(monkeypatch):
|
|
from services import pixelrag_vlm_route_readiness_service as service
|
|
|
|
monkeypatch.setattr(service, "_approved_hosts", lambda: ["http://secondary:11434"])
|
|
monkeypatch.setattr(
|
|
service.requests,
|
|
"get",
|
|
lambda url, timeout: FakeResponse(payload={"models": [{"name": "gemma3:4b"}]}),
|
|
)
|
|
|
|
def fake_post(url, json, timeout):
|
|
raise TimeoutError("generate timeout")
|
|
|
|
monkeypatch.setattr(service.requests, "post", fake_post)
|
|
|
|
payload = service.build_pixelrag_vlm_route_readiness(
|
|
model="minicpm-v:latest",
|
|
probe_generate=True,
|
|
probe_timeout_seconds=1,
|
|
)
|
|
|
|
assert payload["status"] == "critical"
|
|
assert payload["success"] is False
|
|
assert payload["summary"]["candidate_model"] == "gemma3:4b"
|
|
assert payload["summary"]["tag_model_route_ready"] is True
|
|
assert payload["summary"]["model_route_ready"] is False
|
|
assert payload["summary"]["generate_probe_performed"] is True
|
|
assert payload["summary"]["generate_probe_ok_count"] == 0
|
|
assert payload["summary"]["generate_route_ready"] is False
|
|
assert payload["next_machine_action"] == "repair_ollama_vlm_generate_runtime_or_proxy_timeout"
|
|
|
|
|
|
def test_pixelrag_vlm_route_readiness_route_returns_readback(monkeypatch):
|
|
from flask import Flask
|
|
from routes import system_public_routes as routes
|
|
from services import pixelrag_vlm_route_readiness_service as service
|
|
|
|
monkeypatch.setattr(
|
|
service,
|
|
"build_pixelrag_vlm_route_readiness",
|
|
lambda **kwargs: {
|
|
"success": True,
|
|
"policy": "read_only_pixelrag_vlm_route_readiness_v1",
|
|
"status": "ok",
|
|
"summary": {"model_route_ready": True, "candidate_model": "gemma3:4b"},
|
|
"next_machine_action": "run_pixelrag_vlm_replay_worker_execute",
|
|
},
|
|
)
|
|
|
|
app = Flask(__name__)
|
|
with app.test_request_context(
|
|
"/api/ai-automation/pixelrag-vlm-route-readiness?model=minicpm-v:latest"
|
|
"&probe_generate=true&probe_timeout=4"
|
|
):
|
|
response = routes.ai_automation_pixelrag_vlm_route_readiness_api.__wrapped__()
|
|
payload = response.get_json()
|
|
|
|
assert payload["policy"] == "read_only_pixelrag_vlm_route_readiness_v1"
|
|
assert payload["summary"]["candidate_model"] == "gemma3:4b"
|
|
|
|
|
|
def test_pixelrag_vlm_route_readiness_cli_outputs_json(monkeypatch, tmp_path):
|
|
from services import pixelrag_vlm_route_readiness_service as service
|
|
|
|
monkeypatch.setattr(service, "_approved_hosts", lambda: ["http://secondary:11434"])
|
|
monkeypatch.setattr(
|
|
service.requests,
|
|
"get",
|
|
lambda url, timeout: FakeResponse(payload={"models": [{"name": "gemma3:4b"}]}),
|
|
)
|
|
|
|
payload = service.build_pixelrag_vlm_route_readiness(model="minicpm-v:latest")
|
|
assert json.dumps(payload, ensure_ascii=False)
|
|
assert payload["summary"]["candidate_model"] == "gemma3:4b"
|