Spaces:
Running
Running
import { HfInference } from '@huggingface/inference' | |
import { RepoFile } from './types.mts' | |
import { createLlamaPrompt } from './createLlamaPrompt.mts' | |
import { parseTutorial } from './parseTutorial.mts' | |
import { getPythonApp} from './getPythonApp.mts' | |
import { getWebApp } from './getWebApp.mts' | |
import { getReactApp } from './getReactApp.mts' | |
import { isPythonAppPrompt } from './isPythonAppPrompt.mts' | |
import { isReactAppPrompt } from './isReactAppPrompt.mts' | |
export const generateFiles = async (prompt: string, token: string) => { | |
if (`${prompt}`.length < 2) { | |
throw new Error(`prompt too short, please enter at least ${prompt} characters`) | |
} | |
const { prefix, instructions } = | |
isPythonAppPrompt(prompt) | |
? getPythonApp(prompt) | |
: isReactAppPrompt(prompt) | |
? getReactApp(prompt) | |
: getWebApp(prompt) | |
const inputs = createLlamaPrompt(instructions) + "\nSure! Here are the source files:\n" + prefix | |
let tutorial = prefix | |
try { | |
const hf = new HfInference(token) | |
for await (const output of hf.textGenerationStream({ | |
// model: "tiiuae/falcon-180B-chat", | |
model: "codellama/CodeLlama-34b-Instruct-hf", | |
inputs, | |
parameters: { | |
do_sample: true, | |
// for "codellama/CodeLlama-34b-Instruct-hf": | |
// `inputs` tokens + `max_new_tokens` must be <= 8192 | |
// error: `inputs` must have less than 4096 tokens. | |
// for "tiiuae/falcon-180B-chat": | |
// `inputs` tokens + `max_new_tokens` must be <= 8192 | |
// error: `inputs` must have less than 4096 tokens. | |
max_new_tokens: 4096, | |
return_full_text: false, | |
} | |
})) { | |
tutorial += output.token.text | |
process.stdout.write(output.token.text) | |
// res.write(output.token.text) | |
if (tutorial.includes('<|end|>') | |
|| tutorial.includes('[ENDINSTRUCTION]') | |
|| tutorial.includes('[/TASK]') | |
|| tutorial.includes('<|assistant|>')) { | |
break | |
} | |
} | |
} catch (e) { | |
console.log("failed:") | |
console.log(e) | |
} | |
console.log("analyzing the generated instructions..") | |
const files = parseTutorial(tutorial).map(({ filename, content }) => ({ | |
path: `${filename || ""}`.trim().replace(" ", ""), | |
content: `${content || ""}` | |
} as RepoFile)) | |
.filter(res => res.path.length && res.content.length) | |
return files | |
} |