Spaces:
Running
Running
Liam Dyer
commited on
Anthropic Endpoint Support (#923)
Browse files- .env +1 -0
- README.md +45 -0
- package-lock.json +30 -24
- package.json +1 -0
- src/lib/server/endpoints/anthropic/endpointAnthropic.ts +95 -0
- src/lib/server/endpoints/endpoints.ts +6 -0
- src/lib/server/models.ts +2 -0
.env
CHANGED
|
@@ -9,6 +9,7 @@ COOKIE_NAME=hf-chat
|
|
| 9 |
HF_TOKEN=#hf_<token> from from https://huggingface.co/settings/token
|
| 10 |
HF_API_ROOT=https://api-inference.huggingface.co/models
|
| 11 |
OPENAI_API_KEY=#your openai api key here
|
|
|
|
| 12 |
|
| 13 |
HF_ACCESS_TOKEN=#LEGACY! Use HF_TOKEN instead
|
| 14 |
|
|
|
|
| 9 |
HF_TOKEN=#hf_<token> from from https://huggingface.co/settings/token
|
| 10 |
HF_API_ROOT=https://api-inference.huggingface.co/models
|
| 11 |
OPENAI_API_KEY=#your openai api key here
|
| 12 |
+
ANTHROPIC_API_KEY=#your anthropic api key here
|
| 13 |
|
| 14 |
HF_ACCESS_TOKEN=#LEGACY! Use HF_TOKEN instead
|
| 15 |
|
README.md
CHANGED
|
@@ -459,6 +459,51 @@ MODELS=`[
|
|
| 459 |
]`
|
| 460 |
```
|
| 461 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 462 |
#### Amazon
|
| 463 |
|
| 464 |
You can also specify your Amazon SageMaker instance as an endpoint for chat-ui. The config goes like this:
|
|
|
|
| 459 |
]`
|
| 460 |
```
|
| 461 |
|
| 462 |
+
#### Anthropic
|
| 463 |
+
|
| 464 |
+
We also support Anthropic models through the official SDK. You may provide your API key via the `ANTHROPIC_API_KEY` env variable, or alternatively, through the `endpoints.apiKey` as per the following example.
|
| 465 |
+
|
| 466 |
+
```
|
| 467 |
+
MODELS=`[
|
| 468 |
+
{
|
| 469 |
+
"name": "claude-3-sonnet-20240229",
|
| 470 |
+
"displayName": "Claude 3 Sonnet",
|
| 471 |
+
"description": "Ideal balance of intelligence and speed",
|
| 472 |
+
"parameters": {
|
| 473 |
+
"max_new_tokens": 4096,
|
| 474 |
+
},
|
| 475 |
+
"endpoints": [
|
| 476 |
+
{
|
| 477 |
+
"type": "anthropic",
|
| 478 |
+
// optionals
|
| 479 |
+
"apiKey": "sk-ant-...",
|
| 480 |
+
"baseURL": "https://api.anthropic.com",
|
| 481 |
+
defaultHeaders: {},
|
| 482 |
+
defaultQuery: {}
|
| 483 |
+
}
|
| 484 |
+
]
|
| 485 |
+
},
|
| 486 |
+
{
|
| 487 |
+
"name": "claude-3-opus-20240229",
|
| 488 |
+
"displayName": "Claude 3 Opus",
|
| 489 |
+
"description": "Most powerful model for highly complex tasks",
|
| 490 |
+
"parameters": {
|
| 491 |
+
"max_new_tokens": 4096
|
| 492 |
+
},
|
| 493 |
+
"endpoints": [
|
| 494 |
+
{
|
| 495 |
+
"type": "anthropic",
|
| 496 |
+
// optionals
|
| 497 |
+
"apiKey": "sk-ant-...",
|
| 498 |
+
"baseURL": "https://api.anthropic.com",
|
| 499 |
+
defaultHeaders: {},
|
| 500 |
+
defaultQuery: {}
|
| 501 |
+
}
|
| 502 |
+
]
|
| 503 |
+
}
|
| 504 |
+
]`
|
| 505 |
+
```
|
| 506 |
+
|
| 507 |
#### Amazon
|
| 508 |
|
| 509 |
You can also specify your Amazon SageMaker instance as an endpoint for chat-ui. The config goes like this:
|
package-lock.json
CHANGED
|
@@ -8,6 +8,7 @@
|
|
| 8 |
"name": "chat-ui",
|
| 9 |
"version": "0.7.0",
|
| 10 |
"dependencies": {
|
|
|
|
| 11 |
"@huggingface/hub": "^0.5.1",
|
| 12 |
"@huggingface/inference": "^2.6.3",
|
| 13 |
"@iconify-json/bi": "^1.1.21",
|
|
@@ -122,6 +123,30 @@
|
|
| 122 |
"url": "https://github.com/sponsors/antfu"
|
| 123 |
}
|
| 124 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 125 |
"node_modules/@cspotcode/source-map-support": {
|
| 126 |
"version": "0.8.1",
|
| 127 |
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
|
|
@@ -2013,7 +2038,6 @@
|
|
| 2013 |
"version": "2.6.5",
|
| 2014 |
"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.5.tgz",
|
| 2015 |
"integrity": "sha512-OZsUlr2nxvkqUFLSaY2ZbA+P1q22q+KrlxWOn/38RX+u5kTkYL2mTujEpzUhGkS+K/QCYp9oagfXG39XOzyySg==",
|
| 2016 |
-
"optional": true,
|
| 2017 |
"dependencies": {
|
| 2018 |
"@types/node": "*",
|
| 2019 |
"form-data": "^4.0.0"
|
|
@@ -2409,7 +2433,6 @@
|
|
| 2409 |
"version": "3.0.0",
|
| 2410 |
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
|
| 2411 |
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
|
| 2412 |
-
"optional": true,
|
| 2413 |
"dependencies": {
|
| 2414 |
"event-target-shim": "^5.0.0"
|
| 2415 |
},
|
|
@@ -2462,7 +2485,6 @@
|
|
| 2462 |
"version": "4.5.0",
|
| 2463 |
"resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz",
|
| 2464 |
"integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==",
|
| 2465 |
-
"optional": true,
|
| 2466 |
"dependencies": {
|
| 2467 |
"humanize-ms": "^1.2.1"
|
| 2468 |
},
|
|
@@ -2630,8 +2652,7 @@
|
|
| 2630 |
"node_modules/base-64": {
|
| 2631 |
"version": "0.1.0",
|
| 2632 |
"resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz",
|
| 2633 |
-
"integrity": "sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA=="
|
| 2634 |
-
"optional": true
|
| 2635 |
},
|
| 2636 |
"node_modules/base64-js": {
|
| 2637 |
"version": "1.5.1",
|
|
@@ -2899,7 +2920,6 @@
|
|
| 2899 |
"version": "0.0.2",
|
| 2900 |
"resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
|
| 2901 |
"integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
|
| 2902 |
-
"optional": true,
|
| 2903 |
"engines": {
|
| 2904 |
"node": "*"
|
| 2905 |
}
|
|
@@ -3096,7 +3116,6 @@
|
|
| 3096 |
"version": "0.0.2",
|
| 3097 |
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
|
| 3098 |
"integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
|
| 3099 |
-
"optional": true,
|
| 3100 |
"engines": {
|
| 3101 |
"node": "*"
|
| 3102 |
}
|
|
@@ -3352,7 +3371,6 @@
|
|
| 3352 |
"version": "1.3.0",
|
| 3353 |
"resolved": "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz",
|
| 3354 |
"integrity": "sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==",
|
| 3355 |
-
"optional": true,
|
| 3356 |
"dependencies": {
|
| 3357 |
"base-64": "^0.1.0",
|
| 3358 |
"md5": "^2.3.0"
|
|
@@ -3724,7 +3742,6 @@
|
|
| 3724 |
"version": "5.0.1",
|
| 3725 |
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
|
| 3726 |
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
|
| 3727 |
-
"optional": true,
|
| 3728 |
"engines": {
|
| 3729 |
"node": ">=6"
|
| 3730 |
}
|
|
@@ -3907,14 +3924,12 @@
|
|
| 3907 |
"node_modules/form-data-encoder": {
|
| 3908 |
"version": "1.7.2",
|
| 3909 |
"resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz",
|
| 3910 |
-
"integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="
|
| 3911 |
-
"optional": true
|
| 3912 |
},
|
| 3913 |
"node_modules/formdata-node": {
|
| 3914 |
"version": "4.4.1",
|
| 3915 |
"resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz",
|
| 3916 |
"integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==",
|
| 3917 |
-
"optional": true,
|
| 3918 |
"dependencies": {
|
| 3919 |
"node-domexception": "1.0.0",
|
| 3920 |
"web-streams-polyfill": "4.0.0-beta.3"
|
|
@@ -4206,7 +4221,6 @@
|
|
| 4206 |
"version": "1.2.1",
|
| 4207 |
"resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
|
| 4208 |
"integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
|
| 4209 |
-
"optional": true,
|
| 4210 |
"dependencies": {
|
| 4211 |
"ms": "^2.0.0"
|
| 4212 |
}
|
|
@@ -4344,8 +4358,7 @@
|
|
| 4344 |
"node_modules/is-buffer": {
|
| 4345 |
"version": "1.1.6",
|
| 4346 |
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
| 4347 |
-
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
| 4348 |
-
"optional": true
|
| 4349 |
},
|
| 4350 |
"node_modules/is-builtin-module": {
|
| 4351 |
"version": "3.2.1",
|
|
@@ -4819,7 +4832,6 @@
|
|
| 4819 |
"version": "2.3.0",
|
| 4820 |
"resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
|
| 4821 |
"integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
|
| 4822 |
-
"optional": true,
|
| 4823 |
"dependencies": {
|
| 4824 |
"charenc": "0.0.2",
|
| 4825 |
"crypt": "0.0.2",
|
|
@@ -5116,7 +5128,6 @@
|
|
| 5116 |
"url": "https://paypal.me/jimmywarting"
|
| 5117 |
}
|
| 5118 |
],
|
| 5119 |
-
"optional": true,
|
| 5120 |
"engines": {
|
| 5121 |
"node": ">=10.5.0"
|
| 5122 |
}
|
|
@@ -5125,7 +5136,6 @@
|
|
| 5125 |
"version": "2.7.0",
|
| 5126 |
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
|
| 5127 |
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
|
| 5128 |
-
"optional": true,
|
| 5129 |
"dependencies": {
|
| 5130 |
"whatwg-url": "^5.0.0"
|
| 5131 |
},
|
|
@@ -5144,20 +5154,17 @@
|
|
| 5144 |
"node_modules/node-fetch/node_modules/tr46": {
|
| 5145 |
"version": "0.0.3",
|
| 5146 |
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
| 5147 |
-
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
|
| 5148 |
-
"optional": true
|
| 5149 |
},
|
| 5150 |
"node_modules/node-fetch/node_modules/webidl-conversions": {
|
| 5151 |
"version": "3.0.1",
|
| 5152 |
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
| 5153 |
-
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
|
| 5154 |
-
"optional": true
|
| 5155 |
},
|
| 5156 |
"node_modules/node-fetch/node_modules/whatwg-url": {
|
| 5157 |
"version": "5.0.0",
|
| 5158 |
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
| 5159 |
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
| 5160 |
-
"optional": true,
|
| 5161 |
"dependencies": {
|
| 5162 |
"tr46": "~0.0.3",
|
| 5163 |
"webidl-conversions": "^3.0.0"
|
|
@@ -8176,7 +8183,6 @@
|
|
| 8176 |
"version": "4.0.0-beta.3",
|
| 8177 |
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
|
| 8178 |
"integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==",
|
| 8179 |
-
"optional": true,
|
| 8180 |
"engines": {
|
| 8181 |
"node": ">= 14"
|
| 8182 |
}
|
|
|
|
| 8 |
"name": "chat-ui",
|
| 9 |
"version": "0.7.0",
|
| 10 |
"dependencies": {
|
| 11 |
+
"@anthropic-ai/sdk": "^0.17.1",
|
| 12 |
"@huggingface/hub": "^0.5.1",
|
| 13 |
"@huggingface/inference": "^2.6.3",
|
| 14 |
"@iconify-json/bi": "^1.1.21",
|
|
|
|
| 123 |
"url": "https://github.com/sponsors/antfu"
|
| 124 |
}
|
| 125 |
},
|
| 126 |
+
"node_modules/@anthropic-ai/sdk": {
|
| 127 |
+
"version": "0.17.1",
|
| 128 |
+
"resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.17.1.tgz",
|
| 129 |
+
"integrity": "sha512-ke/JGfaa4sc1PB58L4B9hXI/BlJphXc696+cVX8Z8gQt51l++a9umZTN/7UymV8Dcat6KKYNQE8P8yeeyAldHg==",
|
| 130 |
+
"dependencies": {
|
| 131 |
+
"@types/node": "^18.11.18",
|
| 132 |
+
"@types/node-fetch": "^2.6.4",
|
| 133 |
+
"abort-controller": "^3.0.0",
|
| 134 |
+
"agentkeepalive": "^4.2.1",
|
| 135 |
+
"digest-fetch": "^1.3.0",
|
| 136 |
+
"form-data-encoder": "1.7.2",
|
| 137 |
+
"formdata-node": "^4.3.2",
|
| 138 |
+
"node-fetch": "^2.6.7",
|
| 139 |
+
"web-streams-polyfill": "^3.2.1"
|
| 140 |
+
}
|
| 141 |
+
},
|
| 142 |
+
"node_modules/@anthropic-ai/sdk/node_modules/web-streams-polyfill": {
|
| 143 |
+
"version": "3.3.3",
|
| 144 |
+
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
|
| 145 |
+
"integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
|
| 146 |
+
"engines": {
|
| 147 |
+
"node": ">= 8"
|
| 148 |
+
}
|
| 149 |
+
},
|
| 150 |
"node_modules/@cspotcode/source-map-support": {
|
| 151 |
"version": "0.8.1",
|
| 152 |
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
|
|
|
|
| 2038 |
"version": "2.6.5",
|
| 2039 |
"resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.5.tgz",
|
| 2040 |
"integrity": "sha512-OZsUlr2nxvkqUFLSaY2ZbA+P1q22q+KrlxWOn/38RX+u5kTkYL2mTujEpzUhGkS+K/QCYp9oagfXG39XOzyySg==",
|
|
|
|
| 2041 |
"dependencies": {
|
| 2042 |
"@types/node": "*",
|
| 2043 |
"form-data": "^4.0.0"
|
|
|
|
| 2433 |
"version": "3.0.0",
|
| 2434 |
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
|
| 2435 |
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
|
|
|
|
| 2436 |
"dependencies": {
|
| 2437 |
"event-target-shim": "^5.0.0"
|
| 2438 |
},
|
|
|
|
| 2485 |
"version": "4.5.0",
|
| 2486 |
"resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz",
|
| 2487 |
"integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==",
|
|
|
|
| 2488 |
"dependencies": {
|
| 2489 |
"humanize-ms": "^1.2.1"
|
| 2490 |
},
|
|
|
|
| 2652 |
"node_modules/base-64": {
|
| 2653 |
"version": "0.1.0",
|
| 2654 |
"resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz",
|
| 2655 |
+
"integrity": "sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA=="
|
|
|
|
| 2656 |
},
|
| 2657 |
"node_modules/base64-js": {
|
| 2658 |
"version": "1.5.1",
|
|
|
|
| 2920 |
"version": "0.0.2",
|
| 2921 |
"resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
|
| 2922 |
"integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
|
|
|
|
| 2923 |
"engines": {
|
| 2924 |
"node": "*"
|
| 2925 |
}
|
|
|
|
| 3116 |
"version": "0.0.2",
|
| 3117 |
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
|
| 3118 |
"integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
|
|
|
|
| 3119 |
"engines": {
|
| 3120 |
"node": "*"
|
| 3121 |
}
|
|
|
|
| 3371 |
"version": "1.3.0",
|
| 3372 |
"resolved": "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz",
|
| 3373 |
"integrity": "sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==",
|
|
|
|
| 3374 |
"dependencies": {
|
| 3375 |
"base-64": "^0.1.0",
|
| 3376 |
"md5": "^2.3.0"
|
|
|
|
| 3742 |
"version": "5.0.1",
|
| 3743 |
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
|
| 3744 |
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
|
|
|
|
| 3745 |
"engines": {
|
| 3746 |
"node": ">=6"
|
| 3747 |
}
|
|
|
|
| 3924 |
"node_modules/form-data-encoder": {
|
| 3925 |
"version": "1.7.2",
|
| 3926 |
"resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz",
|
| 3927 |
+
"integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="
|
|
|
|
| 3928 |
},
|
| 3929 |
"node_modules/formdata-node": {
|
| 3930 |
"version": "4.4.1",
|
| 3931 |
"resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz",
|
| 3932 |
"integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==",
|
|
|
|
| 3933 |
"dependencies": {
|
| 3934 |
"node-domexception": "1.0.0",
|
| 3935 |
"web-streams-polyfill": "4.0.0-beta.3"
|
|
|
|
| 4221 |
"version": "1.2.1",
|
| 4222 |
"resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
|
| 4223 |
"integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
|
|
|
|
| 4224 |
"dependencies": {
|
| 4225 |
"ms": "^2.0.0"
|
| 4226 |
}
|
|
|
|
| 4358 |
"node_modules/is-buffer": {
|
| 4359 |
"version": "1.1.6",
|
| 4360 |
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
| 4361 |
+
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
|
|
|
| 4362 |
},
|
| 4363 |
"node_modules/is-builtin-module": {
|
| 4364 |
"version": "3.2.1",
|
|
|
|
| 4832 |
"version": "2.3.0",
|
| 4833 |
"resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
|
| 4834 |
"integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
|
|
|
|
| 4835 |
"dependencies": {
|
| 4836 |
"charenc": "0.0.2",
|
| 4837 |
"crypt": "0.0.2",
|
|
|
|
| 5128 |
"url": "https://paypal.me/jimmywarting"
|
| 5129 |
}
|
| 5130 |
],
|
|
|
|
| 5131 |
"engines": {
|
| 5132 |
"node": ">=10.5.0"
|
| 5133 |
}
|
|
|
|
| 5136 |
"version": "2.7.0",
|
| 5137 |
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
|
| 5138 |
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
|
|
|
|
| 5139 |
"dependencies": {
|
| 5140 |
"whatwg-url": "^5.0.0"
|
| 5141 |
},
|
|
|
|
| 5154 |
"node_modules/node-fetch/node_modules/tr46": {
|
| 5155 |
"version": "0.0.3",
|
| 5156 |
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
| 5157 |
+
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
|
|
|
|
| 5158 |
},
|
| 5159 |
"node_modules/node-fetch/node_modules/webidl-conversions": {
|
| 5160 |
"version": "3.0.1",
|
| 5161 |
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
| 5162 |
+
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
|
|
|
|
| 5163 |
},
|
| 5164 |
"node_modules/node-fetch/node_modules/whatwg-url": {
|
| 5165 |
"version": "5.0.0",
|
| 5166 |
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
| 5167 |
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
|
|
|
| 5168 |
"dependencies": {
|
| 5169 |
"tr46": "~0.0.3",
|
| 5170 |
"webidl-conversions": "^3.0.0"
|
|
|
|
| 8183 |
"version": "4.0.0-beta.3",
|
| 8184 |
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz",
|
| 8185 |
"integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==",
|
|
|
|
| 8186 |
"engines": {
|
| 8187 |
"node": ">= 14"
|
| 8188 |
}
|
package.json
CHANGED
|
@@ -82,6 +82,7 @@
|
|
| 82 |
"zod": "^3.22.3"
|
| 83 |
},
|
| 84 |
"optionalDependencies": {
|
|
|
|
| 85 |
"aws4fetch": "^1.0.17",
|
| 86 |
"openai": "^4.14.2"
|
| 87 |
}
|
|
|
|
| 82 |
"zod": "^3.22.3"
|
| 83 |
},
|
| 84 |
"optionalDependencies": {
|
| 85 |
+
"@anthropic-ai/sdk": "^0.17.1",
|
| 86 |
"aws4fetch": "^1.0.17",
|
| 87 |
"openai": "^4.14.2"
|
| 88 |
}
|
src/lib/server/endpoints/anthropic/endpointAnthropic.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { z } from "zod";
|
| 2 |
+
import { ANTHROPIC_API_KEY } from "$env/static/private";
|
| 3 |
+
import type { Endpoint } from "../endpoints";
|
| 4 |
+
import type { TextGenerationStreamOutput } from "@huggingface/inference";
|
| 5 |
+
|
| 6 |
+
export const endpointAnthropicParametersSchema = z.object({
|
| 7 |
+
weight: z.number().int().positive().default(1),
|
| 8 |
+
model: z.any(),
|
| 9 |
+
type: z.literal("anthropic"),
|
| 10 |
+
baseURL: z.string().url().default("https://api.anthropic.com"),
|
| 11 |
+
apiKey: z.string().default(ANTHROPIC_API_KEY ?? "sk-"),
|
| 12 |
+
defaultHeaders: z.record(z.string()).optional(),
|
| 13 |
+
defaultQuery: z.record(z.string()).optional(),
|
| 14 |
+
});
|
| 15 |
+
|
| 16 |
+
export async function endpointAnthropic(
|
| 17 |
+
input: z.input<typeof endpointAnthropicParametersSchema>
|
| 18 |
+
): Promise<Endpoint> {
|
| 19 |
+
const { baseURL, apiKey, model, defaultHeaders, defaultQuery } =
|
| 20 |
+
endpointAnthropicParametersSchema.parse(input);
|
| 21 |
+
let Anthropic;
|
| 22 |
+
try {
|
| 23 |
+
Anthropic = (await import("@anthropic-ai/sdk")).default;
|
| 24 |
+
} catch (e) {
|
| 25 |
+
throw new Error("Failed to import @anthropic-ai/sdk", { cause: e });
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
const anthropic = new Anthropic({
|
| 29 |
+
apiKey,
|
| 30 |
+
baseURL,
|
| 31 |
+
defaultHeaders,
|
| 32 |
+
defaultQuery,
|
| 33 |
+
});
|
| 34 |
+
|
| 35 |
+
return async ({ messages, preprompt }) => {
|
| 36 |
+
let system = preprompt;
|
| 37 |
+
if (messages?.[0]?.from === "system") {
|
| 38 |
+
system = messages[0].content;
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
const messagesFormatted = messages
|
| 42 |
+
.filter((message) => message.from !== "system")
|
| 43 |
+
.map((message) => ({
|
| 44 |
+
role: message.from,
|
| 45 |
+
content: message.content,
|
| 46 |
+
})) as unknown as {
|
| 47 |
+
role: "user" | "assistant";
|
| 48 |
+
content: string;
|
| 49 |
+
}[];
|
| 50 |
+
|
| 51 |
+
let tokenId = 0;
|
| 52 |
+
return (async function* () {
|
| 53 |
+
const stream = anthropic.messages.stream({
|
| 54 |
+
model: model.id ?? model.name,
|
| 55 |
+
messages: messagesFormatted,
|
| 56 |
+
max_tokens: model.parameters?.max_new_tokens,
|
| 57 |
+
temperature: model.parameters?.temperature,
|
| 58 |
+
top_p: model.parameters?.top_p,
|
| 59 |
+
top_k: model.parameters?.top_k,
|
| 60 |
+
stop_sequences: model.parameters?.stop,
|
| 61 |
+
system,
|
| 62 |
+
});
|
| 63 |
+
while (true) {
|
| 64 |
+
const result = await Promise.race([stream.emitted("text"), stream.emitted("end")]);
|
| 65 |
+
|
| 66 |
+
// Stream end
|
| 67 |
+
if (result === undefined) {
|
| 68 |
+
yield {
|
| 69 |
+
token: {
|
| 70 |
+
id: tokenId++,
|
| 71 |
+
text: "",
|
| 72 |
+
logprob: 0,
|
| 73 |
+
special: true,
|
| 74 |
+
},
|
| 75 |
+
generated_text: await stream.finalText(),
|
| 76 |
+
details: null,
|
| 77 |
+
} satisfies TextGenerationStreamOutput;
|
| 78 |
+
return;
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
// Text delta
|
| 82 |
+
yield {
|
| 83 |
+
token: {
|
| 84 |
+
id: tokenId++,
|
| 85 |
+
text: result as unknown as string,
|
| 86 |
+
special: false,
|
| 87 |
+
logprob: 0,
|
| 88 |
+
},
|
| 89 |
+
generated_text: null,
|
| 90 |
+
details: null,
|
| 91 |
+
} satisfies TextGenerationStreamOutput;
|
| 92 |
+
}
|
| 93 |
+
})();
|
| 94 |
+
};
|
| 95 |
+
}
|
src/lib/server/endpoints/endpoints.ts
CHANGED
|
@@ -6,6 +6,10 @@ import endpointAws, { endpointAwsParametersSchema } from "./aws/endpointAws";
|
|
| 6 |
import { endpointOAIParametersSchema, endpointOai } from "./openai/endpointOai";
|
| 7 |
import endpointLlamacpp, { endpointLlamacppParametersSchema } from "./llamacpp/endpointLlamacpp";
|
| 8 |
import endpointOllama, { endpointOllamaParametersSchema } from "./ollama/endpointOllama";
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
|
| 10 |
// parameters passed when generating text
|
| 11 |
export interface EndpointParameters {
|
|
@@ -28,6 +32,7 @@ export type EndpointGenerator<T extends CommonEndpoint> = (parameters: T) => End
|
|
| 28 |
// list of all endpoint generators
|
| 29 |
export const endpoints = {
|
| 30 |
tgi: endpointTgi,
|
|
|
|
| 31 |
aws: endpointAws,
|
| 32 |
openai: endpointOai,
|
| 33 |
llamacpp: endpointLlamacpp,
|
|
@@ -35,6 +40,7 @@ export const endpoints = {
|
|
| 35 |
};
|
| 36 |
|
| 37 |
export const endpointSchema = z.discriminatedUnion("type", [
|
|
|
|
| 38 |
endpointAwsParametersSchema,
|
| 39 |
endpointOAIParametersSchema,
|
| 40 |
endpointTgiParametersSchema,
|
|
|
|
| 6 |
import { endpointOAIParametersSchema, endpointOai } from "./openai/endpointOai";
|
| 7 |
import endpointLlamacpp, { endpointLlamacppParametersSchema } from "./llamacpp/endpointLlamacpp";
|
| 8 |
import endpointOllama, { endpointOllamaParametersSchema } from "./ollama/endpointOllama";
|
| 9 |
+
import {
|
| 10 |
+
endpointAnthropic,
|
| 11 |
+
endpointAnthropicParametersSchema,
|
| 12 |
+
} from "./anthropic/endpointAnthropic";
|
| 13 |
|
| 14 |
// parameters passed when generating text
|
| 15 |
export interface EndpointParameters {
|
|
|
|
| 32 |
// list of all endpoint generators
|
| 33 |
export const endpoints = {
|
| 34 |
tgi: endpointTgi,
|
| 35 |
+
anthropic: endpointAnthropic,
|
| 36 |
aws: endpointAws,
|
| 37 |
openai: endpointOai,
|
| 38 |
llamacpp: endpointLlamacpp,
|
|
|
|
| 40 |
};
|
| 41 |
|
| 42 |
export const endpointSchema = z.discriminatedUnion("type", [
|
| 43 |
+
endpointAnthropicParametersSchema,
|
| 44 |
endpointAwsParametersSchema,
|
| 45 |
endpointOAIParametersSchema,
|
| 46 |
endpointTgiParametersSchema,
|
src/lib/server/models.ts
CHANGED
|
@@ -109,6 +109,8 @@ const addEndpoint = (m: Awaited<ReturnType<typeof processModel>>) => ({
|
|
| 109 |
switch (args.type) {
|
| 110 |
case "tgi":
|
| 111 |
return endpoints.tgi(args);
|
|
|
|
|
|
|
| 112 |
case "aws":
|
| 113 |
return await endpoints.aws(args);
|
| 114 |
case "openai":
|
|
|
|
| 109 |
switch (args.type) {
|
| 110 |
case "tgi":
|
| 111 |
return endpoints.tgi(args);
|
| 112 |
+
case "anthropic":
|
| 113 |
+
return endpoints.anthropic(args);
|
| 114 |
case "aws":
|
| 115 |
return await endpoints.aws(args);
|
| 116 |
case "openai":
|