Skip to content

Commit ad7e83f

Browse files
authored
Merge branch 'main' into main
2 parents 8b54ef3 + a7cfae4 commit ad7e83f

File tree

10 files changed

+85
-9
lines changed

10 files changed

+85
-9
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.12.0/+esm';
101+
import { InferenceClient } from 'https://cdn.jsdelivr.net/npm/@huggingface/inference@4.13.0/+esm';
102102
import { createRepo, commit, deleteRepo, listFiles } from "https://cdn.jsdelivr.net/npm/@huggingface/[email protected]/+esm";
103103
</script>
104104
```

packages/hub/src/lib/parse-safetensors-metadata.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,16 @@ describe("parseSafetensorsMetadata", () => {
143143
assert.strictEqual(safetensorsShardFileInfo?.total, "00072");
144144
});
145145

146+
it("should detect sharded safetensors filename with 6 digits", async () => {
147+
const safetensorsFilename = "model-00001-of-000163.safetensors"; // https://huggingface.co/deepseek-ai/DeepSeek-V3.2-Exp/blob/main/model-00001-of-000163.safetensors
148+
const safetensorsShardFileInfo = parseSafetensorsShardFilename(safetensorsFilename);
149+
150+
assert.strictEqual(safetensorsShardFileInfo?.prefix, "model-");
151+
assert.strictEqual(safetensorsShardFileInfo?.basePrefix, "model");
152+
assert.strictEqual(safetensorsShardFileInfo?.shard, "00001");
153+
assert.strictEqual(safetensorsShardFileInfo?.total, "000163");
154+
});
155+
146156
it("should support sub-byte data types", async () => {
147157
const newDataTypes: Array<"F4" | "F6_E2M3" | "F6_E3M2" | "E8M0"> = ["F4", "F6_E2M3", "F6_E3M2", "E8M0"];
148158

packages/hub/src/lib/parse-safetensors-metadata.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const SAFETENSORS_INDEX_FILE = "model.safetensors.index.json";
1414
export const RE_SAFETENSORS_FILE = /\.safetensors$/;
1515
export const RE_SAFETENSORS_INDEX_FILE = /\.safetensors\.index\.json$/;
1616
export const RE_SAFETENSORS_SHARD_FILE =
17-
/^(?<prefix>(?<basePrefix>.*?)[_-])(?<shard>\d{5})-of-(?<total>\d{5})\.safetensors$/;
17+
/^(?<prefix>(?<basePrefix>.*?)[_-])(?<shard>\d{5,6})-of-(?<total>\d{5,6})\.safetensors$/;
1818
export interface SafetensorsShardFileInfo {
1919
prefix: string;
2020
basePrefix: string;

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.12.0",
3+
"version": "4.13.0",
44
"packageManager": "[email protected]",
55
"license": "MIT",
66
"author": "Hugging Face and Tim Mikeladze <[email protected]>",

packages/inference/src/lib/getProviderHelper.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ export const PROVIDERS: Record<InferenceProvider, Partial<Record<InferenceTask,
179179
"text-to-image": new Wavespeed.WavespeedAITextToImageTask(),
180180
"text-to-video": new Wavespeed.WavespeedAITextToVideoTask(),
181181
"image-to-image": new Wavespeed.WavespeedAIImageToImageTask(),
182+
"image-to-video": new Wavespeed.WavespeedAIImageToVideoTask(),
182183
},
183184
"zai-org": {
184185
conversational: new Zai.ZaiConversationalTask(),

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.12.0";
2+
export const PACKAGE_VERSION = "4.13.0";
33
export const PACKAGE_NAME = "@huggingface/inference";

packages/inference/src/providers/wavespeed.ts

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import type { TextToImageArgs } from "../tasks/cv/textToImage.js";
22
import type { ImageToImageArgs } from "../tasks/cv/imageToImage.js";
33
import type { TextToVideoArgs } from "../tasks/cv/textToVideo.js";
4+
import type { ImageToVideoArgs } from "../tasks/cv/imageToVideo.js";
45
import type { BodyParams, RequestArgs, UrlParams } from "../types.js";
56
import { delay } from "../utils/delay.js";
67
import { omit } from "../utils/omit.js";
78
import { base64FromBytes } from "../utils/base64FromBytes.js";
8-
import type { TextToImageTaskHelper, TextToVideoTaskHelper, ImageToImageTaskHelper } from "./providerHelper.js";
9+
import type {
10+
TextToImageTaskHelper,
11+
TextToVideoTaskHelper,
12+
ImageToImageTaskHelper,
13+
ImageToVideoTaskHelper,
14+
} from "./providerHelper.js";
915
import { TaskProviderHelper } from "./providerHelper.js";
1016
import {
1117
InferenceClientInputError,
@@ -72,7 +78,9 @@ abstract class WavespeedAITask extends TaskProviderHelper {
7278
return `/api/v3/${params.model}`;
7379
}
7480

75-
preparePayload(params: BodyParams<ImageToImageArgs | TextToImageArgs | TextToVideoArgs>): Record<string, unknown> {
81+
preparePayload(
82+
params: BodyParams<ImageToImageArgs | TextToImageArgs | TextToVideoArgs | ImageToVideoArgs>
83+
): Record<string, unknown> {
7684
const payload: Record<string, unknown> = {
7785
...omit(params.args, ["inputs", "parameters"]),
7886
...params.args.parameters,
@@ -95,11 +103,17 @@ abstract class WavespeedAITask extends TaskProviderHelper {
95103
url?: string,
96104
headers?: Record<string, string>
97105
): Promise<Blob> {
98-
if (!headers) {
106+
if (!url || !headers) {
99107
throw new InferenceClientInputError("Headers are required for WaveSpeed AI API calls");
100108
}
101109

102-
const resultUrl = response.data.urls.get;
110+
const parsedUrl = new URL(url);
111+
const resultPath = new URL(response.data.urls.get).pathname;
112+
/// override the base url to use the router.huggingface.co if going through huggingface router
113+
const baseUrl = `${parsedUrl.protocol}//${parsedUrl.host}${
114+
parsedUrl.host === "router.huggingface.co" ? "/wavespeed" : ""
115+
}`;
116+
const resultUrl = `${baseUrl}${resultPath}`;
103117

104118
// Poll for results until completion
105119
while (true) {
@@ -183,3 +197,19 @@ export class WavespeedAIImageToImageTask extends WavespeedAITask implements Imag
183197
};
184198
}
185199
}
200+
201+
export class WavespeedAIImageToVideoTask extends WavespeedAITask implements ImageToVideoTaskHelper {
202+
constructor() {
203+
super(WAVESPEEDAI_API_BASE_URL);
204+
}
205+
206+
async preparePayloadAsync(args: ImageToVideoArgs): Promise<RequestArgs> {
207+
return {
208+
...args,
209+
inputs: args.parameters?.prompt,
210+
image: base64FromBytes(
211+
new Uint8Array(args.inputs instanceof ArrayBuffer ? args.inputs : await (args.inputs as Blob).arrayBuffer())
212+
),
213+
};
214+
}
215+
}

packages/inference/test/InferenceClient.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2336,6 +2336,13 @@ describe.skip("InferenceClient", () => {
23362336
adapter: "lora",
23372337
adapterWeightsPath: "pytorch_lora_weights.safetensors",
23382338
},
2339+
"Wan-AI/Wan2.1-I2V-14B-480P": {
2340+
provider: "wavespeed",
2341+
hfModelId: "Wan-AI/Wan2.1-I2V-14B-480P",
2342+
providerId: "wavespeed-ai/wan-2.1/i2v-480p",
2343+
status: "live",
2344+
task: "image-to-video",
2345+
},
23392346
};
23402347
it(`textToImage - black-forest-labs/FLUX.1-schnell`, async () => {
23412348
const res = await client.textToImage({
@@ -2400,6 +2407,20 @@ describe.skip("InferenceClient", () => {
24002407
});
24012408
expect(res).toBeInstanceOf(Blob);
24022409
});
2410+
it(`imageToVideo - Wan-AI/Wan2.1-I2V-14B-480P`, async () => {
2411+
const res = await client.imageToVideo({
2412+
model: "Wan-AI/Wan2.1-I2V-14B-480P",
2413+
provider: "wavespeed",
2414+
inputs: new Blob([readTestFile("cheetah.png")], { type: "image/png" }),
2415+
parameters: {
2416+
prompt: "The leopard chases its prey",
2417+
guidance_scale: 5,
2418+
num_inference_steps: 29,
2419+
seed: -1,
2420+
},
2421+
});
2422+
expect(res).toBeInstanceOf(Blob);
2423+
});
24032424
},
24042425
TIMEOUT
24052426
);

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.57",
4+
"version": "0.19.59",
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: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,13 @@ export const MODEL_LIBRARIES_UI_ELEMENTS = {
180180
filter: false,
181181
countDownloads: `path:"params.index.json"`,
182182
},
183+
boltzgen: {
184+
prettyLabel: "BoltzGen",
185+
repoName: "BoltzGen",
186+
repoUrl: "https://github.com/HannesStark/boltzgen",
187+
filter: false,
188+
countDownloads: `path:"boltzgen1_diverse.ckpt"`,
189+
},
183190
champ: {
184191
prettyLabel: "Champ",
185192
repoName: "Champ",
@@ -873,6 +880,13 @@ export const MODEL_LIBRARIES_UI_ELEMENTS = {
873880
snippets: snippets.pythae,
874881
filter: false,
875882
},
883+
quantumpeer: {
884+
prettyLabel: "QuantumPeer",
885+
repoName: "QuantumPeer",
886+
repoUrl: "https://github.com/OpenPeer-AI/QuantumPeer",
887+
filter: false,
888+
countDownloads: `path_extension:"setup.py"`,
889+
},
876890
recurrentgemma: {
877891
prettyLabel: "RecurrentGemma",
878892
repoName: "recurrentgemma",

0 commit comments

Comments
 (0)