| name | multimedia-backend-integrator |
| description | Reference guide for adding new media generation backends to MassGen's unified generate_media tool. |
Multimedia Backend Integrator
Reference guide for adding new media generation backends to MassGen's unified generate_media tool.
Architecture Overview
_base.py -- Registration: API keys, default models, priority lists
_selector.py -- Auto-selection logic: picks best backend by key + priority
_image.py -- Image backends: OpenAI, Google (Gemini/Imagen), Grok, OpenRouter
_video.py -- Video backends: Grok, Google Veo, OpenAI Sora
_audio.py -- Audio backends: ElevenLabs, OpenAI TTS
generate_media.py -- Entry point: routing, validation, batch mode, image-to-image
Complete Checklist: Adding a New Backend
1. Registration (_base.py)
2. Implementation (_image.py / _video.py / _audio.py)
3. Dispatcher Update
4. Image-to-Image Support (generate_media.py)
5. Documentation
6. Tests
Continuation Store Patterns
Each backend that supports iterative editing needs a continuation mechanism:
| Backend | Store Type | Key Format | What's Stored | How Continuation Works |
|---|
| OpenAI | Stateless (server-side) | response.id | Nothing locally | Pass previous_response_id to next call |
| Gemini | _GeminiChatStore (in-memory) | gemini_chat_{uuid12} | (client, chat) tuples | Reuse chat object for send_message(); client kept alive to prevent HTTP connection GC |
| Grok | _GrokImageStore (in-memory) | grok_img_{uuid12} | Base64 strings | Pass stored base64 as image_url data URI |
Store Pattern Template
class _NewBackendStore:
def __init__(self, max_items: int = 50):
self._store: OrderedDict[str, Any] = OrderedDict()
self._max = max_items
def save(self, data: Any) -> str:
store_id = f"prefix_{uuid.uuid4().hex[:12]}"
if len(self._store) >= self._max:
self._store.popitem(last=False)
self._store[store_id] = data
return store_id
def get(self, store_id: str) -> Any | None:
return self._store.get(store_id)
_store = _NewBackendStore()
Common Pitfalls
- Missing from priority list — Backend works when explicitly specified but never auto-selected
- Sync vs async — Some SDKs are sync-only; wrap in
asyncio.to_thread() if needed
- Ephemeral URLs — Some APIs return temporary URLs; always prefer base64 or download immediately
- Falsy duration —
duration or default treats 0 as falsy; use if duration is not None
- Existing test breakage — Adding to priority list changes auto-selection; update existing tests that clear env vars
- Image-to-image gating — The
_generate_single_with_input_images function has a backend allowlist
Reference Files
| File | Purpose |
|---|
massgen/tool/_multimodal_tools/generation/_base.py | API keys, default models, priorities |
massgen/tool/_multimodal_tools/generation/_selector.py | Backend auto-selection logic |
massgen/tool/_multimodal_tools/generation/_image.py | Image generation backends |
massgen/tool/_multimodal_tools/generation/_video.py | Video generation backends |
massgen/tool/_multimodal_tools/generation/_audio.py | Audio generation backends |
massgen/tool/_multimodal_tools/generation/generate_media.py | Entry point and routing |
massgen/tool/_multimodal_tools/TOOL.md | User-facing documentation |
massgen/tests/test_grok_multimedia_generation.py | Reference: Grok backend tests |
massgen/tests/test_grok_multimedia_backend_selection.py | Reference: Grok selection tests |
massgen/tests/test_multimodal_image_backend_selection.py | Reference: image selection tests |