in polling.go [99:134]
func (r *BetaThreadRunService) PollStatus(ctx context.Context, threadID string, runID string, pollIntervalMs int, opts ...option.RequestOption) (res *Run, err error) {
var raw *http.Response
opts = append(opts, mkPollingOptions(pollIntervalMs)...)
opts = append(opts, option.WithResponseInto(&raw))
for {
run, err := r.Get(ctx, threadID, runID, opts...)
if err != nil {
return nil, fmt.Errorf("thread run poll: received %w", err)
}
switch run.Status {
case RunStatusInProgress,
RunStatusQueued:
if pollIntervalMs <= 0 {
pollIntervalMs = getPollInterval(raw)
}
time.Sleep(time.Duration(pollIntervalMs) * time.Millisecond)
case RunStatusRequiresAction,
RunStatusCancelled,
RunStatusCompleted,
RunStatusFailed,
RunStatusExpired,
RunStatusIncomplete:
return run, nil
default:
return nil, fmt.Errorf("invalid thread run status during polling: received %s", run.Status)
}
select {
case <-ctx.Done():
return nil, ctx.Err()
default:
break
}
}
}