You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A Responses client continuing a cross-format Chat conversation by conversation loses all prior turns. Continuing by previous_response_id keeps them.
Reproduction
Pinned at bfcd023c (current main, 2026-09-20), passthrough route from OpenAI Responses to an OpenAI Chat backend (format = "openai_chat") with a deterministic capture upstream. Seed then recall:
The recall reaches the Chat backend with only RECALL. Control: same route, same seed, replace conversation with the returned previous_response_id. The backend then receives the seed user turn, seed assistant answer, and recall.
Result: history lost 5/5 with conversation, preserved 5/5 with previous_response_id.
Actual: the conversation follow-up forwards only the new turn. The server returns HTTP 200 with a plausible but context-free answer.
Root cause
crates/libsy-llm-client/src/run.rs at this commit. remember_canonical_response (line 839) calls:
.remember(response_id,None, model,Some(history))// line 863
The conversation id is hardcoded to None. remember_response (line 828) passes the real conversation, and native Responses recording passes both ids (line 718). The later conversation lookup misses, so routing silently continues without history.
Environment
Switchyard version (or commit SHA): bfcd023cb6791efd8ac59d32afb5095c74fef1ff
Suggested fix: pass the request conversation id into remember_canonical_response and store the materialized history under both the response id and the conversation id, with buffered and streamed cross-format conversation tests.
Symptom
A Responses client continuing a cross-format Chat conversation by
conversationloses all prior turns. Continuing byprevious_response_idkeeps them.Reproduction
Pinned at
bfcd023c(current main, 2026-09-20), passthrough route from OpenAI Responses to an OpenAI Chat backend (format = "openai_chat") with a deterministic capture upstream. Seed then recall:{"model":"switchyard/chat","input":"SEED","conversation":"conv_1"} {"model":"switchyard/chat","input":"RECALL","conversation":"conv_1"}The recall reaches the Chat backend with only
RECALL. Control: same route, same seed, replaceconversationwith the returnedprevious_response_id. The backend then receives the seed user turn, seed assistant answer, and recall.Result: history lost 5/5 with
conversation, preserved 5/5 withprevious_response_id.Expected vs. actual
Root cause
crates/libsy-llm-client/src/run.rsat this commit.remember_canonical_response(line 839) calls:The conversation id is hardcoded to
None.remember_response(line 828) passes the realconversation, and native Responses recording passes both ids (line 718). The later conversation lookup misses, so routing silently continues without history.Environment
bfcd023cb6791efd8ac59d32afb5095c74fef1ffAdditional context
previous_response_idonly. PR fix(llm-client): keep Responses follow-ups on the provider holding their history #721 documentsconversationas an equivalent supported continuation.remember_canonical_responseand store the materialized history under both the response id and the conversation id, with buffered and streamed cross-format conversation tests.cc @sabhatinas