@@ -133,7 +133,106 @@ describe("webviewMessageHandler - requestRouterModels provider filter", () => {
133133 expect ( routerModels ) . toHaveProperty ( "openrouter" )
134134 expect ( routerModels ) . toHaveProperty ( "roo" )
135135 expect ( routerModels ) . toHaveProperty ( "requesty" )
136+ expect ( routerModels ) . toHaveProperty ( "deepseek" )
136137 expect ( routerModels . roo ) . toEqual ( { } )
138+ expect ( routerModels . deepseek ) . toEqual ( { } )
139+ expect ( getModelsMock ) . not . toHaveBeenCalledWith ( expect . objectContaining ( { provider : "deepseek" } ) )
140+ } )
141+
142+ it ( "fetches DeepSeek models when stored DeepSeek credentials exist" , async ( ) => {
143+ mockProvider . getState . mockResolvedValue ( {
144+ apiConfiguration : {
145+ deepSeekApiKey : "stored-deepseek-key" ,
146+ deepSeekBaseUrl : "https://deepseek.example.com" ,
147+ } ,
148+ } )
149+
150+ getModelsMock . mockImplementation ( async ( options : any ) => {
151+ if ( options ?. provider === "deepseek" ) {
152+ return { "deepseek-chat" : { contextWindow : 128000 , supportsPromptCache : true } }
153+ }
154+
155+ switch ( options ?. provider ) {
156+ case "openrouter" :
157+ return { "openrouter/qwen2.5" : { contextWindow : 32768 , supportsPromptCache : false } }
158+ case "requesty" :
159+ return { "requesty/model" : { contextWindow : 8192 , supportsPromptCache : false } }
160+ case "vercel-ai-gateway" :
161+ return { "vercel/model" : { contextWindow : 8192 , supportsPromptCache : false } }
162+ case "litellm" :
163+ return { "litellm/model" : { contextWindow : 8192 , supportsPromptCache : false } }
164+ default :
165+ return { }
166+ }
167+ } )
168+
169+ await webviewMessageHandler (
170+ mockProvider as any ,
171+ {
172+ type : "requestRouterModels" ,
173+ } as any ,
174+ )
175+
176+ expect ( getModelsMock ) . toHaveBeenCalledWith ( {
177+ provider : "deepseek" ,
178+ apiKey : "stored-deepseek-key" ,
179+ baseUrl : "https://deepseek.example.com" ,
180+ } )
181+
182+ const call = ( mockProvider . postMessageToWebview as any ) . mock . calls . find (
183+ ( c : any [ ] ) => c [ 0 ] ?. type === "routerModels" ,
184+ )
185+ expect ( call ) . toBeTruthy ( )
186+ expect ( call [ 0 ] . routerModels . deepseek ) . toEqual ( {
187+ "deepseek-chat" : { contextWindow : 128000 , supportsPromptCache : true } ,
188+ } )
189+ } )
190+
191+ it ( "posts a DeepSeek provider error and keeps an empty aggregate entry when DeepSeek fetch fails" , async ( ) => {
192+ mockProvider . getState . mockResolvedValue ( {
193+ apiConfiguration : {
194+ deepSeekApiKey : "stored-deepseek-key" ,
195+ } ,
196+ } )
197+
198+ getModelsMock . mockImplementation ( async ( options : any ) => {
199+ if ( options ?. provider === "deepseek" ) {
200+ throw new Error ( "DeepSeek API error" )
201+ }
202+
203+ switch ( options ?. provider ) {
204+ case "openrouter" :
205+ return { "openrouter/qwen2.5" : { contextWindow : 32768 , supportsPromptCache : false } }
206+ case "requesty" :
207+ return { "requesty/model" : { contextWindow : 8192 , supportsPromptCache : false } }
208+ case "vercel-ai-gateway" :
209+ return { "vercel/model" : { contextWindow : 8192 , supportsPromptCache : false } }
210+ case "litellm" :
211+ return { "litellm/model" : { contextWindow : 8192 , supportsPromptCache : false } }
212+ default :
213+ return { }
214+ }
215+ } )
216+
217+ await webviewMessageHandler (
218+ mockProvider as any ,
219+ {
220+ type : "requestRouterModels" ,
221+ } as any ,
222+ )
223+
224+ expect ( mockProvider . postMessageToWebview ) . toHaveBeenCalledWith ( {
225+ type : "singleRouterModelFetchResponse" ,
226+ success : false ,
227+ error : "DeepSeek API error" ,
228+ values : { provider : "deepseek" } ,
229+ } )
230+
231+ const call = ( mockProvider . postMessageToWebview as any ) . mock . calls . find (
232+ ( c : any [ ] ) => c [ 0 ] ?. type === "routerModels" ,
233+ )
234+ expect ( call ) . toBeTruthy ( )
235+ expect ( call [ 0 ] . routerModels . deepseek ) . toEqual ( { } )
137236 } )
138237
139238 it ( "supports filtering another single provider ('openrouter')" , async ( ) => {
0 commit comments