Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import { ObjectID } from 'mongodb'; | |
import { MongoObject } from './MongoObject'; | |
import { Utils } from '../lib/Utils'; | |
import { config } from '../lib/config'; | |
import db from './Database'; | |
export enum ModelId { | |
'distil-gpt2' = 'distil-gpt2', | |
'arxiv-nlp' = 'arxiv-nlp', | |
'gpt2-large' = 'gpt2-large', | |
'gpt2-xl' = 'gpt2-xl', | |
'xlnet' = 'xlnet', | |
'gpt' = 'gpt', | |
'ctrl' = 'ctrl', | |
'pplm' = 'pplm', | |
} | |
export const ALL_MODELS = Object.values(ModelId) as string[]; | |
namespace Doc { | |
interface InsertDeltaOperation { | |
insert: string; | |
attributes?: { | |
link?: string; | |
bold?: true; | |
}; | |
} | |
export interface Contents { | |
ops: InsertDeltaOperation[]; | |
} | |
} | |
class Doc extends MongoObject { | |
protected static __type = Doc; | |
protected static __collectionName: string = 'docs'; | |
protected static __idField: string = 'shortId'; | |
_id: ObjectID; | |
shortId: string; | |
longId?: string; | |
model: ModelId; | |
contents: Doc.Contents; | |
/** | |
* Optional reference to another doc's `shortId`. | |
*/ | |
clonedFrom?: string; | |
title?: string; | |
/** | |
* Whether to display it on the front page. | |
*/ | |
featured?: boolean; | |
static fromObject(o: Partial<Doc>): Doc { | |
return Object.assign(new Doc(), o); | |
} | |
/** | |
* Initialize a new doc with random ids. | |
*/ | |
static seed(model: ModelId): Doc { | |
return this.fromObject({ | |
shortId: Utils.randomStr(10), | |
longId: Utils.randomStr(24), | |
model | |
}); | |
} | |
/** | |
* Insert a new doc duplicated from an existing one. | |
*/ | |
async duplicate(): Promise<Doc> { | |
const newdoc = Doc.seed(this.model); | |
newdoc.contents = this.contents; | |
newdoc.title = this.title; | |
newdoc.clonedFrom = this.shortId; | |
await db.docs.insertOne(newdoc); | |
return newdoc; | |
} | |
/** | |
* This is displayed next to the doc title in a `<code>` tag. | |
*/ | |
get modelFamily(): string { | |
if ([ | |
'arxiv-nlp', | |
'gpt2-large', | |
'gpt2-xl', | |
].includes(this.model)) { | |
return 'gpt2'; | |
} | |
if (this.model === 'ctrl') { | |
return `salesforce/ctrl`; | |
} | |
if (this.model === 'pplm') { | |
return `uber/pplm`; | |
} | |
return this.model; | |
} | |
get hasCustomLogo(): boolean { | |
return ['ctrl', 'pplm'].includes(this.model); | |
} | |
get modelInfoLink(): string { | |
if (this.model === 'pplm') { | |
return `https://github.com/huggingface/transformers/tree/master/examples/pplm`; | |
} | |
return `https://github.com/huggingface/transformers`; | |
} | |
get shareUrl(): string { | |
return `${config.transformerAutocompleteUrl}/share/${this.shortId}`; | |
} | |
get editUrl(): string { | |
return `${config.transformerAutocompleteUrl}/doc/${this.model}/${this.longId}/edit`; | |
} | |
/** | |
* Construct a (safe) HTML representation of the quill delta content format. | |
*/ | |
get getHTML(): string | undefined { | |
if (! this.contents) { | |
return ; | |
} | |
return this.contents.ops.map(op => { | |
const escaped = op.insert?.toString().replace(/</g, "<") ?? ""; | |
if (op.attributes && op.attributes.bold) { | |
return `<strong>${escaped}</strong>`; | |
} | |
return escaped; | |
}).join(""); | |
} | |
/** | |
* Construct a (safe) JSON representation of the doc.contents. | |
*/ | |
get contentsJson(): string | undefined { | |
if (! this.contents) { | |
return ; | |
} | |
return JSON.stringify(this.contents).replace(/</g, "<"); | |
} | |
duck(): string { | |
return '___quack___'; | |
} | |
} | |
export default Doc; | |