deduct_quota_when_message_created.py 2.5 KB

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