@@ -26,6 +26,7 @@ import (
2626 "strings"
2727 "time"
2828
29+ "github.com/go-logr/logr"
2930 "sigs.k8s.io/controller-runtime/pkg/log"
3031
3132 v1 "sigs.k8s.io/gateway-api-inference-extension/api/v1"
@@ -89,42 +90,59 @@ type Director struct {
8990 defaultPriority int
9091}
9192
92- // HandleRequest orchestrates the request lifecycle.
93- // It always returns the requestContext even in the error case, as the request context is used in error handling.
94- func (d * Director ) HandleRequest (ctx context.Context , reqCtx * handlers.RequestContext ) (* handlers.RequestContext , error ) {
95- logger := log .FromContext (ctx )
93+ // getInferenceObjective creates inferenceObjective based on reqCtx.
94+ func (d * Director ) getInferenceObjective (logger logr.Logger , reqCtx * handlers.RequestContext ) * v1alpha2.InferenceObjective {
95+ infObjective := d .datastore .ObjectiveGet (reqCtx .ObjectiveKey )
96+ if infObjective == nil {
97+ logger .V (logutil .VERBOSE ).Info ("No associated InferenceObjective found, using default" , "objectiveKey" , reqCtx .ObjectiveKey )
98+ infObjective = & v1alpha2.InferenceObjective {
99+ Spec : v1alpha2.InferenceObjectiveSpec {
100+ Priority : & d .defaultPriority ,
101+ },
102+ }
103+ } else if infObjective .Spec .Priority == nil {
104+ // Default to 0 if not specified.
105+ infObjective .Spec .Priority = & d .defaultPriority
106+ }
107+ return infObjective
108+ }
96109
97- // Parse Request, Resolve Target Models, and Determine Parameters
110+ // resolveTargetModel is a helper that resolves targetModel
111+ // and updates the reqCtx and ctx.
112+ func (d * Director ) resolveTargetModel (reqCtx * handlers.RequestContext ) error {
98113 requestBodyMap := reqCtx .Request .Body
99114 var ok bool
100115 reqCtx .IncomingModelName , ok = requestBodyMap ["model" ].(string )
101-
102116 if ! ok {
103- return reqCtx , errutil.Error {Code : errutil .BadRequest , Msg : "model not found in request body" }
117+ return errutil.Error {Code : errutil .BadRequest , Msg : "model not found in request body" }
104118 }
105119 if reqCtx .TargetModelName == "" {
106120 // Default to incoming model name
107121 reqCtx .TargetModelName = reqCtx .IncomingModelName
108122 }
109123 reqCtx .Request .Body ["model" ] = reqCtx .TargetModelName
124+ return nil
125+ }
126+
127+ // HandleRequest orchestrates the request lifecycle.
128+ // It always returns the requestContext even in the error case, as the request context is used in error handling.
129+ func (d * Director ) HandleRequest (ctx context.Context , reqCtx * handlers.RequestContext ) (* handlers.RequestContext , error ) {
130+ logger := log .FromContext (ctx )
131+
132+ // Resolve target model and update req context.
133+ err := d .resolveTargetModel (reqCtx )
134+ if err != nil {
135+ return reqCtx , err
136+ }
110137
138+ // Parse request body.
111139 requestBody , err := requtil .ExtractRequestBody (reqCtx .Request .Body )
112140 if err != nil {
113141 return reqCtx , errutil.Error {Code : errutil .BadRequest , Msg : fmt .Errorf ("failed to extract request data: %w" , err ).Error ()}
114142 }
115143
116- infObjective := d .datastore .ObjectiveGet (reqCtx .ObjectiveKey )
117- if infObjective == nil {
118- logger .V (logutil .VERBOSE ).Info ("No associated InferenceObjective found, using default" , "objectiveKey" , reqCtx .ObjectiveKey )
119- infObjective = & v1alpha2.InferenceObjective {
120- Spec : v1alpha2.InferenceObjectiveSpec {
121- Priority : & d .defaultPriority ,
122- },
123- }
124- } else if infObjective .Spec .Priority == nil {
125- // Default to 0 if not specified.
126- infObjective .Spec .Priority = & d .defaultPriority
127- }
144+ // Parse inference objective.
145+ infObjective := d .getInferenceObjective (logger , reqCtx )
128146
129147 // Prepare LLMRequest (needed for both saturation detection and Scheduler)
130148 reqCtx .SchedulingRequest = & schedulingtypes.LLMRequest {
0 commit comments