Summary
Three parameter mappers in the OpenResponses protocol follow the identical pattern of appending a tool type to the request tools array.
Current Code (repeated 3 times)
class WebSearchMapper(ParameterMapper):
"""Map web_search to Responses tools array."""
def map(self, request: dict[str, Any], value: object, model: Model) -> dict[str, Any]:
validated_value = self._validate_value(value, model)
if not validated_value:
return request
request.setdefault("tools", []).append({"type": "web_search"}) # only this differs
return request
Duplicated for: WebSearchMapper, XSearchMapper, CodeExecutionMapper.
Proposed Change
Add ToolArrayMapper to src/celeste/parameters.py:
class ToolArrayMapper(ParameterMapper):
"""Appends a tool entry to the request tools array."""
tool_type: str
def map(self, request: dict[str, Any], value: Any, model: Model) -> dict[str, Any]:
validated_value = self._validate_value(value, model)
if not validated_value:
return request
request.setdefault("tools", []).append({"type": self.tool_type})
return request
Each tool mapper becomes:
class WebSearchMapper(ToolArrayMapper):
tool_type = "web_search"
class XSearchMapper(ToolArrayMapper):
tool_type = "x_search"
class CodeExecutionMapper(ToolArrayMapper):
tool_type = "code_execution"
Files to Modify
src/celeste/parameters.py (add ToolArrayMapper)
src/celeste/protocols/openresponses/parameters.py (WebSearchMapper, XSearchMapper, CodeExecutionMapper)
Rationale
3 identical 8-line implementations reduced to 3 two-line declarations. If more tools are added (likely, given the OpenResponses API's tool model), they're trivial to add.
Summary
Three parameter mappers in the OpenResponses protocol follow the identical pattern of appending a tool type to the request tools array.
Current Code (repeated 3 times)
Duplicated for:
WebSearchMapper,XSearchMapper,CodeExecutionMapper.Proposed Change
Add
ToolArrayMappertosrc/celeste/parameters.py:Each tool mapper becomes:
Files to Modify
src/celeste/parameters.py(add ToolArrayMapper)src/celeste/protocols/openresponses/parameters.py(WebSearchMapper, XSearchMapper, CodeExecutionMapper)Rationale
3 identical 8-line implementations reduced to 3 two-line declarations. If more tools are added (likely, given the OpenResponses API's tool model), they're trivial to add.