aidial_assistant/application/addons_dialogue_limiter.py (31 lines of code) (raw):
from typing_extensions import override
from aidial_assistant.chain.command_chain import (
LimitExceededException,
ModelRequestLimiter,
)
from aidial_assistant.model.model_client import (
ChatCompletionMessageParam,
ModelClient,
)
class AddonsDialogueLimiter(ModelRequestLimiter):
def __init__(self, max_dialogue_tokens: int, model_client: ModelClient):
self.max_dialogue_tokens = max_dialogue_tokens
self.model_client = model_client
self._dialogue_tokens = 0
self._initial_tokens: int | None = None
@override
async def verify_limit(self, messages: list[ChatCompletionMessageParam]):
if self._initial_tokens is None:
self._initial_tokens = await self.model_client.count_tokens(
messages
)
return
self._dialogue_tokens = (
await self.model_client.count_tokens(messages)
- self._initial_tokens
)
if self._dialogue_tokens > self.max_dialogue_tokens:
raise LimitExceededException(
f"Addons dialogue limit exceeded. Max tokens: {self.max_dialogue_tokens},"
f" actual tokens: {self._dialogue_tokens}."
)