# yaml-language-server: $schema=https://promptfoo.dev/config-schema.json
description: OpenAI function calling with weather API integration

prompts:
  - 'What is the weather like in {{city}}?'

providers:
  - id: 'openai:chat:gpt-4.1-mini'
    label: 'functions-defined-in-external-file'
    config:
      functions: file://get_current_weather.yaml
  - id: 'openai:chat:gpt-4.1-mini'
    label: 'functions-defined-in-config'
    config:
      functions:
        [
          {
            'name': 'get_current_weather',
            'description': 'Get the current weather in a given location',
            'parameters':
              {
                'type': 'object',
                'properties':
                  {
                    'location':
                      {
                        'type': 'string',
                        'description': 'The city and state, e.g. San Francisco, CA',
                      },
                    'unit': { 'type': 'string', 'enum': ['celsius', 'fahrenheit'] },
                  },
                'required': ['location'],
              },
          },
        ]

tests:
  - vars:
      city: Boston
    assert:
      - type: is-json
      - type: is-valid-openai-function-call
      - type: javascript
        value: output.name === 'get_current_weather'
      - type: javascript
        value: JSON.parse(output.arguments).location === 'Boston, MA'

  - vars:
      city: New York
    assert:
      - type: equals
        value: get_current_weather
        # Transform is a cleaner way to pick out specific properties.
        # This transform returns only the 'name' property
        transform: output.name
      - type: similar
        value: NYC
        threshold: 0.5
        # This transform returns only the parsed location argument.
        transform: JSON.parse(output.arguments).location

  - vars:
      city: Paris

  - vars:
      city: Mars
