librechat-data-provider 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/npm-publish.yml +33 -0
- package/babel.config.js +4 -0
- package/dist/index.es.js +765 -0
- package/dist/index.js +822 -0
- package/jest.config.js +18 -0
- package/package.json +49 -0
- package/rollup.config.js +31 -0
- package/src/api-endpoints.ts +95 -0
- package/src/createPayload.ts +28 -0
- package/src/data-service.ts +119 -0
- package/src/headers-helpers.ts +9 -0
- package/src/index.ts +7 -0
- package/src/react-query-service.ts +362 -0
- package/src/request.ts +55 -0
- package/src/sse.mjs +219 -0
- package/src/types.ts +275 -0
- package/tsconfig.json +27 -0
- package/types/api-endpoints.d.ts +24 -0
- package/types/createPayload.d.ts +20 -0
- package/types/data-service.d.ts +27 -0
- package/types/headers-helpers.d.ts +2 -0
- package/types/index.d.ts +7 -0
- package/types/react-query-service.d.ts +45 -0
- package/types/request.d.ts +18 -0
- package/types/types.d.ts +239 -0
package/jest.config.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}', '!<rootDir>/node_modules/'],
|
|
3
|
+
coveragePathIgnorePatterns: ['/node_modules/', '/dist/'],
|
|
4
|
+
coverageReporters: ['text', 'cobertura'],
|
|
5
|
+
testResultsProcessor: 'jest-junit',
|
|
6
|
+
moduleNameMapper: {
|
|
7
|
+
'^@src/(.*)$': '<rootDir>/src/$1',
|
|
8
|
+
},
|
|
9
|
+
// coverageThreshold: {
|
|
10
|
+
// global: {
|
|
11
|
+
// statements: 58,
|
|
12
|
+
// branches: 49,
|
|
13
|
+
// functions: 50,
|
|
14
|
+
// lines: 57,
|
|
15
|
+
// },
|
|
16
|
+
// },
|
|
17
|
+
restoreMocks: true,
|
|
18
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "librechat-data-provider",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "data services for librechat apps",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.es.js",
|
|
7
|
+
"types": "types/",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"clean": "rimraf dist",
|
|
10
|
+
"build": "npm run clean && rollup -c --silent --bundleConfigAsCjs",
|
|
11
|
+
"build:watch": "rollup -c -w",
|
|
12
|
+
"test": "jest --coverage --watch",
|
|
13
|
+
"test:ci": "jest --coverage --ci",
|
|
14
|
+
"verify": "npm run test:ci"
|
|
15
|
+
},
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/danny-avila/LibreChat.git"
|
|
19
|
+
},
|
|
20
|
+
"author": "",
|
|
21
|
+
"license": "ISC",
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/danny-avila/LibreChat/issues"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/danny-avila/LibreChat#readme",
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@tanstack/react-query": "^4.28.0",
|
|
28
|
+
"axios": "^1.3.4"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@babel/preset-env": "^7.21.5",
|
|
32
|
+
"@babel/preset-react": "^7.18.6",
|
|
33
|
+
"@babel/preset-typescript": "^7.21.0",
|
|
34
|
+
"@rollup/plugin-commonjs": "^25.0.2",
|
|
35
|
+
"@rollup/plugin-node-resolve": "^15.1.0",
|
|
36
|
+
"@tanstack/query-core": "^4.29.19",
|
|
37
|
+
"@types/jest": "^29.5.2",
|
|
38
|
+
"@types/node": "^20.3.0",
|
|
39
|
+
"jest": "^29.5.0",
|
|
40
|
+
"jest-junit": "^16.0.0",
|
|
41
|
+
"rimraf": "^5.0.1",
|
|
42
|
+
"rollup": "^3.26.0",
|
|
43
|
+
"rollup-plugin-typescript2": "^0.35.0",
|
|
44
|
+
"typescript": "^5.0.4"
|
|
45
|
+
},
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"registry": "https://registry.npmjs.org/"
|
|
48
|
+
}
|
|
49
|
+
}
|
package/rollup.config.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import typescript from 'rollup-plugin-typescript2';
|
|
2
|
+
import resolve from '@rollup/plugin-node-resolve';
|
|
3
|
+
import pkg from './package.json';
|
|
4
|
+
|
|
5
|
+
export default [
|
|
6
|
+
{
|
|
7
|
+
input: 'src/index.ts',
|
|
8
|
+
output: [
|
|
9
|
+
{
|
|
10
|
+
file: pkg.main,
|
|
11
|
+
format: 'cjs',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
file: pkg.module,
|
|
15
|
+
format: 'esm',
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
...{
|
|
19
|
+
external: [
|
|
20
|
+
...Object.keys(pkg.dependencies || {}),
|
|
21
|
+
...Object.keys(pkg.devDependencies || {}),
|
|
22
|
+
...Object.keys(pkg.peerDependencies || {}),
|
|
23
|
+
],
|
|
24
|
+
preserveSymlinks: true,
|
|
25
|
+
plugins: [
|
|
26
|
+
resolve(),
|
|
27
|
+
typescript({ useTsconfigDeclarationDir: true, tsconfig: './tsconfig.json' }),
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
];
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export const user = () => {
|
|
2
|
+
return '/api/user';
|
|
3
|
+
};
|
|
4
|
+
|
|
5
|
+
export const userPlugins = () => {
|
|
6
|
+
return '/api/user/plugins';
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const messages = (id: string) => {
|
|
10
|
+
return `/api/messages/${id}`;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const abortRequest = (endpoint: string) => {
|
|
14
|
+
return `/api/ask/${endpoint}/abort`;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const conversations = (pageNumber: string) => {
|
|
18
|
+
return `/api/convos?pageNumber=${pageNumber}`;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const conversationById = (id: string) => {
|
|
22
|
+
return `/api/convos/${id}`;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const updateConversation = () => {
|
|
26
|
+
return '/api/convos/update';
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export const deleteConversation = () => {
|
|
30
|
+
return '/api/convos/clear';
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const search = (q: string, pageNumber: string) => {
|
|
34
|
+
return `/api/search?q=${q}&pageNumber=${pageNumber}`;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export const searchEnabled = () => {
|
|
38
|
+
return '/api/search/enable';
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const presets = () => {
|
|
42
|
+
return '/api/presets';
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const deletePreset = () => {
|
|
46
|
+
return '/api/presets/delete';
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const aiEndpoints = () => {
|
|
50
|
+
return '/api/endpoints';
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export const tokenizer = () => {
|
|
54
|
+
return '/api/tokenizer';
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const login = () => {
|
|
58
|
+
return '/api/auth/login';
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export const logout = () => {
|
|
62
|
+
return '/api/auth/logout';
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export const register = () => {
|
|
66
|
+
return '/api/auth/register';
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const loginFacebook = () => {
|
|
70
|
+
return '/api/auth/facebook';
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const loginGoogle = () => {
|
|
74
|
+
return '/api/auth/google';
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
export const refreshToken = () => {
|
|
78
|
+
return '/api/auth/refresh';
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export const requestPasswordReset = () => {
|
|
82
|
+
return '/api/auth/requestPasswordReset';
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export const resetPassword = () => {
|
|
86
|
+
return '/api/auth/resetPassword';
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export const plugins = () => {
|
|
90
|
+
return '/api/plugins';
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export const config = () => {
|
|
94
|
+
return '/api/config';
|
|
95
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { TConversation, TSubmission, EModelEndpoint } from './types';
|
|
2
|
+
|
|
3
|
+
export default function createPayload(submission: TSubmission) {
|
|
4
|
+
const { conversation, message, endpointOption } = submission;
|
|
5
|
+
const { conversationId } = conversation as TConversation;
|
|
6
|
+
const { endpoint } = endpointOption as { endpoint: EModelEndpoint };
|
|
7
|
+
|
|
8
|
+
const endpointUrlMap = {
|
|
9
|
+
azureOpenAI: '/api/ask/azureOpenAI',
|
|
10
|
+
openAI: '/api/ask/openAI',
|
|
11
|
+
google: '/api/ask/google',
|
|
12
|
+
bingAI: '/api/ask/bingAI',
|
|
13
|
+
chatGPT: '/api/ask/chatGPT',
|
|
14
|
+
chatGPTBrowser: '/api/ask/chatGPTBrowser',
|
|
15
|
+
gptPlugins: '/api/ask/gptPlugins',
|
|
16
|
+
anthropic: '/api/ask/anthropic',
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const server = endpointUrlMap[endpoint];
|
|
20
|
+
|
|
21
|
+
const payload = {
|
|
22
|
+
...message,
|
|
23
|
+
...endpointOption,
|
|
24
|
+
conversationId,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
return { server, payload };
|
|
28
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import * as t from './types';
|
|
2
|
+
import request from './request';
|
|
3
|
+
import * as endpoints from './api-endpoints';
|
|
4
|
+
|
|
5
|
+
export function getConversations(pageNumber: string): Promise<t.TGetConversationsResponse> {
|
|
6
|
+
return request.get(endpoints.conversations(pageNumber));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function abortRequestWithMessage(
|
|
10
|
+
endpoint: string,
|
|
11
|
+
abortKey: string,
|
|
12
|
+
message: string,
|
|
13
|
+
): Promise<void> {
|
|
14
|
+
return request.post(endpoints.abortRequest(endpoint), { arg: { abortKey, message } });
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function deleteConversation(payload: t.TDeleteConversationRequest) {
|
|
18
|
+
//todo: this should be a DELETE request
|
|
19
|
+
return request.post(endpoints.deleteConversation(), { arg: payload });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function clearAllConversations(): Promise<unknown> {
|
|
23
|
+
return request.post(endpoints.deleteConversation(), { arg: {} });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function getMessagesByConvoId(id: string): Promise<t.TMessage[]> {
|
|
27
|
+
return request.get(endpoints.messages(id));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function getConversationById(id: string): Promise<t.TConversation> {
|
|
31
|
+
return request.get(endpoints.conversationById(id));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function updateConversation(
|
|
35
|
+
payload: t.TUpdateConversationRequest,
|
|
36
|
+
): Promise<t.TUpdateConversationResponse> {
|
|
37
|
+
return request.post(endpoints.updateConversation(), { arg: payload });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function getPresets(): Promise<t.TPreset[]> {
|
|
41
|
+
return request.get(endpoints.presets());
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function createPreset(payload: t.TPreset): Promise<t.TPreset[]> {
|
|
45
|
+
return request.post(endpoints.presets(), payload);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function updatePreset(payload: t.TPreset): Promise<t.TPreset[]> {
|
|
49
|
+
return request.post(endpoints.presets(), payload);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function deletePreset(arg: t.TPreset | object): Promise<t.TPreset[]> {
|
|
53
|
+
return request.post(endpoints.deletePreset(), arg);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function getSearchEnabled(): Promise<boolean> {
|
|
57
|
+
return request.get(endpoints.searchEnabled());
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function getUser(): Promise<t.TUser> {
|
|
61
|
+
return request.get(endpoints.user());
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export const searchConversations = async (
|
|
65
|
+
q: string,
|
|
66
|
+
pageNumber: string,
|
|
67
|
+
): Promise<t.TSearchResults> => {
|
|
68
|
+
return request.get(endpoints.search(q, pageNumber));
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export const getAIEndpoints = () => {
|
|
72
|
+
return request.get(endpoints.aiEndpoints());
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export const updateTokenCount = (text: string) => {
|
|
76
|
+
return request.post(endpoints.tokenizer(), { arg: text });
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const login = (payload: t.TLoginUser) => {
|
|
80
|
+
return request.post(endpoints.login(), payload);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const logout = () => {
|
|
84
|
+
return request.post(endpoints.logout());
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const register = (payload: t.TRegisterUser) => {
|
|
88
|
+
return request.post(endpoints.register(), payload);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export const refreshToken = () => {
|
|
92
|
+
return request.post(endpoints.refreshToken());
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export const getLoginGoogle = () => {
|
|
96
|
+
return request.get(endpoints.loginGoogle());
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const requestPasswordReset = (
|
|
100
|
+
payload: t.TRequestPasswordReset,
|
|
101
|
+
): Promise<t.TRequestPasswordResetResponse> => {
|
|
102
|
+
return request.post(endpoints.requestPasswordReset(), payload);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export const resetPassword = (payload: t.TResetPassword) => {
|
|
106
|
+
return request.post(endpoints.resetPassword(), payload);
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
export const getAvailablePlugins = (): Promise<t.TPlugin[]> => {
|
|
110
|
+
return request.get(endpoints.plugins());
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export const updateUserPlugins = (payload: t.TUpdateUserPlugins) => {
|
|
114
|
+
return request.post(endpoints.userPlugins(), payload);
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export const getStartupConfig = (): Promise<t.TStartupConfig> => {
|
|
118
|
+
return request.get(endpoints.config());
|
|
119
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
|
|
3
|
+
export function setAcceptLanguageHeader(value: string): void {
|
|
4
|
+
axios.defaults.headers.common['Accept-Language'] = value;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function setTokenHeader(token: string) {
|
|
8
|
+
axios.defaults.headers.common['Authorization'] = 'Bearer ' + token;
|
|
9
|
+
}
|
package/src/index.ts
ADDED