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

  1. Set base_url on the ImagegenConfig passed to generate() (e.g. https://api.openai.com/v1 or your OpenAI-compatible host)
  2. Check the imagegen provider entry in data/user/settings/*.json or the relevant env var for a missing/misspelled base URL key
  3. 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

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


AI-assisted analysis of HKUDS/DeepTutor@3e82f13042 (2026-08-27). Data as JSON: /api/errors/8c76eb0e5b07d8e3. Report an issue: GitHub.