Files
cluster-knaster/core/src/knaster/budget.py
T

37 lines
933 B
Python

"""Token-Budget: Passt Prompt + Ausgabe in den effektiven Kontext eines Slots?"""
from __future__ import annotations
import math
from collections.abc import Callable
from dataclasses import dataclass
MESSAGE_OVERHEAD = 64
Tokenizer = Callable[[str], int]
def estimate_tokens(text: str) -> int:
"""Konservative Schätzung (eher zu hoch): ~3 Zeichen pro Token."""
return math.ceil(len(text) / 3)
@dataclass(frozen=True)
class Budget:
prompt_tokens: int
output_tokens: int
limit: int
@property
def required(self) -> int:
return self.prompt_tokens + self.output_tokens + MESSAGE_OVERHEAD
@property
def fits(self) -> bool:
return self.required <= self.limit
def compute(system: str, user: str, max_output_tokens: int, limit: int,
tokenizer: Tokenizer = estimate_tokens) -> Budget:
return Budget(tokenizer(system) + tokenizer(user), max_output_tokens, limit)