@@ -303,12 +303,16 @@ def get_version_detail_impl(
303303 # Add enabled skills to result
304304 result ['skills' ] = [s for s in skills_snapshot if s .get ('enabled' , True )]
305305
306- # Get model name from model_id
307- if result .get ('model_id' ) is not None and result ['model_id' ] != 0 :
308- model_info = get_model_by_model_id (result ['model_id' ])
309- result ['model_name' ] = model_info .get ('display_name' , None ) if model_info else None
310- else :
311- result ['model_name' ] = None
306+ # Get model names from model_ids array
307+ snapshot_model_ids = result .get ("model_ids" ) or []
308+ snapshot_model_names : List [str ] = []
309+ for mid in snapshot_model_ids :
310+ mid_info = get_model_by_model_id (mid )
311+ if mid_info and mid_info .get ("display_name" ):
312+ snapshot_model_names .append (mid_info ["display_name" ])
313+ result ["model_names" ] = snapshot_model_names
314+ # Derive legacy model_name from the first model for backward compatibility
315+ result ["model_name" ] = snapshot_model_names [0 ] if snapshot_model_names else None
312316
313317 # Get business logic model name
314318 if result .get ('business_logic_model_id' ) is not None and result ['business_logic_model_id' ] != 0 :
@@ -363,8 +367,8 @@ def _check_version_snapshot_availability(
363367 return False , [AgentUnavailableReason .AGENT_NOT_FOUND ]
364368
365369 # Check model availability
366- model_id = agent_info .get ('model_id' )
367- if model_id is None or model_id == 0 :
370+ model_ids = agent_info .get ('model_ids' ) or []
371+ if not model_ids :
368372 unavailable_reasons .append (AgentUnavailableReason .MODEL_NOT_CONFIGURED )
369373
370374 # Check tools availability (only when tools are configured)
@@ -628,13 +632,21 @@ def compare_versions_impl(
628632 'value_b' : version_b .get ('name' ),
629633 })
630634
631- # Compare model_name
632- if version_a .get ('model_name' ) != version_b .get ('model_name' ):
635+ # Compare model_ids (canonical field). Both versions should always have the
636+ # same shape (list of ints) after get_version_detail_impl / draft path normalization.
637+ def _normalize_model_ids (value : Any ) -> List [int ]:
638+ if not value :
639+ return []
640+ return [int (x ) for x in value if x is not None ]
641+
642+ model_ids_a = _normalize_model_ids (version_a .get ('model_ids' ))
643+ model_ids_b = _normalize_model_ids (version_b .get ('model_ids' ))
644+ if model_ids_a != model_ids_b :
633645 differences .append ({
634- 'field' : 'model_name ' ,
646+ 'field' : 'model_ids ' ,
635647 'label' : 'Model' ,
636- 'value_a' : version_a .get ('model_name' ) ,
637- 'value_b' : version_b .get ('model_name' ) ,
648+ 'value_a' : version_a .get ('model_names' ) or model_ids_a ,
649+ 'value_b' : version_b .get ('model_names' ) or model_ids_b ,
638650 })
639651
640652 # Compare max_steps
@@ -752,12 +764,15 @@ def _get_version_detail_or_draft(
752764 # Get published version detail (already includes skills from get_version_detail_impl)
753765 result = get_version_detail_impl (agent_id , tenant_id , version_no )
754766
755- # Get model name from model_id
756- if result .get ('model_id' ) is not None and result ['model_id' ] != 0 :
757- model_info = get_model_by_model_id (result ['model_id' ])
758- result ['model_name' ] = model_info .get ('display_name' , None ) if model_info else None
759- else :
760- result ['model_name' ] = None
767+ # Get model names from model_ids array
768+ detail_model_ids = result .get ("model_ids" ) or []
769+ detail_model_names : List [str ] = []
770+ for mid in detail_model_ids :
771+ mid_info = get_model_by_model_id (mid )
772+ if mid_info and mid_info .get ("display_name" ):
773+ detail_model_names .append (mid_info ["display_name" ])
774+ result ["model_names" ] = detail_model_names
775+ result ["model_name" ] = detail_model_names [0 ] if detail_model_names else None
761776
762777 # Get business logic model name
763778 if result .get ('business_logic_model_id' ) is not None and result ['business_logic_model_id' ] != 0 :
@@ -908,12 +923,20 @@ async def list_published_agents_impl(
908923 agent = entry ["raw_agent" ]
909924 unavailable_reasons = list (dict .fromkeys (entry ["unavailable_reasons" ]))
910925
911- model_id = agent .get ("model_id" )
912- model_info = None
913- if model_id is not None :
914- if model_id not in model_cache :
915- model_cache [model_id ] = get_model_by_model_id (model_id , tenant_id )
916- model_info = model_cache .get (model_id )
926+ # Build model_ids and model_names from agent snapshot
927+ model_ids_list = agent .get ("model_ids" )
928+ model_names_list : list [str ] = []
929+
930+ if model_ids_list :
931+ # Resolve model names for each model_id
932+ for mid in model_ids_list :
933+ if mid not in model_cache :
934+ model_cache [mid ] = get_model_by_model_id (mid , tenant_id )
935+ model_info_item = model_cache .get (mid )
936+ if model_info_item :
937+ model_names_list .append (model_info_item .get ("display_name" ) or model_info_item .get ("model_name" ) or str (mid ))
938+ else :
939+ model_names_list .append (str (mid ))
917940
918941 permission = resolve_agent_list_permission (
919942 user_role = user_role ,
@@ -928,9 +951,9 @@ async def list_published_agents_impl(
928951 "display_name" : agent .get ("display_name" ) if agent .get ("display_name" ) else agent .get ("name" ),
929952 "description" : agent .get ("description" ),
930953 "author" : agent .get ("author" ),
931- "model_id " : model_id ,
932- "model_name " : model_info . get ( "model_name" ) if model_info is not None else agent . get ( "model_name" ) ,
933- "model_display_name " : model_info . get ( "display_name" ) if model_info is not None else None ,
954+ "model_ids " : model_ids_list ,
955+ "model_names " : model_names_list ,
956+ "model_name " : model_names_list [ 0 ] if model_names_list else None ,
934957 "is_available" : len (unavailable_reasons ) == 0 ,
935958 "unavailable_reasons" : unavailable_reasons ,
936959 "is_new" : agent .get ("is_new" , False ),
0 commit comments