import { c } from './lib/Log'; interface AutocompleteOutput { sentences: { value: string; time: number; }[]; time: number; } export class Api { private static ENDPOINT = // `http://coconut-proxy.huggingface.test` // `http://coconuthf.eastus.cloudapp.azure.com:6006` // "http://localhost:6006" // `https://transformer.huggingface.co` `https://wvnbdkpga3d4aev9.us-east-1.aws.endpoints.huggingface.cloud` ; static shared = new Api(); private async postAutocomplete( params: { inputs: { context: string; kwargs: { model_size?: string; /// 'small' | 'medium', top_p?: number; /// float between 0 and 1 temperature?: number; /// float between 0 and 100 step_size?: number; kl_scale?: number; gm_scale?: number; num_iterations?: number; gen_length?: number; max_time?: number; /// <- if we want to limit the response time. (in sec) bow_or_discrim?: string; use_sampling?: boolean; } } } ): Promise { const init = { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(params), } const response = await fetch(Api.ENDPOINT, init) const result = JSON.parse(await response.json()) return result } /** * Demo-specific helpers */ async postWithSettings( params: { context: string; } ): Promise { /// Retrieve all settings params then launch the request. const model_size = document.querySelector('.decoder-settings .setting.model_size .js-val')!.textContent || undefined; const parseSliderVal = (sel: string): number | undefined => { const x = document.querySelector(sel); if (x && x.textContent) { return Number(x.textContent); } return undefined; }; const top_p = parseSliderVal('.decoder-settings .setting.top_p .js-val'); const temperature = parseSliderVal('.decoder-settings .setting.temperature .js-val'); const step_size = parseSliderVal('.decoder-settings .setting.step_size .js-val'); const kl_scale = parseSliderVal('.decoder-settings .setting.kl_scale .js-val'); const gm_scale = parseSliderVal('.decoder-settings .setting.gm_scale .js-val'); const num_iterations = parseSliderVal('.decoder-settings .setting.num_iterations .js-val'); const gen_length = parseSliderVal('.decoder-settings .setting.gen_length .js-val'); const max_time = parseSliderVal('.decoder-settings .setting.max_time .js-val'); const bow_or_discrim = ( document.querySelector('.decoder-settings input[name=bow_or_discrim]:checked') || {} ).value; const use_sampling = ( document.querySelector('.decoder-settings input[name=use_sampling]') || {} ).checked; const sent_params = { inputs: { ...params, kwargs: { model_size, top_p, temperature, step_size, kl_scale, gm_scale, num_iterations, gen_length, max_time, bow_or_discrim, use_sampling, } } } return this.postAutocomplete(sent_params); } /** * Edit AJAX endpoint * * Contrary to the autocomplete endpoint, * this is on server, * not on backend. */ async postEdit(body: any): Promise { const doc = (window).doc as { [index: string]: string }; if (!doc || !doc.longId) { throw new Error(`invalid doc`); } const path = `/edit/${doc.model}/${doc.longId}/${doc.shortId}`; const response = await fetch(path, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), }); return response.ok; } /** * Duplicate AJAX endpoint * * Contrary to the autocomplete endpoint, * this is on server, * not on backend. */ async postDuplicate(): Promise { const doc = (window).doc as { [index: string]: string }; if (!doc || !doc.shortId) { throw new Error(`invalid doc`); } const path = `/duplicate/${doc.shortId}`; const response = await fetch(path, { method: 'POST', headers: { 'Content-Type': 'application/json' }, }); const url = await response.text(); c.log('[new url]', url); return url; } }