@@ -5,6 +5,7 @@ import type { InferenceProviderModelMapping } from "./getInferenceProviderMappin
55import { getInferenceProviderMapping } from "./getInferenceProviderMapping.js" ;
66import type { getProviderHelper } from "./getProviderHelper.js" ;
77import { isUrl } from "./isUrl.js" ;
8+ import { HfInferenceHubApiError , HfInferenceInputError } from "../error.js" ;
89
910/**
1011 * Lazy-loaded from huggingface.co/api/tasks when needed
@@ -33,10 +34,10 @@ export async function makeRequestOptions(
3334
3435 // Validate inputs
3536 if ( args . endpointUrl && provider !== "hf-inference" ) {
36- throw new Error ( `Cannot use endpointUrl with a third-party provider.` ) ;
37+ throw new HfInferenceInputError ( `Cannot use endpointUrl with a third-party provider.` ) ;
3738 }
3839 if ( maybeModel && isUrl ( maybeModel ) ) {
39- throw new Error ( `Model URLs are no longer supported. Use endpointUrl instead.` ) ;
40+ throw new HfInferenceInputError ( `Model URLs are no longer supported. Use endpointUrl instead.` ) ;
4041 }
4142
4243 if ( args . endpointUrl ) {
@@ -51,38 +52,38 @@ export async function makeRequestOptions(
5152 }
5253
5354 if ( ! maybeModel && ! task ) {
54- throw new Error ( "No model provided, and no task has been specified." ) ;
55+ throw new HfInferenceInputError ( "No model provided, and no task has been specified." ) ;
5556 }
5657
5758 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
5859 const hfModel = maybeModel ?? ( await loadDefaultModel ( task ! ) ) ;
5960
6061 if ( providerHelper . clientSideRoutingOnly && ! maybeModel ) {
61- throw new Error ( `Provider ${ provider } requires a model ID to be passed directly.` ) ;
62+ throw new HfInferenceInputError ( `Provider ${ provider } requires a model ID to be passed directly.` ) ;
6263 }
6364
6465 const inferenceProviderMapping = providerHelper . clientSideRoutingOnly
6566 ? ( {
66- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
67- providerId : removeProviderPrefix ( maybeModel ! , provider ) ,
68- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
69- hfModelId : maybeModel ! ,
70- status : "live" ,
67+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
68+ providerId : removeProviderPrefix ( maybeModel ! , provider ) ,
69+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
70+ hfModelId : maybeModel ! ,
71+ status : "live" ,
72+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
73+ task : task ! ,
74+ } satisfies InferenceProviderModelMapping )
75+ : await getInferenceProviderMapping (
76+ {
77+ modelId : hfModel ,
7178 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
7279 task : task ! ,
73- } satisfies InferenceProviderModelMapping )
74- : await getInferenceProviderMapping (
75- {
76- modelId : hfModel ,
77- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
78- task : task ! ,
79- provider,
80- accessToken : args . accessToken ,
81- } ,
82- { fetch : options ?. fetch }
83- ) ;
80+ provider,
81+ accessToken : args . accessToken ,
82+ } ,
83+ { fetch : options ?. fetch }
84+ ) ;
8485 if ( ! inferenceProviderMapping ) {
85- throw new Error ( `We have not been able to find inference provider information for model ${ hfModel } .` ) ;
86+ throw new HfInferenceInputError ( `We have not been able to find inference provider information for model ${ hfModel } .` ) ;
8687 }
8788
8889 // Use the sync version with the resolved model
@@ -122,9 +123,8 @@ export function makeRequestOptionsFromResolvedModel(
122123 if ( providerHelper . clientSideRoutingOnly ) {
123124 // Closed-source providers require an accessToken (cannot be routed).
124125 if ( accessToken && accessToken . startsWith ( "hf_" ) ) {
125- throw new Error ( `Provider ${ provider } is closed-source and does not support HF tokens.` ) ;
126+ throw new HfInferenceInputError ( `Provider ${ provider } is closed-source and does not support HF tokens.` ) ;
126127 }
127- return "provider-key" ;
128128 }
129129 if ( accessToken ) {
130130 return accessToken . startsWith ( "hf_" ) ? "hf-token" : "provider-key" ;
@@ -197,23 +197,28 @@ async function loadDefaultModel(task: InferenceTask): Promise<string> {
197197 }
198198 const taskInfo = tasks [ task ] ;
199199 if ( ( taskInfo ?. models . length ?? 0 ) <= 0 ) {
200- throw new Error ( `No default model defined for task ${ task } , please define the model explicitly.` ) ;
200+ throw new HfInferenceInputError ( `No default model defined for task ${ task } , please define the model explicitly.` ) ;
201201 }
202202 return taskInfo . models [ 0 ] . id ;
203203}
204204
205205async function loadTaskInfo ( ) : Promise < Record < string , { models : { id : string } [ ] } > > {
206- const res = await fetch ( `${ HF_HUB_URL } /api/tasks` ) ;
206+ const url = `${ HF_HUB_URL } /api/tasks` ;
207+ const res = await fetch ( url ) ;
207208
208209 if ( ! res . ok ) {
209- throw new Error ( "Failed to load tasks definitions from Hugging Face Hub." ) ;
210+ throw new HfInferenceHubApiError (
211+ "Failed to load tasks definitions from Hugging Face Hub." ,
212+ { url, method : "GET" } ,
213+ { requestId : res . headers . get ( "x-request-id" ) ?? "" , status : res . status , body : await res . text ( ) } ,
214+ ) ;
210215 }
211216 return await res . json ( ) ;
212217}
213218
214219function removeProviderPrefix ( model : string , provider : string ) : string {
215220 if ( ! model . startsWith ( `${ provider } /` ) ) {
216- throw new Error ( `Models from ${ provider } must be prefixed by "${ provider } /". Got "${ model } ".` ) ;
221+ throw new HfInferenceInputError ( `Models from ${ provider } must be prefixed by "${ provider } /". Got "${ model } ".` ) ;
217222 }
218223 return model . slice ( provider . length + 1 ) ;
219224}
0 commit comments