Skip to main content

Medical Verification Layer for Multimodal LLMs — composable, auditable guardrails for structured LLM outputs

Project description

VLM-Guard

Medical Verification Layer for Multimodal LLMs.

VLM-Guard is a framework for building rule-based verification layers that catch physically impossible, biologically inconsistent, or logically contradictory outputs from multimodal LLMs — before they reach the end user.

from vlm_guard import GuardrailEngine, BaseRule, RuleResult

# 1. Define a rule
class NoMalariaInTissueRule(BaseRule):
    name = "sample_type_check"
    description = "Malaria requires blood smear, not tissue biopsy"

    def condition(self, analysis, context):
        return (
            analysis.label == "Malaria"
            and "tissue" in context.get("sample_type", "").lower()
        )

    def action(self, analysis, context):
        analysis.label = "Unclear"
        analysis.confidence = "Low"
        return analysis, RuleResult(
            action_taken=True, action_type="block",
            message="Malaria cannot be diagnosed on tissue biopsy"
        )

# 2. Register and run
engine = GuardrailEngine()
engine.register(NoMalariaInTissueRule())

final = engine.apply(analysis, context={"sample_type": "Tissue Biopsy"})

Why

Multimodal LLMs hallucinate confidently. In medical AI, a "hallucination" isn't a funny caption — it's a biologically impossible diagnosis that could lead to real-world harm.

VLM-Guard gives you a composable, auditable rule engine to:

  • Block impossible outputs (malaria in a tissue biopsy)
  • Correct misclassifications (flagellate in blood → trypanosomiasis)
  • Promote clear patterns when the LLM is uncertain
  • Flag ambiguous findings for human review
  • Audit every modification with before/after snapshots

Installation

pip install vlm-guard

For image processing extras:

pip install vlm-guard[image]

Quick Start

1. Define your analysis schema

from vlm_guard import Analysis

result = Analysis(
    label="Malaria",
    confidence="High",
    evidence="Ring forms observed inside RBCs",
    findings="Multiple ring-stage parasites in thin blood smear",
    recommendation="Confirm species with PCR",
    metadata={"severity": "Moderate (++)", "species": "P. falciparum"}
)

2. Build rules

Rules have two methods:

  • condition(analysis, context) — should this rule fire?
  • action(analysis, context) — what to do when it fires
from vlm_guard import BaseRule, RuleResult

class SizeCheckRule(BaseRule):
    name = "size_check"
    description = "Rejects morphometrically impossible descriptions"

    def condition(self, analysis, context):
        text = (analysis.findings + " " + analysis.evidence).lower()
        return "7 μm" in text and "macrophage" in text

    def action(self, analysis, context):
        analysis.label = "Unclear"
        analysis.confidence = "Low"
        return analysis, RuleResult(
            action_taken=True, action_type="block",
            message="RBC-sized structures in macrophage cannot be amastigotes (2-4 μm)"
        )

3. Run the guardrail engine

from vlm_guard import GuardrailEngine

engine = GuardrailEngine()
engine.register(SizeCheckRule())

final, audit = engine.apply_with_audit(result, context={"sample_type": "Bone Marrow"})
print(audit.summary())
# [{"rule": "size_check", "action": "block", "message": "...", "modified": ...}]

4. End-to-end pipeline

from vlm_guard import VLMGuardPipeline
from vlm_guard.llm.parsing import parse_to_analysis
from vlm_guard.image.enhance import ImageEnhancer, EnhancementStrategy

pipeline = VLMGuardPipeline(
    model_fn=my_llm_inference_fn,      # any Callable[[Image, str], str]
    parser_fn=parse_to_analysis,        # built-in JSON parser
    guardrail_engine=engine,
    enhancer_fn=ImageEnhancer(EnhancementStrategy.HIGH_CONTRAST),
)

result = pipeline.run(image, prompt, context={"sample_type": "Blood Smear"})
print(result.analysis.label)       # final label after guardrails
print(result.audit.summary())      # everything that changed

Architecture

                     +-----------+
                     |   Image   |
                     +-----+-----+
                           |
                           v
                +----------+----------+
                |  Enhancement (opt)  |
                +----------+----------+
                           |
                           v
                +----------+----------+
                |  Multimodal LLM     |
                +----------+----------+
                           |
                           v
                +----------+----------+
                |  JSON Parser         |
                +----------+----------+
                           |
                           v
                +----------+----------+
                |  Guardrail Engine    |
                |  +-- Rule 1 (block)  |
                |  +-- Rule 2 (flag)   |
                |  +-- Rule 3 (correct)|
                |  +-- Audit Trail     |
                +----------+----------+
                           |
                           v
                +----------+----------+
                |  Final Analysis      |
                +---------------------+

Plugin System

Domain-specific rule packs can be distributed as plugins:

from vlm_guard import GuardrailEngine
from my_plugin import register_my_rules

engine = GuardrailEngine()
register_my_rules(engine)
from vlm_guard import ntd_microscopy

engine = GuardrailEngine()
ntd_microscopy.register_ntd_rules(engine)

Built-in plugin:

  • vlm_guard.plugins.ntd_microscopy — 12 rule classes for Neglected Tropical Disease microscopy (migrated from NTD-Assist)

Rules

VLM-Guard supports four rule types:

Type Use Case Example
Block Prevent impossible outputs Malaria on tissue biopsy → Unclear
Correct Fix misidentifications Flagellate in macrophage → Leishmaniasis
Promote Upgrade confidence when strong signal Amastigote + tissue → Leishmaniasis
Flag Lower confidence / append to recommendation "Ambiguous morphology, manual review suggested"

Extending

VLM-Guard is model-agnostic. The pipeline accepts any Callable[[Image, str], str]:

  • HuggingFace transformers models
  • OpenAI / Anthropic API clients
  • Local GGUF inference
  • Mock models for testing

License

MIT

Citation

@software{vlmguard2026,
  title = {VLM-Guard: Verification Layer for Multimodal LLMs},
  author = {Fakhry, Mohamed},
  year = {2026},
  url = {https://github.com/MohamedFakhry2007/vlm-guard}
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vlm_guard-0.1.2.tar.gz (25.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vlm_guard-0.1.2-py3-none-any.whl (26.0 kB view details)

Uploaded Python 3

File details

Details for the file vlm_guard-0.1.2.tar.gz.

File metadata

  • Download URL: vlm_guard-0.1.2.tar.gz
  • Upload date:
  • Size: 25.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for vlm_guard-0.1.2.tar.gz
Algorithm Hash digest
SHA256 c6be0b346152856e7e48727b7481448ee5ac1f7c989dbd108a91b61dc8745e05
MD5 5be610fa42216677b0e66e27a8ca98a2
BLAKE2b-256 22715b30953c76c4599a4d13139a27930446754fb1aaaaa67488f65099caac59

See more details on using hashes here.

File details

Details for the file vlm_guard-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: vlm_guard-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 26.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for vlm_guard-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 11e240f22fc1b2e4d6dac142fd0dcb2f4828da5874ebb39d9f9062528f0e4b26
MD5 f7a4eb329d612b94342d0e7d54f755f6
BLAKE2b-256 83ff0e1b7ef06ae3ba3a9039c628fd8279447e3a16fc070a66bee5589b431490

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page