How to use reasoning.encrypted_content with store=False (stateless)

Thanks for an interesting observation.

In your error, I wonder what “following item” is supposed to be referring to, as an “rs_” ID is for an entire reasoning container, which can have multiple array items inside. “Following” is language that would indicate something that comes after that “type”:“reasoning” object externally, such as “type”:“message”…

Referencing a response.done for “output”, a single ID for all:

    "output": [
      {
        "id": "rs_045fb12aa0dfc2ea0069170733badc8197969fd65da2ca2501",
        "type": "reasoning",
        "encrypted_content": "gAAAAABpF...zbM_w==",
        "summary": [
          {
            "type": "summary_text",
            "text": "**Formulating a short introduction**\n\nI need to introduce myself in under 8 words. First, I tried \"ChatAPI: Helpful AI offering concise answers,\" which totals 6 words. Then I revised it to \"ChatAPI: Your helpful, concise AI assistant,\" which is also 6 words. Finally, I thought of \"I'm ChatAPI: concise, insightful, helpful AI,\" which is 7 words. I could also go with \"I'm ChatAPI: your helpful, insightful AI\" for a total of 7 words."
          },
          {
            "type": "summary_text",
            "text": "**Finalizing my introduction**\n\nI'm working on a concise introduction that\u2019s under 8 words. I counted: \"I'm ChatAPI: your helpful, insightful AI,\" which totals 7 words, and it's acceptable. I also thought, \"I'm ChatAPI: concise, helpful AI insights provider,\" but that sums up to 7 as well. Ultimately, I prefer saying, \"I'm ChatAPI: concise, helpful AI friend,\" which is 6 words. That feels friendly and direct, so I\u2019ll go with that as my final answer."
          }
        ]
      },

The validation of “reasoning” input items is sort of documented in OpenAPI specification. It is a collector for all reasoning: an array of multiple summary items, and nullable encrypted_content

In “input”,

  • type - string, enum “reasoning” (Always reasoning) - Required
  • id - string - Required
  • encrypted_content - anyOf: string | ‘null’
  • summary - array - - Required
    • items objects
      • type - string, required
      • text - string, required
  • content - array (clear text of GPT-OSS)
    • items objects
      • type - string, required
      • text - string, required
  • status - string, enum [“in_progress”, “completed”, “incomplete”]
Source specification, 'input'
- x-resolved-from: '#/components/schemas/ReasoningItem'
type: object
description: |
  A description of the chain of thought used by a reasoning model while generating
  a response. Be sure to include these items in your `input` to the Responses API
  for subsequent turns of a conversation if you are manually
  [managing context](https://platform.openai.com/docs/guides/conversation-state).
title: Reasoning
properties:
  type:
    type: string
    description: |
      The type of the object. Always `reasoning`.
    enum:
      - reasoning
    x-stainless-const: true
  id:
    type: string
    description: |
      The unique identifier of the reasoning content.
  encrypted_content:
    anyOf:
      - type: string
        description: |
          The encrypted content of the reasoning item - populated when a response is
          generated with `reasoning.encrypted_content` in the `include` parameter.
      - type: 'null'
  summary:
    type: array
    description: |
      Reasoning summary content.
    items:
      x-resolved-from: '#/components/schemas/Summary'
      properties:
        type:
          type: string
          enum:
            - summary_text
          description: The type of the object. Always `summary_text`.
          default: summary_text
          x-stainless-const: true
        text:
          type: string
          description: A summary of the reasoning output from the
            model so far.
      type: object
      required:
        - type
        - text
      title: Summary text
      description: A summary text from the model.
  content:
    type: array
    description: |
      Reasoning text content.
    items:
      x-resolved-from: '#/components/schemas/ReasoningTextContent'
      properties:
        type:
          type: string
          enum:
            - reasoning_text
          description: The type of the reasoning text. Always `reasoning_text`.
          default: reasoning_text
          x-stainless-const: true
        text:
          type: string
          description: The reasoning text from the model.
      type: object
      required:
        - type
        - text
      title: ReasoningTextContent
      description: Reasoning text from the model.
  status:
    type: string
    description: |
      The status of the item. One of `in_progress`, `completed`, or
      `incomplete`. Populated when items are returned via API.
    enum:
      - in_progress
      - completed
      - incomplete
required:
  - id
  - summary
  - type

Thus, the summary array must be present, but can be 0-length.
"include" = ["reasoning.encrypted_content"] is optional in your request, so of course optional in your return.

A stateless API can’t know what was sent, so you should be able to pass about anything you want with zero knowledge of the expectation by the API. Even a made-up ID should be tolerated, along with made-up summary texts (seemingly pointless to transmit, so just empty the summary list). Even in encrypted reasoning, the summaries are external to that.

The only cruel joke would be if the ID is a validated hash of some summary content or even message, or similar in the encryption.

I’d be interested to know if you have issues emptying the summary array (or writing whatever you want as unused text).


Now: is encrypted reasoning salted or a certificate per organization; can I share my response content and another org can replay it?

reasoning and message shape, 2 summary_text

  • for you to even try as input
"model": "o3-mini-2025-01-31",
"output": [
  {
    "id": "rs_045fb12aa0dfc2ea0069170733badc8197969fd65da2ca2501",
    "type": "reasoning",
    "encrypted_content": "gAAAAABpFwc8gea3wdYML_Vmb6fRPBc5jJ708Y0ReNfxqLUQ2zFNWmbyBstUDp_0nFTsLZRmp15oScu1_BdyeqKz-h-o-xlAHPM_U4AcjVwigbUzkErTzPfXjV3i3hiC3FtoEWYr4N7RSRY9B7Z-j4PjAb1bSQP6uRIwOhSCFZ2OWt0nw0lRoT5NA-qe8yti0HmpKh4rJJHvkFOVeyhlNGMApO_1VOOUO-igBDKhmraCdDhZXc_LppOXcFhtD9Er-DIi3wslv9UAm61t6dR2yUXMQywQsqAo0Xg-8GJgtF6pVO9YUC-UgfW2uV_ofx_hzyVzrYLYQxNVYHtWMraFSKhjdQdUpcWdPirziQ1i5z2yLgzFoR5_4mllrTNQ21qnAOmZjfptBWf4heF_vmyU_aw_xjvKCzbM_w==",
    "summary": [
      {
        "type": "summary_text",
        "text": "**Formulating a short introduction**\n\nI need to introduce myself in under 8 words. First, I tried \"ChatAPI: Helpful AI offering concise answers,\" which totals 6 words. Then I revised it to \"ChatAPI: Your helpful, concise AI assistant,\" which is also 6 words. Finally, I thought of \"I'm ChatAPI: concise, insightful, helpful AI,\" which is 7 words. I could also go with \"I'm ChatAPI: your helpful, insightful AI\" for a total of 7 words."
      },
      {
        "type": "summary_text",
        "text": "**Finalizing my introduction**\n\nI'm working on a concise introduction that\u2019s under 8 words. I counted: \"I'm ChatAPI: your helpful, insightful AI,\" which totals 7 words, and it's acceptable. I also thought, \"I'm ChatAPI: concise, helpful AI insights provider,\" but that sums up to 7 as well. Ultimately, I prefer saying, \"I'm ChatAPI: concise, helpful AI friend,\" which is 6 words. That feels friendly and direct, so I\u2019ll go with that as my final answer."
      }
    ]
  },
  {
    "id": "msg_045fb12aa0dfc2ea006917073cb7c88197acf5736b9c7a9aa3",
    "type": "message",
    "status": "completed",
    "content": [
      {
        "type": "output_text",
        "annotations": [],
        "logprobs": [],
        "text": "I'm ChatAPI: your concise, helpful AI."
      }
    ],
    "role": "assistant"
  }
],
1 Like