parent
dbb085c371
commit
f43e6787fd
@ -0,0 +1,85 @@
|
||||
import traceback
|
||||
|
||||
from loguru import logger
|
||||
|
||||
from swarms.utils.litellm_tokenizer import count_tokens
|
||||
from typing import Optional
|
||||
|
||||
|
||||
def dynamic_auto_chunking_(
|
||||
content: str,
|
||||
context_length: Optional[int] = 8192,
|
||||
tokenizer_model_name: Optional[str] = "gpt-4.1",
|
||||
):
|
||||
"""
|
||||
Dynamically chunk the conversation history to fit within the context length.
|
||||
|
||||
Args:
|
||||
content (str): The conversation history as a string.
|
||||
context_length (int): The maximum number of tokens allowed.
|
||||
tokenizer_model_name (str): The name of the tokenizer model to use.
|
||||
|
||||
Returns:
|
||||
str: The chunked conversation history as a string that fits within context_length tokens.
|
||||
"""
|
||||
total_tokens = count_tokens(
|
||||
text=content, model=tokenizer_model_name
|
||||
)
|
||||
|
||||
if total_tokens <= context_length:
|
||||
return content
|
||||
|
||||
# We need to remove characters from the beginning until we're under the limit
|
||||
# Start by removing a percentage of characters and adjust iteratively
|
||||
target_tokens = context_length
|
||||
current_string = content
|
||||
|
||||
# Binary search approach to find the right cutoff point
|
||||
left, right = 0, len(content)
|
||||
|
||||
while left < right:
|
||||
mid = (left + right) // 2
|
||||
test_string = content[mid:]
|
||||
|
||||
if not test_string:
|
||||
break
|
||||
|
||||
test_tokens = count_tokens(
|
||||
text=test_string, model=tokenizer_model_name
|
||||
)
|
||||
|
||||
if test_tokens <= target_tokens:
|
||||
# We can remove more from the beginning
|
||||
right = mid
|
||||
current_string = test_string
|
||||
else:
|
||||
# We need to keep more from the beginning
|
||||
left = mid + 1
|
||||
|
||||
return current_string
|
||||
|
||||
|
||||
def dynamic_auto_chunking(
|
||||
content: str,
|
||||
context_length: Optional[int] = 8192,
|
||||
tokenizer_model_name: Optional[str] = "gpt-4.1",
|
||||
):
|
||||
"""
|
||||
Dynamically chunk the conversation history to fit within the context length.
|
||||
|
||||
Args:
|
||||
content (str): The conversation history as a string.
|
||||
context_length (int): The maximum number of tokens allowed.
|
||||
tokenizer_model_name (str): The name of the tokenizer model to use.
|
||||
"""
|
||||
try:
|
||||
return dynamic_auto_chunking_(
|
||||
content=content,
|
||||
context_length=context_length,
|
||||
tokenizer_model_name=tokenizer_model_name,
|
||||
)
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
f"Dynamic auto chunking failed: {e} Traceback: {traceback.format_exc()}"
|
||||
)
|
||||
return content
|
Loading…
Reference in new issue