Skip to content

Open Responses API doesn't accept "output_text" as an input Item #12337

Description

@Zoarial94

LocalAI version:
v4.10.0 (7ad0cbf)

Environment, CPU architecture, OS, and Version:
Docker, x86, Linux

Describe the bug
Open Response API doesn't accept output_text as an Item per the spec.
https://www.openresponses.org/reference#request-body

func convertORMessageItem(itemMap map[string]any, cfg *config.ModelConfig) (schema.Message, error) {

You should be able to exactly copy the "output" JSON from one call into the "input" JSON of the next call.

To Reproduce
Start a new OR API request (/v1/responses) with output messages from a previous response.

Expected behavior
The model sees the previous responses in the context for the new response

Logs

Example input:

Input JSON
{
  "model": "gemma-4-26b-a4b-it",
  "instructions": "These are scanned hand-written notes. Combine the notes, but do not reorder or change the wording of the notes except for the footnotes and endnotes. ",
  "input": [
    {
      "id": "msg_8c030eaa-8eca-402d-9a37-3b81097dedf8",
      "role": "assistant",
      "type": "message",
      "status": "completed",
      "content": [
        {
          "text": "text 1",
          "type": "output_text",
          "logprobs": [],
          "annotations": []
        }
      ],
      "summary": [],
      "arguments": ""
    },
    {
      "id": "msg_936e093d-e8b7-46b1-a3ed-c5058f5092af",
      "role": "assistant",
      "type": "message",
      "status": "completed",
      "content": [
        {
          "text": "text 2",
          "type": "output_text",
          "logprobs": [],
          "annotations": []
        }
      ],
      "summary": [],
      "arguments": ""
    },
    {
      "id": "msg_259556ea-700d-42e6-905a-9897fb6674d9",
      "role": "assistant",
      "type": "message",
      "status": "completed",
      "content": [
        {
          "text": "text 3",
          "type": "output_text",
          "logprobs": [],
          "annotations": []
        }
      ],
      "summary": [],
      "arguments": ""
    },
    {
      "id": "msg_427a8eff-6185-402e-99a6-1a93c3b3f705",
      "role": "assistant",
      "type": "message",
      "status": "completed",
      "content": [
        {
          "text": "text 4",
          "type": "output_text",
          "logprobs": [],
          "annotations": []
        }
      ],
      "summary": [],
      "arguments": ""
    }
  ],
  "temperature": 0.8
}

Example Backend Input:

Backend Input
[
  {
    "role": "system",
    "content": "These are scanned hand-written notes. Combine the notes, but do not reorder or change the wording of the notes except for the footnotes and endnotes. "
  }
]
Backend Output
{
  "id": "resp_ac7c7791-7680-4685-a4cc-c206264b073f",
  "object": "response",
  "created_at": 1790610865,
  "completed_at": 1790610910,
  "status": "completed",
  "model": "gemma-4-26b-a4b-it",
  "output": [
    {
      "type": "message",
      "id": "msg_8f7ba482-ca80-4cc9-8633-9d71dd0e8fa3",
      "status": "completed",
      "role": "assistant",
      "content": [
        {
          "type": "output_text",
          "text": "Please provide the scanned hand-written notes (by uploading the images or providing the text). \n\nOnce you provide them, I will combine them according to your exact constraints:\n1. **No reordering:** I will keep the notes in their original sequence.\n2. **No wording changes:** I will not change a single word in the body of the notes.\n3. **Footnotes/Endnotes exception:** I will only adjust the footnotes and endnotes to ensure they are correctly placed or formatted according to your requirements.",
          "annotations": [],
          "logprobs": []
        }
      ],
      "arguments": "",
      "summary": []
    }
  ],
  "error": null,
  "incomplete_details": null,
  "previous_response_id": null,
  "instructions": "These are scanned hand-written notes. Combine the notes, but do not reorder or change the wording of the notes except for the footnotes and endnotes. ",
  "tools": [],
  "tool_choice": "none",
  "parallel_tool_calls": true,
  "max_tool_calls": null,
  "temperature": 0.8,
  "top_p": 1,
  "presence_penalty": 0,
  "frequency_penalty": 0,
  "top_logprobs": 0,
  "max_output_tokens": null,
  "text": {
    "format": {
      "type": "text"
    }
  },
  "truncation": "auto",
  "reasoning": null,
  "usage": {
    "input_tokens": 43,
    "output_tokens": 1546,
    "total_tokens": 1589,
    "input_tokens_details": {
      "cached_tokens": 0
    },
    "output_tokens_details": {
      "reasoning_tokens": 0
    }
  },
  "metadata": {},
  "store": true,
  "background": false,
  "service_tier": "default",
  "safety_identifier": null,
  "prompt_cache_key": null
}

Additional context
I believe | "output_text" (Pseudo code since I am unfamiliar with go) needs to be added here as a quick solution, but I'm unsure if it will cause downstream problems.

switch partType {
case "input_text":
if text, ok := partMap["text"].(string); ok {
textContent += text
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions