@@ -1761,6 +1761,52 @@ describe('ProxyService', () => {
17611761 expect ( result . meta . fallbackIndex ) . toBeUndefined ( ) ;
17621762 } ) ;
17631763
1764+ it ( 'tries specificity fallback models before tier fallbacks when a specific-tier route fails' , async ( ) => {
1765+ resolveService . resolve . mockResolvedValue ( {
1766+ tier : 'standard' ,
1767+ model : 'gpt-5.4' ,
1768+ provider : 'OpenAI' ,
1769+ confidence : 0.95 ,
1770+ score : 0 ,
1771+ reason : 'specificity' ,
1772+ specificity_category : 'coding' ,
1773+ fallback_models : [ 'claude-sonnet-4' ] ,
1774+ } ) ;
1775+ providerKeyService . getProviderApiKey
1776+ . mockResolvedValueOnce ( 'sk-openai' )
1777+ . mockResolvedValueOnce ( 'sk-ant' ) ;
1778+ providerClient . forward
1779+ . mockResolvedValueOnce ( {
1780+ response : new Response ( 'error' , { status : 429 } ) ,
1781+ isGoogle : false ,
1782+ isAnthropic : false ,
1783+ isChatGpt : false ,
1784+ } )
1785+ . mockResolvedValueOnce ( {
1786+ response : new Response ( '{}' , { status : 200 } ) ,
1787+ isGoogle : false ,
1788+ isAnthropic : true ,
1789+ isChatGpt : false ,
1790+ } ) ;
1791+ tierService . getTiers . mockResolvedValue ( [
1792+ { tier : 'standard' , fallback_models : null } ,
1793+ ] as never ) ;
1794+ pricingCache . getByModel . mockReturnValue ( { provider : 'Anthropic' } as never ) ;
1795+
1796+ const result = await service . proxyRequest ( {
1797+ agentId : 'agent-1' ,
1798+ userId : 'user-1' ,
1799+ body,
1800+ sessionKey : 'default' ,
1801+ } ) ;
1802+
1803+ expect ( result . meta . fallbackFromModel ) . toBe ( 'gpt-5.4' ) ;
1804+ expect ( result . meta . fallbackIndex ) . toBe ( 0 ) ;
1805+ expect ( result . meta . primaryErrorStatus ) . toBe ( 429 ) ;
1806+ expect ( result . meta . model ) . toBe ( 'claude-sonnet-4' ) ;
1807+ expect ( result . meta . specificity_category ) . toBe ( 'coding' ) ;
1808+ } ) ;
1809+
17641810 it ( 'tries fallback model when primary returns 429' , async ( ) => {
17651811 resolveService . resolve . mockResolvedValue ( {
17661812 tier : 'standard' ,
0 commit comments