diff --git a/package.json b/package.json index 3fb2f93c..e8317a93 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,11 @@ }, "dependencies": { "@adobe/css-tools": "4.3.1", + "@aws-crypto/sha256-js": "^5.1.0", "@dqbd/tiktoken": "^1.0.7", "@mlc-ai/web-tokenizers": "^0.1.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/signature-v4": "^2.0.11", "@tauri-apps/api": "1.4.0", "@types/marked": "^5.0.1", "@xenova/transformers": "^2.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 45941a1f..8a0a93d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,21 @@ dependencies: '@adobe/css-tools': specifier: 4.3.1 version: 4.3.1 + '@aws-crypto/sha256-js': + specifier: ^5.1.0 + version: 5.1.0 '@dqbd/tiktoken': specifier: ^1.0.7 version: 1.0.7 '@mlc-ai/web-tokenizers': specifier: ^0.1.0 version: 0.1.0 + '@smithy/protocol-http': + specifier: ^3.0.7 + version: 3.0.7 + '@smithy/signature-v4': + specifier: ^2.0.11 + version: 2.0.11 '@tauri-apps/api': specifier: 1.4.0 version: 1.4.0 @@ -236,6 +245,53 @@ packages: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 + /@aws-crypto/crc32@3.0.0: + resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.425.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-js@5.1.0: + resolution: {integrity: sha512-VeDxEzCJZUNikoRD7DMFZj/aITgt2VL8tf37nEJqFjUf6DU202Vf3u07W5Ip8lVDs2Pdqg2AbdoWPyjtmHU8nw==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-crypto/util': 5.1.0 + '@aws-sdk/types': 3.425.0 + tslib: 2.6.2 + dev: false + + /@aws-crypto/util@3.0.0: + resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} + dependencies: + '@aws-sdk/types': 3.425.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/util@5.1.0: + resolution: {integrity: sha512-TRSydv/0a4RTZYnCmbpx1F6fOfVlTostBFvLr9GCGPww2WhuIgMg5ZmWN35Wi/Cy6HuvZf82wfUN1F9gQkJ1mQ==} + dependencies: + '@aws-sdk/types': 3.425.0 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/types@3.425.0: + resolution: {integrity: sha512-6lqbmorwerN4v+J5dqbHPAsjynI0mkEF+blf+69QTaKKGaxBBVaXgqoqul9RXYcK5MMrrYRbQIMd0zYOoy90kA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.0 + dev: false + + /@aws-sdk/util-utf8-browser@3.259.0: + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + dependencies: + tslib: 2.6.0 + dev: false + /@dqbd/tiktoken@1.0.7: resolution: {integrity: sha512-bhR5k5W+8GLzysjk8zTMVygQZsgvf7W1F0IlL4ZQ5ugjo5rCyiwGM5d8DYriXspytfu98tv59niang3/T+FoDw==} dev: false @@ -598,6 +654,89 @@ packages: rollup: 3.26.3 dev: true + /@smithy/eventstream-codec@2.0.11: + resolution: {integrity: sha512-BQCTjxhCYRZIfXapa2LmZSaH8QUBGwMZw7XRN83hrdixbLjIcj+o549zjkedFS07Ve2TlvWUI6BTzP+nv7snBA==} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@smithy/types': 2.3.5 + '@smithy/util-hex-encoding': 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/is-array-buffer@2.0.0: + resolution: {integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/protocol-http@3.0.7: + resolution: {integrity: sha512-HnZW8y+r66ntYueCDbLqKwWcMNWW8o3eVpSrHNluwtBJ/EUWfQHRKSiu6vZZtc6PGfPQWgVfucoCE/C3QufMAA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.0 + dev: false + + /@smithy/signature-v4@2.0.11: + resolution: {integrity: sha512-EFVU1dT+2s8xi227l1A9O27edT/GNKvyAK6lZnIZ0zhIHq/jSLznvkk15aonGAM1kmhmZBVGpI7Tt0odueZK9A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-codec': 2.0.11 + '@smithy/is-array-buffer': 2.0.0 + '@smithy/types': 2.3.5 + '@smithy/util-hex-encoding': 2.0.0 + '@smithy/util-middleware': 2.0.4 + '@smithy/util-uri-escape': 2.0.0 + '@smithy/util-utf8': 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/types@2.3.5: + resolution: {integrity: sha512-ehyDt8M9hehyxrLQGoA1BGPou8Js1Ocoh5M0ngDhJMqbFmNK5N6Xhr9/ZExWkyIW8XcGkiMPq3ZUEE0ScrhbuQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/util-buffer-from@2.0.0: + resolution: {integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/is-array-buffer': 2.0.0 + tslib: 2.6.0 + dev: false + + /@smithy/util-hex-encoding@2.0.0: + resolution: {integrity: sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/util-middleware@2.0.4: + resolution: {integrity: sha512-Pbu6P4MBwRcjrLgdTR1O4Y3c0sTZn2JdOiJNcgL7EcIStcQodj+6ZTXtbyU/WTEU3MV2NMA10LxFc3AWHZ3+4A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.3.5 + tslib: 2.6.0 + dev: false + + /@smithy/util-uri-escape@2.0.0: + resolution: {integrity: sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.0 + dev: false + + /@smithy/util-utf8@2.0.0: + resolution: {integrity: sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.0.0 + tslib: 2.6.0 + dev: false + /@sveltejs/vite-plugin-svelte-inspector@1.0.3(@sveltejs/vite-plugin-svelte@2.4.2)(svelte@4.1.0)(vite@4.4.5): resolution: {integrity: sha512-Khdl5jmmPN6SUsVuqSXatKpQTMIifoQPDanaxC84m9JxIibWvSABJyHpyys0Z+1yYrxY5TTEQm+6elh0XCMaOA==} engines: {node: ^14.18.0 || >= 16} @@ -3300,9 +3439,16 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false + /tslib@2.6.0: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} - dev: true + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} diff --git a/src/ts/process/request.ts b/src/ts/process/request.ts index 7fd933bd..bc06942d 100644 --- a/src/ts/process/request.ts +++ b/src/ts/process/request.ts @@ -12,6 +12,11 @@ import { NovelAIBadWordIds, stringlizeNAIChat } from "./models/nai"; import { tokenizeNum } from "../tokenizer"; import { runLocalModel } from "./models/local"; import { risuChatParser } from "../parser"; +import { SignatureV4 } from "@smithy/signature-v4"; +import { HttpRequest } from "@smithy/protocol-http"; +import { Sha256 } from "@aws-crypto/sha256-js"; + + interface requestDataArgument{ formated: OpenAIChat[] @@ -901,6 +906,90 @@ export async function requestChatDataMain(arg:requestDataArgument, model:'model' return prefix + v.content }).join('') + '\n\nAssistant: ' + + //claude bedrock + + //placeholders + const bedrock = false + const region = '' + + const AMZ_HOST = "invoke-bedrock.%REGION%.amazonaws.com"; + const host = AMZ_HOST.replace("%REGION%", region); + + function getCredentialParts(key:string) { + const [accessKeyId, secretAccessKey, region] = key.split(":"); + + if (!accessKeyId || !secretAccessKey || !region) { + throw new Error("The key assigned to this request is invalid."); + } + + return { accessKeyId, secretAccessKey, region }; + } + + + if(bedrock){ + const stream = false + const url = `https://${host}/model/${model}/invoke${stream ? "-with-response-stream" : ""}` + const params = { + prompt : "\n\nHuman: " + requestPrompt, + model: raiModel, + max_tokens_to_sample: maxTokens, + stop_sequences: ["\n\nHuman:", "\n\nSystem:", "\n\nAssistant:"], + temperature: temperature, + } + const rq = new HttpRequest({ + method: "POST", + protocol: "https:", + hostname: host, + path: `/model/${model}/invoke${stream ? "-with-response-stream" : ""}`, + headers: { + ["Host"]: host, + ["content-type"]: "application/json", + ["accept"]: "*/*", + "anthropic-version": "2023-06-01", + }, + body: JSON.stringify(params), + }); + + + const { accessKeyId, secretAccessKey, region } = getCredentialParts(apiKey); + const signer = new SignatureV4({ + sha256: Sha256, + credentials: { accessKeyId, secretAccessKey }, + region, + service: "bedrock", + }); + + const signed = await signer.sign(rq); + + const da = await globalFetch(`${signed.protocol}//${signed.hostname}`, { + method: "POST", + body: params, + headers: { + ["Host"]: host, + ["content-type"]: "application/json", + ["accept"]: "*/*", + "anthropic-version": "2023-06-01", + }, + useRisuToken: true + }) + + + if((!da.ok) || (da.data.error)){ + return { + type: 'fail', + result: `${JSON.stringify(da.data)}` + } + } + + const res = da.data + + return { + type: "success", + result: res.completion, + } + } + const da = await globalFetch(replacerURL, { method: "POST", body: {