@@ -433,6 +433,55 @@ func wireResponsesUpstreamStore(base string) *profile.Store {
433433 }
434434}
435435
436+ func TestSameProtocolOpenAIResponsesSSEPassthroughPreservesLifecycle (t * testing.T ) {
437+ upstreamBody := strings .Join ([]string {
438+ `event: response.created` ,
439+ `data: {"type":"response.created","response":{"id":"resp_test","object":"response","model":"gpt-wire","status":"in_progress","output":[]},"sequence_number":0}` ,
440+ `` ,
441+ `event: response.reasoning_summary_text.delta` ,
442+ `data: {"type":"response.reasoning_summary_text.delta","delta":"thinking","sequence_number":1}` ,
443+ `` ,
444+ `event: response.completed` ,
445+ `data: {"type":"response.completed","response":{"id":"resp_test","object":"response","model":"gpt-wire","status":"completed","output":[],"usage":{"input_tokens":1,"output_tokens":1}},"sequence_number":2}` ,
446+ `` ,
447+ }, "\n " )
448+
449+ up := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
450+ if r .URL .Path != "/v1/responses" {
451+ t .Errorf ("unexpected upstream path %q" , r .URL .Path )
452+ }
453+ w .Header ().Set ("Content-Type" , "text/event-stream; charset=utf-8" )
454+ _ , _ = w .Write ([]byte (upstreamBody ))
455+ }))
456+ defer up .Close ()
457+
458+ s := NewServer (profile.ProxyConfig {Host : "127.0.0.1" , Port : 27483 })
459+ s .ProfileLoader = func () (* profile.Store , error ) { return wireResponsesUpstreamStore (up .URL + "/v1" ), nil }
460+ ts := httptest .NewServer (s .Server .Handler )
461+ defer ts .Close ()
462+
463+ payload := `{"model":"cross-model-id","input":"ping","stream":true}`
464+ resp , err := http .Post (ts .URL + "/custom-api/cross-model-id/openai-responses/v1/responses" , "application/json" , strings .NewReader (payload ))
465+ if err != nil {
466+ t .Fatal (err )
467+ }
468+ defer resp .Body .Close ()
469+ body , _ := io .ReadAll (resp .Body )
470+ if resp .StatusCode != http .StatusOK {
471+ t .Fatalf ("status=%d body=%s" , resp .StatusCode , body )
472+ }
473+ raw := string (body )
474+ for _ , want := range []string {
475+ `event: response.reasoning_summary_text.delta` ,
476+ `"type":"response.reasoning_summary_text.delta"` ,
477+ `event: response.completed` ,
478+ `"type":"response.completed"` ,
479+ } {
480+ if ! strings .Contains (raw , want ) {
481+ t .Fatalf ("same-protocol Responses stream lost %s in %s" , want , raw )
482+ }
483+ }
484+ }
436485func TestCrossProtocolOpenAIIngressWithClaudeUpstreamTranscodesJSON (t * testing.T ) {
437486 var upstreamHits int
438487 up := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
0 commit comments