{"record":{"id":"f835444dcf3bf153","repo":"BerriAI/litellm","slug":"output-s3-uri-cannot-be-empty-for-async-invoke-req","errorCode":null,"errorMessage":"output_s3_uri cannot be empty for async invoke requests","messagePattern":"output_s3_uri cannot be empty for async invoke requests","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/llms/bedrock/embed/twelvelabs_marengo_transformation.py","lineNumber":181,"sourceCode":"\n        Args:\n            model_input: The transformed TwelveLabs Marengo embedding request\n            model_id: The model identifier (without async_invoke prefix)\n            output_s3_uri: Optional S3 URI for output data config\n\n        Returns:\n            TwelveLabsAsyncInvokeRequest: The wrapped async invoke request\n        \"\"\"\n        import urllib.parse\n\n        # Clean the model ID\n        unquoted_model_id = urllib.parse.unquote(model_id)\n        if unquoted_model_id.startswith(\"async_invoke/\"):\n            unquoted_model_id = unquoted_model_id.replace(\"async_invoke/\", \"\")\n\n        # Validate that the S3 URI is not empty\n        if not output_s3_uri or output_s3_uri.strip() == \"\":\n            raise ValueError(\"output_s3_uri cannot be empty for async invoke requests\")\n\n        return TwelveLabsAsyncInvokeRequest(\n            modelId=unquoted_model_id,\n            modelInput=model_input,\n            outputDataConfig=TwelveLabsOutputDataConfig(\n                s3OutputDataConfig=TwelveLabsS3OutputDataConfig(s3Uri=output_s3_uri)\n            ),\n        )\n\n    def _transform_response(self, response_list: list[dict], model: str) -> EmbeddingResponse:\n        \"\"\"\n        Transform TwelveLabs response to OpenAI format.\n        Handles the actual TwelveLabs response format: {\"data\": [{\"embedding\": [...]}]}\n        \"\"\"\n        embeddings: Final[list[Embedding]] = []\n        total_tokens = 0\n\n        for response in response_list:","sourceCodeStart":163,"sourceCodeEnd":199,"githubUrl":"https://github.com/BerriAI/litellm/blob/6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d/litellm/llms/bedrock/embed/twelvelabs_marengo_transformation.py#L163-L199","documentation":"Bedrock's async-invoke API requires an outputDataConfig with an S3 location where the (potentially large) result is written. TwelveLabsMarengoEmbeddingConfig._transform_async_invoke_request validates output_s3_uri before wrapping the request and rejects empty/whitespace values.","triggerScenarios":"Using 'bedrock/async_invoke/twelvelabs.marengo-embed-2.7' without passing output_s3_uri, or passing a whitespace-only string, when constructing the async invoke request.","commonSituations":"Assuming the async result comes back in the HTTP response instead of via S3; wiring output_s3_uri from an env var that is unset in some environments.","solutions":["Pass a valid S3 URI as output_s3_uri, e.g. 's3://my-bucket/embeddings-output/'.","Ensure the Bedrock principal has s3:PutObject access to that bucket/prefix.","Set the env var / config feeding output_s3_uri in every environment that uses async invoke."],"exampleFix":"# before\nlitellm.embedding(model=\"bedrock/async_invoke/twelvelabs.marengo-embed-2.7\", input=[url], input_type=\"video\")\n\n# after\nlitellm.embedding(\n    model=\"bedrock/async_invoke/twelvelabs.marengo-embed-2.7\",\n    input=[url],\n    input_type=\"video\",\n    output_s3_uri=\"s3://my-bucket/embeddings-out/\",\n)","handlingStrategy":"validation","validationCode":"def validate_async_invoke(output_s3_uri: str | None):\n    if not output_s3_uri or not output_s3_uri.strip():\n        raise ValueError(\"output_s3_uri required\")\n    if not output_s3_uri.startswith(\"s3://\"):\n        raise ValueError(\"output_s3_uri must be an s3:// URI\")","typeGuard":"def is_valid_s3_uri(uri: str | None) -> bool:\n    import re\n    return bool(uri) and bool(re.match(r\"^s3://[^/\\s]+/.+\", uri.strip()))","tryCatchPattern":null,"preventionTips":["Provision a dedicated output bucket/prefix per environment.","Verify s3:PutObject for the Bedrock service role on that prefix."],"tags":["bedrock","twelvelabs","async-invoke","s3","validation"],"backgroundTag":null,"analyzedSha":"6c2dcb801bf2b75c18f1bb24140e7cf57465cc4d","analyzedAt":"2026-08-15T07:12:03.035Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}