| from core.app.entities.app_invoke_entities import AgentChatAppGenerateEntity, ChatAppGenerateEntity |
| from core.entities.provider_entities import QuotaUnit |
| 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 |
|
|
| 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 = 1 |
|
|
| if "gpt-4" in model_config.model: |
| used_quota = 20 |
| else: |
| used_quota = 1 |
|
|
| if used_quota is not None: |
| db.session.query(Provider).filter( |
| Provider.tenant_id == application_generate_entity.app_config.tenant_id, |
| Provider.provider_name == model_config.provider, |
| 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}) |
| db.session.commit() |
|
|