1010import OpenAI from "openai" ;
1111import { genaiscriptDebug } from "./debug.js" ;
1212import type { ChatCompletionHandler } from "./chat.js" ;
13- import type { ChatCompletionMessageParam , ChatCompletionResponse } from "./chattypes.js" ;
13+ import type {
14+ ChatCompletionMessageParam ,
15+ ChatCompletionResponse ,
16+ ChatCompletionsOptions ,
17+ } from "./chattypes.js" ;
1418import { errorMessage , isCancelError } from "./error.js" ;
1519import { createFetch } from "./fetch.js" ;
1620import { logError } from "./util.js" ;
17- import { checkCancelled } from "./cancellation.js" ;
21+ import { type CancellationOptions , checkCancelled } from "./cancellation.js" ;
1822import { deleteUndefinedValues } from "./cleaners.js" ;
23+ import type { RetryOptions } from "./types.js" ;
24+ import type { MarkdownTrace } from "./trace.js" ;
1925const dbg = genaiscriptDebug ( "openai:responses" ) ;
2026
2127function statusToReason (
@@ -169,8 +175,8 @@ export const OpenAIv2ResponsesChatCompletion: ChatCompletionHandler = async (
169175async function handleNonStreamingResponse (
170176 openai : OpenAI ,
171177 request : OpenAI . Responses . ResponseCreateParams ,
172- options : any ,
173- trace : any ,
178+ options : ChatCompletionsOptions & CancellationOptions & RetryOptions ,
179+ trace : MarkdownTrace ,
174180) : Promise < ChatCompletionResponse > {
175181 const { cancellationToken } = options ;
176182
@@ -190,13 +196,16 @@ async function handleNonStreamingResponse(
190196async function handleStreamingResponse (
191197 openai : OpenAI ,
192198 request : OpenAI . Responses . ResponseCreateParams ,
193- options : any ,
194- trace : any ,
199+ options : ChatCompletionsOptions & CancellationOptions & RetryOptions ,
200+ trace : MarkdownTrace ,
195201) : Promise < ChatCompletionResponse > {
196202 const { cancellationToken, partialCb } = options ;
197203
198204 checkCancelled ( cancellationToken ) ;
199205
206+ let reasoningSoFar = "" ;
207+ let responseSoFar = "" ;
208+ let tokensSoFar = 0 ;
200209 const res : ChatCompletionResponse = { } ;
201210 try {
202211 const stream = await openai . responses . create ( {
@@ -222,8 +231,28 @@ async function handleStreamingResponse(
222231 case "response.created" :
223232 Object . assign ( res , responseToCompletion ( chunk . response ) ) ;
224233 break ;
234+ case "response.reasoning_summary_text.delta" :
235+ reasoningSoFar += chunk . delta ;
236+ if ( partialCb )
237+ partialCb ( {
238+ reasoningSoFar,
239+ tokensSoFar,
240+ responseSoFar,
241+ reasoningChunk : chunk . delta ,
242+ responseChunk : undefined ,
243+ inner : false ,
244+ } ) ;
245+ break ;
225246 case "response.output_text.delta" :
226- if ( partialCb ) partialCb ( { text : chunk . delta } ) ;
247+ responseSoFar += chunk . delta ;
248+ if ( partialCb )
249+ partialCb ( {
250+ reasoningSoFar,
251+ responseChunk : chunk . delta ,
252+ inner : false ,
253+ tokensSoFar,
254+ responseSoFar,
255+ } ) ;
227256 trace ?. appendContent ( chunk . delta ) ;
228257 break ;
229258 case "response.refusal.done" :
0 commit comments