diff --git a/gateway/gateway-controller/pkg/utils/llm_transformer.go b/gateway/gateway-controller/pkg/utils/llm_transformer.go index 400ee7d97..56a164f84 100644 --- a/gateway/gateway-controller/pkg/utils/llm_transformer.go +++ b/gateway/gateway-controller/pkg/utils/llm_transformer.go @@ -269,14 +269,10 @@ func (t *LLMProviderTransformer) transformProxy(proxy *api.LLMProxyConfiguration operationRegistry[targetKey] = targetOp } - templateParams, err := buildTemplateParams(tmpl, targetPath) - if err != nil { - return nil, fmt.Errorf("failed to build template params: %w", err) - } pol := api.Policy{ Name: llmPol.Name, Version: llmPol.Version, - Params: mergeParams(pathEntry.Params, templateParams), + Params: copyParams(pathEntry.Params), } appendOperationPolicy(targetOp, pol) attachedPolicyPaths[targetPath] = true @@ -510,14 +506,10 @@ func (t *LLMProviderTransformer) transformProvider(provider *api.LLMProviderConf continue } - templateParams, err := buildTemplateParams(tmpl, targetPath) - if err != nil { - return nil, fmt.Errorf("failed to build template params: %w", err) - } pol := api.Policy{ Name: llmPol.Name, Version: llmPol.Version, - Params: mergeParams(pathEntry.Params, templateParams), + Params: copyParams(pathEntry.Params), } appendOperationPolicy(targetOp, pol) attachedPolicyPaths[targetPath] = true @@ -615,14 +607,10 @@ func (t *LLMProviderTransformer) transformProvider(provider *api.LLMProviderConf operationRegistry[targetKey] = targetOp } - templateParams, err := buildTemplateParams(tmpl, targetPath) - if err != nil { - return nil, fmt.Errorf("failed to build template params: %w", err) - } pol := api.Policy{ Name: llmPol.Name, Version: llmPol.Version, - Params: mergeParams(pathEntry.Params, templateParams), + Params: copyParams(pathEntry.Params), } appendOperationPolicy(targetOp, pol) attachedPolicyPaths[targetPath] = true @@ -793,6 +781,19 @@ func mergeParams(base map[string]interface{}, extra map[string]interface{}) *map return &merged } +// copyParams creates a shallow copy of the parameters map and returns a pointer to it. +// Returns nil if the input map is nil or empty. +func copyParams(params map[string]interface{}) *map[string]interface{} { + if len(params) == 0 { + return nil + } + copied := make(map[string]interface{}, len(params)) + for k, v := range params { + copied[k] = v + } + return &copied +} + func appendOperationPolicy(op *api.Operation, pol api.Policy) { if op.Policies == nil { op.Policies = &[]api.Policy{pol} diff --git a/gateway/gateway-controller/pkg/utils/llm_transformer_test.go b/gateway/gateway-controller/pkg/utils/llm_transformer_test.go index b9138b2e8..515d346fc 100644 --- a/gateway/gateway-controller/pkg/utils/llm_transformer_test.go +++ b/gateway/gateway-controller/pkg/utils/llm_transformer_test.go @@ -981,9 +981,9 @@ func TestTransformProvider_ExpandsWildcardPolicyPathWithTemplateMappings(t *test require.NotNil(t, responsesPolicy) require.NotNil(t, responsesPolicy.Params) - reqModel, ok := (*responsesPolicy.Params)["requestModel"].(map[string]interface{}) - require.True(t, ok) - assert.Equal(t, responsesModel, reqModel["identifier"]) + // User-defined policies should only contain user params, not template params + _, hasRequestModel := (*responsesPolicy.Params)["requestModel"] + assert.False(t, hasRequestModel, "template params should not be merged into user-defined policies") assert.Equal(t, "value", (*responsesPolicy.Params)["userParam"]) require.NotNil(t, wildcardPostOp) @@ -1000,9 +1000,9 @@ func TestTransformProvider_ExpandsWildcardPolicyPathWithTemplateMappings(t *test require.NotNil(t, wildcardPolicy) require.NotNil(t, wildcardPolicy.Params) - wildcardReqModel, ok := (*wildcardPolicy.Params)["requestModel"].(map[string]interface{}) - require.True(t, ok) - assert.Equal(t, defaultModel, wildcardReqModel["identifier"]) + // User-defined policies should only contain user params, not template params + _, hasWildcardRequestModel := (*wildcardPolicy.Params)["requestModel"] + assert.False(t, hasWildcardRequestModel, "template params should not be merged into user-defined policies") assert.Equal(t, "value", (*wildcardPolicy.Params)["userParam"]) }