mcpbeat

Dspy Adapters Multimodal

omidzamani/dspy-adapters-multimodal

Use for DSPy adapter selection, JSONAdapter, XMLAdapter, ChatAdapter, native function calling, structured outputs, and multimodal inputs like dspy.Image or dspy.Audio.

937 tokens
context cost
the whole folder, loaded on every use
2
files
ships runnable scripts
0
copies elsewhere
how many repositories repackaged it
119
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/OmidZamani/dspy-skills --skill dspy-adapters-multimodal

What comes with it

294 bytes besides the instruction
example.py

The instruction itself

9 sections, as written by the author

DSPy Adapters and Multimodal I/O

Goal

Choose an adapter deliberately and model image, audio, and file inputs with DSPy's typed primitives.

Adapter Selection

| 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?")

Native Function Calling

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.

Image Inputs

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(...).

Audio and File Inputs

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.

Best Practices

  • Start with ChatAdapter; switch only for a measured reason.
  • Use typed signatures for structured output.
  • Test adapter behavior against the exact production model.
  • Avoid deprecated Image.from_file() and Image.from_url() helpers; call dspy.Image(...).
  • Keep local file handling and uploaded file IDs within provider policy.
  • Design signatures: dspy-signature-designer
  • Build tool agents: dspy-react-agent-builder

Official Documentation

  • Adapters guide: https://dspy.ai/learn/programming/adapters/
  • Tools guide: https://dspy.ai/learn/programming/tools/
  • XMLAdapter API: https://dspy.ai/api/adapters/XMLAdapter/
  • Image API: https://dspy.ai/api/primitives/Image/
  • Audio API: https://dspy.ai/api/primitives/Audio/

How to use it

Copy the folder

Take omidzamani/dspy-adapters-multimodal from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.