movimento / kimodo /scripts /text_encoder_smoke.py
rydlrKE's picture
Sync text encoder 3.0 fix and smoke checks
4be5ba2
"""End-to-end text encoder smoke test for API/local/auto modes."""
from __future__ import annotations
import argparse
import json
import time
from kimodo.model.load_model import DEFAULT_TEXT_ENCODER_URL, _select_text_encoder_conf
from kimodo.model.loading import get_env_var, instantiate_from_dict
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Kimodo text encoder smoke test")
parser.add_argument(
"--prompt",
default="A person walks forward.",
help="Prompt used for the end-to-end encoding call.",
)
parser.add_argument(
"--strict",
action="store_true",
help="Return non-zero if any step fails.",
)
parser.add_argument(
"--retry-delay-sec",
type=float,
default=10.0,
help="Delay before a single retry when the first cold-start attempt fails.",
)
return parser.parse_args()
def main() -> int:
args = parse_args()
text_encoder_url = get_env_var("TEXT_ENCODER_URL", DEFAULT_TEXT_ENCODER_URL)
mode = get_env_var("TEXT_ENCODER_MODE", "auto").lower()
report = {
"mode": mode,
"text_encoder_url": text_encoder_url,
"encoder_target": None,
"ready": False,
"encode_ok": False,
"elapsed_ms": None,
"output_shape": None,
"lengths": None,
"error": None,
}
started = time.time()
conf = None
encoder = None
for attempt in range(2):
try:
if conf is None:
conf = _select_text_encoder_conf(text_encoder_url)
report["encoder_target"] = conf.get("_target_")
if encoder is None:
encoder = instantiate_from_dict(conf)
# Probe readiness path first.
encoder(["healthcheck"])
report["ready"] = True
encoded, lengths = encoder([args.prompt])
report["encode_ok"] = True
report["output_shape"] = tuple(encoded.shape)
report["lengths"] = lengths
report["attempts"] = attempt + 1
break
except Exception as error: # pragma: no cover - runtime/network dependent
report["error"] = f"{type(error).__name__}: {error}"
report["attempts"] = attempt + 1
if attempt == 0:
time.sleep(max(0.0, args.retry_delay_sec))
encoder = None
continue
report["elapsed_ms"] = int((time.time() - started) * 1000)
print(json.dumps(report, indent=2, sort_keys=True))
if args.strict and (not report["ready"] or not report["encode_ok"]):
return 2
return 0
if __name__ == "__main__":
raise SystemExit(main())