Summary
Six parameter mapper classes at the protocol/provider level implement the identical validate-then-set pattern, differing only in the target field name.
Current Code (repeated 6 times)
class TemperatureMapper(ParameterMapper):
"""Map temperature to Chat Completions temperature field."""
def map(self, request: dict[str, Any], value: object, model: Model) -> dict[str, Any]:
validated_value = self._validate_value(value, model)
if validated_value is None:
return request
request["temperature"] = validated_value # only this line differs
return request
Duplicated for: temperature, max_tokens (chatcompletions), temperature, max_output_tokens (openresponses), temperature, max_tokens (cohere).
Proposed Change
Add SimpleFieldMapper to src/celeste/parameters.py:
class SimpleFieldMapper(ParameterMapper):
"""Maps a parameter directly to a request field after validation."""
field: str
def map(self, request: dict[str, Any], value: Any, model: Model) -> dict[str, Any]:
validated_value = self._validate_value(value, model)
if validated_value is None:
return request
request[self.field] = validated_value
return request
Each simple mapper becomes a 2-line class:
class TemperatureMapper(SimpleFieldMapper):
field = "temperature"
Modality-level wrappers (e.g., modalities/text/providers/groq/parameters.py) are unchanged - they already just set name and inherit the protocol mapper.
Files to Modify
src/celeste/parameters.py (add SimpleFieldMapper)
src/celeste/protocols/chatcompletions/parameters.py (TemperatureMapper, MaxTokensMapper)
src/celeste/protocols/openresponses/parameters.py (TemperatureMapper, MaxOutputTokensMapper)
src/celeste/providers/cohere/chat/parameters.py (TemperatureMapper, MaxTokensMapper)
Rationale
6 identical 8-line implementations reduced to 6 two-line declarations. Complex mappers like ResponseFormatMapper and ThinkingMapper remain untouched. The SimpleFieldMapper is itself a clean, single-responsibility class.
Summary
Six parameter mapper classes at the protocol/provider level implement the identical validate-then-set pattern, differing only in the target field name.
Current Code (repeated 6 times)
Duplicated for:
temperature,max_tokens(chatcompletions),temperature,max_output_tokens(openresponses),temperature,max_tokens(cohere).Proposed Change
Add
SimpleFieldMappertosrc/celeste/parameters.py:Each simple mapper becomes a 2-line class:
Modality-level wrappers (e.g.,
modalities/text/providers/groq/parameters.py) are unchanged - they already just setnameand inherit the protocol mapper.Files to Modify
src/celeste/parameters.py(add SimpleFieldMapper)src/celeste/protocols/chatcompletions/parameters.py(TemperatureMapper, MaxTokensMapper)src/celeste/protocols/openresponses/parameters.py(TemperatureMapper, MaxOutputTokensMapper)src/celeste/providers/cohere/chat/parameters.py(TemperatureMapper, MaxTokensMapper)Rationale
6 identical 8-line implementations reduced to 6 two-line declarations. Complex mappers like
ResponseFormatMapperandThinkingMapperremain untouched. TheSimpleFieldMapperis itself a clean, single-responsibility class.