From 7e57142960094bdb6b6cba8af58cce81bb60d273 Mon Sep 17 00:00:00 2001 From: Meena Muthukumar <73094232+meenacodes@users.noreply.github.com> Date: Tue, 28 Jul 2026 19:13:13 +0530 Subject: [PATCH 1/2] Update virtualmcpserver_types.go --- .../api/v1beta1/virtualmcpserver_types.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/cmd/thv-operator/api/v1beta1/virtualmcpserver_types.go b/cmd/thv-operator/api/v1beta1/virtualmcpserver_types.go index 699eb0d601..4660309c21 100644 --- a/cmd/thv-operator/api/v1beta1/virtualmcpserver_types.go +++ b/cmd/thv-operator/api/v1beta1/virtualmcpserver_types.go @@ -93,8 +93,10 @@ type VirtualMCPServerSpec struct { TelemetryConfigRef *MCPTelemetryConfigReference `json:"telemetryConfigRef,omitempty"` // EmbeddingServerRef references an existing EmbeddingServer resource by name. - // When the optimizer is enabled, this field is required to point to a ready EmbeddingServer - // that provides embedding capabilities. + // It is optional even when the optimizer is enabled: without it (and without + // spec.config.optimizer.embeddingService), find_tool falls back to FTS5 + // keyword-only search with no semantic ranking. Set this field to point to a + // ready EmbeddingServer when semantic ranking is desired. // The referenced EmbeddingServer must exist in the same namespace and be ready. // +optional EmbeddingServerRef *EmbeddingServerRef `json:"embeddingServerRef,omitempty"` @@ -599,7 +601,8 @@ func (r *VirtualMCPServer) Validate() error { // validateEmbeddingServer validates EmbeddingServerRef and Optimizer configuration. // Rules: // - embeddingServerRef.name must be non-empty when ref is provided -// - optimizer requires either embeddingServerRef or a manually set embeddingService +// - optimizer does not require an embedding source: with neither embeddingServerRef +// nor optimizer.embeddingService set, find_tool runs FTS5 keyword-only search // - if embeddingServerRef is set without optimizer, auto-populate optimizer with defaults // // The controller handles the remaining cases at runtime (event emission, URL population). @@ -611,15 +614,6 @@ func (r *VirtualMCPServer) validateEmbeddingServer() error { hasOptimizer := r.Spec.Config.Optimizer != nil hasRef := r.Spec.EmbeddingServerRef != nil - hasManualService := hasOptimizer && r.Spec.Config.Optimizer.EmbeddingService != "" - - // Optimizer configured without any embedding source is an error. - // The user must either set embeddingServerRef or manually set optimizer.embeddingService. - if hasOptimizer && !hasRef && !hasManualService { - return fmt.Errorf( - "spec.config.optimizer requires an embedding service: " + - "set spec.embeddingServerRef (recommended) or spec.config.optimizer.embeddingService") - } // EmbeddingServerRef is set but optimizer is not configured: auto-populate // optimizer with default values so the embedding server is actually used. From a2662cd909f59566de947a7674820dd7c02a40e1 Mon Sep 17 00:00:00 2001 From: Meena Muthukumar <73094232+meenacodes@users.noreply.github.com> Date: Tue, 28 Jul 2026 19:14:36 +0530 Subject: [PATCH 2/2] Update virtualmcpserver_types_test.go --- cmd/thv-operator/api/v1beta1/virtualmcpserver_types_test.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cmd/thv-operator/api/v1beta1/virtualmcpserver_types_test.go b/cmd/thv-operator/api/v1beta1/virtualmcpserver_types_test.go index 466400709c..504d9e2dbc 100644 --- a/cmd/thv-operator/api/v1beta1/virtualmcpserver_types_test.go +++ b/cmd/thv-operator/api/v1beta1/virtualmcpserver_types_test.go @@ -422,7 +422,7 @@ func TestValidateEmbeddingServer(t *testing.T) { expectOptimizer: true, }, { - name: "optimizer_without_ref_or_service_errors", + name: "optimizer_without_ref_or_service_succeeds_keyword_only", server: &VirtualMCPServer{ Spec: VirtualMCPServerSpec{ GroupRef: &MCPGroupRef{Name: "test-group"}, @@ -431,8 +431,7 @@ func TestValidateEmbeddingServer(t *testing.T) { }, }, }, - expectError: true, - errContains: "spec.config.optimizer requires an embedding service", + expectOptimizer: true, }, { name: "empty_ref_name_errors",