@@ -24,22 +24,28 @@ export class RooHandler extends BaseOpenAiCompatibleProvider<string> {
2424 sessionToken = CloudService . instance . authService ?. getSessionToken ( )
2525 }
2626
27- const baseURL = process . env . ROO_CODE_PROVIDER_URL ?? "https://api.roocode.com/proxy"
27+ let baseURL = process . env . ROO_CODE_PROVIDER_URL ?? "https://api.roocode.com/proxy"
28+
29+ // Ensure baseURL ends with /v1 for OpenAI client, but don't duplicate it
30+ if ( ! baseURL . endsWith ( "/v1" ) ) {
31+ baseURL = `${ baseURL } /v1`
32+ }
2833
2934 // Always construct the handler, even without a valid token.
3035 // The provider-proxy server will return 401 if authentication fails.
3136 super ( {
3237 ...options ,
3338 providerName : "Roo Code Cloud" ,
34- baseURL : ` ${ baseURL } /v1` , // OpenAI client needs /v1 suffix
39+ baseURL, // Already has /v1 suffix
3540 apiKey : sessionToken || "unauthenticated" , // Use a placeholder if no token.
3641 defaultProviderModelId : rooDefaultModelId ,
3742 providerModels : { } ,
3843 defaultTemperature : 0.7 ,
3944 } )
4045
41- // Load dynamic models asynchronously - pass base URL without /v1
42- this . loadDynamicModels ( baseURL , sessionToken ) . catch ( ( error ) => {
46+ // Load dynamic models asynchronously - strip /v1 from baseURL for fetcher
47+ const fetcherBaseURL = baseURL . endsWith ( "/v1" ) ? baseURL . slice ( 0 , - 3 ) : baseURL
48+ this . loadDynamicModels ( fetcherBaseURL , sessionToken ) . catch ( ( error ) => {
4349 console . error ( "[RooHandler] Failed to load dynamic models:" , error )
4450 } )
4551
0 commit comments