Skip to content

refactor: add SimpleFieldMapper base class for trivial parameter mappers #157

Description

@Kamilbenkirane

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions