{"record":{"id":"e78562e7de357040","repo":"BerriAI/litellm","slug":"video-create-character-is-not-supported-for-this-p","errorCode":null,"errorMessage":"video create character is not supported for this provider","messagePattern":"video create character is not supported for this provider","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"litellm/llms/base_llm/videos/transformation.py","lineNumber":280,"sourceCode":"        custom_llm_provider: str | None = None,\n    ) -> VideoObject:\n        pass\n\n    def transform_video_create_character_request(\n        self,\n        name: str,\n        video: Any,\n        api_base: str,\n        litellm_params: GenericLiteLLMParams,\n        headers: dict,\n    ) -> tuple[str, list]:\n        \"\"\"\n        Transform the video create character request into a URL and files list (multipart).\n\n        Returns:\n            Tuple[str, list]: (url, files_list) for the multipart POST request\n        \"\"\"\n        raise NotImplementedError(\"video create character is not supported for this provider\")\n\n    def transform_video_create_character_response(\n        self,\n        raw_response: httpx.Response,\n        logging_obj: LiteLLMLoggingObj,\n    ) -> CharacterObject:\n        raise NotImplementedError(\"video create character is not supported for this provider\")\n\n    def transform_video_get_character_request(\n        self,\n        character_id: str,\n        api_base: str,\n        litellm_params: GenericLiteLLMParams,\n        headers: dict,\n    ) -> tuple[str, dict]:\n        \"\"\"\n        Transform the video get character request into a URL and params.\n","sourceCodeStart":262,"sourceCodeEnd":298,"githubUrl":"https://github.com/BerriAI/litellm/blob/6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d/litellm/llms/base_llm/videos/transformation.py#L262-L298","documentation":"BaseVideosConfig.transform_video_create_character_request() is only implemented by providers that support character creation for video generation (uploading a reference character image as multipart). The base class deliberately raises NotImplementedError('video create character is not supported for this provider') so unsupported providers fail loudly instead of silently producing garbage. Hitting it means the configured video provider has no character API.","triggerScenarios":"Calling the video character-create path (e.g. litellm's video character upload/create) against a provider whose config does not override transform_video_create_character_request — e.g. a provider that only supports text-to-video.","commonSituations":"Assuming every video provider supports character reuse because one (e.g. a Chinese video provider with character APIs) does; porting character-based workflows to a new provider; feature-detection missing before calling character endpoints.","solutions":["Check the provider's documentation/config for character support before calling character endpoints; use a provider that implements the character API.","Feature-test at startup: `hasattr`/override check on the provider config's transform_video_create_character_request versus the base, and disable the character flow if unsupported.","Fall back to prompt-only video generation (no character reference) when the provider lacks support."],"exampleFix":"# before\nawait litellm.acreate_video_character(provider=\"myvid\", name=\"hero\", video=img)  # NotImplementedError\n\n# after: feature-check then fall back\nfrom litellm.llms.base_llm.videos.transformation import BaseVideosConfig\n\ncfg = get_videos_config(\"myvid\")\nif type(cfg).transform_video_create_character_request is BaseVideosConfig.transform_video_create_character_request:\n    job = await litellm.avideo_generate(model=\"myvid/model-a\", prompt=\"a hero like the reference\")\nelse:\n    char = await litellm.acreate_video_character(provider=\"myvid\", name=\"hero\", video=img)","handlingStrategy":"type-guard","validationCode":"from litellm.llms.base_llm.videos.transformation import BaseVideosConfig\n\ndef provider_supports_characters(cfg: BaseVideosConfig) -> bool:\n    return type(cfg).transform_video_create_character_request is not BaseVideosConfig.transform_video_create_character_request","typeGuard":"from litellm.llms.base_llm.videos.transformation import BaseVideosConfig\n\ndef provider_supports_characters(cfg: BaseVideosConfig) -> bool:\n    return (\n        type(cfg).transform_video_create_character_request\n        is not BaseVideosConfig.transform_video_create_character_request\n    )","tryCatchPattern":"try:\n    char = await litellm.acreate_video_character(provider=p, name=n, video=img)\nexcept NotImplementedError:\n    job = await litellm.avideo_generate(model=m, prompt=f\"a character named {n}\")  # prompt-only fallback","preventionTips":["Check provider capability matrices before adopting character APIs.","Gate character features behind a runtime capability check on the config class."],"tags":["video-generation","not-implemented","feature-support","litellm"],"backgroundTag":null,"analyzedSha":"6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d","analyzedAt":"2026-08-15T07:12:03.035Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}