Skip to main content

Multimodal

SynapseKit v1.0.0 adds first-class support for multimodal content: images, audio, and mixed-content messages that work across providers.

ImageContent

Create image payloads from files, URLs, or base64 data:

from synapsekit import ImageContent

# From a local file
img = ImageContent.from_file("photo.jpg")

# From a URL
img = ImageContent.from_url("https://example.com/image.png")

# From base64 data
img = ImageContent.from_base64(base64_string, media_type="image/png")

Convert to provider-specific formats:

# For OpenAI
openai_content = img.to_openai_format()
# {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}}

# For Anthropic
anthropic_content = img.to_anthropic_format()
# {"type": "image", "source": {"type": "base64", "media_type": "image/jpeg", "data": "..."}}

AudioContent

Create audio payloads from files or base64 data:

from synapsekit import AudioContent

# From a local file
audio = AudioContent.from_file("recording.mp3")

# From base64 data
audio = AudioContent.from_base64(base64_string, media_type="audio/mp3")

MultimodalMessage

Compose messages with mixed content types and convert to provider formats:

from synapsekit import MultimodalMessage, ImageContent

msg = MultimodalMessage(
role="user",
content=[
"What do you see in this image?",
ImageContent.from_file("photo.jpg"),
],
)

# Convert to OpenAI format
openai_messages = msg.to_openai_messages()
# [{"role": "user", "content": [{"type": "text", "text": "What do you see..."}, {"type": "image_url", ...}]}]

# Convert to Anthropic format
anthropic_messages = msg.to_anthropic_messages()
# [{"role": "user", "content": [{"type": "text", "text": "What do you see..."}, {"type": "image", ...}]}]

Multiple images

msg = MultimodalMessage(
role="user",
content=[
"Compare these two images:",
ImageContent.from_file("before.jpg"),
ImageContent.from_file("after.jpg"),
],
)

Mixed content types

msg = MultimodalMessage(
role="user",
content=[
"Describe this image and transcribe the audio:",
ImageContent.from_url("https://example.com/chart.png"),
AudioContent.from_file("narration.mp3"),
],
)

ImageLoader

Load images with optional AI-powered descriptions using a vision LLM:

from synapsekit import ImageLoader

loader = ImageLoader()

# Basic load (returns ImageContent)
image = loader.load("photo.jpg")

# Async load
image = await loader.async_load("photo.jpg")

# With vision LLM description
loader = ImageLoader(llm=vision_llm)
image = loader.load("chart.png")
print(image.description) # "A bar chart showing Q4 revenue by region..."

API Markers

v1.0.0 also introduces API stability markers:

from synapsekit import public_api, experimental, deprecated

@public_api
class RAGPipeline:
"""Stable public API — will not break in minor versions."""
...

@experimental
class A2AServer:
"""Experimental — API may change in minor versions."""
...

@deprecated(reason="Use MultimodalMessage instead", alternative="MultimodalMessage")
class LegacyImageMessage:
"""Deprecated — will be removed in a future version."""
...
  • @public_api — stable, follows semver
  • @experimental — may change without notice
  • @deprecated(reason, alternative) — scheduled for removal, with migration guidance