# yaml-language-server: $schema=https://promptfoo.dev/config-schema.json
description: Multi-provider structured JSON outputs with schema validation

prompts:
  # Schema output with `steps` array
  - label: 'With step-by-step'
    raw: 'You are a helpful math tutor. Solve {{problem}}'
    config:
      response_format:
        type: json_schema
        json_schema:
          name: math_response
          strict: true
          schema:
            type: object
            properties:
              steps:
                type: array
                items:
                  type: object
                  properties:
                    explanation:
                      type: string
                    output:
                      type: string
                  required:
                    - explanation
                    - output
                  additionalProperties: false
              final_answer:
                type: string
            required:
              - steps
              - final_answer
            additionalProperties: false

  # Schema output without `steps` array
  - label: 'Without step-by-step'
    raw: 'You are a helpful math tutor. Solve {{problem}}'
    config:
      response_format:
        type: json_schema
        json_schema:
          name: math_response
          strict: true
          schema:
            type: object
            properties:
              final_answer:
                type: string
            required:
              - final_answer
            additionalProperties: false

providers:
  # OpenAI with structured outputs (response_format)
  - openai:chat:gpt-4o-mini

  # Azure OpenAI with structured outputs (response_format)
  - id: azure:chat:gpt-4o-2024-08-06
    config:
      apiHost: 'YOUR_ORG.openai.azure.com'
      apiVersion: '2024-08-01-preview'
      deploymentName: 'YOUR_DEPLOYMENT_NAME'

  # Anthropic with structured outputs (output_format) - with steps
  - id: anthropic:messages:claude-sonnet-4-6
    label: 'Anthropic (with steps)'
    config:
      max_tokens: 2048
      output_format:
        type: json_schema
        schema:
          type: object
          properties:
            steps:
              type: array
              items:
                type: object
                properties:
                  explanation:
                    type: string
                  output:
                    type: string
                required:
                  - explanation
                  - output
                additionalProperties: false
            final_answer:
              type: string
          required:
            - steps
            - final_answer
          additionalProperties: false

  # Anthropic with structured outputs (output_format) - without steps
  - id: anthropic:messages:claude-sonnet-4-6
    label: 'Anthropic (without steps)'
    config:
      max_tokens: 2048
      output_format:
        type: json_schema
        schema:
          type: object
          properties:
            final_answer:
              type: string
          required:
            - final_answer
          additionalProperties: false

defaultTest:
  assert:
    - type: is-json
    - type: javascript
      value: typeof output === 'object'

tests:
  - description: Solving for the number of dragons in a cave
    vars:
      problem: 'If a wizard has 8x dragons and finds 31 more in a cave, but only has room for 2 total, how many dragons must the wizard release? (8x + 31 = 2)'
    assert:
      - type: contains-any
        value:
          - -3.625
          - -29/8
          - '-3.625'
          - '-29/8'
  - description: Calculating the area of a perfectly square pizza
    vars:
      problem: 'A perfectly square pizza has a side length of sqrt(x) meters. If the side length is 4.9 meters, what is the area in square meters? (sqrt(x) = 4.9)'
    assert:
      - type: contains-any
        value:
          - 24.01
          - '24.01'
