| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 | 
							- 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()
 
 
  |