(w http.ResponseWriter, r *http.Request)
| 63 | } |
| 64 | |
| 65 | func (i *BlockingResponsesInterceptor) ProcessRequest(w http.ResponseWriter, r *http.Request) (outErr error) { |
| 66 | ctx, span := i.tracer.Start(r.Context(), "Intercept.ProcessRequest", trace.WithAttributes(tracing.InterceptionAttributesFromContext(r.Context())...)) |
| 67 | defer tracing.EndSpanErr(span, &outErr) |
| 68 | |
| 69 | if err := i.validateRequest(ctx, w); err != nil { |
| 70 | return err |
| 71 | } |
| 72 | |
| 73 | i.injectTools() |
| 74 | |
| 75 | var ( |
| 76 | response *responses.Response |
| 77 | upstreamErr error |
| 78 | respCopy responseCopier |
| 79 | firstResponseID string |
| 80 | ) |
| 81 | |
| 82 | prompt, promptFound, err := i.reqPayload.lastUserPrompt(ctx, i.logger) |
| 83 | if err != nil { |
| 84 | i.logger.Warn(ctx, "failed to get user prompt", slog.Error(err)) |
| 85 | } |
| 86 | shouldLoop := true |
| 87 | |
| 88 | for shouldLoop { |
| 89 | srv := i.newResponsesService() |
| 90 | respCopy = responseCopier{} |
| 91 | |
| 92 | opts := i.requestOptions(&respCopy) |
| 93 | opts = append(opts, option.WithRequestTimeout(time.Second*600)) |
| 94 | |
| 95 | // TODO(ssncferreira): inject actor headers directly in the client-header |
| 96 | // middleware instead of using SDK options. |
| 97 | if actor := aibcontext.ActorFromContext(r.Context()); actor != nil && i.cfg.SendActorHeaders { |
| 98 | opts = append(opts, intercept.ActorHeadersAsOpenAIOpts(actor)...) |
| 99 | } |
| 100 | |
| 101 | response, upstreamErr = i.newResponse(ctx, srv, opts) |
| 102 | |
| 103 | if upstreamErr != nil || response == nil { |
| 104 | break |
| 105 | } |
| 106 | |
| 107 | if firstResponseID == "" { |
| 108 | firstResponseID = response.ID |
| 109 | } |
| 110 | |
| 111 | i.recordTokenUsage(ctx, response) |
| 112 | i.recordModelThoughts(ctx, response) |
| 113 | |
| 114 | // Check if there any injected tools to invoke. |
| 115 | pending := i.getPendingInjectedToolCalls(response) |
| 116 | shouldLoop, err = i.handleInnerAgenticLoop(ctx, pending, response) |
| 117 | if err != nil { |
| 118 | i.sendCustomErr(ctx, w, http.StatusInternalServerError, err) |
| 119 | shouldLoop = false |
| 120 | } |
| 121 | } |
| 122 |
nothing calls this directly
no test coverage detected