Skip to main content
The request block enables you to perform lightweight transformations on the payload before it gets sent to the upstream provider.

Header Operations

You can arbitrarily set, delete, or filter HTTP headers going to the upstream server.
Note: If the same header is set multiple times, the last one wins. Deletions and filter/keep operations apply in order.

filter_header_values

Removes header value items that match any of the given patterns (denylist). Non-matching items are kept.
  • Syntax: filter_header_values <header> <pattern>... [separator="<sep>"];
  • Default separator is ,. Output is normalized (", " for comma, "<sep> " for others).
  • Pattern matching supports * wildcards; case-insensitive is not applied (patterns must match the exact case used by the client).
  • If all values are removed, the header is deleted.

keep_header_values

Keeps only header value items that match any of the given patterns (allowlist). Non-matching items are removed.
  • Syntax: keep_header_values <header> <pattern>... [separator="<sep>"];
  • Mirror of filter_header_values with inverted logic: patterns select what to keep.
  • Same separator and output formatting rules as filter_header_values.
  • If no values match, the header is deleted.

Model Mapping

Use model_map to alias or hardcode model names conditionally.
  • Maps $request.model to $request.model_mapped.
  • Exact match on the from string.
  • If no matches occur, model_map_default dictates what $request.model_mapped becomes.

JSON Mutations

Apply lightweight mutations directly to the upstream JSON body.
  • Supports a subset of object-path JSONPath expressions (e.g. $.a.b.c).
  • json_set values support primitives (true, false, null, integers, strings) or expressions (like concat(...)).
  • json_wrap_input_text converts a string field into an OpenAI Responses input message list, leaves missing or already-array values unchanged, and rejects other types.
  • json_keep_values filters a JSON string array, keeping only values that match any pattern (allowlist). Use after json_set_header_values to restrict a header-sourced array to a known-safe set.
  • json_filter_values filters a JSON string array, removing values that match any pattern (denylist).
  • Both json_keep_values and json_filter_values support * wildcards, are case-insensitive, and delete the field if no values remain.

Request Validation

Use req_* rules to reject malformed client requests with HTTP 400 before they reach the upstream provider.
  • <source> is body, header, or query. Body targets use object-path ($.a.b.c, no array indices); header/query targets use the parameter name.
  • Rules run after model_map (a $.model rule sees the mapped model name) and before JSON mutations and req_map, in DSL order — defaults.request rules first, then matched match.request rules. The first failure stops validation and returns 400 with code=request_validation_failed.
  • req_required fails when the target is missing; JSON null counts as missing unless allow_null=true (body only). req_forbid fails when the target is present. All other rules are no-ops for missing targets.
  • req_type (body only) checks null|bool|number|integer|string|array|object. req_range checks numeric bounds; req_len checks string length (Unicode code points) or array length. req_enum compares body values as JSON literals and header/query values as strings.
  • If any body rule is configured and the request has no JSON object body, the request is rejected; use only header/query rules for non-JSON APIs.
  • Error messages never include the actual field value.

Structural Request Mapping

Use req_map to apply heavy, cross-provider schema transformations (such as converting an OpenAI JSON request into a Gemini or Anthropic JSON request).
Use after_req_map when a request JSON mutation must run after the structural mapping step.
  • Only request JSON mutation directives are allowed inside after_req_map.
  • If no req_map is configured, after_req_map runs after the normal request JSON operations.

Built-in Modes (v0.1)

  • openai_chat_to_openai_responses
  • anthropic_to_openai_chat
  • gemini_to_openai_chat
  • openai_chat_to_gemini_generate_content
  • openai_chat_to_anthropic_messages