Rehydrate

Validates previous_response_id by fetching the stored response, confirming its status is completed, and promoting the ID to filter metadata

Category: Setup-dependent integration
Task: Validates previous_response_id by fetching the stored response, confirming its status is completed, and promoting the ID to filter metadata

Prerequisites: The external service, credentials, or certificates referenced by this configuration.

This configuration comes from the selected release. The example has not been run here; external services are not bundled.

Download the source file.

# Rehydrate
# Requires `--features store-sqlite` because these filters are opt-in.
#
# Validates `previous_response_id` by fetching the stored
# response, confirming its status is completed, and
# promoting the ID to filter metadata. Body construction
# from the resolved conversation is handled downstream by
# the `openai_responses_proxy` filter.
#
# Pipeline ordering:
#   1. openai_responses_request — parses the create body once, promotes
#      classification metadata, enriches it, and generates IDs
#   2. openai_response_store — initializes store, registers in ctx
#   3. openai_responses_rehydrate — validates previous response, sets metadata
#
# The response_store filter must appear before openai_responses_rehydrate so its
# store backend is registered in `ctx.response_stores` during
# `on_request`.
#
# Example requests:
#
#   # First turn (stored)
#   curl -X POST http://localhost:8080/v1/responses \
#     -H "Content-Type: application/json" \
#     -d '{"model":"gpt-4.1","input":"Hello"}'
#
#   # Second turn (rehydrated — uses previous_response_id)
#   curl -X POST http://localhost:8080/v1/responses \
#     -H "Content-Type: application/json" \
#     -d '{"model":"gpt-4.1","input":"What next?","previous_response_id":"resp_abc"}'
#
# Build:
#   cargo build -p praxis-ai-proxy --features store-sqlite

listeners:
  - name: ai-gateway
    address: "127.0.0.1:8080"
    filter_chains: [responses-pipeline]

filter_chains:
  - name: responses-pipeline
    filters:
      - filter: openai_responses_request

      - filter: state_owner
        mode: single_tenant
        tenant_id: default

      - filter: openai_response_store
        backend: sqlite
        database_url: "sqlite://responses.db?mode=rwc"
        responses_table: openai_responses
        conversations_table: openai_conversations

      - filter: openai_responses_rehydrate

      - filter: router
        routes:
          - path: "/v1/responses"
            cluster: "inference-backend"

      - filter: load_balancer
        clusters:
          - name: "inference-backend"
            endpoints:
              - "127.0.0.1:8000"

insecure_options:
  allow_private_endpoints: true # example proxies to local backends