|
6 | 6 | "reflect" |
7 | 7 | "testing" |
8 | 8 |
|
| 9 | + common2 "github.com/QuantumNous/new-api/common" |
9 | 10 | "github.com/QuantumNous/new-api/types" |
10 | 11 |
|
11 | 12 | "github.com/QuantumNous/new-api/dto" |
@@ -2066,6 +2067,105 @@ func TestRemoveDisabledFieldsAllowInferenceGeo(t *testing.T) { |
2066 | 2067 | assertJSONEqual(t, `{"inference_geo":"eu","store":true}`, string(out)) |
2067 | 2068 | } |
2068 | 2069 |
|
| 2070 | +func TestApplyParamOverrideWithRelayInfoRecordsOperationAuditInDebugMode(t *testing.T) { |
| 2071 | + originalDebugEnabled := common2.DebugEnabled |
| 2072 | + common2.DebugEnabled = true |
| 2073 | + t.Cleanup(func() { |
| 2074 | + common2.DebugEnabled = originalDebugEnabled |
| 2075 | + }) |
| 2076 | + |
| 2077 | + info := &RelayInfo{ |
| 2078 | + ChannelMeta: &ChannelMeta{ |
| 2079 | + ParamOverride: map[string]interface{}{ |
| 2080 | + "operations": []interface{}{ |
| 2081 | + map[string]interface{}{ |
| 2082 | + "mode": "copy", |
| 2083 | + "from": "metadata.target_model", |
| 2084 | + "to": "model", |
| 2085 | + }, |
| 2086 | + map[string]interface{}{ |
| 2087 | + "mode": "set", |
| 2088 | + "path": "service_tier", |
| 2089 | + "value": "flex", |
| 2090 | + }, |
| 2091 | + map[string]interface{}{ |
| 2092 | + "mode": "set", |
| 2093 | + "path": "temperature", |
| 2094 | + "value": 0.1, |
| 2095 | + }, |
| 2096 | + }, |
| 2097 | + }, |
| 2098 | + }, |
| 2099 | + } |
| 2100 | + |
| 2101 | + out, err := ApplyParamOverrideWithRelayInfo([]byte(`{ |
| 2102 | + "model":"gpt-4.1", |
| 2103 | + "temperature":0.7, |
| 2104 | + "metadata":{"target_model":"gpt-4.1-mini"} |
| 2105 | + }`), info) |
| 2106 | + if err != nil { |
| 2107 | + t.Fatalf("ApplyParamOverrideWithRelayInfo returned error: %v", err) |
| 2108 | + } |
| 2109 | + assertJSONEqual(t, `{ |
| 2110 | + "model":"gpt-4.1-mini", |
| 2111 | + "temperature":0.1, |
| 2112 | + "service_tier":"flex", |
| 2113 | + "metadata":{"target_model":"gpt-4.1-mini"} |
| 2114 | + }`, string(out)) |
| 2115 | + |
| 2116 | + expected := []string{ |
| 2117 | + "copy metadata.target_model -> model", |
| 2118 | + "set service_tier = flex", |
| 2119 | + "set temperature = 0.1", |
| 2120 | + } |
| 2121 | + if !reflect.DeepEqual(info.ParamOverrideAudit, expected) { |
| 2122 | + t.Fatalf("unexpected param override audit, got %#v", info.ParamOverrideAudit) |
| 2123 | + } |
| 2124 | +} |
| 2125 | + |
| 2126 | +func TestApplyParamOverrideWithRelayInfoRecordsOnlyKeyOperationsWhenDebugDisabled(t *testing.T) { |
| 2127 | + originalDebugEnabled := common2.DebugEnabled |
| 2128 | + common2.DebugEnabled = false |
| 2129 | + t.Cleanup(func() { |
| 2130 | + common2.DebugEnabled = originalDebugEnabled |
| 2131 | + }) |
| 2132 | + |
| 2133 | + info := &RelayInfo{ |
| 2134 | + ChannelMeta: &ChannelMeta{ |
| 2135 | + ParamOverride: map[string]interface{}{ |
| 2136 | + "operations": []interface{}{ |
| 2137 | + map[string]interface{}{ |
| 2138 | + "mode": "copy", |
| 2139 | + "from": "metadata.target_model", |
| 2140 | + "to": "model", |
| 2141 | + }, |
| 2142 | + map[string]interface{}{ |
| 2143 | + "mode": "set", |
| 2144 | + "path": "temperature", |
| 2145 | + "value": 0.1, |
| 2146 | + }, |
| 2147 | + }, |
| 2148 | + }, |
| 2149 | + }, |
| 2150 | + } |
| 2151 | + |
| 2152 | + _, err := ApplyParamOverrideWithRelayInfo([]byte(`{ |
| 2153 | + "model":"gpt-4.1", |
| 2154 | + "temperature":0.7, |
| 2155 | + "metadata":{"target_model":"gpt-4.1-mini"} |
| 2156 | + }`), info) |
| 2157 | + if err != nil { |
| 2158 | + t.Fatalf("ApplyParamOverrideWithRelayInfo returned error: %v", err) |
| 2159 | + } |
| 2160 | + |
| 2161 | + expected := []string{ |
| 2162 | + "copy metadata.target_model -> model", |
| 2163 | + } |
| 2164 | + if !reflect.DeepEqual(info.ParamOverrideAudit, expected) { |
| 2165 | + t.Fatalf("unexpected param override audit, got %#v", info.ParamOverrideAudit) |
| 2166 | + } |
| 2167 | +} |
| 2168 | + |
2069 | 2169 | func assertJSONEqual(t *testing.T, want, got string) { |
2070 | 2170 | t.Helper() |
2071 | 2171 |
|
|
0 commit comments