Glitch lens
Verify which vendor family (GPT, Gemini, GLM, Qwen, kimi, Deepseek, Minimax, Seed) actually serves an LLM endpoint or this Hermes agent, using glitch-token fingerprint probes. Use when the user suspects model substitution, wants to audit an API provider or OpenAI-compatible endpoint, or asks what model they are really talking to.From its SKILL.md
npx -y skills add Animnia/glitch-lens --skill glitch-lensAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
4.7 KB, as published. Nobody here has run it
Glitch Lens
Glitch Lens probes a model with glitch tokens — strings that one vendor's models consistently fail to copy verbatim while every other vendor's models copy them fine. Two fresh copy failures on the same token confirm a vendor-family candidate.
Epistemic boundary (always repeat this to the user): fingerprints identify known vendor-family behavior only. They cannot verify a specific model version, and cannot prove a provider is honest or dishonest. An unknown result is inconclusive, not an exoneration.
When to Use
- The user suspects an API provider, reseller, or proxy serves a different model than claimed.
- The user wants to audit the OpenAI-compatible endpoint their Hermes agent (or any tool) is configured against.
- The user asks "what model am I really talking to?"
Quick Reference
All commands run through the glitch-lens CLI via npx -y glitch-lens (requires Node.js ≥ 20; no install needed). Never print API key values — the CLI reads keys from environment variables named on the command line.
| Task | Command |
|---|---|
| Scan an endpoint | npx -y glitch-lens scan --protocol <openai|openai-responses|anthropic> --endpoint <url> --model <id> --key-env <ENV_NAME> --json |
| Start delegated scan | npx -y glitch-lens delegated-start --model <slug> [--provider <id>] |
| Advance delegated scan | npx -y glitch-lens delegated-advance --input <round.json> |
| Show Hermes model/provider config | hermes config show |
Procedure
Channel 1 — Direct scan of an endpoint (preferred when a key is available)
- Determine the endpoint, model id, and the name of the env var holding the API key. To audit the endpoint Hermes itself uses, run
hermes config showand read the configured provider/model and any custom base URL. - Never echo or print the key value. If the variable is unset, the CLI exits with a clear
Environment variable <NAME> is not seterror — tell the user the variable name and ask them to export it. - Run the scan command from the table above and present the JSON result.
Channel 2 — Delegated self-scan of this Hermes agent
Use when no API key is available, or the question is specifically "what model is serving this agent?". The agent executes blinded probe tasks against itself; the final report is labeled experimental-context-contaminated — say this when presenting it.
- Run
hermes config showand note the configured model id — use it as--modelbelow and asactualModelin every result. npx -y glitch-lens delegated-start --model <model>→ returns{ state, tasks }. Tasks are blinded (no vendor labels) — do not try to infer vendors from tokens.- Execute each task in a fresh, minimal session so the answer is not contaminated by this conversation:
Capture the reply ashermes chat -q "<task.prompt verbatim>"modelOutput. Fallback (faster, more contaminated): answer the probe prompt yourself in-context, verbatim, with no commentary. - Write
{"state": <state>, "results": [...]}to a temp file and runnpx -y glitch-lens delegated-advance --input <file>. Each result:{ taskId, executionStatus: "completed", modelOutput, actualModel }, or{ taskId, executionStatus: "failed", error }. Repeat untildone: true. - Present
report:status,candidates,coverage,stopReason, and the contamination label.
Pitfalls
- Never alter, translate, or "fix" probe prompts or outputs; the scorer handles whitespace differences.
- A result without
actualModelis discarded asmodel_unverified; execution failures are retried, never counted as copy failures. status: "conflict"means several vendor families confirmed — report them all, do not pick one.status: "unknown"is inconclusive — the fingerprint set is small; it does not prove the model is genuine.- If
npxfails, check Node.js ≥ 20 is installed; on restricted networks retry with a proxy.
Verification
A completed scan produces status: "match" with candidates[0].vendor (the likely vendor family), plus per-token evidence. Cross-check that evidence outcomes are copy_failed (confirmed twice) and that inconclusive outcomes (request_failed, execution_failed, model_unverified) are not presented as copy failures.