router-for-me/CLIProxyAPI · error
ExecuteProtocolWithAuthManager requires Stream=false
Error message
ExecuteProtocolWithAuthManager requires Stream=false
What it means
Programmer error in the route-level execution API: ExecuteProtocolWithAuthManager() performs non-streaming requests with explicit entry/exit protocols, so passing ProtocolExecutionRequest{Stream: true} is rejected with a mode error before dispatch. Use ExecuteProtocolStreamWithAuthManager for streaming.
Source
Thrown at sdk/api/handlers/model_execution.go:147
InternalSource: true,
SkipInterceptorPluginID: req.SkipInterceptorPluginID,
SkipRouterPluginID: req.SkipRouterPluginID,
})
chunks, errMsg := prepareModelExecutionStream(ctx, dataChan, errChan)
if errMsg != nil {
return ModelExecutionStream{}, errMsg
}
return ModelExecutionStream{
StatusCode: http.StatusOK,
Headers: cloneHeader(headers),
Chunks: chunks,
}, nil
}
// ExecuteProtocolWithAuthManager executes a route-level non-streaming request with explicit protocols.
func (h *BaseAPIHandler) ExecuteProtocolWithAuthManager(ctx context.Context, req ProtocolExecutionRequest) (ModelExecutionResponse, *interfaces.ErrorMessage) {
if req.Stream {
return ModelExecutionResponse{}, modelExecutionModeError("ExecuteProtocolWithAuthManager requires Stream=false")
}
body, headers, errMsg := h.executeWithAuthManagerFormats(ctx, req.EntryProtocol, req.ExitProtocol, req.Model, cloneBytes(req.Body), req.Alt, false, modelExecutionOptions{
Headers: req.Headers,
Query: req.Query,
ForcedProvider: req.ForcedProvider,
AuthSelectionModel: req.AuthSelectionModel,
})
if errMsg != nil {
return ModelExecutionResponse{}, errMsg
}
return ModelExecutionResponse{
StatusCode: http.StatusOK,
Headers: cloneHeader(headers),
Body: cloneBytes(body),
}, nil
}
// ExecuteProtocolStreamWithAuthManager executes a route-level streaming request with explicit protocols.View on GitHub (pinned to 78f0c4079e)
Solutions
- Set Stream: false before calling ExecuteProtocolWithAuthManager
- Route the call to ExecuteProtocolStreamWithAuthManager when the caller needs chunks
Example fix
// before resp, errMsg := h.ExecuteProtocolWithAuthManager(ctx, req) // req.Stream == true // after req.Stream = false resp, errMsg := h.ExecuteProtocolWithAuthManager(ctx, req)
Defensive patterns
Strategy: validation
Validate before calling
if req.Stream {
return nil, fmt.Errorf("use ExecuteProtocolStreamWithAuthManager for streaming")
}
resp, errMsg := h.ExecuteProtocolWithAuthManager(ctx, req) Type guard
func isNonStreamingProtocolRequest(req ProtocolExecutionRequest) bool {
return !req.Stream
} Try / catch
resp, errMsg := h.ExecuteProtocolWithAuthManager(ctx, req)
if errMsg != nil && strings.Contains(errMsg.Error(), "requires Stream=false") {
log.Error("route bug: streaming request reached the non-streaming protocol executor")
} Prevention
- Do not share one mutable request struct between streaming and non-streaming paths
- Set Stream immediately before the matching Execute* call
When it happens
Trigger: An internal route handler or plugin calls BaseAPIHandler.ExecuteProtocolWithAuthManager with a request whose Stream field is true — typically a request struct shared between the streaming and non-streaming paths.
Common situations: One request struct reused for both variants with Stream toggled by a flag; refactoring a route from streaming to buffered and leaving Stream set.
Related errors
- ExecuteProtocolStreamWithAuthManager requires Stream=true
- ExecuteModel requires Stream=false
- ExecuteModelStream requires Stream=true
- plugin sync response is nil
- count must be a positive integer
AI-assisted analysis of router-for-me/CLIProxyAPI@78f0c4079e (2026-08-15).
Data as JSON: /api/errors/fece277eb29545bf.
Report an issue: GitHub.