From 192b6e5c3d518c31b8463ec9353f241a3d4b95ab Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Wed, 23 Sep 2026 12:29:24 +0200 Subject: [PATCH] direct: surface model_serving_endpoints ForceSendFields at the remote root RemapState sourced ForceSendFields from the nested EndpointDetails, which the auto-copier (root ForceSendFields only) cannot reproduce. Surface it on the ModelServingEndpointRemote root in newModelServingEndpointRemote (filtered to the wrapper's own fields) and read it there in RemapState, making RemapState a plain subset copy. Add marshal-based MarshalJSON/UnmarshalJSON so the wrapper's extra fields survive the JSON state round-trip (mirrors VectorSearchEndpointRemote). Side effect: the plan remote_state now force-sends the surfaced fields, so the per-engine direct plan goldens are regenerated. No action/diff changes. Co-authored-by: Isaac --- .../basic/out.second-plan.direct.txt | 2 + .../catalog-name/out.second-plan.direct.json | 62 ++++++++++--------- .../name-change/out.second-plan.direct.json | 52 ++++++++-------- .../out.second-plan.direct.json | 44 ++++++------- .../schema-name/out.second-plan.direct.json | 62 ++++++++++--------- .../table-prefix/out.second-plan.direct.json | 62 ++++++++++--------- .../update/ai-gateway/out.plan.direct.json | 62 ++++++++++--------- .../out.plan.direct.json | 60 +++++++++--------- .../update/config/out.plan.direct.json | 50 ++++++++------- .../email-notifications/out.plan.direct.json | 62 ++++++++++--------- .../update/tags/out.plan.direct.json | 50 ++++++++------- .../dresources/model_serving_endpoint.go | 18 +++++- 12 files changed, 312 insertions(+), 274 deletions(-) diff --git a/acceptance/bundle/resources/model_serving_endpoints/basic/out.second-plan.direct.txt b/acceptance/bundle/resources/model_serving_endpoints/basic/out.second-plan.direct.txt index 876bd99c4c5..60bca95b9ff 100644 --- a/acceptance/bundle/resources/model_serving_endpoints/basic/out.second-plan.direct.txt +++ b/acceptance/bundle/resources/model_serving_endpoints/basic/out.second-plan.direct.txt @@ -4,6 +4,7 @@ json.lineage = "[UUID]"; json.serial = 1; json.plan.resources.model_serving_endpoints.my_endpoint.action = "recreate"; json.plan.resources.model_serving_endpoints.my_endpoint.new_state.value.name = "[ENDPOINT_NAME_2]"; +json.plan.resources.model_serving_endpoints.my_endpoint.remote_state.description = ""; json.plan.resources.model_serving_endpoints.my_endpoint.remote_state.endpoint_details.creation_timestamp = [UNIX_TIME_MILLIS][0]; json.plan.resources.model_serving_endpoints.my_endpoint.remote_state.endpoint_details.creator = "[USERNAME]"; json.plan.resources.model_serving_endpoints.my_endpoint.remote_state.endpoint_details.description = ""; @@ -16,6 +17,7 @@ json.plan.resources.model_serving_endpoints.my_endpoint.remote_state.endpoint_de json.plan.resources.model_serving_endpoints.my_endpoint.remote_state.endpoint_details.state.ready = "NOT_READY"; json.plan.resources.model_serving_endpoints.my_endpoint.remote_state.endpoint_id = "[ENDPOINT_ID_1]"; json.plan.resources.model_serving_endpoints.my_endpoint.remote_state.name = "[ENDPOINT_NAME_1]"; +json.plan.resources.model_serving_endpoints.my_endpoint.remote_state.route_optimized = false; json.plan.resources.model_serving_endpoints.my_endpoint.changes.description.action = "skip"; json.plan.resources.model_serving_endpoints.my_endpoint.changes.description.reason = "empty"; json.plan.resources.model_serving_endpoints.my_endpoint.changes.description.remote = ""; diff --git a/acceptance/bundle/resources/model_serving_endpoints/recreate/catalog-name/out.second-plan.direct.json b/acceptance/bundle/resources/model_serving_endpoints/recreate/catalog-name/out.second-plan.direct.json index f99a336e98a..89686b87922 100644 --- a/acceptance/bundle/resources/model_serving_endpoints/recreate/catalog-name/out.second-plan.direct.json +++ b/acceptance/bundle/resources/model_serving_endpoints/recreate/catalog-name/out.second-plan.direct.json @@ -32,6 +32,36 @@ } }, "remote_state": { + "config": { + "auto_capture_config": { + "catalog_name": "main", + "schema_name": "default", + "table_name_prefix": "my_table" + }, + "served_entities": [ + { + "external_model": { + "name": "gpt-4o-mini", + "openai_config": { + "openai_api_key": "{{secrets/test-scope/openai-key}}" + }, + "provider": "openai", + "task": "llm/v1/chat" + }, + "name": "prod" + } + ], + "traffic_config": { + "routes": [ + { + "served_entity_name": "prod", + "served_model_name": "prod", + "traffic_percentage": 100 + } + ] + } + }, + "description": "", "endpoint_details": { "config": { "auto_capture_config": { @@ -76,36 +106,8 @@ } }, "endpoint_id": "[UUID]", - "config": { - "auto_capture_config": { - "catalog_name": "main", - "schema_name": "default", - "table_name_prefix": "my_table" - }, - "served_entities": [ - { - "external_model": { - "name": "gpt-4o-mini", - "openai_config": { - "openai_api_key": "{{secrets/test-scope/openai-key}}" - }, - "provider": "openai", - "task": "llm/v1/chat" - }, - "name": "prod" - } - ], - "traffic_config": { - "routes": [ - { - "served_entity_name": "prod", - "served_model_name": "prod", - "traffic_percentage": 100 - } - ] - } - }, - "name": "[ORIGINAL_ENDPOINT_ID]" + "name": "[ORIGINAL_ENDPOINT_ID]", + "route_optimized": false }, "changes": { "config.auto_capture_config.catalog_name": { diff --git a/acceptance/bundle/resources/model_serving_endpoints/recreate/name-change/out.second-plan.direct.json b/acceptance/bundle/resources/model_serving_endpoints/recreate/name-change/out.second-plan.direct.json index ab7d2ad1591..2a50d836ce7 100644 --- a/acceptance/bundle/resources/model_serving_endpoints/recreate/name-change/out.second-plan.direct.json +++ b/acceptance/bundle/resources/model_serving_endpoints/recreate/name-change/out.second-plan.direct.json @@ -27,6 +27,31 @@ } }, "remote_state": { + "config": { + "served_entities": [ + { + "external_model": { + "name": "gpt-4o-mini", + "openai_config": { + "openai_api_key": "{{secrets/test-scope/openai-key}}" + }, + "provider": "openai", + "task": "llm/v1/chat" + }, + "name": "prod" + } + ], + "traffic_config": { + "routes": [ + { + "served_entity_name": "prod", + "served_model_name": "prod", + "traffic_percentage": 100 + } + ] + } + }, + "description": "", "endpoint_details": { "config": { "served_entities": [ @@ -66,31 +91,8 @@ } }, "endpoint_id": "[UUID]", - "config": { - "served_entities": [ - { - "external_model": { - "name": "gpt-4o-mini", - "openai_config": { - "openai_api_key": "{{secrets/test-scope/openai-key}}" - }, - "provider": "openai", - "task": "llm/v1/chat" - }, - "name": "prod" - } - ], - "traffic_config": { - "routes": [ - { - "served_entity_name": "prod", - "served_model_name": "prod", - "traffic_percentage": 100 - } - ] - } - }, - "name": "[ORIGINAL_ENDPOINT_ID]" + "name": "[ORIGINAL_ENDPOINT_ID]", + "route_optimized": false }, "changes": { "config.traffic_config": { diff --git a/acceptance/bundle/resources/model_serving_endpoints/recreate/route-optimized/out.second-plan.direct.json b/acceptance/bundle/resources/model_serving_endpoints/recreate/route-optimized/out.second-plan.direct.json index 3382946b547..b5555453219 100644 --- a/acceptance/bundle/resources/model_serving_endpoints/recreate/route-optimized/out.second-plan.direct.json +++ b/acceptance/bundle/resources/model_serving_endpoints/recreate/route-optimized/out.second-plan.direct.json @@ -24,6 +24,27 @@ } }, "remote_state": { + "config": { + "served_entities": [ + { + "entity_name": "system.ai.llama_v3_2_1b_instruct", + "entity_version": "1", + "name": "llama", + "scale_to_zero_enabled": true, + "workload_size": "Small" + } + ], + "traffic_config": { + "routes": [ + { + "served_entity_name": "llama", + "served_model_name": "llama", + "traffic_percentage": 100 + } + ] + } + }, + "description": "", "endpoint_details": { "config": { "served_entities": [ @@ -59,27 +80,8 @@ } }, "endpoint_id": "[UUID]", - "config": { - "served_entities": [ - { - "entity_name": "system.ai.llama_v3_2_1b_instruct", - "entity_version": "1", - "name": "llama", - "scale_to_zero_enabled": true, - "workload_size": "Small" - } - ], - "traffic_config": { - "routes": [ - { - "served_entity_name": "llama", - "served_model_name": "llama", - "traffic_percentage": 100 - } - ] - } - }, - "name": "[ORIGINAL_ENDPOINT_ID]" + "name": "[ORIGINAL_ENDPOINT_ID]", + "route_optimized": false }, "changes": { "config.traffic_config": { diff --git a/acceptance/bundle/resources/model_serving_endpoints/recreate/schema-name/out.second-plan.direct.json b/acceptance/bundle/resources/model_serving_endpoints/recreate/schema-name/out.second-plan.direct.json index 6545723b23d..0a2bc7bee2d 100644 --- a/acceptance/bundle/resources/model_serving_endpoints/recreate/schema-name/out.second-plan.direct.json +++ b/acceptance/bundle/resources/model_serving_endpoints/recreate/schema-name/out.second-plan.direct.json @@ -32,6 +32,36 @@ } }, "remote_state": { + "config": { + "auto_capture_config": { + "catalog_name": "main", + "schema_name": "default", + "table_name_prefix": "my_table" + }, + "served_entities": [ + { + "external_model": { + "name": "gpt-4o-mini", + "openai_config": { + "openai_api_key": "{{secrets/test-scope/openai-key}}" + }, + "provider": "openai", + "task": "llm/v1/chat" + }, + "name": "prod" + } + ], + "traffic_config": { + "routes": [ + { + "served_entity_name": "prod", + "served_model_name": "prod", + "traffic_percentage": 100 + } + ] + } + }, + "description": "", "endpoint_details": { "config": { "auto_capture_config": { @@ -76,36 +106,8 @@ } }, "endpoint_id": "[UUID]", - "config": { - "auto_capture_config": { - "catalog_name": "main", - "schema_name": "default", - "table_name_prefix": "my_table" - }, - "served_entities": [ - { - "external_model": { - "name": "gpt-4o-mini", - "openai_config": { - "openai_api_key": "{{secrets/test-scope/openai-key}}" - }, - "provider": "openai", - "task": "llm/v1/chat" - }, - "name": "prod" - } - ], - "traffic_config": { - "routes": [ - { - "served_entity_name": "prod", - "served_model_name": "prod", - "traffic_percentage": 100 - } - ] - } - }, - "name": "[ORIGINAL_ENDPOINT_ID]" + "name": "[ORIGINAL_ENDPOINT_ID]", + "route_optimized": false }, "changes": { "config.auto_capture_config.schema_name": { diff --git a/acceptance/bundle/resources/model_serving_endpoints/recreate/table-prefix/out.second-plan.direct.json b/acceptance/bundle/resources/model_serving_endpoints/recreate/table-prefix/out.second-plan.direct.json index 0ef37e3a62d..6d2c9deccb6 100644 --- a/acceptance/bundle/resources/model_serving_endpoints/recreate/table-prefix/out.second-plan.direct.json +++ b/acceptance/bundle/resources/model_serving_endpoints/recreate/table-prefix/out.second-plan.direct.json @@ -32,6 +32,36 @@ } }, "remote_state": { + "config": { + "auto_capture_config": { + "catalog_name": "main", + "schema_name": "default", + "table_name_prefix": "my_table" + }, + "served_entities": [ + { + "external_model": { + "name": "gpt-4o-mini", + "openai_config": { + "openai_api_key": "{{secrets/test-scope/openai-key}}" + }, + "provider": "openai", + "task": "llm/v1/chat" + }, + "name": "prod" + } + ], + "traffic_config": { + "routes": [ + { + "served_entity_name": "prod", + "served_model_name": "prod", + "traffic_percentage": 100 + } + ] + } + }, + "description": "", "endpoint_details": { "config": { "auto_capture_config": { @@ -76,36 +106,8 @@ } }, "endpoint_id": "[UUID]", - "config": { - "auto_capture_config": { - "catalog_name": "main", - "schema_name": "default", - "table_name_prefix": "my_table" - }, - "served_entities": [ - { - "external_model": { - "name": "gpt-4o-mini", - "openai_config": { - "openai_api_key": "{{secrets/test-scope/openai-key}}" - }, - "provider": "openai", - "task": "llm/v1/chat" - }, - "name": "prod" - } - ], - "traffic_config": { - "routes": [ - { - "served_entity_name": "prod", - "served_model_name": "prod", - "traffic_percentage": 100 - } - ] - } - }, - "name": "[ORIGINAL_ENDPOINT_ID]" + "name": "[ORIGINAL_ENDPOINT_ID]", + "route_optimized": false }, "changes": { "config.auto_capture_config.table_name_prefix": { diff --git a/acceptance/bundle/resources/model_serving_endpoints/update/ai-gateway/out.plan.direct.json b/acceptance/bundle/resources/model_serving_endpoints/update/ai-gateway/out.plan.direct.json index ca7cc9b22dc..afe9fa25886 100644 --- a/acceptance/bundle/resources/model_serving_endpoints/update/ai-gateway/out.plan.direct.json +++ b/acceptance/bundle/resources/model_serving_endpoints/update/ai-gateway/out.plan.direct.json @@ -32,6 +32,36 @@ } }, "remote_state": { + "ai_gateway": { + "inference_table_config": { + "catalog_name": "first-inference-catalog" + } + }, + "config": { + "served_entities": [ + { + "external_model": { + "name": "gpt-4o-mini", + "openai_config": { + "openai_api_key": "{{secrets/test-scope/openai-key}}" + }, + "provider": "openai", + "task": "llm/v1/chat" + }, + "name": "prod" + } + ], + "traffic_config": { + "routes": [ + { + "served_entity_name": "prod", + "served_model_name": "prod", + "traffic_percentage": 100 + } + ] + } + }, + "description": "", "endpoint_details": { "ai_gateway": { "inference_table_config": { @@ -76,36 +106,8 @@ } }, "endpoint_id": "[UUID]", - "ai_gateway": { - "inference_table_config": { - "catalog_name": "first-inference-catalog" - } - }, - "config": { - "served_entities": [ - { - "external_model": { - "name": "gpt-4o-mini", - "openai_config": { - "openai_api_key": "{{secrets/test-scope/openai-key}}" - }, - "provider": "openai", - "task": "llm/v1/chat" - }, - "name": "prod" - } - ], - "traffic_config": { - "routes": [ - { - "served_entity_name": "prod", - "served_model_name": "prod", - "traffic_percentage": 100 - } - ] - } - }, - "name": "[ENDPOINT_ID]" + "name": "[ENDPOINT_ID]", + "route_optimized": false }, "changes": { "ai_gateway.inference_table_config.catalog_name": { diff --git a/acceptance/bundle/resources/model_serving_endpoints/update/both_gateway_and_tags/out.plan.direct.json b/acceptance/bundle/resources/model_serving_endpoints/update/both_gateway_and_tags/out.plan.direct.json index 67974b8a639..32c30ee2612 100644 --- a/acceptance/bundle/resources/model_serving_endpoints/update/both_gateway_and_tags/out.plan.direct.json +++ b/acceptance/bundle/resources/model_serving_endpoints/update/both_gateway_and_tags/out.plan.direct.json @@ -38,6 +38,36 @@ } }, "remote_state": { + "ai_gateway": { + "inference_table_config": { + "catalog_name": "first-inference-catalog" + } + }, + "config": { + "served_entities": [ + { + "external_model": { + "name": "gpt-4o-mini", + "openai_config": { + "openai_api_key": "{{secrets/test-scope/openai-key}}" + }, + "provider": "openai", + "task": "llm/v1/chat" + }, + "name": "prod" + } + ], + "traffic_config": { + "routes": [ + { + "served_entity_name": "prod", + "served_model_name": "prod", + "traffic_percentage": 100 + } + ] + } + }, + "description": "", "endpoint_details": { "ai_gateway": { "inference_table_config": { @@ -88,36 +118,8 @@ ] }, "endpoint_id": "[UUID]", - "ai_gateway": { - "inference_table_config": { - "catalog_name": "first-inference-catalog" - } - }, - "config": { - "served_entities": [ - { - "external_model": { - "name": "gpt-4o-mini", - "openai_config": { - "openai_api_key": "{{secrets/test-scope/openai-key}}" - }, - "provider": "openai", - "task": "llm/v1/chat" - }, - "name": "prod" - } - ], - "traffic_config": { - "routes": [ - { - "served_entity_name": "prod", - "served_model_name": "prod", - "traffic_percentage": 100 - } - ] - } - }, "name": "[ENDPOINT_ID]", + "route_optimized": false, "tags": [ { "key": "team", diff --git a/acceptance/bundle/resources/model_serving_endpoints/update/config/out.plan.direct.json b/acceptance/bundle/resources/model_serving_endpoints/update/config/out.plan.direct.json index bcb8282e599..5b90f2088d6 100644 --- a/acceptance/bundle/resources/model_serving_endpoints/update/config/out.plan.direct.json +++ b/acceptance/bundle/resources/model_serving_endpoints/update/config/out.plan.direct.json @@ -35,6 +35,30 @@ } }, "remote_state": { + "config": { + "served_entities": [ + { + "external_model": { + "name": "gpt-4o-mini", + "openai_config": { + "openai_api_key": "{{secrets/test-scope/openai-key}}" + }, + "provider": "openai", + "task": "llm/v1/chat" + }, + "name": "prod" + } + ], + "traffic_config": { + "routes": [ + { + "served_model_name": "prod", + "traffic_percentage": 100 + } + ] + } + }, + "description": "", "endpoint_details": { "config": { "served_entities": [ @@ -73,30 +97,8 @@ } }, "endpoint_id": "[UUID]", - "config": { - "served_entities": [ - { - "external_model": { - "name": "gpt-4o-mini", - "openai_config": { - "openai_api_key": "{{secrets/test-scope/openai-key}}" - }, - "provider": "openai", - "task": "llm/v1/chat" - }, - "name": "prod" - } - ], - "traffic_config": { - "routes": [ - { - "served_model_name": "prod", - "traffic_percentage": 100 - } - ] - } - }, - "name": "[ENDPOINT_ID]" + "name": "[ENDPOINT_ID]", + "route_optimized": false }, "changes": { "config.served_entities[0].external_model.name": { diff --git a/acceptance/bundle/resources/model_serving_endpoints/update/email-notifications/out.plan.direct.json b/acceptance/bundle/resources/model_serving_endpoints/update/email-notifications/out.plan.direct.json index 1d7161ab0fd..0f860ce7ac3 100644 --- a/acceptance/bundle/resources/model_serving_endpoints/update/email-notifications/out.plan.direct.json +++ b/acceptance/bundle/resources/model_serving_endpoints/update/email-notifications/out.plan.direct.json @@ -32,6 +32,36 @@ } }, "remote_state": { + "config": { + "served_entities": [ + { + "external_model": { + "name": "gpt-4o-mini", + "openai_config": { + "openai_api_key": "{{secrets/test-scope/openai-key}}" + }, + "provider": "openai", + "task": "llm/v1/chat" + }, + "name": "prod" + } + ], + "traffic_config": { + "routes": [ + { + "served_entity_name": "prod", + "served_model_name": "prod", + "traffic_percentage": 100 + } + ] + } + }, + "description": "", + "email_notifications": { + "on_update_success": [ + "user1@example.com" + ] + }, "endpoint_details": { "config": { "served_entities": [ @@ -76,36 +106,8 @@ } }, "endpoint_id": "[UUID]", - "config": { - "served_entities": [ - { - "external_model": { - "name": "gpt-4o-mini", - "openai_config": { - "openai_api_key": "{{secrets/test-scope/openai-key}}" - }, - "provider": "openai", - "task": "llm/v1/chat" - }, - "name": "prod" - } - ], - "traffic_config": { - "routes": [ - { - "served_entity_name": "prod", - "served_model_name": "prod", - "traffic_percentage": 100 - } - ] - } - }, - "email_notifications": { - "on_update_success": [ - "user1@example.com" - ] - }, - "name": "[ENDPOINT_ID]" + "name": "[ENDPOINT_ID]", + "route_optimized": false }, "changes": { "config.traffic_config": { diff --git a/acceptance/bundle/resources/model_serving_endpoints/update/tags/out.plan.direct.json b/acceptance/bundle/resources/model_serving_endpoints/update/tags/out.plan.direct.json index 7c8d5983def..f8850241ddf 100644 --- a/acceptance/bundle/resources/model_serving_endpoints/update/tags/out.plan.direct.json +++ b/acceptance/bundle/resources/model_serving_endpoints/update/tags/out.plan.direct.json @@ -33,6 +33,31 @@ } }, "remote_state": { + "config": { + "served_entities": [ + { + "external_model": { + "name": "gpt-4o-mini", + "openai_config": { + "openai_api_key": "{{secrets/test-scope/openai-key}}" + }, + "provider": "openai", + "task": "llm/v1/chat" + }, + "name": "prod" + } + ], + "traffic_config": { + "routes": [ + { + "served_entity_name": "prod", + "served_model_name": "prod", + "traffic_percentage": 100 + } + ] + } + }, + "description": "", "endpoint_details": { "config": { "served_entities": [ @@ -78,31 +103,8 @@ ] }, "endpoint_id": "[UUID]", - "config": { - "served_entities": [ - { - "external_model": { - "name": "gpt-4o-mini", - "openai_config": { - "openai_api_key": "{{secrets/test-scope/openai-key}}" - }, - "provider": "openai", - "task": "llm/v1/chat" - }, - "name": "prod" - } - ], - "traffic_config": { - "routes": [ - { - "served_entity_name": "prod", - "served_model_name": "prod", - "traffic_percentage": 100 - } - ] - } - }, "name": "[ENDPOINT_ID]", + "route_optimized": false, "tags": [ { "key": "team", diff --git a/bundle/direct/dresources/model_serving_endpoint.go b/bundle/direct/dresources/model_serving_endpoint.go index c0cc8f82598..f9c0a2314ac 100644 --- a/bundle/direct/dresources/model_serving_endpoint.go +++ b/bundle/direct/dresources/model_serving_endpoint.go @@ -9,6 +9,7 @@ import ( "github.com/databricks/cli/libs/structs/structpath" "github.com/databricks/cli/libs/utils" "github.com/databricks/databricks-sdk-go" + "github.com/databricks/databricks-sdk-go/marshal" "github.com/databricks/databricks-sdk-go/service/serving" ) @@ -103,7 +104,7 @@ func (*ResourceModelServingEndpoint) RemapState(state *ModelServingEndpointRemot RouteOptimized: state.RouteOptimized, Tags: state.Tags, TelemetryConfig: state.TelemetryConfig, - ForceSendFields: utils.FilterFields[serving.CreateServingEndpoint](state.EndpointDetails.ForceSendFields), + ForceSendFields: utils.FilterFields[serving.CreateServingEndpoint](state.ForceSendFields), // Rate limits are a deprecated field that are not returned by the API on GET calls. Thus we map them to nil. // TODO(shreyas): Add a warning when users try setting top level rate limits. @@ -126,6 +127,20 @@ type ModelServingEndpointRemote struct { RouteOptimized bool `json:"route_optimized,omitempty"` Tags []serving.EndpointTag `json:"tags,omitempty"` TelemetryConfig *serving.TelemetryConfig `json:"telemetry_config,omitempty"` + + // ForceSendFields surfaces EndpointDetails.ForceSendFields at the root so RemapState is a + // plain field copy rather than reaching into the nested EndpointDetails struct. + ForceSendFields []string `json:"-"` +} + +// Custom marshalers so the SDK's ForceSendFields convention is honored on the wrapper and its +// extra fields survive a JSON state round-trip (mirrors VectorSearchEndpointRemote). +func (s *ModelServingEndpointRemote) UnmarshalJSON(b []byte) error { + return marshal.Unmarshal(b, s) +} + +func (s ModelServingEndpointRemote) MarshalJSON() ([]byte, error) { + return marshal.Marshal(s) } func newModelServingEndpointRemote(details *serving.ServingEndpointDetailed) *ModelServingEndpointRemote { @@ -141,6 +156,7 @@ func newModelServingEndpointRemote(details *serving.ServingEndpointDetailed) *Mo RouteOptimized: details.RouteOptimized, Tags: details.Tags, TelemetryConfig: details.TelemetryConfig, + ForceSendFields: utils.FilterFields[ModelServingEndpointRemote](details.ForceSendFields), } }