@@ -78,6 +78,30 @@ function inputItemsStartWith(input: InputItem[], baseline: InputItem[]): boolean
7878 return baseline . every ( ( item , index ) => stringifyStable ( item ) === stringifyStable ( input [ index ] ) ) ;
7979}
8080
81+ function responseInputEndedWithFinalAnswer ( input : InputItem [ ] ) : boolean {
82+ const lastConversationItem = input . findLast (
83+ ( item ) =>
84+ item . type === "message" ||
85+ item . type === "function_call" ||
86+ item . type === "function_call_output" ,
87+ ) ;
88+ return (
89+ lastConversationItem ?. type === "message" &&
90+ lastConversationItem . role === "assistant" &&
91+ lastConversationItem . phase === "final_answer"
92+ ) ;
93+ }
94+
95+ function suffixStartsNewUserTurn ( input : InputItem [ ] ) : boolean {
96+ const firstConversationItem = input . find (
97+ ( item ) =>
98+ item . type === "message" ||
99+ item . type === "function_call" ||
100+ item . type === "function_call_output" ,
101+ ) ;
102+ return firstConversationItem ?. type === "message" && firstConversationItem . role === "user" ;
103+ }
104+
81105export function planOpenAIWebSocketRequestPayload ( params : {
82106 fullPayload : ResponseCreateEvent ;
83107 previousRequestPayload ?: ResponseCreateEvent ;
@@ -97,14 +121,22 @@ export function planOpenAIWebSocketRequestPayload(params: {
97121 ) {
98122 const baseline = [ ...previousInputItems , ...previousResponseInputItems ] ;
99123 if ( inputItemsStartWith ( fullInputItems , baseline ) ) {
100- return {
101- mode : "incremental" ,
102- payload : {
103- ...params . fullPayload ,
104- previous_response_id : params . previousResponseId ,
105- input : fullInputItems . slice ( baseline . length ) ,
106- } ,
107- } ;
124+ const incrementalInput = fullInputItems . slice ( baseline . length ) ;
125+ if (
126+ ! (
127+ responseInputEndedWithFinalAnswer ( previousResponseInputItems ) &&
128+ suffixStartsNewUserTurn ( incrementalInput )
129+ )
130+ ) {
131+ return {
132+ mode : "incremental" ,
133+ payload : {
134+ ...params . fullPayload ,
135+ previous_response_id : params . previousResponseId ,
136+ input : incrementalInput ,
137+ } ,
138+ } ;
139+ }
108140 }
109141 }
110142
0 commit comments