@@ -96,6 +96,74 @@ pub struct ProfileConfig {
9696 /// 最大输出 token 数上限(可选,用于限制转发给 provider 的 max_tokens)
9797 #[ serde( default ) ]
9898 pub max_tokens : Option < u64 > ,
99+ /// 从翻译后的请求体中剥离的参数名列表
100+ /// 用于处理上游端点不支持某些参数的情况(如 Codex ChatGPT 不支持 temperature)
101+ /// 设为 "auto" 时根据 base_url 自动推断
102+ #[ serde( default ) ]
103+ pub strip_params : StripParams ,
104+ }
105+
106+ /// 参数剥离配置
107+ #[ derive( Debug , Clone , Default , Serialize , Deserialize ) ]
108+ #[ serde( from = "StripParamsRaw" ) ]
109+ pub enum StripParams {
110+ /// 根据 base_url 自动推断需要剥离的参数
111+ #[ default]
112+ Auto ,
113+ /// 不剥离任何参数
114+ None ,
115+ /// 剥离指定的参数列表
116+ List ( Vec < String > ) ,
117+ }
118+
119+ #[ derive( Deserialize ) ]
120+ #[ serde( untagged) ]
121+ enum StripParamsRaw {
122+ Str ( String ) ,
123+ List ( Vec < String > ) ,
124+ }
125+
126+ impl From < StripParamsRaw > for StripParams {
127+ fn from ( raw : StripParamsRaw ) -> Self {
128+ match raw {
129+ StripParamsRaw :: Str ( s) => match s. to_lowercase ( ) . as_str ( ) {
130+ "auto" => StripParams :: Auto ,
131+ "none" | "false" | "" => StripParams :: None ,
132+ _ => StripParams :: List (
133+ s. split ( ',' )
134+ . map ( |p| p. trim ( ) . to_string ( ) )
135+ . filter ( |p| !p. is_empty ( ) )
136+ . collect ( ) ,
137+ ) ,
138+ } ,
139+ StripParamsRaw :: List ( list) => StripParams :: List ( list) ,
140+ }
141+ }
142+ }
143+
144+ impl StripParams {
145+ /// 解析实际要剥离的参数列表,Auto 模式根据 base_url 推断
146+ pub fn resolve ( & self , base_url : & str ) -> Vec < String > {
147+ match self {
148+ StripParams :: None => vec ! [ ] ,
149+ StripParams :: List ( list) => list. clone ( ) ,
150+ StripParams :: Auto => Self :: infer_from_url ( base_url) ,
151+ }
152+ }
153+
154+ /// 已知端点的参数兼容性规则
155+ fn infer_from_url ( base_url : & str ) -> Vec < String > {
156+ if base_url. contains ( "chatgpt.com" ) {
157+ // Codex ChatGPT 端点不支持采样参数
158+ vec ! [
159+ "temperature" . to_string( ) ,
160+ "top_p" . to_string( ) ,
161+ "top_k" . to_string( ) ,
162+ ]
163+ } else {
164+ vec ! [ ]
165+ }
166+ }
99167}
100168
101169/// Claude Code 模型 slot 映射
@@ -386,6 +454,7 @@ mod tests {
386454 oauth_provider : None ,
387455 models : ProfileModels :: default ( ) ,
388456 max_tokens : None ,
457+ strip_params : StripParams :: default ( ) ,
389458 }
390459 }
391460
0 commit comments