HKUDS/DeepTutor · error · GenerationProviderError
No endpoint URL configured for image generation.
Error message
No endpoint URL configured for image generation.
What it means
Raised by ChatCompletionsImagegenAdapter.generate when ImagegenConfig.base_url is empty. The adapter builds the request URL as join_api_path(config.base_url, 'chat/completions'), so without a base URL there is no endpoint to POST the image-generation chat request to.
Source
Thrown at deeptutor/services/imagegen/adapters/chat_completions.py:42
GenerationProviderError,
build_auth_headers,
join_api_path,
raise_for_provider,
)
from deeptutor.services.imagegen.base import BaseImagegenAdapter
from deeptutor.services.imagegen.config import ImagegenConfig
logger = logging.getLogger(__name__)
class ChatCompletionsImagegenAdapter(BaseImagegenAdapter):
"""POST ``{base}/chat/completions`` with image modalities; collect image bytes."""
async def generate(
self, prompt: str, config: ImagegenConfig, *, n: int = 1
) -> list[tuple[bytes, str]]:
if not config.base_url:
raise GenerationProviderError("No endpoint URL configured for image generation.")
url = join_api_path(config.base_url, "chat/completions")
headers = {
"Content-Type": "application/json",
**build_auth_headers(config.auth_style, config.api_key),
**(config.extra_headers or {}),
}
payload: dict[str, Any] = {
"model": config.model,
"messages": [{"role": "user", "content": prompt}],
"modalities": ["image", "text"],
}
logger.debug("imagegen(chat) url=%s model=%s", url, config.model)
try:
async with httpx.AsyncClient(timeout=config.request_timeout) as client:
resp = await client.post(url, headers=headers, json=payload)
raise_for_provider(resp, "Image generation")
images = [View on GitHub (pinned to 3e82f13042)
Solutions
- Set base_url on the ImagegenConfig passed to generate() (e.g. https://api.openai.com/v1 or your OpenAI-compatible host)
- Check the imagegen provider entry in data/user/settings/*.json or the relevant env var for a missing/misspelled base URL key
- If the provider has no chat-completions image endpoint, switch to a provider type that uses /images/generations (OpenAICompatImagegenAdapter)
Example fix
// before config = ImagegenConfig(base_url=None, api_key=key) // after config = ImagegenConfig(base_url="https://api.openai.com/v1", api_key=key)
Defensive patterns
Strategy: validation
Validate before calling
def validate_imagegen_config(config):
if not config.base_url:
raise ValueError("ImagegenConfig.base_url is required before generate()")
if not config.api_key:
raise ValueError("ImagegenConfig.api_key is required") Type guard
def has_base_url(config) -> bool:
return isinstance(getattr(config, "base_url", None), str) and config.base_url.strip() != "" Prevention
- Validate base_url/api_key at config load time, not at request time
- Fail fast on startup with a clear message when the imagegen provider entry lacks a base URL
When it happens
Trigger: Calling generate() with an ImagegenConfig whose base_url is None or '' — e.g. the provider config was loaded from settings/env and the base URL key was omitted or named incorrectly, or a generic OpenAI-compatible imagegen provider was selected without specifying its API host.
Common situations: Missing IMAGEGEN_BASE_URL-style env var, typo in the provider settings JSON (data/user/settings/*.json), assuming the LLM chat provider's base URL is reused for imagegen when it is a separate config field.
Related errors
- No endpoint URL configured for image generation.
- No embedding model is configured. Set up the embedding profi
- Prompt key '{key}' missing or empty in loaded book prompt bu
- {exc}
- Image generation request error: {exc}
AI-assisted analysis of HKUDS/DeepTutor@3e82f13042 (2026-08-27).
Data as JSON: /api/errors/8c76eb0e5b07d8e3.
Report an issue: GitHub.