From 6d299913c1a05a2a50462d5aa09cb12f913c4598 Mon Sep 17 00:00:00 2001 From: Wauplin Date: Thu, 14 Nov 2024 15:42:53 +0100 Subject: [PATCH 01/12] do not export internal methods --- packages/tasks/src/snippets/python.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/tasks/src/snippets/python.ts b/packages/tasks/src/snippets/python.ts index bdb148e391..a5eb92ab5f 100644 --- a/packages/tasks/src/snippets/python.ts +++ b/packages/tasks/src/snippets/python.ts @@ -9,7 +9,7 @@ const snippetImportInferenceClient = (model: ModelDataMinimal, accessToken: stri client = InferenceClient("${model.id}", token="${accessToken || "{API_TOKEN}"}") `; -export const snippetConversational = ( +const snippetConversational = ( model: ModelDataMinimal, accessToken: string, opts?: { @@ -118,7 +118,7 @@ print(completion.choices[0].message)`, } }; -export const snippetZeroShotClassification = (model: ModelDataMinimal): InferenceSnippet => ({ +const snippetZeroShotClassification = (model: ModelDataMinimal): InferenceSnippet => ({ content: `def query(payload): response = requests.post(API_URL, headers=headers, json=payload) return response.json() @@ -129,7 +129,7 @@ output = query({ })`, }); -export const snippetZeroShotImageClassification = (model: ModelDataMinimal): InferenceSnippet => ({ +const snippetZeroShotImageClassification = (model: ModelDataMinimal): InferenceSnippet => ({ content: `def query(data): with open(data["image_path"], "rb") as f: img = f.read() @@ -146,7 +146,7 @@ output = query({ })`, }); -export const snippetBasic = (model: ModelDataMinimal): InferenceSnippet => ({ +const snippetBasic = (model: ModelDataMinimal): InferenceSnippet => ({ content: `def query(payload): response = requests.post(API_URL, headers=headers, json=payload) return response.json() @@ -156,7 +156,7 @@ output = query({ })`, }); -export const snippetFile = (model: ModelDataMinimal): InferenceSnippet => ({ +const snippetFile = (model: ModelDataMinimal): InferenceSnippet => ({ content: `def query(filename): with open(filename, "rb") as f: data = f.read() @@ -166,7 +166,7 @@ export const snippetFile = (model: ModelDataMinimal): InferenceSnippet => ({ output = query(${getModelInputSnippet(model)})`, }); -export const snippetTextToImage = (model: ModelDataMinimal, accessToken: string): InferenceSnippet[] => [ +const snippetTextToImage = (model: ModelDataMinimal, accessToken: string): InferenceSnippet[] => [ { client: "huggingface_hub", content: `${snippetImportInferenceClient(model, accessToken)} @@ -189,7 +189,7 @@ image = Image.open(io.BytesIO(image_bytes))`, }, ]; -export const snippetTabular = (model: ModelDataMinimal): InferenceSnippet => ({ +const snippetTabular = (model: ModelDataMinimal): InferenceSnippet => ({ content: `def query(payload): response = requests.post(API_URL, headers=headers, json=payload) return response.content @@ -198,7 +198,7 @@ response = query({ })`, }); -export const snippetTextToAudio = (model: ModelDataMinimal): InferenceSnippet => { +const snippetTextToAudio = (model: ModelDataMinimal): InferenceSnippet => { // Transformers TTS pipeline and api-inference-community (AIC) pipeline outputs are diverged // with the latest update to inference-api (IA). // Transformers IA returns a byte object (wav file), whereas AIC returns wav and sampling_rate. @@ -231,7 +231,7 @@ Audio(audio, rate=sampling_rate)`, } }; -export const snippetDocumentQuestionAnswering = (model: ModelDataMinimal): InferenceSnippet => ({ +const snippetDocumentQuestionAnswering = (model: ModelDataMinimal): InferenceSnippet => ({ content: `def query(payload): with open(payload["image"], "rb") as f: img = f.read() @@ -244,7 +244,7 @@ output = query({ })`, }); -export const pythonSnippets: Partial< +const pythonSnippets: Partial< Record< PipelineType, ( From 0288149bbd86dae9d7a836ca3bafa0daef999b65 Mon Sep 17 00:00:00 2001 From: Wauplin Date: Thu, 14 Nov 2024 16:52:15 +0100 Subject: [PATCH 02/12] better snippet for document-question-answering --- packages/tasks/src/snippets/inputs.ts | 6 ++-- packages/tasks/src/snippets/python.spec.ts | 38 ++++++++++++++++++++++ packages/tasks/src/snippets/python.ts | 27 +++++++++++---- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/packages/tasks/src/snippets/inputs.ts b/packages/tasks/src/snippets/inputs.ts index 70afde388c..6b1c06a77c 100644 --- a/packages/tasks/src/snippets/inputs.ts +++ b/packages/tasks/src/snippets/inputs.ts @@ -27,9 +27,9 @@ const inputsTableQuestionAnswering = () => const inputsVisualQuestionAnswering = () => `{ - "image": "cat.png", - "question": "What is in this image?" -}`; + "image": "cat.png", + "question": "What is in this image?" + }`; const inputsQuestionAnswering = () => `{ diff --git a/packages/tasks/src/snippets/python.spec.ts b/packages/tasks/src/snippets/python.spec.ts index 1bae17cb3d..da88746867 100644 --- a/packages/tasks/src/snippets/python.spec.ts +++ b/packages/tasks/src/snippets/python.spec.ts @@ -105,6 +105,44 @@ for chunk in stream: print(chunk.choices[0].delta.content, end="")`); }); + it("document-question-answering", async () => { + const model: ModelDataMinimal = { + id: "impira/layoutlm-invoices", + pipeline_tag: "document-question-answering", + tags: [], + inference: "", + }; + const snippets = getPythonInferenceSnippet(model, "api_token") as InferenceSnippet[]; + + expect(snippets.length).toEqual(2); + + expect(snippets[0].client).toEqual("huggingface_hub"); + expect(snippets[0].content).toEqual(`from huggingface_hub import InferenceClient +client = InferenceClient("impira/layoutlm-invoices", token="api_token") + +output = client.document_question_answering(cat.png, question=What is in this image?)`); + + expect(snippets[1].client).toEqual("requests"); + expect(snippets[1].content).toEqual(`import requests + +API_URL = "https://api-inference.huggingface.co/models/impira/layoutlm-invoices" +headers = {"Authorization": "Bearer api_token"} + +def query(payload): + with open(payload["image"], "rb") as f: + img = f.read() + payload["image"] = base64.b64encode(img).decode("utf-8") + response = requests.post(API_URL, headers=headers, json=payload) + return response.json() + +output = query({ + "inputs": { + "image": "cat.png", + "question": "What is in this image?" + }, +})`); + }); + it("text-to-image", async () => { const model: ModelDataMinimal = { id: "black-forest-labs/FLUX.1-schnell", diff --git a/packages/tasks/src/snippets/python.ts b/packages/tasks/src/snippets/python.ts index a5eb92ab5f..fe340eee9f 100644 --- a/packages/tasks/src/snippets/python.ts +++ b/packages/tasks/src/snippets/python.ts @@ -231,18 +231,31 @@ Audio(audio, rate=sampling_rate)`, } }; -const snippetDocumentQuestionAnswering = (model: ModelDataMinimal): InferenceSnippet => ({ - content: `def query(payload): - with open(payload["image"], "rb") as f: - img = f.read() - payload["image"] = base64.b64encode(img).decode("utf-8") +const snippetDocumentQuestionAnswering = (model: ModelDataMinimal, accessToken: string): InferenceSnippet[] => { + const inputsAsStr = getModelInputSnippet(model) as string; + const inputsAsObj = JSON.parse(inputsAsStr); + + return [ + { + client: "huggingface_hub", + content: `${snippetImportInferenceClient(model, accessToken)} +output = client.document_question_answering(${inputsAsObj.image}, question=${inputsAsObj.question})`, + }, + { + client: "requests", + content: `def query(payload): + with open(payload["image"], "rb") as f: + img = f.read() + payload["image"] = base64.b64encode(img).decode("utf-8") response = requests.post(API_URL, headers=headers, json=payload) return response.json() output = query({ - "inputs": ${getModelInputSnippet(model)}, + "inputs": ${inputsAsStr}, })`, -}); + }, + ]; +}; const pythonSnippets: Partial< Record< From 0900c99c9b85e86c043b8c7ca51e37664c2a1317 Mon Sep 17 00:00:00 2001 From: Wauplin Date: Thu, 14 Nov 2024 16:56:27 +0100 Subject: [PATCH 03/12] reorder snippets alphabetically in module --- packages/tasks/src/snippets/python.ts | 166 +++++++++++++------------- 1 file changed, 85 insertions(+), 81 deletions(-) diff --git a/packages/tasks/src/snippets/python.ts b/packages/tasks/src/snippets/python.ts index fe340eee9f..3abb2299ce 100644 --- a/packages/tasks/src/snippets/python.ts +++ b/packages/tasks/src/snippets/python.ts @@ -4,11 +4,35 @@ import { stringifyGenerationConfig, stringifyMessages } from "./common.js"; import { getModelInputSnippet } from "./inputs.js"; import type { InferenceSnippet, ModelDataMinimal } from "./types.js"; +// Snippets shared between tasks + const snippetImportInferenceClient = (model: ModelDataMinimal, accessToken: string): string => `from huggingface_hub import InferenceClient client = InferenceClient("${model.id}", token="${accessToken || "{API_TOKEN}"}") `; +const snippetBasic = (model: ModelDataMinimal): InferenceSnippet => ({ + content: `def query(payload): + response = requests.post(API_URL, headers=headers, json=payload) + return response.json() + +output = query({ + "inputs": ${getModelInputSnippet(model)}, +})`, +}); + +const snippetFile = (model: ModelDataMinimal): InferenceSnippet => ({ + content: `def query(filename): + with open(filename, "rb") as f: + data = f.read() + response = requests.post(API_URL, headers=headers, data=data) + return response.json() + +output = query(${getModelInputSnippet(model)})`, +}); + +// Specific snippets + const snippetConversational = ( model: ModelDataMinimal, accessToken: string, @@ -118,76 +142,31 @@ print(completion.choices[0].message)`, } }; -const snippetZeroShotClassification = (model: ModelDataMinimal): InferenceSnippet => ({ - content: `def query(payload): - response = requests.post(API_URL, headers=headers, json=payload) - return response.json() - -output = query({ - "inputs": ${getModelInputSnippet(model)}, - "parameters": {"candidate_labels": ["refund", "legal", "faq"]}, -})`, -}); +const snippetDocumentQuestionAnswering = (model: ModelDataMinimal, accessToken: string): InferenceSnippet[] => { + const inputsAsStr = getModelInputSnippet(model) as string; + const inputsAsObj = JSON.parse(inputsAsStr); -const snippetZeroShotImageClassification = (model: ModelDataMinimal): InferenceSnippet => ({ - content: `def query(data): - with open(data["image_path"], "rb") as f: + return [ + { + client: "huggingface_hub", + content: `${snippetImportInferenceClient(model, accessToken)} +output = client.document_question_answering(${inputsAsObj.image}, question=${inputsAsObj.question})`, + }, + { + client: "requests", + content: `def query(payload): + with open(payload["image"], "rb") as f: img = f.read() - payload={ - "parameters": data["parameters"], - "inputs": base64.b64encode(img).decode("utf-8") - } + payload["image"] = base64.b64encode(img).decode("utf-8") response = requests.post(API_URL, headers=headers, json=payload) return response.json() output = query({ - "image_path": ${getModelInputSnippet(model)}, - "parameters": {"candidate_labels": ["cat", "dog", "llama"]}, -})`, -}); - -const snippetBasic = (model: ModelDataMinimal): InferenceSnippet => ({ - content: `def query(payload): - response = requests.post(API_URL, headers=headers, json=payload) - return response.json() - -output = query({ - "inputs": ${getModelInputSnippet(model)}, + "inputs": ${inputsAsStr}, })`, -}); - -const snippetFile = (model: ModelDataMinimal): InferenceSnippet => ({ - content: `def query(filename): - with open(filename, "rb") as f: - data = f.read() - response = requests.post(API_URL, headers=headers, data=data) - return response.json() - -output = query(${getModelInputSnippet(model)})`, -}); - -const snippetTextToImage = (model: ModelDataMinimal, accessToken: string): InferenceSnippet[] => [ - { - client: "huggingface_hub", - content: `${snippetImportInferenceClient(model, accessToken)} -# output is a PIL.Image object -image = client.text_to_image(${getModelInputSnippet(model)})`, - }, - { - client: "requests", - content: `def query(payload): - response = requests.post(API_URL, headers=headers, json=payload) - return response.content -image_bytes = query({ - "inputs": ${getModelInputSnippet(model)}, -}) - -# You can access the image with PIL.Image for example -import io -from PIL import Image -image = Image.open(io.BytesIO(image_bytes))`, - }, -]; + }, + ]; +}; const snippetTabular = (model: ModelDataMinimal): InferenceSnippet => ({ content: `def query(payload): @@ -231,31 +210,56 @@ Audio(audio, rate=sampling_rate)`, } }; -const snippetDocumentQuestionAnswering = (model: ModelDataMinimal, accessToken: string): InferenceSnippet[] => { - const inputsAsStr = getModelInputSnippet(model) as string; - const inputsAsObj = JSON.parse(inputsAsStr); +const snippetTextToImage = (model: ModelDataMinimal, accessToken: string): InferenceSnippet[] => [ + { + client: "huggingface_hub", + content: `${snippetImportInferenceClient(model, accessToken)} +# output is a PIL.Image object +image = client.text_to_image(${getModelInputSnippet(model)})`, + }, + { + client: "requests", + content: `def query(payload): + response = requests.post(API_URL, headers=headers, json=payload) + return response.content +image_bytes = query({ + "inputs": ${getModelInputSnippet(model)}, +}) - return [ - { - client: "huggingface_hub", - content: `${snippetImportInferenceClient(model, accessToken)} -output = client.document_question_answering(${inputsAsObj.image}, question=${inputsAsObj.question})`, - }, - { - client: "requests", - content: `def query(payload): - with open(payload["image"], "rb") as f: +# You can access the image with PIL.Image for example +import io +from PIL import Image +image = Image.open(io.BytesIO(image_bytes))`, + }, +]; + +const snippetZeroShotClassification = (model: ModelDataMinimal): InferenceSnippet => ({ + content: `def query(payload): + response = requests.post(API_URL, headers=headers, json=payload) + return response.json() + +output = query({ + "inputs": ${getModelInputSnippet(model)}, + "parameters": {"candidate_labels": ["refund", "legal", "faq"]}, +})`, +}); + +const snippetZeroShotImageClassification = (model: ModelDataMinimal): InferenceSnippet => ({ + content: `def query(data): + with open(data["image_path"], "rb") as f: img = f.read() - payload["image"] = base64.b64encode(img).decode("utf-8") + payload={ + "parameters": data["parameters"], + "inputs": base64.b64encode(img).decode("utf-8") + } response = requests.post(API_URL, headers=headers, json=payload) return response.json() output = query({ - "inputs": ${inputsAsStr}, + "image_path": ${getModelInputSnippet(model)}, + "parameters": {"candidate_labels": ["cat", "dog", "llama"]}, })`, - }, - ]; -}; +}); const pythonSnippets: Partial< Record< From 060cd21206523d3db27f249b67e4378db967997e Mon Sep 17 00:00:00 2001 From: Wauplin Date: Thu, 14 Nov 2024 17:05:13 +0100 Subject: [PATCH 04/12] better snippet for automated-speech-recognition --- packages/tasks/src/snippets/python.spec.ts | 32 ++++++++++++++++++++++ packages/tasks/src/snippets/python.ts | 16 ++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/packages/tasks/src/snippets/python.spec.ts b/packages/tasks/src/snippets/python.spec.ts index da88746867..cfebfbb0d2 100644 --- a/packages/tasks/src/snippets/python.spec.ts +++ b/packages/tasks/src/snippets/python.spec.ts @@ -3,6 +3,38 @@ import { describe, expect, it } from "vitest"; import { getPythonInferenceSnippet } from "./python"; describe("inference API snippets", () => { + it("automatic-speech-recognition", async () => { + const model: ModelDataMinimal = { + id: "openai/whisper-large-v3-turbo", + pipeline_tag: "automatic-speech-recognition", + tags: [], + inference: "", + }; + const snippets = getPythonInferenceSnippet(model, "api_token") as InferenceSnippet[]; + + expect(snippets.length).toEqual(2); + + expect(snippets[0].client).toEqual("huggingface_hub"); + expect(snippets[0].content).toEqual(`from huggingface_hub import InferenceClient +client = InferenceClient("openai/whisper-large-v3-turbo", token="api_token") + +output = client.automatic_speech_recognition("sample1.flac")`); + + expect(snippets[1].client).toEqual("requests"); + expect(snippets[1].content).toEqual(`import requests + +API_URL = "https://api-inference.huggingface.co/models/openai/whisper-large-v3-turbo" +headers = {"Authorization": "Bearer api_token"} + +def query(filename): + with open(filename, "rb") as f: + data = f.read() + response = requests.post(API_URL, headers=headers, data=data) + return response.json() + +output = query("sample1.flac")`); + }); + it("conversational llm", async () => { const model: ModelDataMinimal = { id: "meta-llama/Llama-3.1-8B-Instruct", diff --git a/packages/tasks/src/snippets/python.ts b/packages/tasks/src/snippets/python.ts index 3abb2299ce..7aa5d49186 100644 --- a/packages/tasks/src/snippets/python.ts +++ b/packages/tasks/src/snippets/python.ts @@ -33,6 +33,20 @@ output = query(${getModelInputSnippet(model)})`, // Specific snippets +const snippetAutomaticSpeechRecognition = (model: ModelDataMinimal, accessToken: string): InferenceSnippet[] => { + return [ + { + client: "huggingface_hub", + content: `${snippetImportInferenceClient(model, accessToken)} +output = client.automatic_speech_recognition(${getModelInputSnippet(model)})`, + }, + { + client: "requests", + content: snippetFile(model).content, + }, + ]; +}; + const snippetConversational = ( model: ModelDataMinimal, accessToken: string, @@ -285,7 +299,7 @@ const pythonSnippets: Partial< "image-text-to-text": snippetConversational, "fill-mask": snippetBasic, "sentence-similarity": snippetBasic, - "automatic-speech-recognition": snippetFile, + "automatic-speech-recognition": snippetAutomaticSpeechRecognition, "text-to-image": snippetTextToImage, "text-to-speech": snippetTextToAudio, "text-to-audio": snippetTextToAudio, From 6234469c9f70d81bee077c7abae440787b127765 Mon Sep 17 00:00:00 2001 From: Wauplin Date: Thu, 14 Nov 2024 17:16:38 +0100 Subject: [PATCH 05/12] better snippet for image-to-image --- packages/tasks/src/snippets/inputs.ts | 6 ++++ packages/tasks/src/snippets/python.spec.ts | 42 ++++++++++++++++++++++ packages/tasks/src/snippets/python.ts | 34 ++++++++++++++++++ 3 files changed, 82 insertions(+) diff --git a/packages/tasks/src/snippets/inputs.ts b/packages/tasks/src/snippets/inputs.ts index 6b1c06a77c..177fbca8af 100644 --- a/packages/tasks/src/snippets/inputs.ts +++ b/packages/tasks/src/snippets/inputs.ts @@ -86,6 +86,11 @@ const inputsImageClassification = () => `"cats.jpg"`; const inputsImageToText = () => `"cats.jpg"`; +const inputsImageToImage = () => `{ + "image": "cat.png", + "prompt": "Turn the cat into a tiger." +}`; + const inputsImageSegmentation = () => `"cats.jpg"`; const inputsObjectDetection = () => `"cats.jpg"`; @@ -118,6 +123,7 @@ const modelInputSnippets: { "fill-mask": inputsFillMask, "image-classification": inputsImageClassification, "image-to-text": inputsImageToText, + "image-to-image": inputsImageToImage, "image-segmentation": inputsImageSegmentation, "object-detection": inputsObjectDetection, "question-answering": inputsQuestionAnswering, diff --git a/packages/tasks/src/snippets/python.spec.ts b/packages/tasks/src/snippets/python.spec.ts index cfebfbb0d2..9270dbc088 100644 --- a/packages/tasks/src/snippets/python.spec.ts +++ b/packages/tasks/src/snippets/python.spec.ts @@ -175,6 +175,48 @@ output = query({ })`); }); + it("image-to-image", async () => { + const model: ModelDataMinimal = { + id: "stabilityai/stable-diffusion-xl-refiner-1.0", + pipeline_tag: "image-to-image", + tags: [], + inference: "", + }; + const snippets = getPythonInferenceSnippet(model, "api_token") as InferenceSnippet[]; + + expect(snippets.length).toEqual(2); + + expect(snippets[0].client).toEqual("huggingface_hub"); + expect(snippets[0].content).toEqual(`from huggingface_hub import InferenceClient +client = InferenceClient("stabilityai/stable-diffusion-xl-refiner-1.0", token="api_token") + +# output is a PIL.Image object +image = client.image_to_image("cat.png", prompt="Turn the cat into a tiger.")`); + + expect(snippets[1].client).toEqual("requests"); + expect(snippets[1].content).toEqual(`import requests + +API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-xl-refiner-1.0" +headers = {"Authorization": "Bearer api_token"} + +def query(payload): + with open(payload["inputs"], "rb") as f: + img = f.read() + payload["inputs"] = base64.b64encode(img).decode("utf-8") + response = requests.post(API_URL, headers=headers, json=payload) + return response.content + +image_bytes = query({ + "inputs": "cat.png", + "parameters": {"prompt": "Turn the cat into a tiger."}, +}) + +# You can access the image with PIL.Image for example +import io +from PIL import Image +image = Image.open(io.BytesIO(image_bytes))`); + }); + it("text-to-image", async () => { const model: ModelDataMinimal = { id: "black-forest-labs/FLUX.1-schnell", diff --git a/packages/tasks/src/snippets/python.ts b/packages/tasks/src/snippets/python.ts index 7aa5d49186..242b4b3f20 100644 --- a/packages/tasks/src/snippets/python.ts +++ b/packages/tasks/src/snippets/python.ts @@ -182,6 +182,39 @@ output = query({ ]; }; +const snippetImageToImage = (model: ModelDataMinimal, accessToken: string): InferenceSnippet[] => { + const inputsAsStr = getModelInputSnippet(model) as string; + const inputsAsObj = JSON.parse(inputsAsStr); + + return [ + { + client: "huggingface_hub", + content: `${snippetImportInferenceClient(model, accessToken)} +# output is a PIL.Image object +image = client.image_to_image("${inputsAsObj.image}", prompt="${inputsAsObj.prompt}")`, + }, + { + client: "requests", + content: `def query(payload): + with open(payload["inputs"], "rb") as f: + img = f.read() + payload["inputs"] = base64.b64encode(img).decode("utf-8") + response = requests.post(API_URL, headers=headers, json=payload) + return response.content + +image_bytes = query({ + "inputs": "${inputsAsObj.image}", + "parameters": {"prompt": "${inputsAsObj.prompt}"}, +}) + +# You can access the image with PIL.Image for example +import io +from PIL import Image +image = Image.open(io.BytesIO(image_bytes))`, + }, + ]; +}; + const snippetTabular = (model: ModelDataMinimal): InferenceSnippet => ({ content: `def query(payload): response = requests.post(API_URL, headers=headers, json=payload) @@ -312,6 +345,7 @@ const pythonSnippets: Partial< "image-segmentation": snippetFile, "document-question-answering": snippetDocumentQuestionAnswering, "image-to-text": snippetFile, + "image-to-image": snippetImageToImage, "zero-shot-image-classification": snippetZeroShotImageClassification, }; From 0907d8fa7ecdd352f70f0f9b6652431626e00d9f Mon Sep 17 00:00:00 2001 From: Wauplin Date: Thu, 14 Nov 2024 17:24:04 +0100 Subject: [PATCH 06/12] Add base64 import when required --- packages/tasks/src/snippets/python.spec.ts | 6 ++++-- packages/tasks/src/snippets/python.ts | 25 +++++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/packages/tasks/src/snippets/python.spec.ts b/packages/tasks/src/snippets/python.spec.ts index 9270dbc088..88f056a2ad 100644 --- a/packages/tasks/src/snippets/python.spec.ts +++ b/packages/tasks/src/snippets/python.spec.ts @@ -155,7 +155,8 @@ client = InferenceClient("impira/layoutlm-invoices", token="api_token") output = client.document_question_answering(cat.png, question=What is in this image?)`); expect(snippets[1].client).toEqual("requests"); - expect(snippets[1].content).toEqual(`import requests + expect(snippets[1].content).toEqual(`import base64 +import requests API_URL = "https://api-inference.huggingface.co/models/impira/layoutlm-invoices" headers = {"Authorization": "Bearer api_token"} @@ -194,7 +195,8 @@ client = InferenceClient("stabilityai/stable-diffusion-xl-refiner-1.0", token="a image = client.image_to_image("cat.png", prompt="Turn the cat into a tiger.")`); expect(snippets[1].client).toEqual("requests"); - expect(snippets[1].content).toEqual(`import requests + expect(snippets[1].content).toEqual(`import base64 +import requests API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-xl-refiner-1.0" headers = {"Authorization": "Bearer api_token"} diff --git a/packages/tasks/src/snippets/python.ts b/packages/tasks/src/snippets/python.ts index 242b4b3f20..b3bfd6a390 100644 --- a/packages/tasks/src/snippets/python.ts +++ b/packages/tasks/src/snippets/python.ts @@ -11,6 +11,22 @@ const snippetImportInferenceClient = (model: ModelDataMinimal, accessToken: stri client = InferenceClient("${model.id}", token="${accessToken || "{API_TOKEN}"}") `; +const addImportsToSnippet = (snippet: string, model: ModelDataMinimal, accessToken: string): string => { + if (snippet.includes("requests")) { + snippet = `import requests + +API_URL = "https://api-inference.huggingface.co/models/${model.id}" +headers = {"Authorization": ${accessToken ? `"Bearer ${accessToken}"` : `f"Bearer {API_TOKEN}"`}} + +${snippet}`; + } + if (snippet.includes("base64")) { + snippet = `import base64 +${snippet}`; + } + return snippet; +}; + const snippetBasic = (model: ModelDataMinimal): InferenceSnippet => ({ content: `def query(payload): response = requests.post(API_URL, headers=headers, json=payload) @@ -368,14 +384,7 @@ export function getPythonInferenceSnippet( return snippets.map((snippet) => { return { ...snippet, - content: snippet.content.includes("requests") - ? `import requests - -API_URL = "https://api-inference.huggingface.co/models/${model.id}" -headers = {"Authorization": ${accessToken ? `"Bearer ${accessToken}"` : `f"Bearer {API_TOKEN}"`}} - -${snippet.content}` - : snippet.content, + content: addImportsToSnippet(snippet.content, model, accessToken), }; }); } From cc4a24f3241992a7d40c126ee368fc91e4a31e17 Mon Sep 17 00:00:00 2001 From: Wauplin Date: Mon, 25 Nov 2024 14:48:24 +0100 Subject: [PATCH 07/12] fix snippet + add fixtures --- .../scripts/generate-snippets-fixtures.ts | 30 +++++++++++++++++++ .../0.huggingface_hub.py | 4 +++ .../1.requests.py | 12 ++++++++ .../0.huggingface_hub.py | 4 +++ .../document-question-answering/1.requests.py | 19 ++++++++++++ .../image-to-image/0.huggingface_hub.py | 5 ++++ .../image-to-image/1.requests.py | 22 ++++++++++++++ packages/tasks/src/snippets/python.ts | 2 +- 8 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.py create mode 100644 packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.py create mode 100644 packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.py create mode 100644 packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.py create mode 100644 packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.py create mode 100644 packages/tasks-gen/snippets-fixtures/image-to-image/1.requests.py diff --git a/packages/tasks-gen/scripts/generate-snippets-fixtures.ts b/packages/tasks-gen/scripts/generate-snippets-fixtures.ts index 1107d78a50..00d7e4c34e 100644 --- a/packages/tasks-gen/scripts/generate-snippets-fixtures.ts +++ b/packages/tasks-gen/scripts/generate-snippets-fixtures.ts @@ -30,6 +30,16 @@ const TEST_CASES: { languages: LANGUAGE[]; opts?: Record; }[] = [ + { + testName: "automatic-speech-recognition", + model: { + id: "openai/whisper-large-v3-turbo", + pipeline_tag: "automatic-speech-recognition", + tags: [], + inference: "", + }, + languages: ["py"], + }, { testName: "conversational-llm-non-stream", model: { @@ -74,6 +84,26 @@ const TEST_CASES: { languages: ["sh", "js", "py"], opts: { streaming: true }, }, + { + testName: "document-question-answering", + model: { + id: "impira/layoutlm-invoices", + pipeline_tag: "document-question-answering", + tags: [], + inference: "", + }, + languages: ["py"], + }, + { + testName: "image-to-image", + model: { + id: "stabilityai/stable-diffusion-xl-refiner-1.0", + pipeline_tag: "image-to-image", + tags: [], + inference: "", + }, + languages: ["py"], + }, { testName: "text-to-image", model: { diff --git a/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.py b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.py new file mode 100644 index 0000000000..503bc86325 --- /dev/null +++ b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.py @@ -0,0 +1,4 @@ +from huggingface_hub import InferenceClient +client = InferenceClient("openai/whisper-large-v3-turbo", token="api_token") + +output = client.automatic_speech_recognition("sample1.flac") \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.py b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.py new file mode 100644 index 0000000000..485f658811 --- /dev/null +++ b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.py @@ -0,0 +1,12 @@ +import requests + +API_URL = "https://api-inference.huggingface.co/models/openai/whisper-large-v3-turbo" +headers = {"Authorization": "Bearer api_token"} + +def query(filename): + with open(filename, "rb") as f: + data = f.read() + response = requests.post(API_URL, headers=headers, data=data) + return response.json() + +output = query("sample1.flac") \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.py b/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.py new file mode 100644 index 0000000000..ffe118405c --- /dev/null +++ b/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.py @@ -0,0 +1,4 @@ +from huggingface_hub import InferenceClient +client = InferenceClient("impira/layoutlm-invoices", token="api_token") + +output = client.document_question_answering("cat.png", question="What is in this image?") \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.py b/packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.py new file mode 100644 index 0000000000..816f186788 --- /dev/null +++ b/packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.py @@ -0,0 +1,19 @@ +import base64 +import requests + +API_URL = "https://api-inference.huggingface.co/models/impira/layoutlm-invoices" +headers = {"Authorization": "Bearer api_token"} + +def query(payload): + with open(payload["image"], "rb") as f: + img = f.read() + payload["image"] = base64.b64encode(img).decode("utf-8") + response = requests.post(API_URL, headers=headers, json=payload) + return response.json() + +output = query({ + "inputs": { + "image": "cat.png", + "question": "What is in this image?" + }, +}) \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.py b/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.py new file mode 100644 index 0000000000..c992a1bc62 --- /dev/null +++ b/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.py @@ -0,0 +1,5 @@ +from huggingface_hub import InferenceClient +client = InferenceClient("stabilityai/stable-diffusion-xl-refiner-1.0", token="api_token") + +# output is a PIL.Image object +image = client.image_to_image("cat.png", prompt="Turn the cat into a tiger.") \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/image-to-image/1.requests.py b/packages/tasks-gen/snippets-fixtures/image-to-image/1.requests.py new file mode 100644 index 0000000000..00ea8d5551 --- /dev/null +++ b/packages/tasks-gen/snippets-fixtures/image-to-image/1.requests.py @@ -0,0 +1,22 @@ +import base64 +import requests + +API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-xl-refiner-1.0" +headers = {"Authorization": "Bearer api_token"} + +def query(payload): + with open(payload["inputs"], "rb") as f: + img = f.read() + payload["inputs"] = base64.b64encode(img).decode("utf-8") + response = requests.post(API_URL, headers=headers, json=payload) + return response.content + +image_bytes = query({ + "inputs": "cat.png", + "parameters": {"prompt": "Turn the cat into a tiger."}, +}) + +# You can access the image with PIL.Image for example +import io +from PIL import Image +image = Image.open(io.BytesIO(image_bytes)) \ No newline at end of file diff --git a/packages/tasks/src/snippets/python.ts b/packages/tasks/src/snippets/python.ts index b3bfd6a390..4c01270fdc 100644 --- a/packages/tasks/src/snippets/python.ts +++ b/packages/tasks/src/snippets/python.ts @@ -180,7 +180,7 @@ const snippetDocumentQuestionAnswering = (model: ModelDataMinimal, accessToken: { client: "huggingface_hub", content: `${snippetImportInferenceClient(model, accessToken)} -output = client.document_question_answering(${inputsAsObj.image}, question=${inputsAsObj.question})`, +output = client.document_question_answering("${inputsAsObj.image}", question="${inputsAsObj.question}")`, }, { client: "requests", From c4f6394b9165a6321d59d8add1757241438d4701 Mon Sep 17 00:00:00 2001 From: Wauplin Date: Wed, 5 Mar 2025 14:02:42 +0100 Subject: [PATCH 08/12] document question answering --- packages/inference/src/snippets/python.ts | 27 +++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/packages/inference/src/snippets/python.ts b/packages/inference/src/snippets/python.ts index b1f35bedc2..2df347db94 100644 --- a/packages/inference/src/snippets/python.ts +++ b/packages/inference/src/snippets/python.ts @@ -390,25 +390,38 @@ Audio(audio, rate=sampling_rate)`, } }; -export const snippetDocumentQuestionAnswering = (model: ModelDataMinimal): InferenceSnippet[] => { +const snippetDocumentQuestionAnswering = ( + model: ModelDataMinimal, + accessToken: string, + provider: SnippetInferenceProvider +): InferenceSnippet[] => { + const inputsAsStr = getModelInputSnippet(model) as string; + const inputsAsObj = JSON.parse(inputsAsStr); + return [ + { + client: "huggingface_hub", + content: `${snippetImportInferenceClient(accessToken, provider)} +output = client.document_question_answering( + "${inputsAsObj.image}", + question="${inputsAsObj.question}", + model="${model.id}", +)`, + }, { client: "requests", - content: `\ -def query(payload): + content: `def query(payload): with open(payload["image"], "rb") as f: img = f.read() - payload["image"] = base64.b64encode(img).decode("utf-8") + payload["image"] = base64.b64encode(img).decode("utf-8") response = requests.post(API_URL, headers=headers, json=payload) return response.json() - output = query({ - "inputs": ${getModelInputSnippet(model)}, + "inputs": ${inputsAsStr}, })`, }, ]; }; - export const pythonSnippets: Partial< Record< PipelineType, From 9a0ea8415c752cbdb31b3197d442b608a184e1ac Mon Sep 17 00:00:00 2001 From: Wauplin Date: Wed, 5 Mar 2025 14:06:01 +0100 Subject: [PATCH 09/12] ASR --- packages/inference/src/snippets/python.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/inference/src/snippets/python.ts b/packages/inference/src/snippets/python.ts index 2df347db94..ca2c6280c1 100644 --- a/packages/inference/src/snippets/python.ts +++ b/packages/inference/src/snippets/python.ts @@ -390,6 +390,21 @@ Audio(audio, rate=sampling_rate)`, } }; +const snippetAutomaticSpeechRecognition = ( + model: ModelDataMinimal, + accessToken: string, + provider: SnippetInferenceProvider +): InferenceSnippet[] => { + return [ + { + client: "huggingface_hub", + content: `${snippetImportInferenceClient(accessToken, provider)} +output = client.automatic_speech_recognition(${getModelInputSnippet(model)}, model="${model.id}")`, + }, + snippetFile(model)[0], + ]; +}; + const snippetDocumentQuestionAnswering = ( model: ModelDataMinimal, accessToken: string, @@ -448,7 +463,7 @@ export const pythonSnippets: Partial< "image-text-to-text": snippetConversational, "fill-mask": snippetBasic, "sentence-similarity": snippetBasic, - "automatic-speech-recognition": snippetFile, + "automatic-speech-recognition": snippetAutomaticSpeechRecognition, "text-to-image": snippetTextToImage, "text-to-video": snippetTextToVideo, "text-to-speech": snippetTextToAudio, From 5bbb0fd37b98530d442e14bbc8a392046e776eed Mon Sep 17 00:00:00 2001 From: Wauplin Date: Wed, 5 Mar 2025 14:22:04 +0100 Subject: [PATCH 10/12] improvements --- packages/inference/src/snippets/python.ts | 50 +++++++++++-------- .../scripts/generate-snippets-fixtures.ts | 3 ++ .../0.huggingface_hub.hf-inference.py | 8 +++ .../0.huggingface_hub.py | 4 -- .../1.requests.hf-inference.py | 12 +++++ .../1.requests.py | 12 ----- .../0.huggingface_hub.hf-inference.py | 4 +- .../0.huggingface_hub.together.py | 4 +- .../0.huggingface_hub.hf-inference.py | 4 +- .../0.huggingface_hub.together.py | 4 +- .../0.huggingface_hub.fireworks-ai.py | 4 +- .../0.huggingface_hub.hf-inference.py | 4 +- .../0.huggingface_hub.fireworks-ai.py | 4 +- .../0.huggingface_hub.hf-inference.py | 4 +- .../0.huggingface_hub.hf-inference.py | 11 ++++ .../0.huggingface_hub.py | 4 -- ...requests.py => 1.requests.hf-inference.py} | 5 +- .../image-to-image/0.huggingface_hub.py | 5 -- .../image-to-image/1.requests.py | 22 -------- .../0.huggingface_hub.hf-inference.py | 6 +-- .../text-to-image/0.huggingface_hub.fal-ai.py | 8 +-- .../0.huggingface_hub.hf-inference.py | 8 +-- .../text-to-video/0.huggingface_hub.fal-ai.py | 8 +-- .../0.huggingface_hub.replicate.py | 8 +-- 24 files changed, 101 insertions(+), 105 deletions(-) create mode 100644 packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.hf-inference.py delete mode 100644 packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.py create mode 100644 packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.hf-inference.py delete mode 100644 packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.py create mode 100644 packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.hf-inference.py delete mode 100644 packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.py rename packages/tasks-gen/snippets-fixtures/document-question-answering/{1.requests.py => 1.requests.hf-inference.py} (83%) delete mode 100644 packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.py delete mode 100644 packages/tasks-gen/snippets-fixtures/image-to-image/1.requests.py diff --git a/packages/inference/src/snippets/python.ts b/packages/inference/src/snippets/python.ts index ca2c6280c1..100e651a08 100644 --- a/packages/inference/src/snippets/python.ts +++ b/packages/inference/src/snippets/python.ts @@ -39,14 +39,23 @@ const HFH_INFERENCE_CLIENT_METHODS: Partial> = { "tabular-regression": "tabular_regression", }; -const snippetImportInferenceClient = (accessToken: string, provider: SnippetInferenceProvider): string => - `\ +const snippetImportInferenceClient = ( + accessToken: string, + provider: SnippetInferenceProvider, + model?: string +): string => { + let snippet = `\ from huggingface_hub import InferenceClient client = InferenceClient( - provider="${provider}", - api_key="${accessToken || "{API_TOKEN}"}" -)`; + provider="${provider}", + api_key="${accessToken || "{API_TOKEN}"}",`; + if (model) { + snippet += `\n model="${model}",`; + } + snippet += "\n)"; + return snippet; +}; export const snippetConversational = ( model: ModelDataMinimal, @@ -180,7 +189,8 @@ export const snippetZeroShotImageClassification = (model: ModelDataMinimal): Inf return [ { client: "requests", - content: `\ + content: `import base64 + def query(data): with open(data["image_path"], "rb") as f: img = f.read() @@ -210,10 +220,9 @@ export const snippetBasic = ( { client: "huggingface_hub", content: `\ -${snippetImportInferenceClient(accessToken, provider)} +${snippetImportInferenceClient(accessToken, provider, model.id)} result = client.${HFH_INFERENCE_CLIENT_METHODS[model.pipeline_tag]}( - model="${model.id}", inputs=${getModelInputSnippet(model)}, provider="${provider}", ) @@ -263,12 +272,11 @@ export const snippetTextToImage = ( { client: "huggingface_hub", content: `\ -${snippetImportInferenceClient(accessToken, provider)} +${snippetImportInferenceClient(accessToken, provider, model.id)} # output is a PIL.Image object image = client.text_to_image( - ${getModelInputSnippet(model)}, - model="${model.id}" + ${getModelInputSnippet(model)} )`, }, ...(provider === "fal-ai" @@ -322,11 +330,10 @@ export const snippetTextToVideo = ( { client: "huggingface_hub", content: `\ -${snippetImportInferenceClient(accessToken, provider)} +${snippetImportInferenceClient(accessToken, provider, model.id)} video = client.text_to_video( - ${getModelInputSnippet(model)}, - model="${model.id}" + ${getModelInputSnippet(model)} )`, }, ] @@ -374,8 +381,7 @@ Audio(audio_bytes)`, return [ { client: "requests", - content: `\ -def query(payload): + content: `def query(payload): response = requests.post(API_URL, headers=headers, json=payload) return response.json() @@ -398,8 +404,8 @@ const snippetAutomaticSpeechRecognition = ( return [ { client: "huggingface_hub", - content: `${snippetImportInferenceClient(accessToken, provider)} -output = client.automatic_speech_recognition(${getModelInputSnippet(model)}, model="${model.id}")`, + content: `${snippetImportInferenceClient(accessToken, provider, model.id)} +output = client.automatic_speech_recognition(${getModelInputSnippet(model)})`, }, snippetFile(model)[0], ]; @@ -416,21 +422,23 @@ const snippetDocumentQuestionAnswering = ( return [ { client: "huggingface_hub", - content: `${snippetImportInferenceClient(accessToken, provider)} + content: `${snippetImportInferenceClient(accessToken, provider, model.id)} output = client.document_question_answering( "${inputsAsObj.image}", question="${inputsAsObj.question}", - model="${model.id}", )`, }, { client: "requests", - content: `def query(payload): + content: `import base64 + +def query(payload): with open(payload["image"], "rb") as f: img = f.read() payload["image"] = base64.b64encode(img).decode("utf-8") response = requests.post(API_URL, headers=headers, json=payload) return response.json() + output = query({ "inputs": ${inputsAsStr}, })`, diff --git a/packages/tasks-gen/scripts/generate-snippets-fixtures.ts b/packages/tasks-gen/scripts/generate-snippets-fixtures.ts index 9c9500e03f..b22d7551e4 100644 --- a/packages/tasks-gen/scripts/generate-snippets-fixtures.ts +++ b/packages/tasks-gen/scripts/generate-snippets-fixtures.ts @@ -40,6 +40,7 @@ const TEST_CASES: { inference: "", }, languages: ["py"], + providers: ["hf-inference"], }, { testName: "conversational-llm-non-stream", @@ -98,6 +99,7 @@ const TEST_CASES: { inference: "", }, languages: ["py"], + providers: ["hf-inference"], }, { testName: "image-to-image", @@ -108,6 +110,7 @@ const TEST_CASES: { inference: "", }, languages: ["py"], + providers: ["hf-inference"], }, { testName: "text-to-image", diff --git a/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.hf-inference.py new file mode 100644 index 0000000000..c869f412a8 --- /dev/null +++ b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.hf-inference.py @@ -0,0 +1,8 @@ +from huggingface_hub import InferenceClient + +client = InferenceClient( + provider="hf-inference", + api_key="api_token", + model="openai/whisper-large-v3-turbo", +) +output = client.automatic_speech_recognition("sample1.flac") \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.py b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.py deleted file mode 100644 index 503bc86325..0000000000 --- a/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.py +++ /dev/null @@ -1,4 +0,0 @@ -from huggingface_hub import InferenceClient -client = InferenceClient("openai/whisper-large-v3-turbo", token="api_token") - -output = client.automatic_speech_recognition("sample1.flac") \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.hf-inference.py b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.hf-inference.py new file mode 100644 index 0000000000..c334749143 --- /dev/null +++ b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.hf-inference.py @@ -0,0 +1,12 @@ +import requests + +API_URL = "https://router.huggingface.co/hf-inference/v1" +headers = {"Authorization": "Bearer api_token"} + +def query(filename): + with open(filename, "rb") as f: + data = f.read() + response = requests.post(API_URL, headers=headers, data=data) + return response.json() + +output = query("sample1.flac") \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.py b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.py deleted file mode 100644 index 485f658811..0000000000 --- a/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.py +++ /dev/null @@ -1,12 +0,0 @@ -import requests - -API_URL = "https://api-inference.huggingface.co/models/openai/whisper-large-v3-turbo" -headers = {"Authorization": "Bearer api_token"} - -def query(filename): - with open(filename, "rb") as f: - data = f.read() - response = requests.post(API_URL, headers=headers, data=data) - return response.json() - -output = query("sample1.flac") \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/conversational-llm-non-stream/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/conversational-llm-non-stream/0.huggingface_hub.hf-inference.py index 5edd9b64e4..44e29d2a0b 100644 --- a/packages/tasks-gen/snippets-fixtures/conversational-llm-non-stream/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/conversational-llm-non-stream/0.huggingface_hub.hf-inference.py @@ -1,8 +1,8 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="hf-inference", - api_key="api_token" + provider="hf-inference", + api_key="api_token", ) messages = [ diff --git a/packages/tasks-gen/snippets-fixtures/conversational-llm-non-stream/0.huggingface_hub.together.py b/packages/tasks-gen/snippets-fixtures/conversational-llm-non-stream/0.huggingface_hub.together.py index 8a1753c525..ee348d6987 100644 --- a/packages/tasks-gen/snippets-fixtures/conversational-llm-non-stream/0.huggingface_hub.together.py +++ b/packages/tasks-gen/snippets-fixtures/conversational-llm-non-stream/0.huggingface_hub.together.py @@ -1,8 +1,8 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="together", - api_key="api_token" + provider="together", + api_key="api_token", ) messages = [ diff --git a/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.hf-inference.py index cd4f46e355..34693c89d1 100644 --- a/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.hf-inference.py @@ -1,8 +1,8 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="hf-inference", - api_key="api_token" + provider="hf-inference", + api_key="api_token", ) messages = [ diff --git a/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.together.py b/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.together.py index d125f8415d..e43a688a9b 100644 --- a/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.together.py +++ b/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.together.py @@ -1,8 +1,8 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="together", - api_key="api_token" + provider="together", + api_key="api_token", ) messages = [ diff --git a/packages/tasks-gen/snippets-fixtures/conversational-vlm-non-stream/0.huggingface_hub.fireworks-ai.py b/packages/tasks-gen/snippets-fixtures/conversational-vlm-non-stream/0.huggingface_hub.fireworks-ai.py index f85b19fff8..41f26d30a7 100644 --- a/packages/tasks-gen/snippets-fixtures/conversational-vlm-non-stream/0.huggingface_hub.fireworks-ai.py +++ b/packages/tasks-gen/snippets-fixtures/conversational-vlm-non-stream/0.huggingface_hub.fireworks-ai.py @@ -1,8 +1,8 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="fireworks-ai", - api_key="api_token" + provider="fireworks-ai", + api_key="api_token", ) messages = [ diff --git a/packages/tasks-gen/snippets-fixtures/conversational-vlm-non-stream/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/conversational-vlm-non-stream/0.huggingface_hub.hf-inference.py index 726de28b45..507809756d 100644 --- a/packages/tasks-gen/snippets-fixtures/conversational-vlm-non-stream/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/conversational-vlm-non-stream/0.huggingface_hub.hf-inference.py @@ -1,8 +1,8 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="hf-inference", - api_key="api_token" + provider="hf-inference", + api_key="api_token", ) messages = [ diff --git a/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.fireworks-ai.py b/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.fireworks-ai.py index 52c40bd259..df6123c78c 100644 --- a/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.fireworks-ai.py +++ b/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.fireworks-ai.py @@ -1,8 +1,8 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="fireworks-ai", - api_key="api_token" + provider="fireworks-ai", + api_key="api_token", ) messages = [ diff --git a/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.hf-inference.py index 5bcc6a9bcc..3fb0425397 100644 --- a/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.hf-inference.py @@ -1,8 +1,8 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="hf-inference", - api_key="api_token" + provider="hf-inference", + api_key="api_token", ) messages = [ diff --git a/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.hf-inference.py new file mode 100644 index 0000000000..d0d8e5f86a --- /dev/null +++ b/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.hf-inference.py @@ -0,0 +1,11 @@ +from huggingface_hub import InferenceClient + +client = InferenceClient( + provider="hf-inference", + api_key="api_token", + model="impira/layoutlm-invoices", +) +output = client.document_question_answering( + "cat.png", + question="What is in this image?", +) \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.py b/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.py deleted file mode 100644 index ffe118405c..0000000000 --- a/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.py +++ /dev/null @@ -1,4 +0,0 @@ -from huggingface_hub import InferenceClient -client = InferenceClient("impira/layoutlm-invoices", token="api_token") - -output = client.document_question_answering("cat.png", question="What is in this image?") \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.py b/packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.hf-inference.py similarity index 83% rename from packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.py rename to packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.hf-inference.py index 816f186788..f33f77404f 100644 --- a/packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.py +++ b/packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.hf-inference.py @@ -1,9 +1,10 @@ -import base64 import requests -API_URL = "https://api-inference.huggingface.co/models/impira/layoutlm-invoices" +API_URL = "https://router.huggingface.co/hf-inference/v1" headers = {"Authorization": "Bearer api_token"} +import base64 + def query(payload): with open(payload["image"], "rb") as f: img = f.read() diff --git a/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.py b/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.py deleted file mode 100644 index c992a1bc62..0000000000 --- a/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.py +++ /dev/null @@ -1,5 +0,0 @@ -from huggingface_hub import InferenceClient -client = InferenceClient("stabilityai/stable-diffusion-xl-refiner-1.0", token="api_token") - -# output is a PIL.Image object -image = client.image_to_image("cat.png", prompt="Turn the cat into a tiger.") \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/image-to-image/1.requests.py b/packages/tasks-gen/snippets-fixtures/image-to-image/1.requests.py deleted file mode 100644 index 00ea8d5551..0000000000 --- a/packages/tasks-gen/snippets-fixtures/image-to-image/1.requests.py +++ /dev/null @@ -1,22 +0,0 @@ -import base64 -import requests - -API_URL = "https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-xl-refiner-1.0" -headers = {"Authorization": "Bearer api_token"} - -def query(payload): - with open(payload["inputs"], "rb") as f: - img = f.read() - payload["inputs"] = base64.b64encode(img).decode("utf-8") - response = requests.post(API_URL, headers=headers, json=payload) - return response.content - -image_bytes = query({ - "inputs": "cat.png", - "parameters": {"prompt": "Turn the cat into a tiger."}, -}) - -# You can access the image with PIL.Image for example -import io -from PIL import Image -image = Image.open(io.BytesIO(image_bytes)) \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/text-classification/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/text-classification/0.huggingface_hub.hf-inference.py index ab26849845..0a2bf3ec39 100644 --- a/packages/tasks-gen/snippets-fixtures/text-classification/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/text-classification/0.huggingface_hub.hf-inference.py @@ -1,12 +1,12 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="hf-inference", - api_key="api_token" + provider="hf-inference", + api_key="api_token", + model="distilbert/distilbert-base-uncased-finetuned-sst-2-english", ) result = client.text_classification( - model="distilbert/distilbert-base-uncased-finetuned-sst-2-english", inputs="I like you. I love you", provider="hf-inference", ) diff --git a/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.fal-ai.py b/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.fal-ai.py index f96622c78f..9cb5f0cf5a 100644 --- a/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.fal-ai.py +++ b/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.fal-ai.py @@ -1,12 +1,12 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="fal-ai", - api_key="api_token" + provider="fal-ai", + api_key="api_token", + model="black-forest-labs/FLUX.1-schnell", ) # output is a PIL.Image object image = client.text_to_image( - "Astronaut riding a horse", - model="black-forest-labs/FLUX.1-schnell" + "Astronaut riding a horse" ) \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.hf-inference.py index 2a488324f8..8afd574c1d 100644 --- a/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.hf-inference.py @@ -1,12 +1,12 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="hf-inference", - api_key="api_token" + provider="hf-inference", + api_key="api_token", + model="black-forest-labs/FLUX.1-schnell", ) # output is a PIL.Image object image = client.text_to_image( - "Astronaut riding a horse", - model="black-forest-labs/FLUX.1-schnell" + "Astronaut riding a horse" ) \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.fal-ai.py b/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.fal-ai.py index 54cc650531..aaf222e013 100644 --- a/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.fal-ai.py +++ b/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.fal-ai.py @@ -1,11 +1,11 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="fal-ai", - api_key="api_token" + provider="fal-ai", + api_key="api_token", + model="tencent/HunyuanVideo", ) video = client.text_to_video( - "A young man walking on the street", - model="tencent/HunyuanVideo" + "A young man walking on the street" ) \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.replicate.py b/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.replicate.py index eecb00a94e..293ae90e6b 100644 --- a/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.replicate.py +++ b/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.replicate.py @@ -1,11 +1,11 @@ from huggingface_hub import InferenceClient client = InferenceClient( - provider="replicate", - api_key="api_token" + provider="replicate", + api_key="api_token", + model="tencent/HunyuanVideo", ) video = client.text_to_video( - "A young man walking on the street", - model="tencent/HunyuanVideo" + "A young man walking on the street" ) \ No newline at end of file From 2c51475592517c39c4ba016310216cb3880252be Mon Sep 17 00:00:00 2001 From: Wauplin Date: Wed, 5 Mar 2025 14:31:36 +0100 Subject: [PATCH 11/12] many fixes + image-to-image --- packages/inference/src/snippets/python.ts | 94 ++++++++++++++----- .../1.requests.hf-inference.py | 2 +- .../1.requests.hf-inference.py | 5 +- .../0.huggingface_hub.hf-inference.py | 9 ++ .../image-to-image/1.requests.hf-inference.py | 22 +++++ .../1.requests.hf-inference.py | 2 +- .../text-to-image/1.requests.hf-inference.py | 2 +- 7 files changed, 104 insertions(+), 32 deletions(-) create mode 100644 packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.hf-inference.py create mode 100644 packages/tasks-gen/snippets-fixtures/image-to-image/1.requests.hf-inference.py diff --git a/packages/inference/src/snippets/python.ts b/packages/inference/src/snippets/python.ts index 100e651a08..a0a73f9636 100644 --- a/packages/inference/src/snippets/python.ts +++ b/packages/inference/src/snippets/python.ts @@ -57,7 +57,7 @@ client = InferenceClient( return snippet; }; -export const snippetConversational = ( +const snippetConversational = ( model: ModelDataMinimal, accessToken: string, provider: SnippetInferenceProvider, @@ -168,7 +168,7 @@ print(completion.choices[0].message)`, } }; -export const snippetZeroShotClassification = (model: ModelDataMinimal): InferenceSnippet[] => { +const snippetZeroShotClassification = (model: ModelDataMinimal): InferenceSnippet[] => { return [ { client: "requests", @@ -185,13 +185,11 @@ output = query({ ]; }; -export const snippetZeroShotImageClassification = (model: ModelDataMinimal): InferenceSnippet[] => { +const snippetZeroShotImageClassification = (model: ModelDataMinimal): InferenceSnippet[] => { return [ { client: "requests", - content: `import base64 - -def query(data): + content: `def query(data): with open(data["image_path"], "rb") as f: img = f.read() payload={ @@ -209,7 +207,7 @@ output = query({ ]; }; -export const snippetBasic = ( +const snippetBasic = ( model: ModelDataMinimal, accessToken: string, provider: SnippetInferenceProvider @@ -246,7 +244,7 @@ output = query({ ]; }; -export const snippetFile = (model: ModelDataMinimal): InferenceSnippet[] => { +const snippetFile = (model: ModelDataMinimal): InferenceSnippet[] => { return [ { client: "requests", @@ -262,7 +260,7 @@ output = query(${getModelInputSnippet(model)})`, ]; }; -export const snippetTextToImage = ( +const snippetTextToImage = ( model: ModelDataMinimal, accessToken: string, provider: SnippetInferenceProvider, @@ -320,7 +318,7 @@ image = Image.open(io.BytesIO(image_bytes))`, ]; }; -export const snippetTextToVideo = ( +const snippetTextToVideo = ( model: ModelDataMinimal, accessToken: string, provider: SnippetInferenceProvider @@ -340,7 +338,7 @@ video = client.text_to_video( : []; }; -export const snippetTabular = (model: ModelDataMinimal): InferenceSnippet[] => { +const snippetTabular = (model: ModelDataMinimal): InferenceSnippet[] => { return [ { client: "requests", @@ -356,7 +354,7 @@ response = query({ ]; }; -export const snippetTextToAudio = (model: ModelDataMinimal): InferenceSnippet[] => { +const snippetTextToAudio = (model: ModelDataMinimal): InferenceSnippet[] => { // Transformers TTS pipeline and api-inference-community (AIC) pipeline outputs are diverged // with the latest update to inference-api (IA). // Transformers IA returns a byte object (wav file), whereas AIC returns wav and sampling_rate. @@ -430,9 +428,7 @@ output = client.document_question_answering( }, { client: "requests", - content: `import base64 - -def query(payload): + content: `def query(payload): with open(payload["image"], "rb") as f: img = f.read() payload["image"] = base64.b64encode(img).decode("utf-8") @@ -445,7 +441,45 @@ output = query({ }, ]; }; -export const pythonSnippets: Partial< + +const snippetImageToImage = ( + model: ModelDataMinimal, + accessToken: string, + provider: SnippetInferenceProvider +): InferenceSnippet[] => { + const inputsAsStr = getModelInputSnippet(model) as string; + const inputsAsObj = JSON.parse(inputsAsStr); + + return [ + { + client: "huggingface_hub", + content: `${snippetImportInferenceClient(accessToken, provider, model.id)} +# output is a PIL.Image object +image = client.image_to_image("${inputsAsObj.image}", prompt="${inputsAsObj.prompt}")`, + }, + { + client: "requests", + content: `def query(payload): + with open(payload["inputs"], "rb") as f: + img = f.read() + payload["inputs"] = base64.b64encode(img).decode("utf-8") + response = requests.post(API_URL, headers=headers, json=payload) + return response.content + +image_bytes = query({ + "inputs": "${inputsAsObj.image}", + "parameters": {"prompt": "${inputsAsObj.prompt}"}, +}) + +# You can access the image with PIL.Image for example +import io +from PIL import Image +image = Image.open(io.BytesIO(image_bytes))`, + }, + ]; +}; + +const pythonSnippets: Partial< Record< PipelineType, ( @@ -485,6 +519,7 @@ export const pythonSnippets: Partial< "image-segmentation": snippetFile, "document-question-answering": snippetDocumentQuestionAnswering, "image-to-text": snippetFile, + "image-to-image": snippetImageToImage, "zero-shot-image-classification": snippetZeroShotImageClassification, }; @@ -507,17 +542,24 @@ export function getPythonInferenceSnippet( return snippets.map((snippet) => { return { ...snippet, - content: - snippet.client === "requests" - ? `\ -import requests - -API_URL = "${openAIbaseUrl(provider)}" -headers = {"Authorization": ${accessToken ? `"Bearer ${accessToken}"` : `f"Bearer {API_TOKEN}"`}} - -${snippet.content}` - : snippet.content, + content: addImportsToSnippet(snippet.content, model, accessToken), }; }); } } + +const addImportsToSnippet = (snippet: string, model: ModelDataMinimal, accessToken: string): string => { + if (snippet.includes("requests")) { + snippet = `import requests + +API_URL = "https://router.huggingface.co/hf-inference/models/${model.id}" +headers = {"Authorization": ${accessToken ? `"Bearer ${accessToken}"` : `f"Bearer {API_TOKEN}"`}} + +${snippet}`; + } + if (snippet.includes("base64")) { + snippet = `import base64 +${snippet}`; + } + return snippet; +}; diff --git a/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.hf-inference.py b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.hf-inference.py index c334749143..4acaa0ed5b 100644 --- a/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/1.requests.hf-inference.py @@ -1,6 +1,6 @@ import requests -API_URL = "https://router.huggingface.co/hf-inference/v1" +API_URL = "https://router.huggingface.co/hf-inference/models/openai/whisper-large-v3-turbo" headers = {"Authorization": "Bearer api_token"} def query(filename): diff --git a/packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.hf-inference.py b/packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.hf-inference.py index f33f77404f..51fed678d8 100644 --- a/packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/document-question-answering/1.requests.hf-inference.py @@ -1,10 +1,9 @@ +import base64 import requests -API_URL = "https://router.huggingface.co/hf-inference/v1" +API_URL = "https://router.huggingface.co/hf-inference/models/impira/layoutlm-invoices" headers = {"Authorization": "Bearer api_token"} -import base64 - def query(payload): with open(payload["image"], "rb") as f: img = f.read() diff --git a/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.hf-inference.py new file mode 100644 index 0000000000..b1d0290228 --- /dev/null +++ b/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.hf-inference.py @@ -0,0 +1,9 @@ +from huggingface_hub import InferenceClient + +client = InferenceClient( + provider="hf-inference", + api_key="api_token", + model="stabilityai/stable-diffusion-xl-refiner-1.0", +) +# output is a PIL.Image object +image = client.image_to_image("cat.png", prompt="Turn the cat into a tiger.") \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/image-to-image/1.requests.hf-inference.py b/packages/tasks-gen/snippets-fixtures/image-to-image/1.requests.hf-inference.py new file mode 100644 index 0000000000..2d16ba05f5 --- /dev/null +++ b/packages/tasks-gen/snippets-fixtures/image-to-image/1.requests.hf-inference.py @@ -0,0 +1,22 @@ +import base64 +import requests + +API_URL = "https://router.huggingface.co/hf-inference/models/stabilityai/stable-diffusion-xl-refiner-1.0" +headers = {"Authorization": "Bearer api_token"} + +def query(payload): + with open(payload["inputs"], "rb") as f: + img = f.read() + payload["inputs"] = base64.b64encode(img).decode("utf-8") + response = requests.post(API_URL, headers=headers, json=payload) + return response.content + +image_bytes = query({ + "inputs": "cat.png", + "parameters": {"prompt": "Turn the cat into a tiger."}, +}) + +# You can access the image with PIL.Image for example +import io +from PIL import Image +image = Image.open(io.BytesIO(image_bytes)) \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/text-classification/1.requests.hf-inference.py b/packages/tasks-gen/snippets-fixtures/text-classification/1.requests.hf-inference.py index b362a49bf6..281fca0df2 100644 --- a/packages/tasks-gen/snippets-fixtures/text-classification/1.requests.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/text-classification/1.requests.hf-inference.py @@ -1,6 +1,6 @@ import requests -API_URL = "https://router.huggingface.co/hf-inference/v1" +API_URL = "https://router.huggingface.co/hf-inference/models/distilbert/distilbert-base-uncased-finetuned-sst-2-english" headers = {"Authorization": "Bearer api_token"} def query(payload): diff --git a/packages/tasks-gen/snippets-fixtures/text-to-image/1.requests.hf-inference.py b/packages/tasks-gen/snippets-fixtures/text-to-image/1.requests.hf-inference.py index 1c1fe427dc..a8e1ad9de0 100644 --- a/packages/tasks-gen/snippets-fixtures/text-to-image/1.requests.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/text-to-image/1.requests.hf-inference.py @@ -1,6 +1,6 @@ import requests -API_URL = "https://router.huggingface.co/hf-inference/v1" +API_URL = "https://router.huggingface.co/hf-inference/models/black-forest-labs/FLUX.1-schnell" headers = {"Authorization": "Bearer api_token"} def query(payload): From 17c2231bfaa861fe4019512ecd33016c196839b7 Mon Sep 17 00:00:00 2001 From: Wauplin Date: Wed, 5 Mar 2025 15:53:30 +0100 Subject: [PATCH 12/12] pass model as method arg --- packages/inference/src/snippets/python.ts | 48 +++++++++---------- .../0.huggingface_hub.hf-inference.py | 3 +- .../0.huggingface_hub.hf-inference.py | 2 +- .../0.huggingface_hub.together.py | 2 +- .../0.huggingface_hub.fireworks-ai.py | 2 +- .../0.huggingface_hub.hf-inference.py | 2 +- .../0.huggingface_hub.hf-inference.py | 2 +- .../0.huggingface_hub.hf-inference.py | 7 ++- .../0.huggingface_hub.hf-inference.py | 3 +- .../text-to-image/0.huggingface_hub.fal-ai.py | 4 +- .../0.huggingface_hub.hf-inference.py | 4 +- .../text-to-video/0.huggingface_hub.fal-ai.py | 4 +- .../0.huggingface_hub.replicate.py | 4 +- 13 files changed, 43 insertions(+), 44 deletions(-) diff --git a/packages/inference/src/snippets/python.ts b/packages/inference/src/snippets/python.ts index a0a73f9636..ef3df2564f 100644 --- a/packages/inference/src/snippets/python.ts +++ b/packages/inference/src/snippets/python.ts @@ -39,23 +39,14 @@ const HFH_INFERENCE_CLIENT_METHODS: Partial> = { "tabular-regression": "tabular_regression", }; -const snippetImportInferenceClient = ( - accessToken: string, - provider: SnippetInferenceProvider, - model?: string -): string => { - let snippet = `\ +const snippetImportInferenceClient = (accessToken: string, provider: SnippetInferenceProvider): string => + `\ from huggingface_hub import InferenceClient client = InferenceClient( provider="${provider}", - api_key="${accessToken || "{API_TOKEN}"}",`; - if (model) { - snippet += `\n model="${model}",`; - } - snippet += "\n)"; - return snippet; -}; + api_key="${accessToken || "{API_TOKEN}"}", +)`; const snippetConversational = ( model: ModelDataMinimal, @@ -98,7 +89,7 @@ stream = client.chat.completions.create( model="${model.id}", messages=messages, ${configStr} - stream=True + stream=True, ) for chunk in stream: @@ -218,11 +209,11 @@ const snippetBasic = ( { client: "huggingface_hub", content: `\ -${snippetImportInferenceClient(accessToken, provider, model.id)} +${snippetImportInferenceClient(accessToken, provider)} result = client.${HFH_INFERENCE_CLIENT_METHODS[model.pipeline_tag]}( inputs=${getModelInputSnippet(model)}, - provider="${provider}", + model="${model.id}", ) print(result) @@ -270,11 +261,12 @@ const snippetTextToImage = ( { client: "huggingface_hub", content: `\ -${snippetImportInferenceClient(accessToken, provider, model.id)} +${snippetImportInferenceClient(accessToken, provider)} # output is a PIL.Image object image = client.text_to_image( - ${getModelInputSnippet(model)} + ${getModelInputSnippet(model)}, + model="${model.id}", )`, }, ...(provider === "fal-ai" @@ -328,10 +320,11 @@ const snippetTextToVideo = ( { client: "huggingface_hub", content: `\ -${snippetImportInferenceClient(accessToken, provider, model.id)} +${snippetImportInferenceClient(accessToken, provider)} video = client.text_to_video( - ${getModelInputSnippet(model)} + ${getModelInputSnippet(model)}, + model="${model.id}", )`, }, ] @@ -402,8 +395,8 @@ const snippetAutomaticSpeechRecognition = ( return [ { client: "huggingface_hub", - content: `${snippetImportInferenceClient(accessToken, provider, model.id)} -output = client.automatic_speech_recognition(${getModelInputSnippet(model)})`, + content: `${snippetImportInferenceClient(accessToken, provider)} +output = client.automatic_speech_recognition(${getModelInputSnippet(model)}, model="${model.id}")`, }, snippetFile(model)[0], ]; @@ -420,10 +413,11 @@ const snippetDocumentQuestionAnswering = ( return [ { client: "huggingface_hub", - content: `${snippetImportInferenceClient(accessToken, provider, model.id)} + content: `${snippetImportInferenceClient(accessToken, provider)} output = client.document_question_answering( "${inputsAsObj.image}", question="${inputsAsObj.question}", + model="${model.id}", )`, }, { @@ -453,9 +447,13 @@ const snippetImageToImage = ( return [ { client: "huggingface_hub", - content: `${snippetImportInferenceClient(accessToken, provider, model.id)} + content: `${snippetImportInferenceClient(accessToken, provider)} # output is a PIL.Image object -image = client.image_to_image("${inputsAsObj.image}", prompt="${inputsAsObj.prompt}")`, +image = client.image_to_image( + "${inputsAsObj.image}", + prompt="${inputsAsObj.prompt}", + model="${model.id}", +)`, }, { client: "requests", diff --git a/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.hf-inference.py index c869f412a8..9a945fcf65 100644 --- a/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/automatic-speech-recognition/0.huggingface_hub.hf-inference.py @@ -3,6 +3,5 @@ client = InferenceClient( provider="hf-inference", api_key="api_token", - model="openai/whisper-large-v3-turbo", ) -output = client.automatic_speech_recognition("sample1.flac") \ No newline at end of file +output = client.automatic_speech_recognition("sample1.flac", model="openai/whisper-large-v3-turbo") \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.hf-inference.py index 34693c89d1..0f1fd0dbdc 100644 --- a/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.hf-inference.py @@ -16,7 +16,7 @@ model="meta-llama/Llama-3.1-8B-Instruct", messages=messages, max_tokens=500, - stream=True + stream=True, ) for chunk in stream: diff --git a/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.together.py b/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.together.py index e43a688a9b..31d00d979c 100644 --- a/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.together.py +++ b/packages/tasks-gen/snippets-fixtures/conversational-llm-stream/0.huggingface_hub.together.py @@ -16,7 +16,7 @@ model="meta-llama/Llama-3.1-8B-Instruct", messages=messages, max_tokens=500, - stream=True + stream=True, ) for chunk in stream: diff --git a/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.fireworks-ai.py b/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.fireworks-ai.py index df6123c78c..ad86364e4d 100644 --- a/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.fireworks-ai.py +++ b/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.fireworks-ai.py @@ -27,7 +27,7 @@ model="meta-llama/Llama-3.2-11B-Vision-Instruct", messages=messages, max_tokens=500, - stream=True + stream=True, ) for chunk in stream: diff --git a/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.hf-inference.py index 3fb0425397..7d58f8020a 100644 --- a/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/conversational-vlm-stream/0.huggingface_hub.hf-inference.py @@ -27,7 +27,7 @@ model="meta-llama/Llama-3.2-11B-Vision-Instruct", messages=messages, max_tokens=500, - stream=True + stream=True, ) for chunk in stream: diff --git a/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.hf-inference.py index d0d8e5f86a..46e437c63a 100644 --- a/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/document-question-answering/0.huggingface_hub.hf-inference.py @@ -3,9 +3,9 @@ client = InferenceClient( provider="hf-inference", api_key="api_token", - model="impira/layoutlm-invoices", ) output = client.document_question_answering( "cat.png", question="What is in this image?", + model="impira/layoutlm-invoices", ) \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.hf-inference.py index b1d0290228..c21949966a 100644 --- a/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/image-to-image/0.huggingface_hub.hf-inference.py @@ -3,7 +3,10 @@ client = InferenceClient( provider="hf-inference", api_key="api_token", - model="stabilityai/stable-diffusion-xl-refiner-1.0", ) # output is a PIL.Image object -image = client.image_to_image("cat.png", prompt="Turn the cat into a tiger.") \ No newline at end of file +image = client.image_to_image( + "cat.png", + prompt="Turn the cat into a tiger.", + model="stabilityai/stable-diffusion-xl-refiner-1.0", +) \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/text-classification/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/text-classification/0.huggingface_hub.hf-inference.py index 0a2bf3ec39..d6b9b9aa45 100644 --- a/packages/tasks-gen/snippets-fixtures/text-classification/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/text-classification/0.huggingface_hub.hf-inference.py @@ -3,12 +3,11 @@ client = InferenceClient( provider="hf-inference", api_key="api_token", - model="distilbert/distilbert-base-uncased-finetuned-sst-2-english", ) result = client.text_classification( inputs="I like you. I love you", - provider="hf-inference", + model="distilbert/distilbert-base-uncased-finetuned-sst-2-english", ) print(result) diff --git a/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.fal-ai.py b/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.fal-ai.py index 9cb5f0cf5a..8f8a6b1021 100644 --- a/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.fal-ai.py +++ b/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.fal-ai.py @@ -3,10 +3,10 @@ client = InferenceClient( provider="fal-ai", api_key="api_token", - model="black-forest-labs/FLUX.1-schnell", ) # output is a PIL.Image object image = client.text_to_image( - "Astronaut riding a horse" + "Astronaut riding a horse", + model="black-forest-labs/FLUX.1-schnell", ) \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.hf-inference.py b/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.hf-inference.py index 8afd574c1d..b4c48cec43 100644 --- a/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.hf-inference.py +++ b/packages/tasks-gen/snippets-fixtures/text-to-image/0.huggingface_hub.hf-inference.py @@ -3,10 +3,10 @@ client = InferenceClient( provider="hf-inference", api_key="api_token", - model="black-forest-labs/FLUX.1-schnell", ) # output is a PIL.Image object image = client.text_to_image( - "Astronaut riding a horse" + "Astronaut riding a horse", + model="black-forest-labs/FLUX.1-schnell", ) \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.fal-ai.py b/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.fal-ai.py index aaf222e013..fc96fd381b 100644 --- a/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.fal-ai.py +++ b/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.fal-ai.py @@ -3,9 +3,9 @@ client = InferenceClient( provider="fal-ai", api_key="api_token", - model="tencent/HunyuanVideo", ) video = client.text_to_video( - "A young man walking on the street" + "A young man walking on the street", + model="tencent/HunyuanVideo", ) \ No newline at end of file diff --git a/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.replicate.py b/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.replicate.py index 293ae90e6b..208c583119 100644 --- a/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.replicate.py +++ b/packages/tasks-gen/snippets-fixtures/text-to-video/0.huggingface_hub.replicate.py @@ -3,9 +3,9 @@ client = InferenceClient( provider="replicate", api_key="api_token", - model="tencent/HunyuanVideo", ) video = client.text_to_video( - "A young man walking on the street" + "A young man walking on the street", + model="tencent/HunyuanVideo", ) \ No newline at end of file