OpenAI API responses.parse with web_search_preview tool returns corrupted JSON with control characters
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
Línea de trabajo
Comienza en el punto de entrada client.responses.parse y ejecuta la reproducción proporcionada de AsyncOpenAI con la herramienta web_search_preview y una entrada no ASCII. Compara el texto devuelto con el JSON esperado, comprobando si hay caracteres de control, escapes incompletos y truncamiento; terminado significa que el JSON es válido y completo, con el texto no ASCII codificado correctamente.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Confirm this is an issue with the Python library and not an underlying OpenAI API
- This is an issue with the Python library
Describe the bug
Summary
When using the responses.parse API with the web_search_preview tool, the
response frequently contains control characters and gets truncated, causing
JSON parsing failures. This occurs specifically when generating search queries
that may include non-ASCII content.
Environment
- OpenAI Python SDK Version: 1.95.0
- Python Version: 3.12+
- API Model: gpt-4.1
- Endpoint: client.responses.parse
Impact
- JSON parsing fails with ValidationError
- The web_search_preview tool becomes unusable for queries involving
non-English content - Responses are truncated around 3.5-4.5KB, suggesting a buffer overflow issue
Workaround
We currently retry without the web_search_preview tool when these errors occur,
which succeeds but loses the web search functionality.
Suggested Fix
- Ensure web search results are properly sanitized to remove control
characters - Fix the response buffer size to prevent truncation
- Properly encode non-ASCII characters as UTF-8 instead of malformed escape
sequences
To Reproduce
Steps to Reproduce
from openai import AsyncOpenAI
from pydantic import BaseModel, Field
from typing import List, Optional
class Subqueries(BaseModel):
subqueries: List[str] = Field(description="List of search queries")
hl: Optional[str] = Field(default=None, description="Language code")
gl: Optional[str] = Field(default=None, description="Country code")
async_client = AsyncOpenAI()
response = await async_client.responses.parse(
model="gpt-4.1",
input=[
{
"role": "system",
"content": "Generate search queries for finding content creators"
},
{
"role": "user",
"content": "Find Russian language content creators"
}
],
text_format=Subqueries,
tools=[
{
"type": "web_search_preview",
"user_location": {"type": "approximate"},
"search_context_size": "medium"
}
],
temperature=1
)
Expected Behavior
The API should return valid JSON with properly encoded text, including
non-ASCII characters as valid UTF-8.
Actual Behavior
- Control Character Corruption: Responses contain invalid control characters:
{"subqueries": ["\u0004\u0043\u0043... - Where \u0004 is ASCII control character 4, not valid text.
- Truncation Mid-Escape: Responses get truncated in the middle of escape
sequences:
Invalid JSON: EOF while parsing a string at line 1 column 4587
input_value='{"subqueries": ["\u0017...0043a\u00043e\u00043 ' - Note the incomplete escape sequence at the end.
- Malformed Unicode: Instead of proper UTF-8 encoding for Cyrillic:
- Expected: "Фильмы" (proper UTF-8)
- Actual: "\x04\x024\x038..." (control char + ASCII digits)
Code snippets
OS
macOS
Python version
3.12
Library version
1.95.0
- Lenguaje dominante
- Python
- Estrellas
- 31.8k
- Forks
- 7.3k
- Merge medio
- 1 d 3 h
- PR fusionados (30 d)
- 131
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de openai/openai-python
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
openai/openai-python#4022 · 18 comentarios ·
Los mantenedores suelen responder en 1 día
-
fix(auth): SubjectTokenProviderError drops response and duplicates error message in workload identity providersPosiblemente ocupada @mohmedmm la tomó hace 7 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
openai/openai-python#4017 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Querystring drops explicit empty-string scalar valuesPosiblemente ocupada @sylvesterkaczmarek la tomó hace 30 días. Abiertosdk-breaking-change v4
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
openai/openai-python#3837 ·
Los mantenedores suelen responder en 1 día
-
Define + export `ServiceTiers` string literalPosiblemente ocupada @SparshGarg999 la tomó hace 56 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
openai/openai-python#3556 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Empty OPENAI_BASE_URL prevents fallback to default API endpointPosiblemente ocupada @Sehastrajit-S la tomó hace 22 días. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
openai/openai-python#2927 · 6 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de openai/openai-python
Issues similares
-
Add `django-upgrade` to the CIAbiertodependencies feature github_actions good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
wemake-services/wemake-django-template#3149 ·
Los mantenedores suelen responder en 1 día
-
[request] vsg/1.1.16Abiertoupstream update
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
conan-io/conan-center-index#31142 ·
Los mantenedores suelen responder en 1 día
-
area:core bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
request-theme
Dificultad 2/5 Menos de una hora Aptitud para principiantes 70/100
LizardByte/ThemerrDB#8877 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
area/install-update comp/gateway P0 sweeper:risk-compatibility type/bug
Dificultad 2/5 Menos de una hora Aptitud para principiantes 72/100
NousResearch/hermes-agent#135997 · 3 comentarios ·
Los mantenedores suelen responder en 1 día