{"record":{"id":"b7fe5277133d3c16","repo":"langgenius/dify","slug":"provider-quota-exceeded-b7fe52","errorCode":"provider_quota_exceeded","errorMessage":"Your quota for Dify Hosted Model Provider has been exhausted. Please go to Settings -> Model Provider to complete your own provider credentials.","messagePattern":"Your quota for Dify Hosted Model Provider has been exhausted\\. Please go to Settings -> Model Provider to complete your own provider credentials\\.","errorType":"console","errorClass":"ProviderQuotaExceededError","httpStatus":400,"severity":"error","filePath":"api/controllers/console/explore/completion.py","lineNumber":136,"sourceCode":"                user=current_user,\n                args=args,\n                invoke_from=InvokeFrom.EXPLORE,\n                streaming=streaming,\n            )\n\n            # response-contract:ignore compact_generate_response\n            return helper.compact_generate_response(response)\n        except services.errors.conversation.ConversationNotExistsError:\n            raise NotFound(\"Conversation Not Exists.\")\n        except services.errors.conversation.ConversationCompletedError:\n            raise ConversationCompletedError()\n        except services.errors.app_model_config.AppModelConfigBrokenError:\n            logger.exception(\"App model config broken.\")\n            raise AppUnavailableError()\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>/completion-messages/<string:task_id>/stop\",\n    endpoint=\"installed_app_stop_completion\",\n)\nclass CompletionStopApi(InstalledAppResource):\n    @console_ns.response(200, \"Success\", console_ns.models[SimpleResultResponse.__name__])\n    @with_current_user_id","sourceCodeStart":118,"sourceCodeEnd":154,"githubUrl":"https://github.com/langgenius/dify/blob/ef8544b173fd6cd7a8e71df2cab576e52bebbfbc/api/controllers/console/explore/completion.py#L118-L154","documentation":"Raised by CompletionApi.post (HTTP 400, error_code 'provider_quota_exceeded') when core.errors.error.QuotaExceededError is thrown. The Dify-hosted model provider quota (free trial allowance) for the tenant has been exhausted. The controller maps this to a client-facing error directing the user to set up their own provider credentials.","triggerScenarios":"POST /console/installed-apps/<id>/completion-messages where the app uses a Dify-hosted provider whose token/call quota is used up. The hosted provider rejects the call and QuotaExceededError propagates up.","commonSituations":"Free-tier tenant exceeded the hosted OpenAI trial allowance; many users on one tenant drained the shared quota; long-running testing/eval burned through trial tokens; no BYO credentials configured so all traffic hits the hosted pool.","solutions":["Configure your own provider credentials in Settings -> Model Provider to stop using the hosted pool.","Update the app to use a model backed by your own credentials.","Request a quota increase or upgrade the Dify plan if dependent on hosted providers.","Audit which apps/users consume the most hosted quota and throttle them."],"exampleFix":"# before: app pinned to Dify-hosted OpenAI; quota exhausted\n# (completion-messages returns provider_quota_exceeded)\n\n# after: switch the app model to your own provider\n# Studio -> App -> Model -> select your OpenAI key -> Save & Publish\n# then retry","handlingStrategy":"try-catch","validationCode":"// If a quota endpoint exists, check remaining hosted quota before posting; otherwise,\n// gate usage on a client-side budget counter and stop when near the limit.\nif (hostedQuotaRemaining <= 0) { promptConfigureOwnProvider(); }","typeGuard":"function hasHostedQuota(quotaInfo) {\n  return Number(quotaInfo?.remaining ?? 0) > 0;\n}","tryCatchPattern":"try {\n  await postCompletion(id, payload);\n} catch (err) {\n  if (err.code === 'provider_quota_exceeded') {\n    // stop retrying hosted provider; prompt for BYO credentials\n    promptConfigureOwnProvider();\n  } else { throw err; }\n}","preventionTips":["Set up your own provider credentials before hosted quota runs out.","Monitor hosted quota usage and alert before exhaustion.","Throttle automated/eval workloads away from the hosted pool."],"tags":["explore","completion","model-provider","quota","billing"],"backgroundTag":null,"analyzedSha":"ef8544b173fd6cd7a8e71df2cab576e52bebbfbc","analyzedAt":"2026-08-12T05:15:17.394Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}