http_interactions:
- request:
    method: POST
    uri: https://api.openai.com/v1/chat/completions
    body:
      string: '{"messages":[{"role":"user","content":[{"type":"text","text":"\n  What
        is the difference between a tibble and a data frame?\n  Answer with a bulleted
        list\n"}]}],"model":"gpt-4.1","stream":false}'
  response:
    status: 200
    headers:
      access-control-expose-headers: X-Request-ID
      alt-svc: h3=":443"; ma=86400
      cf-cache-status: DYNAMIC
      cf-ray: 9580b1812d3f4799-DFW
      content-encoding: gzip
      content-type: application/json
      date: Mon, 30 Jun 2025 21:18:04 GMT
      openai-organization: user-wfrajlxs4zxa4ixjljhmt9vx
      openai-processing-ms: '6825'
      openai-version: '2020-10-01'
      server: cloudflare
      set-cookie:
      - __cf_bm=_kgOzIXje3RMgf9ZRJJwneN7i9QH6YZg5cY1Osa4Mww-1751318284-1.0.1.1-Np0H1G6A9SRMRX_jYsXdpwBbFPrfNyW3AvM6sskZ72EakZu6iL3K0roRxKm9weWNwgBF.WKxAYzDCKVJ5dg.ePjEkcI.tFt9mpJqgMRa8F0;
        path=/; expires=Mon, 30-Jun-25 21:48:04 GMT; domain=.api.openai.com; HttpOnly;
        Secure; SameSite=None
      - _cfuvid=yLQNOT2LHa2PGRy5Bnv4W40z4UlLALg7_dyaKCZJtjg-1751318284297-0.0.1.1-604800000;
        path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
      strict-transport-security: max-age=31536000; includeSubDomains; preload
      x-content-type-options: nosniff
      x-envoy-upstream-service-time: '6828'
      x-ratelimit-limit-requests: '10000'
      x-ratelimit-limit-tokens: '30000000'
      x-ratelimit-remaining-requests: '9999'
      x-ratelimit-remaining-tokens: '29999974'
      x-ratelimit-reset-requests: 6ms
      x-ratelimit-reset-tokens: 0s
      x-request-id: req_3813583f1f50004bf907f11ec098e2f0
    body:
      string: |
        {
          "id": "chatcmpl-BoGAvD8wIK38xco8XQvNOm5ZC72RS",
          "object": "chat.completion",
          "created": 1751318277,
          "model": "gpt-4.1-2025-04-14",
          "choices": [
            {
              "index": 0,
              "message": {
                "role": "assistant",
                "content": "- **Printing behavior**:  \n  - Tibbles print a preview (first 10 rows and columns that fit on screen), whereas data frames print ALL data unless told otherwise.\n\n- **Data type preservation:**  \n  - Tibbles never convert strings to factors by default, whereas data.frames (in base R <4.0) automatically convert strings to factors unless instructed not to.\n\n- **Subsetting output:**  \n  - Tibbles always return another tibble when subsetting with `[ ]`, while data frames may simplify the output (e.g., as a vector) depending on usage.\n\n- **Column name handling:**  \n  - Tibbles allow non-syntactic column names (e.g., names with spaces or special characters) without backticks, whereas data frames require syntactic names or backticks.\n\n- **Partial matching:**  \n  - Tibbles do **not** support partial column name matching, while data frames do.\n\n- **Enhanced printing:**  \n  - Tibbles display data types next to column names when printed; data frames do not.\n\n- **Creation:**  \n  - Tibbles are created with `tibble()` or `as_tibble()`, while data frames use `data.frame()`.\n\n- **Row names:**  \n  - Tibbles do not support row names; data frames do.\n\n- **Package:**  \n  - Tibbles are part of the tidyverse (`tibble` package); data frames are a base R structure.",
                "refusal": null,
                "annotations": []
              },
              "logprobs": null,
              "finish_reason": "stop"
            }
          ],
          "usage": {
            "prompt_tokens": 30,
            "completion_tokens": 303,
            "total_tokens": 333,
            "prompt_tokens_details": {
              "cached_tokens": 0,
              "audio_tokens": 0
            },
            "completion_tokens_details": {
              "reasoning_tokens": 0,
              "audio_tokens": 0,
              "accepted_prediction_tokens": 0,
              "rejected_prediction_tokens": 0
            }
          },
          "service_tier": "default",
          "system_fingerprint": "fp_51e1070cf2"
        }
  recorded_at: 2025-06-30 21:18:04
- request:
    method: POST
    uri: https://api.openai.com/v1/chat/completions
    body:
      string: '{"messages":[{"role":"user","content":[{"type":"text","text":"\n  What
        is the difference between a tibble and a data frame?\n  Answer with a bulleted
        list\n"}]},{"role":"assistant","content":[{"type":"text","text":"- **Printing
        behavior**:  \n  - Tibbles print a preview (first 10 rows and columns that
        fit on screen), whereas data frames print ALL data unless told otherwise.\n\n-
        **Data type preservation:**  \n  - Tibbles never convert strings to factors
        by default, whereas data.frames (in base R <4.0) automatically convert strings
        to factors unless instructed not to.\n\n- **Subsetting output:**  \n  - Tibbles
        always return another tibble when subsetting with `[ ]`, while data frames
        may simplify the output (e.g., as a vector) depending on usage.\n\n- **Column
        name handling:**  \n  - Tibbles allow non-syntactic column names (e.g., names
        with spaces or special characters) without backticks, whereas data frames
        require syntactic names or backticks.\n\n- **Partial matching:**  \n  - Tibbles
        do **not** support partial column name matching, while data frames do.\n\n-
        **Enhanced printing:**  \n  - Tibbles display data types next to column names
        when printed; data frames do not.\n\n- **Creation:**  \n  - Tibbles are created
        with `tibble()` or `as_tibble()`, while data frames use `data.frame()`.\n\n-
        **Row names:**  \n  - Tibbles do not support row names; data frames do.\n\n-
        **Package:**  \n  - Tibbles are part of the tidyverse (`tibble` package);
        data frames are a base R structure."}]},{"role":"user","content":[{"type":"text","text":"Tell
        me three funny jokes about statisticians"}]}],"model":"gpt-4.1","stream":false}'
  response:
    status: 200
    headers:
      access-control-expose-headers: X-Request-ID
      alt-svc: h3=":443"; ma=86400
      cf-cache-status: DYNAMIC
      cf-ray: 9580b1adfdb74799-DFW
      content-encoding: gzip
      content-type: application/json
      date: Mon, 30 Jun 2025 21:18:06 GMT
      openai-organization: user-wfrajlxs4zxa4ixjljhmt9vx
      openai-processing-ms: '1747'
      openai-version: '2020-10-01'
      server: cloudflare
      set-cookie:
      - __cf_bm=y5PiSFtfw5yYQDtwMGL_HJhBgSJTGI.jI.wAlW2oxTM-1751318286-1.0.1.1-IGGUmC4cn41xb3bXQ4lw9D9HITVs_bKW2v1CSzfxI9cWILLjKzyyhNlYj6cUej2dXQ_9ECrF6TQzOqaCwUFBeqwBXzYAPoLho2fBpb.WYDU;
        path=/; expires=Mon, 30-Jun-25 21:48:06 GMT; domain=.api.openai.com; HttpOnly;
        Secure; SameSite=None
      - _cfuvid=5dX1.413RO0cRtQvMvlvfR.SVzBjqC4Tz5indfiUIqk-1751318286278-0.0.1.1-604800000;
        path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
      strict-transport-security: max-age=31536000; includeSubDomains; preload
      x-content-type-options: nosniff
      x-envoy-upstream-service-time: '1751'
      x-ratelimit-limit-requests: '10000'
      x-ratelimit-limit-tokens: '30000000'
      x-ratelimit-remaining-requests: '9999'
      x-ratelimit-remaining-tokens: '29999646'
      x-ratelimit-reset-requests: 6ms
      x-ratelimit-reset-tokens: 0s
      x-request-id: req_e0ae123b8d9ec07b60e2c8ae93b4d57b
    body:
      string: |
        {
          "id": "chatcmpl-BoGB2GINW8ZriXgkEUHDWZAl3fV96",
          "object": "chat.completion",
          "created": 1751318284,
          "model": "gpt-4.1-2025-04-14",
          "choices": [
            {
              "index": 0,
              "message": {
                "role": "assistant",
                "content": "Sure! Here are three funny jokes about statisticians:\n\n1. **Why did the statistician bring a ladder to the bar?**  \n   Because he heard the drinks were on the house!\n\n2. **How do you tell the difference between a statistician and an accountant?**  \n   Ask them to calculate the average salary: the accountant will give you the mean, the statistician will ask “what do you want it to be?”\n\n3. **Why do statisticians love the jungle?**  \n   Because of all the *sample* trees!",
                "refusal": null,
                "annotations": []
              },
              "logprobs": null,
              "finish_reason": "stop"
            }
          ],
          "usage": {
            "prompt_tokens": 349,
            "completion_tokens": 112,
            "total_tokens": 461,
            "prompt_tokens_details": {
              "cached_tokens": 0,
              "audio_tokens": 0
            },
            "completion_tokens_details": {
              "reasoning_tokens": 0,
              "audio_tokens": 0,
              "accepted_prediction_tokens": 0,
              "rejected_prediction_tokens": 0
            }
          },
          "service_tier": "default",
          "system_fingerprint": "fp_51e1070cf2"
        }
  recorded_at: 2025-06-30 21:18:06
recorded_with: VCR-vcr/1.7.0.91, webmockr/2.1.0
