@@ -91,6 +91,7 @@ import {
9191 mergeModelWindowRows ,
9292 modelWindowRowsFromProfile ,
9393 serializeModelWindowRows ,
94+ shouldShowModelImageHandling ,
9495 type ImageHandling ,
9596 type ModelWindowRow ,
9697} from "./model-windows" ;
@@ -6123,8 +6124,10 @@ function RelayProfileEditor({
61236124 setModelWindowRows : ( value : ModelWindowRow [ ] ) => void ;
61246125} ) {
61256126 const [ showAdvanced , setShowAdvanced ] = useState ( false ) ;
6126- // 纯 Responses 模式(非聚合)下 VLM/Strip 不生效,禁用下拉
6127- const vlmUnsupportedProtocol = profile . protocol === "responses" && ! isAggregateRelayProfile ( profile ) ;
6127+ const showModelImageHandling = shouldShowModelImageHandling (
6128+ profile . protocol ,
6129+ isAggregateRelayProfile ( profile ) ,
6130+ ) ;
61286131 if ( isAggregateRelayProfile ( profile ) ) {
61296132 return (
61306133 < AggregateRelayProfileEditor
@@ -6412,13 +6415,18 @@ function RelayProfileEditor({
64126415 </ div >
64136416 </ div >
64146417 < div className = "relay-model-row-editor" >
6415- < div className = "relay-model-row relay-model-row-head" >
6418+ < div
6419+ className = { `relay-model-row relay-model-row-head${ showModelImageHandling ? "" : " relay-model-row--without-image-handling" } ` }
6420+ >
64166421 < span > { t ( "模型名称" ) } </ span >
64176422 < span > { t ( "上下文窗口" ) } </ span >
6418- < span > { t ( "图片处理方式" ) } </ span >
6423+ { showModelImageHandling ? < span > { t ( "图片处理方式" ) } </ span > : null }
64196424 </ div >
64206425 { modelWindowRows . map ( ( row , index ) => (
6421- < div className = "relay-model-row" key = { index } >
6426+ < div
6427+ className = { `relay-model-row${ showModelImageHandling ? "" : " relay-model-row--without-image-handling" } ` }
6428+ key = { index }
6429+ >
64226430 < Input
64236431 value = { row . model }
64246432 onChange = { ( event ) => updateModelWindowRow ( index , { model : event . currentTarget . value } ) }
@@ -6429,19 +6437,20 @@ function RelayProfileEditor({
64296437 onChange = { ( event ) => updateModelWindowRow ( index , { window : event . currentTarget . value } ) }
64306438 placeholder = "1M"
64316439 />
6432- < AppSelect
6433- className = "text-xs"
6434- value = { row . imageHandling }
6435- disabled = { vlmUnsupportedProtocol }
6436- onChange = { ( value ) => updateModelWindowRow ( index , { imageHandling : value } ) }
6437- options = { [
6438- { value : "" , label : t ( "纯文本模型请配置此项" ) , disabled : true } ,
6439- { value : "send-as-is" , label : "send-as-is" , title : t ( "原样发送图片" ) } ,
6440- { value : "strip" , label : "strip images" , title : t ( "为纯文本模型移除消息中的图片" ) } ,
6441- { value : "vlm" , label : "VLM analysis" , title : t ( "为纯文本模型配置图片分析路由" ) } ,
6442- ] }
6443- title = { vlmUnsupportedProtocol ? t ( "VLM 仅支持 Chat Completions 协议和聚合模式" ) : t ( "多模态模型(支持图片输入的模型)请保持 send-as-is。" ) }
6444- />
6440+ { showModelImageHandling ? (
6441+ < AppSelect
6442+ className = "text-xs"
6443+ value = { row . imageHandling }
6444+ onChange = { ( value ) => updateModelWindowRow ( index , { imageHandling : value } ) }
6445+ options = { [
6446+ { value : "" , label : t ( "纯文本模型请配置此项" ) , disabled : true } ,
6447+ { value : "send-as-is" , label : "send-as-is" , title : t ( "原样发送图片" ) } ,
6448+ { value : "strip" , label : "strip images" , title : t ( "为纯文本模型移除消息中的图片" ) } ,
6449+ { value : "vlm" , label : "VLM analysis" , title : t ( "为纯文本模型配置图片分析路由" ) } ,
6450+ ] }
6451+ title = { t ( "多模态模型(支持图片输入的模型)请保持 send-as-is。" ) }
6452+ />
6453+ ) : null }
64456454 < Button
64466455 aria-label = { t ( "删除模型" ) }
64476456 onClick = { ( ) => removeModelWindowRow ( index ) }
0 commit comments