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

  1. Set Stream: false before calling ExecuteProtocolWithAuthManager
  2. 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

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


AI-assisted analysis of router-for-me/CLIProxyAPI@78f0c4079e (2026-08-15). Data as JSON: /api/errors/fece277eb29545bf. Report an issue: GitHub.