[bot] OpenAI Responses API `instructions` and string-form `input` not captured in span input
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 82/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Tranquilla
- Stack tecnologico
- java
- Ambito
- observability
Direzione di ricerca
Inizia da braintrust-sdk/src/main/java/dev/braintrust/instrumentation/InstrumentationSemConv.java, in tagOpenAIRequest(), quindi confronta la gestione del campo system di Anthropic intorno alle righe 224–232. Esamina i test di Responses API in braintrust-sdk/instrumentation/openai_2_15_0/src/test/java/dev/braintrust/instrumentation/openai/v2_15_0/BraintrustOpenAITest.java ed estendi la copertura per instructions e string input. Il lavoro è completato quando entrambe le forme compaiono in braintrust.input_json.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
The OpenAI Responses API request tagger in InstrumentationSemConv.tagOpenAIRequest() drops two important pieces of input data:
-
instructions(system prompt) silently dropped: The Responses API usesinstructionsas the system-level prompt (equivalent to Chat Completions' system message or Anthropic'ssystemfield). This field is not included inbraintrust.input_json, so the system prompt is invisible when viewing the trace. -
String-form
inputsilently dropped: The Responses API acceptsinputas either a plain string ("Hello!") or an array of input items. The code checksrequestJson.get("input").isArray(), which means plain-string inputs fail the guard andinput_jsonis never set.
For comparison, the Anthropic request tagger in the same file correctly captures the system field as a synthetic {role: "system"} message appended to the input array (lines 224–232).
What is missing
In InstrumentationSemConv.tagOpenAIRequest() (lines 127–138):
if (requestBody != null) {
JsonNode requestJson = BraintrustJsonMapper.get().readTree(requestBody);
if (requestJson.has("model")) {
metadata.put("model", requestJson.get("model").asText());
}
// Chat completions API uses "messages"; Responses API uses "input"
if (requestJson.has("messages")) {
span.setAttribute("braintrust.input_json", toJson(requestJson.get("messages")));
} else if (requestJson.has("input") && requestJson.get("input").isArray()) {
span.setAttribute("braintrust.input_json", toJson(requestJson.get("input")));
}
}
Problem 1: instructions not captured
A typical Responses API request:
{
"model": "gpt-4o-mini",
"instructions": "You are a helpful assistant",
"input": [{"role": "user", "content": "What is 2+2?"}]
}
The input array is captured, but instructions is silently dropped. Users viewing this trace in Braintrust see the user message but not the system instructions that shaped the model's behavior.
The Anthropic handler (tagAnthropicRequest, lines 224–232) solves the equivalent problem by appending a synthetic {role: "system", content: ...} entry:
if (requestJson.has("system") && ...) {
var systemNode = BraintrustJsonMapper.get().createObjectNode();
systemNode.put("role", "system");
systemNode.set("content", requestJson.get("system"));
inputArray.add(systemNode);
}
Problem 2: String-form input dropped
A valid Responses API request:
{
"model": "gpt-4o-mini",
"input": "What is the capital of France?"
}
The requestJson.get("input").isArray() check fails for string inputs, so input_json is never set. The span has no input at all.
The OpenAI Java SDK supports both forms via ResponseCreateParams.builder().inputOfResponse(String) and .inputOfResponse(List<ResponseInputItem>).
Braintrust docs status
- The Braintrust tracing docs at https://www.braintrust.dev/docs/guides/tracing state that LLM spans capture "the model, messages, parameters" — implying system-level instructions should be captured: unclear
- The OpenAI integration docs at https://www.braintrust.dev/docs/integrations/ai-providers/openai do not mention the Responses API
instructionsfield: not_found
Upstream sources
- OpenAI Responses API: https://developers.openai.com/docs/guides/responses-vs-chat-completions — documents
instructionsas the system prompt equivalent andinputaccepting both string and array formats - OpenAI Java SDK:
ResponseCreateParams.builder().instructions(String)and.inputOfResponse(String)/.inputOfResponse(List)are stable API surfaces
Local files inspected
braintrust-sdk/src/main/java/dev/braintrust/instrumentation/InstrumentationSemConv.java— lines 127–138 (tagOpenAIRequest:instructionsnot extracted, stringinputdropped byisArray()guard); lines 224–232 (tagAnthropicRequest:systemcorrectly captured as synthetic system message for comparison)braintrust-sdk/instrumentation/openai_2_15_0/src/test/java/dev/braintrust/instrumentation/openai/v2_15_0/BraintrustOpenAITest.java— lines 229–253, 275–302 (Responses API tests use.instructions("You are a helpful assistant")butassertValidOpenAISpanonly checksinput_jsonis non-null, not that it contains the instructions)
- Lingua principale
- Java
- Stelle
- 21
- Fork
- 5
- Merge medio
- 2g 7h
- PR unite (30g)
- 8
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di braintrustdata/braintrust-sdk-java
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
Tutte le issue di braintrustdata/braintrust-sdk-java
Issue simili
-
executions.Query — startDate and timeRange filters are sent with inverted comparison operators Apertaarea/plugin
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
kestra-io/plugin-kestra#190 ·
-
litertlm-android AAR ships no consumer ProGuard rules → "mid == null" SIGABRT in minified apps Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
google-ai-edge/LiteRT-LM#3739 ·
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
integra-team-red/meet-map#249 ·
-
[Studio][Bug] Cancelled create-user dialog keeps the password and admin switch for the next attempt Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
apache/rocketmq-dashboard#5064 ·