dspy-adapters-multimodal — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited dspy-adapters-multimodal (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Choose an adapter deliberately and model image, audio, and file inputs with DSPy's typed primitives.
| Adapter | Use it for |
|---|---|
dspy.ChatAdapter() | Default, human-readable field markers, broad model compatibility |
dspy.JSONAdapter() | Structured JSON output and native function calling where supported |
dspy.XMLAdapter() | XML-tagged fields when XML is easier for the target LM to follow |
dspy.TwoStepAdapter() | A separate extraction pass when parsing needs extra help |
Configure globally or for a limited scope:
import dspy
dspy.configure(
lm=dspy.LM("openai/gpt-4o-mini"),
adapter=dspy.JSONAdapter(),
)
with dspy.context(adapter=dspy.XMLAdapter()):
result = dspy.Predict("question -> answer")(question="What is DSPy?")JSONAdapter enables native function calling by default. ChatAdapter keeps text parsing by default. Override either behavior explicitly:
chat_native = dspy.ChatAdapter(use_native_function_calling=True)
json_manual = dspy.JSONAdapter(use_native_function_calling=False)DSPy falls back to manual parsing when the configured LM does not support native function calling.
class DescribeImage(dspy.Signature):
image: dspy.Image = dspy.InputField()
description: str = dspy.OutputField()
describe = dspy.Predict(DescribeImage)
result = describe(image=dspy.Image("./diagram.png"))Pass a local path, HTTP URL, bytes, PIL image, or existing data URI directly to dspy.Image(...).
class SummarizeAudio(dspy.Signature):
audio: dspy.Audio = dspy.InputField()
summary: str = dspy.OutputField()
audio = dspy.Audio.from_file("./meeting.wav")
summary = dspy.Predict(SummarizeAudio)(audio=audio)class SummarizeFile(dspy.Signature):
file: dspy.File = dspy.InputField()
summary: str = dspy.OutputField()
document = dspy.File.from_path("./research.pdf")
summary = dspy.Predict(SummarizeFile)(file=document)Provider capabilities vary. Verify that the selected model accepts the media type before deployment.
ChatAdapter; switch only for a measured reason.Image.from_file() and Image.from_url() helpers; call dspy.Image(...).~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.