"""Check a model's declared context window against what its server does. uv run python scripts/probe_context.py ALIAS [--config PATH] ALIAS is a LiteLLM model alias. The LiteLLM URL and token come from the agent config (NISSE_CONFIG, ./nisse-dev.yaml, or --config), with its secrets from the environment or .env. See docs/Tuning-Guide.md, "Declaring a local model's limits", and nisse_dev/probe.py for what the verdicts mean. """ import argparse import os import sys from pathlib import Path import httpx from nisse_dev.catalog import ModelCatalog from nisse_dev.config import AgentConfig, ConfigError from nisse_dev.envfile import load_env_file from nisse_dev.probe import probe def main() -> int: parser = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) parser.add_argument("alias", help="LiteLLM model alias to probe") parser.add_argument("--config", help="agent config file to take LiteLLM from") parser.add_argument( "--max-probe-tokens", type=int, default=64_000, help="refuse to send a prompt larger than this (default: %(default)s)", ) args = parser.parse_args() load_env_file(Path(os.environ.get("NISSE_ENV", ".env")).expanduser()) try: config = ( AgentConfig.from_file(Path(args.config)) if args.config else AgentConfig.load() ) except ConfigError as exc: print(exc, file=sys.stderr) return 2 catalog = ModelCatalog.discover(config.llm_base_url, config.llm_token) facts = catalog.facts(args.alias) declared = facts.max_input_tokens if declared is None: print( f"LiteLLM declares no max_input_tokens for {args.alias}; set one first", file=sys.stderr, ) return 1 if declared * 1.5 > args.max_probe_tokens: print( f"{args.alias} declares {declared} tokens; probing would send about " f"{int(declared * 1.5)}. Raise --max-probe-tokens to allow it.", file=sys.stderr, ) return 1 with httpx.Client( base_url=config.llm_base_url.rstrip("/"), headers={"Authorization": f"Bearer {config.llm_token}"}, timeout=600, ) as http: result = probe(http, args.alias, declared, facts.backing) print(f"{args.alias}: {result.message}") return 0 if result.verdict in ("matches", "refuses", "declared_conservative") else 1 if __name__ == "__main__": raise SystemExit(main())