@@ -2222,4 +2222,54 @@ describe('Proxy OpenAI API', () => {
22222222 expect ( res . body . choices [ 0 ] . message . content ) . toBe ( 'Recovered response' ) ;
22232223 expect ( sdkMocks . sessionDelete ) . toHaveBeenCalledWith ( { path : { id : 'test-session-id' } } ) ;
22242224 } ) ;
2225+ describe ( 'Proxy Responses API previous_response_id' , ( ) => {
2226+ test ( 'chains follow-up turns onto the stored session without recreating it' , async ( ) => {
2227+ sdkMocks . sessionMessages . mockReset ( ) ;
2228+ sdkMocks . sessionMessages . mockResolvedValue ( [
2229+ {
2230+ info : { role : 'assistant' , finish : 'stop' } ,
2231+ parts : [ { type : 'text' , text : 'Mock response' } ]
2232+ }
2233+ ] ) ;
2234+ sdkMocks . eventSubscribe . mockReset ( ) ;
2235+ sdkMocks . sessionCreate . mockClear ( ) ;
2236+ sdkMocks . sessionDelete . mockClear ( ) ;
2237+ sdkMocks . configUpdate . mockClear ( ) ;
2238+
2239+ const first = await request ( app )
2240+ . post ( '/v1/responses' )
2241+ . set ( 'Authorization' , 'Bearer test-key' )
2242+ . send ( { model : 'opencode/kimi-k2.5' , input : 'Hello' } ) ;
2243+
2244+ expect ( first . statusCode ) . toEqual ( 200 ) ;
2245+ expect ( first . body . id ) . toMatch ( / ^ r e s p _ / ) ;
2246+ expect ( sdkMocks . sessionCreate ) . toHaveBeenCalledTimes ( 1 ) ;
2247+
2248+ const followUp = await request ( app )
2249+ . post ( '/v1/responses' )
2250+ . set ( 'Authorization' , 'Bearer test-key' )
2251+ . send ( {
2252+ input : 'And a follow-up question' ,
2253+ previous_response_id : first . body . id
2254+ } ) ;
2255+
2256+ expect ( followUp . statusCode ) . toEqual ( 200 ) ;
2257+ // The stored OpenCode session is reused; no new session, no teardown.
2258+ expect ( sdkMocks . sessionCreate ) . toHaveBeenCalledTimes ( 1 ) ;
2259+ expect ( sdkMocks . sessionDelete ) . not . toHaveBeenCalled ( ) ;
2260+ // Model falls back to the one recorded with the previous response.
2261+ const lastUpdate = sdkMocks . configUpdate . mock . calls . at ( - 1 ) ?. [ 0 ] ;
2262+ expect ( lastUpdate ?. body ?. activeModel ) . toEqual ( { providerID : 'opencode' , modelID : 'kimi-k2.5' } ) ;
2263+ } ) ;
2264+
2265+ test ( 'rejects an invalid previous_response_id' , async ( ) => {
2266+ const res = await request ( app )
2267+ . post ( '/v1/responses' )
2268+ . set ( 'Authorization' , 'Bearer test-key' )
2269+ . send ( { input : 'Hello' , previous_response_id : 'resp_does-not-exist' } ) ;
2270+
2271+ expect ( res . statusCode ) . toEqual ( 400 ) ;
2272+ expect ( res . body . error . message ) . toContain ( 'previous_response_id' ) ;
2273+ } ) ;
22252274} ) ;
2275+ } ) ;
0 commit comments