Skip to content

Commit 8b54ef3

Browse files
authored
Merge branch 'main' into main
2 parents 7fd7648 + cefe7d6 commit 8b54ef3

File tree

9 files changed

+49
-8
lines changed

9 files changed

+49
-8
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ You can run our packages with vanilla JS, without any bundler, by using a CDN or
9898

9999
```html
100100
<script type="module">
101-
import { InferenceClient } from 'https://cdn.jsdelivr.net/npm/@huggingface/inference@4.11.3/+esm';
101+
import { InferenceClient } from 'https://cdn.jsdelivr.net/npm/@huggingface/inference@4.12.0/+esm';
102102
import { createRepo, commit, deleteRepo, listFiles } from "https://cdn.jsdelivr.net/npm/@huggingface/[email protected]/+esm";
103103
</script>
104104
```

packages/inference/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@huggingface/inference",
3-
"version": "4.11.3",
3+
"version": "4.12.0",
44
"packageManager": "[email protected]",
55
"license": "MIT",
66
"author": "Hugging Face and Tim Mikeladze <[email protected]>",

packages/inference/src/errors.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ export class InferenceClientInputError extends InferenceClientError {
1717
}
1818
}
1919

20+
export class InferenceClientRoutingError extends InferenceClientError {
21+
constructor(message: string) {
22+
super(message);
23+
this.name = "RoutingError";
24+
}
25+
}
26+
2027
interface HttpRequest {
2128
url: string;
2229
method: string;

packages/inference/src/lib/getInferenceProviderMapping.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,17 @@ export async function getInferenceProviderMapping(
124124
}
125125
): Promise<InferenceProviderMappingEntry | null> {
126126
const logger = getLogger();
127+
if (params.provider === ("auto" as InferenceProvider) && params.task === "conversational") {
128+
// Special case for auto + conversational to avoid extra API calls
129+
// Call directly the server-side auto router
130+
return {
131+
hfModelId: params.modelId,
132+
provider: "auto",
133+
providerId: params.modelId,
134+
status: "live",
135+
task: "conversational",
136+
};
137+
}
127138
if (HARDCODED_MODEL_INFERENCE_MAPPING[params.provider][params.modelId]) {
128139
return HARDCODED_MODEL_INFERENCE_MAPPING[params.provider][params.modelId];
129140
}

packages/inference/src/package.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
// Generated file from package.json. Issues importing JSON directly when publishing on commonjs/ESM - see https://github.com/microsoft/TypeScript/issues/51783
2-
export const PACKAGE_VERSION = "4.11.3";
2+
export const PACKAGE_VERSION = "4.12.0";
33
export const PACKAGE_NAME = "@huggingface/inference";

packages/inference/src/providers/providerHelper.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ import type {
4747
ZeroShotImageClassificationOutput,
4848
} from "@huggingface/tasks";
4949
import { HF_ROUTER_URL } from "../config.js";
50-
import { InferenceClientProviderOutputError } from "../errors.js";
50+
import { InferenceClientProviderOutputError, InferenceClientRoutingError } from "../errors.js";
5151
import type { AudioToAudioOutput } from "../tasks/audio/audioToAudio.js";
5252
import type { BaseArgs, BodyParams, HeaderParams, InferenceProvider, RequestArgs, UrlParams } from "../types.js";
5353
import { toArray } from "../utils/toArray.js";
@@ -62,7 +62,7 @@ import type { ImageSegmentationArgs } from "../tasks/cv/imageSegmentation.js";
6262
export abstract class TaskProviderHelper {
6363
constructor(
6464
readonly provider: InferenceProvider,
65-
private baseUrl: string,
65+
protected baseUrl: string,
6666
readonly clientSideRoutingOnly: boolean = false
6767
) {}
6868

@@ -369,3 +369,16 @@ export class BaseTextGenerationTask extends TaskProviderHelper implements TextGe
369369
throw new InferenceClientProviderOutputError("Expected Array<{generated_text: string}>");
370370
}
371371
}
372+
373+
export class AutoRouterConversationalTask extends BaseConversationalTask {
374+
constructor() {
375+
super("auto" as InferenceProvider, "https://router.huggingface.co");
376+
}
377+
378+
override makeBaseUrl(params: UrlParams): string {
379+
if (params.authMethod !== "hf-token") {
380+
throw new InferenceClientRoutingError("Cannot select auto-router when using non-Hugging Face API key.");
381+
}
382+
return this.baseUrl;
383+
}
384+
}

packages/inference/src/tasks/nlp/chatCompletion.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { resolveProvider } from "../../lib/getInferenceProviderMapping.js";
33
import { getProviderHelper } from "../../lib/getProviderHelper.js";
44
import type { BaseArgs, Options } from "../../types.js";
55
import { innerRequest } from "../../utils/request.js";
6+
import type { ConversationalTaskHelper, TaskProviderHelper } from "../../providers/providerHelper.js";
7+
import { AutoRouterConversationalTask } from "../../providers/providerHelper.js";
68

79
/**
810
* Use the chat completion endpoint to generate a response to a prompt, using OpenAI message completion API no stream
@@ -11,8 +13,14 @@ export async function chatCompletion(
1113
args: BaseArgs & ChatCompletionInput,
1214
options?: Options
1315
): Promise<ChatCompletionOutput> {
14-
const provider = await resolveProvider(args.provider, args.model, args.endpointUrl);
15-
const providerHelper = getProviderHelper(provider, "conversational");
16+
let providerHelper: ConversationalTaskHelper & TaskProviderHelper;
17+
if (!args.provider || args.provider === "auto") {
18+
// Special case: we have a dedicated auto-router for conversational models. No need to fetch provider mapping.
19+
providerHelper = new AutoRouterConversationalTask();
20+
} else {
21+
const provider = await resolveProvider(args.provider, args.model, args.endpointUrl);
22+
providerHelper = getProviderHelper(provider, "conversational");
23+
}
1624
const { data: response } = await innerRequest<ChatCompletionOutput>(args, providerHelper, {
1725
...options,
1826
task: "conversational",

packages/tasks/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@huggingface/tasks",
33
"packageManager": "[email protected]",
4-
"version": "0.19.56",
4+
"version": "0.19.57",
55
"description": "List of ML tasks for huggingface.co/tasks",
66
"repository": "https://github.com/huggingface/huggingface.js.git",
77
"publishConfig": {

packages/tasks/src/model-libraries.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -809,8 +809,10 @@ export const MODEL_LIBRARIES_UI_ELEMENTS = {
809809
prettyLabel: "PaddleOCR",
810810
repoName: "PaddleOCR",
811811
repoUrl: "https://github.com/PaddlePaddle/PaddleOCR",
812+
docsUrl: "https://www.paddleocr.ai/",
812813
snippets: snippets.paddleocr,
813814
filter: true,
815+
countDownloads: `path_extension:"safetensors" OR path:"inference.pdiparams"`,
814816
},
815817
peft: {
816818
prettyLabel: "PEFT",

0 commit comments

Comments
 (0)