deduct_quota_when_message_created.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from configs import dify_config
  2. from core.app.entities.app_invoke_entities import AgentChatAppGenerateEntity, ChatAppGenerateEntity
  3. from core.entities.provider_entities import QuotaUnit
  4. from events.message_event import message_was_created
  5. from extensions.ext_database import db
  6. from models.provider import Provider, ProviderType
  7. @message_was_created.connect
  8. def handle(sender, **kwargs):
  9. message = sender
  10. application_generate_entity = kwargs.get("application_generate_entity")
  11. if not isinstance(application_generate_entity, ChatAppGenerateEntity | AgentChatAppGenerateEntity):
  12. return
  13. model_config = application_generate_entity.model_conf
  14. provider_model_bundle = model_config.provider_model_bundle
  15. provider_configuration = provider_model_bundle.configuration
  16. if provider_configuration.using_provider_type != ProviderType.SYSTEM:
  17. return
  18. system_configuration = provider_configuration.system_configuration
  19. quota_unit = None
  20. for quota_configuration in system_configuration.quota_configurations:
  21. if quota_configuration.quota_type == system_configuration.current_quota_type:
  22. quota_unit = quota_configuration.quota_unit
  23. if quota_configuration.quota_limit == -1:
  24. return
  25. break
  26. used_quota = None
  27. if quota_unit:
  28. if quota_unit == QuotaUnit.TOKENS:
  29. used_quota = message.message_tokens + message.answer_tokens
  30. elif quota_unit == QuotaUnit.CREDITS:
  31. used_quota = dify_config.get_model_credits(model_config.model)
  32. else:
  33. used_quota = 1
  34. if used_quota is not None and system_configuration.current_quota_type is not None:
  35. db.session.query(Provider).filter(
  36. Provider.tenant_id == application_generate_entity.app_config.tenant_id,
  37. Provider.provider_name == model_config.provider,
  38. Provider.provider_type == ProviderType.SYSTEM.value,
  39. Provider.quota_type == system_configuration.current_quota_type.value,
  40. Provider.quota_limit > Provider.quota_used,
  41. ).update({"quota_used": Provider.quota_used + used_quota})
  42. db.session.commit()