{"record":{"id":"222c16c382b1c662","repo":"langgenius/dify","slug":"completion-request-error-222c16","errorCode":"completion_request_error","errorMessage":"Completion request failed.","messagePattern":"Completion request failed\\.","errorType":"error_code","errorClass":"CompletionRequestError","httpStatus":400,"severity":"error","filePath":"api/controllers/console/explore/message.py","lineNumber":191,"sourceCode":"                user=current_user,\n                message_id=message_id_str,\n                invoke_from=InvokeFrom.EXPLORE,\n                streaming=streaming,\n            )\n            # response-contract:ignore compact_generate_response\n            return helper.compact_generate_response(response)\n        except MessageNotExistsError:\n            raise NotFound(\"Message Not Exists.\")\n        except MoreLikeThisDisabledError:\n            raise AppMoreLikeThisDisabledError()\n        except ProviderTokenNotInitError as ex:\n            raise ProviderNotInitializeError(ex.description)\n        except QuotaExceededError:\n            raise ProviderQuotaExceededError()\n        except ModelCurrentlyNotSupportError:\n            raise ProviderModelCurrentlyNotSupportError()\n        except InvokeError as e:\n            raise CompletionRequestError(e.description)\n        except ValueError as e:\n            raise e\n        except Exception:\n            logger.exception(\"internal server error.\")\n            raise InternalServerError()\n\n\n@console_ns.route(\n    \"/installed-apps/<uuid:installed_app_id>/messages/<uuid:message_id>/suggested-questions\",\n    endpoint=\"installed_app_suggested_question\",\n)\nclass MessageSuggestedQuestionApi(InstalledAppResource):\n    @console_ns.response(200, \"Success\", console_ns.models[SuggestedQuestionsResponse.__name__])\n    @with_current_user\n    def get(self, current_user: Account, installed_app: InstalledApp, message_id: UUID):\n        app_model = installed_app.app_with_session(session=db.session())\n        if app_model is None:\n            raise AppUnavailableError()","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/langgenius/dify/blob/ef8544b173fd6cd7a8e71df2cab576e52bebbfbc/api/controllers/console/explore/message.py#L173-L209","documentation":"HTTP 400 with error_code completion_request_error, raised when generate_more_like_this raises an InvokeError from the model runtime. The provider was reached and credentials are valid, but the actual completion invocation failed.","triggerScenarios":"GET more-like-this where the underlying provider invoke() raised InvokeError — network error mid-call, provider 4xx/5xx, malformed request, content-policy rejection, or context-length exceeded. The controller maps InvokeError.description to CompletionRequestError(400).","commonSituations":"Provider outage or transient error; prompt+context exceeding the model's token limit; content filter rejection; rate limit (provider-side, distinct from hosted quota); model deprecation.","solutions":["Retry once with backoff for transient provider errors.","Reduce input length (trim the source message/context) to fit the model window.","Inspect ex.description (logged server-side) to distinguish content-policy vs. token-limit vs. provider-5xx.","Switch to a fallback model/provider if the primary keeps failing.","Verify the provider's own dashboard shows the request reaching it."],"exampleFix":"# before: single shot, no retry\nresp = get(more_like_this_url(id, mid))\n\n# after: bounded retry with backoff, then fallback model\nfor attempt in range(3):\n    try:\n        resp = get(more_like_this_url(id, mid)); break\n    except CompletionRequestError:\n        sleep(2 ** attempt)\nelse:\n    switch_model(); resp = get(more_like_this_url(id, mid))","handlingStrategy":"retry","validationCode":"// No purely client-side validation prevents provider invoke failures;\n// preflight only checks credentials/quota/model (errors 755-757)\nif (!providerConfigured(app, providers)) return; // avoids 755, not 758","typeGuard":null,"tryCatchPattern":"for (let attempt = 0; attempt < 3; attempt++) {\n  try {\n    return await get(moreLikeThisUrl(id, mid));\n  } catch (e) {\n    if (e.code === 'completion_request_error' && attempt < 2) {\n      await sleep(2 ** attempt * 500); // backoff for transient provider errors\n      continue;\n    }\n    if (e.code === 'completion_request_error') {\n      await switchToFallbackModel(id);\n      return get(moreLikeThisUrl(id, mid));\n    }\n    throw e;\n  }\n}","preventionTips":["Retry with exponential backoff for transient InvokeError causes.","Trim source message/context to stay within the model token window.","Keep a fallback model/provider configured.","Inspect server logs (ex.description) to classify the underlying cause."],"tags":["rest-api","explore","provider","invoke","more-like-this","transient","dify"],"backgroundTag":null,"analyzedSha":"ef8544b173fd6cd7a8e71df2cab576e52bebbfbc","analyzedAt":"2026-08-12T05:15:17.394Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}