- from datetime import UTC, datetime
 - 
 - from configs import dify_config
 - from core.app.entities.app_invoke_entities import AgentChatAppGenerateEntity, ChatAppGenerateEntity
 - from core.entities.provider_entities import QuotaUnit
 - from core.plugin.entities.plugin import ModelProviderID
 - from events.message_event import message_was_created
 - from extensions.ext_database import db
 - from models.provider import Provider, ProviderType
 - 
 - 
 - @message_was_created.connect
 - def handle(sender, **kwargs):
 -     message = sender
 -     application_generate_entity = kwargs.get("application_generate_entity")
 - 
 -     if not isinstance(application_generate_entity, ChatAppGenerateEntity | AgentChatAppGenerateEntity):
 -         return
 - 
 -     model_config = application_generate_entity.model_conf
 -     provider_model_bundle = model_config.provider_model_bundle
 -     provider_configuration = provider_model_bundle.configuration
 - 
 -     if provider_configuration.using_provider_type != ProviderType.SYSTEM:
 -         return
 - 
 -     system_configuration = provider_configuration.system_configuration
 - 
 -     if not system_configuration.current_quota_type:
 -         return
 - 
 -     quota_unit = None
 -     for quota_configuration in system_configuration.quota_configurations:
 -         if quota_configuration.quota_type == system_configuration.current_quota_type:
 -             quota_unit = quota_configuration.quota_unit
 - 
 -             if quota_configuration.quota_limit == -1:
 -                 return
 - 
 -             break
 - 
 -     used_quota = None
 -     if quota_unit:
 -         if quota_unit == QuotaUnit.TOKENS:
 -             used_quota = message.message_tokens + message.answer_tokens
 -         elif quota_unit == QuotaUnit.CREDITS:
 -             used_quota = dify_config.get_model_credits(model_config.model)
 -         else:
 -             used_quota = 1
 - 
 -     if used_quota is not None and system_configuration.current_quota_type is not None:
 -         db.session.query(Provider).filter(
 -             Provider.tenant_id == application_generate_entity.app_config.tenant_id,
 -             # TODO: Use provider name with prefix after the data migration.
 -             Provider.provider_name == ModelProviderID(model_config.provider).provider_name,
 -             Provider.provider_type == ProviderType.SYSTEM.value,
 -             Provider.quota_type == system_configuration.current_quota_type.value,
 -             Provider.quota_limit > Provider.quota_used,
 -         ).update(
 -             {
 -                 "quota_used": Provider.quota_used + used_quota,
 -                 "last_used": datetime.now(tz=UTC).replace(tzinfo=None),
 -             }
 -         )
 -         db.session.commit()
 
 
  |