Source code for council.llm.llm_configuration_base
import abc
from typing import Any
from council.utils.parameter import Parameter
_DEFAULT_TIMEOUT = 30
def _tv(x: float):
"""
Temperature Validator
Sampling temperature to use, between 0. and 2.
"""
if x < 0.0 or x > 2.0:
raise ValueError("must be in the range [0.0..2.0]")
def _pv(x: float):
"""
Penalty Validator
Penalty must be between -2.0 and 2.0
"""
if x < -2.0 or x > 2.0:
raise ValueError("must be in the range [-2.0..2.0]")
def _mtv(x: int):
"""
Max Token Validator
Must be positive
"""
if x <= 0:
raise ValueError("must be positive")
[docs]
class LLMConfigurationBase(abc.ABC):
"""
Configuration for OpenAI LLM Chat Completion GPT Model
"""
def __init__(self):
self._temperature = Parameter.float(name="temperature", required=False, default=0.0, validator=_tv)
self._max_tokens = Parameter.int(name="max_tokens", required=False, validator=_mtv)
self._top_p = Parameter.float(name="top_p", required=False)
self._n = Parameter.int(name="n", required=False, default=1)
self._presence_penalty = Parameter.float(name="presence_penalty", required=False, validator=_pv)
self._frequency_penalty = Parameter.float(name="frequency_penalty", required=False, validator=_pv)
@property
def temperature(self) -> Parameter[float]:
"""
temperature settings for the LLM.
Ranges from 0.0 to 2.0.
See: https://platform.openai.com/docs/api-reference/completions/create#completions-create-temperature
"""
return self._temperature
@property
def top_p(self) -> Parameter[float]:
"""
The model only takes into account the tokens with the highest probability mass.
See: https://platform.openai.com/docs/api-reference/completions/create#completions-create-top_p
"""
return self._top_p
@property
def max_tokens(self) -> Parameter[int]:
"""
Limit on number of tokens
See: https://platform.openai.com/docs/api-reference/completions/create#completions-create-max_tokens
"""
return self._max_tokens
@property
def n(self) -> Parameter[int]:
"""
How many completions to generate for each prompt.
See: https://platform.openai.com/docs/api-reference/completions/create#completions-create-n
"""
return self._n
@property
def presence_penalty(self) -> Parameter[float]:
"""
Positive values penalize new tokens based on whether they appear in the text so far,
increasing the model's likelihood to talk about new topics.
Number between -2.0 and 2.0
See: https://platform.openai.com/docs/api-reference/completions/create#completions-create-presence_penalty
"""
return self._presence_penalty
@property
def frequency_penalty(self) -> Parameter[float]:
"""
Positive values penalize new tokens based on their existing frequency in the text so far,
decreasing the model's likelihood to repeat the same line verbatim.
Number between -2.0 and 2.0
See: https://platform.openai.com/docs/api-reference/completions/create#completions-create-frequency_penalty
"""
return self._frequency_penalty
def read_env(self, env_var_prefix: str):
self.temperature.from_env(env_var_prefix + "LLM_TEMPERATURE")
self.max_tokens.from_env(env_var_prefix + "LLM_MAX_TOKENS")
self.top_p.from_env(env_var_prefix + "LLM_TOP_P")
self.n.from_env(env_var_prefix + "LLM_N")
self.presence_penalty.from_env(env_var_prefix + "LLM_PRESENCE_PENALTY")
self.frequency_penalty.from_env(env_var_prefix + "LLM_FREQUENCY_PENALTY")
def build_default_payload(self) -> dict[str, Any]:
payload: dict[str, Any] = {}
def add_param(parameter: Parameter):
if parameter.is_some():
payload.setdefault(parameter.name, parameter.unwrap())
add_param(self._temperature)
add_param(self._max_tokens)
add_param(self._top_p)
add_param(self._n)
add_param(self._presence_penalty)
add_param(self._frequency_penalty)
return payload