Skip to content

refactor: add ToolArrayMapper base class for tool-type parameters #158

Description

@Kamilbenkirane

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.

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