XciD's picture
XciD HF staff
use-inference-endpoint (#2)
b868fde verified
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<any> {
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<AutocompleteOutput> {
/// 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<HTMLInputElement>('.decoder-settings input[name=bow_or_discrim]:checked') || {}
).value;
const use_sampling = (
document.querySelector<HTMLInputElement>('.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<boolean> {
const doc = (<any>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<string> {
const doc = (<any>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;
}
}