Spaces:
Runtime error
Runtime error
| import * as readline from 'node:readline' | |
| import { stdin, stdout } from 'node:process' | |
| const API_URL = 'http://127.0.0.1:8080' | |
| const chat = [ | |
| { | |
| human: "Hello, Assistant.", | |
| assistant: "Hello. How may I help you today?" | |
| }, | |
| { | |
| human: "Please tell me the largest city in Europe.", | |
| assistant: "Sure. The largest city in Europe is Moscow, the capital of Russia." | |
| }, | |
| ] | |
| const instruction = `A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.` | |
| function format_prompt(question) { | |
| return `${instruction}\n${ | |
| chat.map(m =>`### Human: ${m.human}\n### Assistant: ${m.assistant}`).join("\n") | |
| }\n### Human: ${question}\n### Assistant:` | |
| } | |
| async function tokenize(content) { | |
| const result = await fetch(`${API_URL}/tokenize`, { | |
| method: 'POST', | |
| body: JSON.stringify({ content }) | |
| }) | |
| if (!result.ok) { | |
| return [] | |
| } | |
| return await result.json().tokens | |
| } | |
| const n_keep = await tokenize(instruction).length | |
| async function chat_completion(question) { | |
| const result = await fetch(`${API_URL}/completion`, { | |
| method: 'POST', | |
| body: JSON.stringify({ | |
| prompt: format_prompt(question), | |
| temperature: 0.2, | |
| top_k: 40, | |
| top_p: 0.9, | |
| n_keep: n_keep, | |
| n_predict: 256, | |
| stop: ["\n### Human:"], // stop completion after generating this | |
| stream: true, | |
| }) | |
| }) | |
| if (!result.ok) { | |
| return | |
| } | |
| let answer = '' | |
| for await (var chunk of result.body) { | |
| const t = Buffer.from(chunk).toString('utf8') | |
| if (t.startsWith('data: ')) { | |
| const message = JSON.parse(t.substring(6)) | |
| answer += message.content | |
| process.stdout.write(message.content) | |
| if (message.stop) { | |
| if (message.truncated) { | |
| chat.shift() | |
| } | |
| break | |
| } | |
| } | |
| } | |
| process.stdout.write('\n') | |
| chat.push({ human: question, assistant: answer.trimStart() }) | |
| } | |
| const rl = readline.createInterface({ input: stdin, output: stdout }); | |
| const readlineQuestion = (rl, query, options) => new Promise((resolve, reject) => { | |
| rl.question(query, options, resolve) | |
| }); | |
| while(true) { | |
| const question = await readlineQuestion(rl, '> ') | |
| await chat_completion(question) | |
| } | |