deduct_quota_when_messaeg_created.py 2.1 KB

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