From a623fafbcfef820243359fe942b356cbbaf09d9a Mon Sep 17 00:00:00 2001 From: Ali Abdalla Date: Wed, 4 Dec 2024 20:48:49 -0800 Subject: [PATCH] Move requirements generation in playground to playground worker (#10126) * move requirements genereation * formatting * add changeset --------- Co-authored-by: gradio-pr-bot --- .changeset/clear-hats-shout.md | 5 +++ .../lib/components/DemosLite/DemosLite.svelte | 31 +++---------- .../DemosLite/requirements-utils.ts | 45 ------------------- 3 files changed, 11 insertions(+), 70 deletions(-) create mode 100644 .changeset/clear-hats-shout.md delete mode 100644 js/_website/src/lib/components/DemosLite/requirements-utils.ts diff --git a/.changeset/clear-hats-shout.md b/.changeset/clear-hats-shout.md new file mode 100644 index 0000000000000..0930546354344 --- /dev/null +++ b/.changeset/clear-hats-shout.md @@ -0,0 +1,5 @@ +--- +"website": minor +--- + +feat:Move requirements generation in playground to playground worker diff --git a/js/_website/src/lib/components/DemosLite/DemosLite.svelte b/js/_website/src/lib/components/DemosLite/DemosLite.svelte index be819c03d27cd..4375baae66f16 100644 --- a/js/_website/src/lib/components/DemosLite/DemosLite.svelte +++ b/js/_website/src/lib/components/DemosLite/DemosLite.svelte @@ -13,7 +13,6 @@ import { onMount } from "svelte"; import SYSTEM_PROMPT from "$lib/json/system_prompt.json"; import WHEEL from "$lib/json/wheel.json"; - import { excludeUnavailablePackages } from "./requirements-utils"; let generated = true; @@ -21,7 +20,7 @@ let compare = false; const workerUrl = "https://playground-worker.pages.dev/api/generate"; - // const workerUrl = "http://localhost:5174/api/generate"; + // const workerUrl = "http://localhost:5173/api/generate"; let model_info = ""; let abortController: AbortController | null = null; @@ -87,6 +86,8 @@ // } } else if (parsed.info) { console.log(parsed.info); + } else if (parsed.requirements) { + yield { requirements: parsed.requirements }; } else if (parsed.choices && parsed.choices.length > 0) { yield parsed; } @@ -125,7 +126,9 @@ SYSTEM_PROMPT.SYSTEM, abortController.signal )) { - if (chunk.choices && chunk.choices.length > 0) { + if (chunk.requirements) { + demos[queried_index].requirements = chunk.requirements; + } else if (chunk.choices && chunk.choices.length > 0) { const content = chunk.choices[0].delta.content; if (content) { out += content; @@ -151,28 +154,6 @@ } } - const system_prompt_requirements_txt = `User gives Python code. -You return the required package list in the format of \`requirements.txt\` for pip. -You exclude \`gradio\` from the package list because it's already installed in the user's environment. -You only return the content of \`requirements.txt\`, without any other texts or messages.`; - const query_requirements_txt = demos[queried_index].code; - let generated_requirements_txt = ""; - for await (const chunk of streamFromWorker( - query_requirements_txt, - system_prompt_requirements_txt, - abortController.signal - )) { - if (chunk.choices && chunk.choices.length > 0) { - const content = chunk.choices[0].delta.content; - if (content) { - generated_requirements_txt += content; - } - } - } - demos[queried_index].requirements = await excludeUnavailablePackages( - generated_requirements_txt.split("\n").filter((r) => r.trim() !== "") - ); - generated = true; if (selected_demo.name === demo_name) { highlight_changes(code_to_compare, demos[queried_index].code); diff --git a/js/_website/src/lib/components/DemosLite/requirements-utils.ts b/js/_website/src/lib/components/DemosLite/requirements-utils.ts deleted file mode 100644 index af8c7b159843b..0000000000000 --- a/js/_website/src/lib/components/DemosLite/requirements-utils.ts +++ /dev/null @@ -1,45 +0,0 @@ -export function extractPackageName(line: string): string | null { - const noComments = line.split("#")[0].trim(); - - const match = noComments.match(/^([a-zA-Z0-9_\-.]+)/); - return match ? match[1] : null; -} - -export async function packageExistsOnPyPi(packageName: string) { - const url = `https://pypi.org/pypi/${packageName}/json`; - - try { - const response = await fetch(url); - - if (response.status === 200) { - console.log(`The package '${packageName}' exists on PyPI.`); - return true; - } else if (response.status === 404) { - console.log(`The package '${packageName}' does not exist on PyPI.`); - return false; - } else { - console.log( - `Failed to fetch information for '${packageName}'. HTTP Status Code: ${response.status}` - ); - return false; - } - } catch (error) { - console.error(`Error while checking package '${packageName}':`, error); - return false; - } -} - -export async function excludeUnavailablePackages( - requirements: string[] -): Promise { - const packageChecks = requirements.map(async (req) => { - const packageName = extractPackageName(req); - if (!packageName) return null; - - const exists = await packageExistsOnPyPi(packageName); - return exists === true ? req : null; - }); - - const results = await Promise.all(packageChecks); - return results.filter((line) => line !== null); -}