diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 6a222ca..e123f95 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE42WT2vcMBDFv4vPIUtDGkqO3T9gaNrShF5CD6o9WasrS4s1phtKv3u03o1trT2jueq992P0JISe/2UIB8zus5VuoEDtrM+usr3CKqyBbWu/GJTrCmsT5J22ZXb/6f9Vn/6i7LZVW5iEe4HOfs/zSey4Rid+wN6oAh4AK1dOsrHKUJyZztst0pml0WBxCBVGeQ9+cVqPcx9uxsm8Di1stIFpuJeS+a+Af12zIxBnlaN8Vh7ubte2cCU0A0ZbhOYllOYXkSNG3Xy8G1dRKZwlHIVUcFk5XQAZP8kpSG73LT1Cp4oQD+B9qI8nnU0yYGtQJ3BHSwqWGkw40+PjmkQETRBPHFfvEKBWYFBxpM4gAPGn/25IgX5qH142EnOSZZBESWOTDMjvcOSR4VK3KXKxSFfvDSDZWy/LIFxvFyYZkOkt9nC4df0bylLb7SyoV0WIlSKufOQQoei9xRYW1jRu/vHvFC66UQW2ymh8nc0PsgyyrKDYJUidh8Pl9s/pfzIL6lURgh4otvCw0P/6gGDJpyW2cLBvLSZpFx4Od/4bhe/VLGmQZRC6rgsPh3tyB11QN+pdlADoaSIHi2qU9Ubh/HPUqxIEdVojfYr59QYzxYeHkQsAAA==" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE42WQW+cMBCF/wvnqKtEbRTl2N2NhNS0UVL1UvXgwnRx19grPChbVf3v9cIG8MKM5+r33qfhYYy//80QjpjdZxvdQIHaWZ9dZQeFVVgD29Z+NSrvKqxNkPfaltn93b+rIf1J2V2rdjALDwKdfcrzWey0Riee4WBUAY+AlStn2VhlKM7M5+0W6czaaLA4hgqjvAe/6tfj3PXNNJnXoYUHbWAeHqRk/jPgq2v2BOKscpSPysPt+60tXAnNiNEWofkVSvOryBGjbj7cTquoFC4STkIquK6cLoCM93IKkttDS4/QqSLEI3gf6uNJZ5MM2BrUCdzJkoKlBhPO9PKyJRFBE8QTr2twCFAbMKg4UmcQgPi3/2ZIgb5pH042EtPLMkiipKlJBuSfcOKR4VK7KXKxSFcfDCDZ2yDLIFxvFyYZkOkt9nC4bf0TylLb3SJoUEWIjSK2fOQQoehniy0srGnc8uHfKVz0QRXYKqPxz2J+lGWQdQXFPkHqPBwut7/7+8kiaFBFCHqg2MLDQv/bI4Ilj5bYwsG+tJikXXg43PluFK5Xi6RRlkHoui48PK5RlqKcpHSY/iomehrzDD78lhlOb+BAX91RF9Tn8SZKAHS1kYNFhZG9Ubh8tg6qBEFtvYk+x/z4D+yAH3BeDAAA" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index e932f14..a9d040c 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/Client.html b/docs/classes/Client.html index d5abf7a..7c626de 100644 --- a/docs/classes/Client.html +++ b/docs/classes/Client.html @@ -14,6 +14,7 @@ RawDoPost RawDoSSEPost ReplacePII +Rerank Toxicity Translate embedInputs @@ -105,7 +106,7 @@
  • A Promise with a respose object and an error object if the error is not null.
  • -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/interfaces/Rerank.html b/docs/interfaces/Rerank.html new file mode 100644 index 0000000..ba63f0e --- /dev/null +++ b/docs/interfaces/Rerank.html @@ -0,0 +1,14 @@ +Rerank | predictionguard

    Interface Rerank

    Rerank represents an object that contains the result for the rerank call.

    +
    interface Rerank {
        created: number;
        id: string;
        model: string;
        object: string;
        results: RerankResult[];
        createdDate(): Date;
    }

    Properties

    Methods

    Properties

    created: number

    created represents the unix timestamp for when the request was +received.

    +
    id: string

    id represents a unique identifier for the result.

    +
    model: string

    model represents the model that was used.

    +
    object: string

    object represent the type of the result document.

    +
    results: RerankResult[]

    Methods

    • createdDate converts the created unix timestamp into a JS Date.

      +

      Returns Date

    \ No newline at end of file diff --git a/docs/interfaces/RerankInput.html b/docs/interfaces/RerankInput.html new file mode 100644 index 0000000..6119bc5 --- /dev/null +++ b/docs/interfaces/RerankInput.html @@ -0,0 +1,10 @@ +RerankInput | predictionguard

    Interface RerankInput

    RerankInput represents the input to generate a rerank.

    +
    interface RerankInput {
        documents: string[];
        model: string;
        query: string;
        returnDocuments: boolean;
    }

    Properties

    documents: string[]

    documents represent the documents to rank.

    +
    model: string

    model represents the model to use.

    +
    query: string

    query represents the content to rank against.

    +
    returnDocuments: boolean

    returnDocuments determines to return the document in the result.

    +
    \ No newline at end of file diff --git a/docs/interfaces/RerankResult.html b/docs/interfaces/RerankResult.html new file mode 100644 index 0000000..8d06aa6 --- /dev/null +++ b/docs/interfaces/RerankResult.html @@ -0,0 +1,8 @@ +RerankResult | predictionguard

    Interface RerankResult

    interface RerankResult {
        index: number;
        relevance_score: number;
        text: string;
    }

    Properties

    Properties

    index: number

    index represents the index position in the collection for +this checks.

    +
    relevance_score: number

    relevance_score is the ranking of the result.

    +
    text: string

    text represents the returned document.

    +
    \ No newline at end of file diff --git a/docs/interfaces/Toxicity.html b/docs/interfaces/Toxicity.html index 28c1a30..373d4f5 100644 --- a/docs/interfaces/Toxicity.html +++ b/docs/interfaces/Toxicity.html @@ -1,14 +1,14 @@ Toxicity | predictionguard

    Interface Toxicity

    Toxicity represents an object that contains the result for the toxicity call.

    -
    interface Toxicity {
        checks: ToxicityCheck[];
        created: number;
        id: string;
        object: string;
        createdDate(): Date;
    }

    Properties

    interface Toxicity {
        checks: ToxicityCheck[];
        created: number;
        id: string;
        object: string;
        createdDate(): Date;
    }

    Properties

    Methods

    Properties

    checks: ToxicityCheck[]

    checks represents the collection of checks to choose from.

    -
    created: number

    created represents the unix timestamp for when the request was +

    created: number

    created represents the unix timestamp for when the request was received.

    -
    id: string

    id represents a unique identifier for the result.

    -
    object: string

    object represent the type of the result document.

    -

    Methods

    • createdDate converts the created unix timestamp into a JS Date.

      -

      Returns Date

    \ No newline at end of file +
    id: string

    id represents a unique identifier for the result.

    +
    object: string

    object represent the type of the result document.

    +

    Methods

    \ No newline at end of file diff --git a/docs/interfaces/ToxicityCheck.html b/docs/interfaces/ToxicityCheck.html index 765fcb9..bad3278 100644 --- a/docs/interfaces/ToxicityCheck.html +++ b/docs/interfaces/ToxicityCheck.html @@ -1,7 +1,7 @@ ToxicityCheck | predictionguard

    Interface ToxicityCheck

    ToxicityCheck represents an object that contains a check choice.

    -
    interface ToxicityCheck {
        index: number;
        score: number;
    }

    Properties

    interface ToxicityCheck {
        index: number;
        score: number;
    }

    Properties

    Properties

    index: number

    index represents the index position in the collection for this checks.

    -
    score: number

    score represents the score for the provided text.

    -
    \ No newline at end of file +
    score: number

    score represents the score for the provided text.

    +
    \ No newline at end of file diff --git a/docs/interfaces/Translate.html b/docs/interfaces/Translate.html index cc70deb..808a90b 100644 --- a/docs/interfaces/Translate.html +++ b/docs/interfaces/Translate.html @@ -1,6 +1,6 @@ Translate | predictionguard

    Interface Translate

    Translate represents an object that contains the result for the translate call.

    -
    interface Translate {
        best_score: number;
        best_translation: string;
        best_translation_model: string;
        created: number;
        id: string;
        object: string;
        translations: Translation[];
        createdDate(): Date;
    }

    Properties

    interface Translate {
        best_score: number;
        best_translation: string;
        best_translation_model: string;
        created: number;
        id: string;
        object: string;
        translations: Translation[];
        createdDate(): Date;
    }

    Properties

    best_score: number

    best_score represents the best score for the best translation.

    -
    best_translation: string

    best_translation represents the best translation of the input text.

    -
    best_translation_model: string

    best_translation_model represents the model used for the best +

    best_translation: string

    best_translation represents the best translation of the input text.

    +
    best_translation_model: string

    best_translation_model represents the model used for the best translation.

    -
    created: number

    created represents the unix timestamp for when the request was +

    created: number

    created represents the unix timestamp for when the request was received.

    -
    id: string

    id represents a unique identifier for the result.

    -
    object: string

    object represent the type of the result document.

    -
    translations: Translation[]

    translations represents the collection of translations to choose from.

    -

    Methods

    • createdDate converts the created unix timestamp into a JS Date.

      -

      Returns Date

    \ No newline at end of file +
    id: string

    id represents a unique identifier for the result.

    +
    object: string

    object represent the type of the result document.

    +
    translations: Translation[]

    translations represents the collection of translations to choose from.

    +

    Methods

    \ No newline at end of file diff --git a/docs/interfaces/Translation.html b/docs/interfaces/Translation.html index 585fc5a..44a7ad6 100644 --- a/docs/interfaces/Translation.html +++ b/docs/interfaces/Translation.html @@ -1,10 +1,10 @@ Translation | predictionguard

    Interface Translation

    Translation represents an object that contains a translation choice.

    -
    interface Translation {
        model: string;
        score: number;
        status: string;
        translation: string;
    }

    Properties

    interface Translation {
        model: string;
        score: number;
        status: string;
        translation: string;
    }

    Properties

    model: string

    model represents the model that was used for this translation.

    -
    score: number

    score represents the quality score for this translation.

    -
    status: string

    status represents the status of using the model for this translation.

    -
    translation: string

    translation represents the translation.

    -
    \ No newline at end of file +
    score: number

    score represents the quality score for this translation.

    +
    status: string

    status represents the status of using the model for this translation.

    +
    translation: string

    translation represents the translation.

    +
    \ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html index 6fc8182..af3aa13 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -36,6 +36,9 @@ OutputExtension ReplacePII ReplacePIICheck +Rerank +RerankInput +RerankResult Toxicity ToxicityCheck Translate diff --git a/examples/rerank.js b/examples/rerank.js new file mode 100644 index 0000000..9b06e25 --- /dev/null +++ b/examples/rerank.js @@ -0,0 +1,22 @@ +import * as pg from '../dist/index.js'; + +const client = new pg.Client('https://api.predictionguard.com', process.env.PREDICTIONGUARD_API_KEY); + +async function Rerank() { + const input = { + model: 'bge-reranker-v2-m3', + query: 'What is Deep Learning?', + documents: ['Deep Learning is not pizza.', 'Deep Learning is pizza.'], + returnDocuments: true, + }; + + var [result, err] = await client.Rerank(input); + if (err != null) { + console.log('ERROR:' + err.error); + return; + } + + console.log('RESULT:' + result.results[0].relevance_score); +} + +Rerank(); diff --git a/makefile b/makefile index 4825256..c8dee8c 100644 --- a/makefile +++ b/makefile @@ -256,6 +256,20 @@ curl-replacepi: js-replacepi: compile-ts node --env-file=.env examples/replacepi.js +curl-rerank: + curl -i -X POST https://api.predictionguard.com/rerank \ + -H "Authorization: Bearer SvTs40VBQCaSX6w0P46R61XoTPNF8RNp8875WqCd" \ + -H "Content-Type: application/json" \ + -d '{ \ + "model": "bge-reranker-v2-m3", \ + "query": "What is Deep Learning?", \ + "documents": ["Deep Learning is not pizza.", "Deep Learning is pizza."], \ + "return_documents": true \ + }' + +js-rerank: compile-ts + node --env-file=.env examples/rerank.js + curl-toxicity: curl -X POST https://api.predictionguard.com/toxicity \ -H "Authorization: Bearer ${PREDICTIONGUARD_API_KEY}" \ diff --git a/package-lock.json b/package-lock.json index 1520e1e..899d23c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "predictionguard", - "version": "0.31.0", + "version": "0.32.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "predictionguard", - "version": "0.31.0", + "version": "0.32.0", "license": "Apache 2.0", "dependencies": { "fetch-sse": "^1.0.23", diff --git a/package.json b/package.json index 5de8e07..d9bd762 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "type": "module", "name": "predictionguard", "author": "Prediction Guard", - "version": "0.31.0", + "version": "0.32.0", "license": "Apache 2.0", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/src/api_client.ts b/src/api_client.ts index d51edf9..2fa31c1 100644 --- a/src/api_client.ts +++ b/src/api_client.ts @@ -2,7 +2,7 @@ import fetch from 'node-fetch'; import * as sse from 'fetch-sse'; import * as model from './api_model.js'; -const version = '0.31.0'; +const version = '0.32.0'; /** Client provides access the PredictionGuard API. */ export class Client { @@ -1109,6 +1109,79 @@ export class Client { } } + // ------------------------------------------------------------------------- + // Rerank + + /** Rerank sorts text inputs by semantic relevance to a specified query. + * + * @example + * ``` + * import * as pg from '../dist/index.js'; + * + * const client = new pg.Client('https://api.predictionguard.com', process.env.PREDICTIONGUARD_API_KEY); + * + * async function Rerank() { + * const input = { + * model: 'bge-reranker-v2-m3', + * query: 'What is Deep Learning?', + * documents: ['Deep Learning is not pizza.', 'Deep Learning is pizza.'], + * returnDocuments: true, + * }; + * + * var [result, err] = await client.Rerank(input); + * if (err != null) { + * console.log('ERROR:' + err.error); + * return; + * } + * + * console.log('RESULT:' + result.results[0].relevance_score); + * } + * + * Rerank(); + * ``` + * + * @param {model.RerankInput} input - input represents the entire set of + * possible input for the Rerank call. + * + * @returns - A Promise with a Rerank object and a Error + * object if the error is not null. + * */ + async Rerank(input: model.RerankInput): Promise<[model.Rerank, model.Error | null]> { + const zero: model.Rerank = { + id: '', + object: '', + created: 0, + model: '', + results: [], + createdDate: function () { + return new Date(0); + }, + }; + + try { + const body = { + model: input.model, + query: input.query, + documents: input.documents, + return_documents: input.returnDocuments, + }; + + const [result, err] = await this.RawDoPost('rerank', body); + if (err != null) { + return [zero, err]; + } + + const rerank = result as model.Rerank; + rerank.createdDate = function () { + return new Date(this.created * 1000); + }; + + return [rerank, null]; + } catch (e) { + return [zero, {error: JSON.stringify(e)}]; + } + } + // ------------------------------------------------------------------------- // Toxicity diff --git a/src/api_model.ts b/src/api_model.ts index 77af2b7..e94f7f7 100644 --- a/src/api_model.ts +++ b/src/api_model.ts @@ -620,6 +620,58 @@ export interface ReplacePII { // ----------------------------------------------------------------------------- +/** RerankInput represents the input to generate a rerank. */ +export interface RerankInput { + /** model represents the model to use. */ + model: string; + + /** query represents the content to rank against. */ + query: string; + + /** documents represent the documents to rank. */ + documents: string[]; + + /** returnDocuments determines to return the document in the result. */ + returnDocuments: boolean; +} + +//** RerankResult represents an individual rerank result. */ +export interface RerankResult { + /** index represents the index position in the collection for + * this checks. */ + index: number; + + /** relevance_score is the ranking of the result. */ + relevance_score: number; + + /** text represents the returned document. */ + text: string; +} + +/** Rerank represents an object that contains the result for the rerank call. */ +export interface Rerank { + /** id represents a unique identifier for the result. */ + id: string; + + /** object represent the type of the result document. */ + object: string; + + /** created represents the unix timestamp for when the request was + * received. */ + created: number; + + /** model represents the model that was used. */ + model: string; + + //** results is the set of rankings. */ + results: RerankResult[]; + + /** createdDate converts the created unix timestamp into a JS Date. */ + createdDate(): Date; +} + +// ----------------------------------------------------------------------------- + /** ToxicityCheck represents an object that contains a check choice. */ export interface ToxicityCheck { /** index represents the index position in the collection for diff --git a/test/api_test.js b/test/api_test.js index 1e27cd6..49e014b 100644 --- a/test/api_test.js +++ b/test/api_test.js @@ -109,6 +109,20 @@ describe('Test_Client', () => { }; }); + proxy.forPost('/rerank').thenCallback((request) => { + const auth = request.headers['authorization']; + if (typeof auth == 'undefined' || auth == 'Bearer') { + return { + statusCode: 403, + }; + } + + return { + statusCode: 200, + json: rerankResp, + }; + }); + proxy.forPost('/toxicity').thenCallback((request) => { const auth = request.headers['authorization']; if (typeof auth == 'undefined' || auth == 'Bearer') { @@ -212,6 +226,16 @@ describe('Test_Client', () => { // ------------------------------------------------------------------------- + it('rerank-basic', async () => { + await testRerankBasic(); + }); + + it('rerank-badkey', async () => { + await testRerankBadkey(); + }); + + // ------------------------------------------------------------------------- + it('toxicity-basic', async () => { await testToxicityBasic(); }); @@ -684,6 +708,71 @@ async function testReplacePIIBadkey() { // ============================================================================= +const rerankResp = { + id: 'rerank-67b1cdc7-bd15-4728-9482-d0d36c1b59f2', + object: 'list', + created: 1732232529, + model: 'bge-reranker-v2-m3', + results: [ + { + index: 0, + relevance_score: 0.06512755, + text: 'Deep Learning is not pizza.', + }, + { + index: 1, + relevance_score: 0.05439932, + text: 'Deep Learning is pizza.', + }, + ], +}; + +async function testRerankBasic() { + const client = new pg.Client('http://localhost:8080', 'any key'); + + const input = { + model: 'bge-reranker-v2-m3', + query: 'What is Deep Learning?', + documents: ['Deep Learning is not pizza.', 'Deep Learning is pizza.'], + returnDocuments: true, + }; + + var [result, err] = await client.Rerank(input); + if (err != null) { + assert.fail('ERROR:' + err.error); + } + + const got = JSON.stringify(result); + const exp = JSON.stringify(rerankResp); + + assert.equal(got, exp); +} + +async function testRerankBadkey() { + const client = new pg.Client('http://localhost:8080', ''); + + const input = { + model: 'bge-reranker-v2-m3', + query: 'What is Deep Learning?', + documents: ['Deep Learning is not pizza.', 'Deep Learning is pizza.'], + returnDocuments: true, + }; + + var [, err] = await client.Rerank(input); + if (err == null) { + assert.fail("didn't get an error"); + } + + const got = JSON.stringify(err); + const exp = JSON.stringify({ + error: 'api understands the request but refuses to authorize it', + }); + + assert.equal(got, exp); +} + +// ============================================================================= + const toxicityResp = { id: 'toxi-vRvkxJHmAiSh3NvuuSc48HQ669g7y', object: 'toxicity.check',