@chainlit/react-client 0.0.1
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/README.md +172 -0
- package/dist/index.d.mts +347 -0
- package/dist/index.d.ts +347 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +15 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +61 -0
package/README.md
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
## Overview
|
|
2
|
+
|
|
3
|
+
The `@chainlit/react-client` package provides a set of React hooks as well as an API client to connect to your [Chainlit](https://github.com/Chainlit/chainlit) application from any React application. The package includes hooks for managing chat sessions, messages, data, and interactions.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
To install the package, run the following command in your project directory:
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install @chainlit/react-client
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
This package use [Recoil](https://github.com/facebookexperimental/Recoil) to manage its state. This means you will have to wrap your application in a recoil provider:
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import React from 'react';
|
|
17
|
+
import ReactDOM from 'react-dom/client';
|
|
18
|
+
import { RecoilRoot } from 'recoil';
|
|
19
|
+
|
|
20
|
+
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
|
|
21
|
+
<React.StrictMode>
|
|
22
|
+
<RecoilRoot>
|
|
23
|
+
<MyApp />
|
|
24
|
+
</RecoilRoot>
|
|
25
|
+
</React.StrictMode>
|
|
26
|
+
);
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
### `useChatSession`
|
|
32
|
+
|
|
33
|
+
This hook is responsible for managing the chat session's connection to the WebSocket server.
|
|
34
|
+
|
|
35
|
+
#### Methods
|
|
36
|
+
|
|
37
|
+
- `connect`: Establishes a connection to the WebSocket server.
|
|
38
|
+
- `disconnect`: Disconnects from the WebSocket server.
|
|
39
|
+
- `setChatProfile`: Sets the chat profile state.
|
|
40
|
+
|
|
41
|
+
#### Example
|
|
42
|
+
|
|
43
|
+
```jsx
|
|
44
|
+
import { useChatSession } from '@chainlit/react-client';
|
|
45
|
+
|
|
46
|
+
const ChatComponent = () => {
|
|
47
|
+
const { connect, disconnect, chatProfile, setChatProfile } = useChatSession();
|
|
48
|
+
|
|
49
|
+
// Connect to the WebSocket server
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
connect({
|
|
52
|
+
wsEndpoint: 'YOUR_WEBSOCKET_ENDPOINT', // Your Chainlit server url
|
|
53
|
+
userEnv: {
|
|
54
|
+
/* user environment variables */
|
|
55
|
+
},
|
|
56
|
+
accessToken: 'YOUR_ACCESS_TOKEN' // Optional Chainlit auth token
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
return () => {
|
|
60
|
+
disconnect();
|
|
61
|
+
};
|
|
62
|
+
}, [connect, disconnect]);
|
|
63
|
+
|
|
64
|
+
// Rest of your component logic
|
|
65
|
+
};
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### `useChatMessages`
|
|
69
|
+
|
|
70
|
+
This hook provides access to the chat messages and the first user message.
|
|
71
|
+
|
|
72
|
+
#### Properties
|
|
73
|
+
|
|
74
|
+
- `messages`: An array of chat messages.
|
|
75
|
+
- `firstUserMessage`: The first message from the user.
|
|
76
|
+
|
|
77
|
+
#### Example
|
|
78
|
+
|
|
79
|
+
```jsx
|
|
80
|
+
import { useChatMessages } from '@chainlit/react-client';
|
|
81
|
+
|
|
82
|
+
const MessagesComponent = () => {
|
|
83
|
+
const { messages, firstUserMessage } = useChatMessages();
|
|
84
|
+
|
|
85
|
+
// Render your messages
|
|
86
|
+
return (
|
|
87
|
+
<div>
|
|
88
|
+
{messages.map((message) => (
|
|
89
|
+
<p key={message.id}>{message.content}</p>
|
|
90
|
+
))}
|
|
91
|
+
</div>
|
|
92
|
+
);
|
|
93
|
+
};
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### `useChatData`
|
|
97
|
+
|
|
98
|
+
This hook provides access to various chat-related data and states.
|
|
99
|
+
|
|
100
|
+
#### Properties
|
|
101
|
+
|
|
102
|
+
- `actions`: An array of actions.
|
|
103
|
+
- `askUser`: The current ask user state.
|
|
104
|
+
- `avatars`: An array of avatar elements.
|
|
105
|
+
- `chatSettingsDefaultValue`: The default value for chat settings.
|
|
106
|
+
- `chatSettingsInputs`: The current chat settings inputs.
|
|
107
|
+
- `chatSettingsValue`: The current value of chat settings.
|
|
108
|
+
- `connected`: A boolean indicating if the WebSocket connection is established.
|
|
109
|
+
- `disabled`: A boolean indicating if the chat is disabled.
|
|
110
|
+
- `elements`: An array of chat elements.
|
|
111
|
+
- `error`: A boolean indicating if there is an error in the session.
|
|
112
|
+
- `loading`: A boolean indicating if the chat is in a loading state.
|
|
113
|
+
- `tasklists`: An array of tasklist elements.
|
|
114
|
+
|
|
115
|
+
#### Example
|
|
116
|
+
|
|
117
|
+
```jsx
|
|
118
|
+
import { useChatData } from '@chainlit/react-client';
|
|
119
|
+
|
|
120
|
+
const ChatDataComponent = () => {
|
|
121
|
+
const { loading, connected, error } = useChatData();
|
|
122
|
+
|
|
123
|
+
// Use the data to render your component
|
|
124
|
+
if (loading) return <p>Loading...</p>;
|
|
125
|
+
if (error) return <p>Error connecting to chat...</p>;
|
|
126
|
+
if (!connected) return <p>Disconnected...</p>;
|
|
127
|
+
|
|
128
|
+
// Rest of your component logic
|
|
129
|
+
};
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### `useChatInteract`
|
|
133
|
+
|
|
134
|
+
This hook provides methods to interact with the chat, such as sending messages, replying, and updating settings.
|
|
135
|
+
|
|
136
|
+
#### Methods
|
|
137
|
+
|
|
138
|
+
- `callAction`: Calls an action.
|
|
139
|
+
- `clear`: Clears the chat session.
|
|
140
|
+
- `replyMessage`: Replies to a message.
|
|
141
|
+
- `sendMessage`: Sends a message.
|
|
142
|
+
- `stopTask`: Stops the current task.
|
|
143
|
+
- `setIdToResume`: Sets the ID to resume a conversation.
|
|
144
|
+
- `updateChatSettings`: Updates the chat settings.
|
|
145
|
+
|
|
146
|
+
#### Example
|
|
147
|
+
|
|
148
|
+
```jsx
|
|
149
|
+
import { useChatInteract } from '@chainlit/react-client';
|
|
150
|
+
|
|
151
|
+
const InteractionComponent = () => {
|
|
152
|
+
const { sendMessage, replyMessage } = useChatInteract();
|
|
153
|
+
|
|
154
|
+
const handleSendMessage = () => {
|
|
155
|
+
const message = { content: 'Hello, World!', id: 'message-id' };
|
|
156
|
+
sendMessage(message);
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
const handleReplyMessage = () => {
|
|
160
|
+
const message = { content: 'Replying to your message', id: 'reply-id' };
|
|
161
|
+
replyMessage(message);
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
// Render your interaction component
|
|
165
|
+
return (
|
|
166
|
+
<div>
|
|
167
|
+
<button onClick={handleSendMessage}>Send Message</button>
|
|
168
|
+
<button onClick={handleReplyMessage}>Reply to Message</button>
|
|
169
|
+
</div>
|
|
170
|
+
);
|
|
171
|
+
};
|
|
172
|
+
```
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import * as recoil from 'recoil';
|
|
2
|
+
import * as lodash from 'lodash';
|
|
3
|
+
import { Socket } from 'socket.io-client';
|
|
4
|
+
export { Socket } from 'socket.io-client';
|
|
5
|
+
import * as swr__internal from 'swr/_internal';
|
|
6
|
+
import { SWRConfiguration } from 'swr';
|
|
7
|
+
|
|
8
|
+
interface IAction {
|
|
9
|
+
description?: string;
|
|
10
|
+
forId: string;
|
|
11
|
+
id: string;
|
|
12
|
+
label?: string;
|
|
13
|
+
name: string;
|
|
14
|
+
onClick: () => void;
|
|
15
|
+
value: string;
|
|
16
|
+
collapsed: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type IElement = IImageElement | ITextElement | IPdfElement | IAvatarElement | ITasklistElement | IAudioElement | IVideoElement | IFileElement | IPlotlyElement;
|
|
20
|
+
type IMessageElement = IImageElement | ITextElement | IPdfElement | IAudioElement | IVideoElement | IFileElement | IPlotlyElement;
|
|
21
|
+
type ElementType = IElement['type'];
|
|
22
|
+
type IElementSize = 'small' | 'medium' | 'large';
|
|
23
|
+
interface TElement<T> {
|
|
24
|
+
id: string;
|
|
25
|
+
type: T;
|
|
26
|
+
conversationId?: string;
|
|
27
|
+
forIds?: string[];
|
|
28
|
+
url?: string;
|
|
29
|
+
}
|
|
30
|
+
interface TMessageElement<T> extends TElement<T> {
|
|
31
|
+
name: string;
|
|
32
|
+
display: 'inline' | 'side' | 'page';
|
|
33
|
+
}
|
|
34
|
+
interface IImageElement extends TMessageElement<'image'> {
|
|
35
|
+
content?: ArrayBuffer;
|
|
36
|
+
size?: IElementSize;
|
|
37
|
+
}
|
|
38
|
+
interface IAvatarElement extends TElement<'avatar'> {
|
|
39
|
+
name: string;
|
|
40
|
+
content?: ArrayBuffer;
|
|
41
|
+
}
|
|
42
|
+
interface ITextElement extends TMessageElement<'text'> {
|
|
43
|
+
content?: string;
|
|
44
|
+
language?: string;
|
|
45
|
+
}
|
|
46
|
+
interface IPdfElement extends TMessageElement<'pdf'> {
|
|
47
|
+
content?: string;
|
|
48
|
+
}
|
|
49
|
+
interface IAudioElement extends TMessageElement<'audio'> {
|
|
50
|
+
content?: ArrayBuffer;
|
|
51
|
+
}
|
|
52
|
+
interface IVideoElement extends TMessageElement<'video'> {
|
|
53
|
+
content?: ArrayBuffer;
|
|
54
|
+
size?: IElementSize;
|
|
55
|
+
}
|
|
56
|
+
interface IFileElement extends TMessageElement<'file'> {
|
|
57
|
+
type: 'file';
|
|
58
|
+
mime?: string;
|
|
59
|
+
content?: ArrayBuffer;
|
|
60
|
+
}
|
|
61
|
+
interface IPlotlyElement extends TMessageElement<'plotly'> {
|
|
62
|
+
content?: string;
|
|
63
|
+
}
|
|
64
|
+
interface ITasklistElement extends TElement<'tasklist'> {
|
|
65
|
+
content?: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
interface IBaseTemplate {
|
|
69
|
+
template?: string;
|
|
70
|
+
formatted?: string;
|
|
71
|
+
template_format: string;
|
|
72
|
+
}
|
|
73
|
+
type PromptMessageRole = 'system' | 'assistant' | 'user' | 'function';
|
|
74
|
+
type ILLMSettings = Record<string, string | string[] | number | boolean>;
|
|
75
|
+
interface IPromptMessage extends IBaseTemplate {
|
|
76
|
+
role: PromptMessageRole;
|
|
77
|
+
name?: string;
|
|
78
|
+
}
|
|
79
|
+
interface IFunction {
|
|
80
|
+
name: string;
|
|
81
|
+
description: string;
|
|
82
|
+
parameters: {
|
|
83
|
+
required: string[];
|
|
84
|
+
properties: Record<string, {
|
|
85
|
+
title: string;
|
|
86
|
+
type: string;
|
|
87
|
+
}>;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
interface ITool {
|
|
91
|
+
type: string;
|
|
92
|
+
function: IFunction;
|
|
93
|
+
}
|
|
94
|
+
interface IPrompt extends IBaseTemplate {
|
|
95
|
+
provider: string;
|
|
96
|
+
id?: string;
|
|
97
|
+
inputs?: Record<string, string>;
|
|
98
|
+
completion?: string;
|
|
99
|
+
settings?: ILLMSettings;
|
|
100
|
+
functions?: IFunction[];
|
|
101
|
+
messages?: IPromptMessage[];
|
|
102
|
+
}
|
|
103
|
+
interface IMessage {
|
|
104
|
+
author: string;
|
|
105
|
+
authorIsUser?: boolean;
|
|
106
|
+
content?: string;
|
|
107
|
+
createdAt: number | string;
|
|
108
|
+
disableHumanFeedback?: boolean;
|
|
109
|
+
elements?: IFileElement[];
|
|
110
|
+
humanFeedback?: number;
|
|
111
|
+
humanFeedbackComment?: string;
|
|
112
|
+
id: string;
|
|
113
|
+
indent?: number;
|
|
114
|
+
isError?: boolean;
|
|
115
|
+
language?: string;
|
|
116
|
+
parentId?: string;
|
|
117
|
+
prompt?: IPrompt;
|
|
118
|
+
streaming?: boolean;
|
|
119
|
+
waitForAnswer?: boolean;
|
|
120
|
+
subMessages?: IMessage[];
|
|
121
|
+
}
|
|
122
|
+
interface IMessageContent {
|
|
123
|
+
elements: IMessageElement[];
|
|
124
|
+
message: IMessage;
|
|
125
|
+
preserveSize?: boolean;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
interface FileSpec {
|
|
129
|
+
accept?: string[] | Record<string, string[]>;
|
|
130
|
+
max_size_mb?: number;
|
|
131
|
+
max_files?: number;
|
|
132
|
+
}
|
|
133
|
+
interface ActionSpec {
|
|
134
|
+
keys?: string[];
|
|
135
|
+
}
|
|
136
|
+
interface IFileResponse {
|
|
137
|
+
name: string;
|
|
138
|
+
path?: string;
|
|
139
|
+
size: number;
|
|
140
|
+
type: string;
|
|
141
|
+
content: ArrayBuffer;
|
|
142
|
+
}
|
|
143
|
+
interface IAsk {
|
|
144
|
+
callback: (payload: IMessage | IFileResponse[] | IAction) => void;
|
|
145
|
+
spec: {
|
|
146
|
+
type: 'text' | 'file' | 'action';
|
|
147
|
+
timeout: number;
|
|
148
|
+
} & FileSpec & ActionSpec;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
type Role = 'USER' | 'ADMIN' | 'OWNER' | 'ANONYMOUS';
|
|
152
|
+
type AppUserProvider = 'credentials' | 'header' | 'github' | 'google' | 'azure-ad';
|
|
153
|
+
interface IAppUser {
|
|
154
|
+
id: string;
|
|
155
|
+
username: string;
|
|
156
|
+
role: Role;
|
|
157
|
+
tags?: string[];
|
|
158
|
+
image?: string;
|
|
159
|
+
provider?: AppUserProvider;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
interface IConversation {
|
|
163
|
+
id: string;
|
|
164
|
+
createdAt: number | string;
|
|
165
|
+
appUser?: IAppUser;
|
|
166
|
+
metadata?: Record<string, any>;
|
|
167
|
+
messages: IMessage[];
|
|
168
|
+
elements: IElement[];
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
type MessageHistory = {
|
|
172
|
+
content: string;
|
|
173
|
+
createdAt: number;
|
|
174
|
+
};
|
|
175
|
+
type ConversationsHistory = {
|
|
176
|
+
conversations?: IConversation[];
|
|
177
|
+
currentConversationId?: string;
|
|
178
|
+
groupedConversations?: {
|
|
179
|
+
[key: string]: IConversation[];
|
|
180
|
+
};
|
|
181
|
+
pageInfo?: IPageInfo;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
interface IMessageUpdate extends IMessage {
|
|
185
|
+
newId?: string;
|
|
186
|
+
}
|
|
187
|
+
interface IToken {
|
|
188
|
+
id: number | string;
|
|
189
|
+
token: string;
|
|
190
|
+
isSequence: boolean;
|
|
191
|
+
}
|
|
192
|
+
declare const useChatData: () => {
|
|
193
|
+
actions: IAction[];
|
|
194
|
+
askUser: IAsk | undefined;
|
|
195
|
+
avatars: IAvatarElement[];
|
|
196
|
+
chatSettingsDefaultValue: any;
|
|
197
|
+
chatSettingsInputs: any;
|
|
198
|
+
chatSettingsValue: any;
|
|
199
|
+
connected: boolean | undefined;
|
|
200
|
+
disabled: boolean;
|
|
201
|
+
elements: IMessageElement[];
|
|
202
|
+
error: boolean | undefined;
|
|
203
|
+
loading: boolean;
|
|
204
|
+
tasklists: ITasklistElement[];
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
declare const useChatInteract: () => {
|
|
208
|
+
callAction: (action: IAction) => void;
|
|
209
|
+
clear: () => void;
|
|
210
|
+
replyMessage: (message: IMessage) => void;
|
|
211
|
+
sendMessage: (message: IMessage, files?: IFileElement[]) => void;
|
|
212
|
+
stopTask: () => void;
|
|
213
|
+
setIdToResume: recoil.SetterOrUpdater<string | undefined>;
|
|
214
|
+
updateChatSettings: (values: object) => void;
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
declare const useChatMessages: () => {
|
|
218
|
+
messages: IMessage[];
|
|
219
|
+
firstUserMessage: IMessage | undefined;
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
declare const useChatSession: () => {
|
|
223
|
+
connect: lodash.DebouncedFunc<({ wsEndpoint, userEnv, accessToken }: {
|
|
224
|
+
wsEndpoint: string;
|
|
225
|
+
userEnv: Record<string, string>;
|
|
226
|
+
accessToken?: string | undefined;
|
|
227
|
+
}) => void>;
|
|
228
|
+
disconnect: () => void;
|
|
229
|
+
chatProfile: string | undefined;
|
|
230
|
+
setChatProfile: recoil.SetterOrUpdater<string | undefined>;
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
declare const useAuth: (apiClient: ChainlitAPI) => {
|
|
234
|
+
data: {
|
|
235
|
+
requireLogin: boolean;
|
|
236
|
+
passwordAuth: boolean;
|
|
237
|
+
headerAuth: boolean;
|
|
238
|
+
oauthProviders: string[];
|
|
239
|
+
};
|
|
240
|
+
user: null;
|
|
241
|
+
role: string;
|
|
242
|
+
isReady: boolean;
|
|
243
|
+
isAuthenticated: boolean;
|
|
244
|
+
accessToken: string;
|
|
245
|
+
logout: () => void;
|
|
246
|
+
setAccessToken: () => void;
|
|
247
|
+
} | {
|
|
248
|
+
data: {
|
|
249
|
+
requireLogin: boolean;
|
|
250
|
+
passwordAuth: boolean;
|
|
251
|
+
headerAuth: boolean;
|
|
252
|
+
oauthProviders: string[];
|
|
253
|
+
} | undefined;
|
|
254
|
+
user: IAppUser | null;
|
|
255
|
+
role: Role | undefined;
|
|
256
|
+
isAuthenticated: boolean;
|
|
257
|
+
isReady: boolean;
|
|
258
|
+
accessToken: string | undefined;
|
|
259
|
+
logout: () => void;
|
|
260
|
+
setAccessToken: (token: string | null | undefined) => void;
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
declare const fetcher: (client: ChainlitAPI, endpoint: string, token?: string) => Promise<any>;
|
|
264
|
+
declare function useApi<T>(client: ChainlitAPI, path: string | null, options?: SWRConfiguration): swr__internal.SWRResponse<T, Error, Partial<swr__internal.PublicConfiguration<T, Error, swr__internal.BareFetcher<T>>> | undefined>;
|
|
265
|
+
|
|
266
|
+
interface IConversationsFilters {
|
|
267
|
+
authorEmail?: string;
|
|
268
|
+
search?: string;
|
|
269
|
+
feedback?: number;
|
|
270
|
+
}
|
|
271
|
+
interface IPageInfo {
|
|
272
|
+
hasNextPage: boolean;
|
|
273
|
+
endCursor?: string;
|
|
274
|
+
}
|
|
275
|
+
interface IPagination {
|
|
276
|
+
first: number;
|
|
277
|
+
cursor?: string | number;
|
|
278
|
+
}
|
|
279
|
+
declare class ClientError extends Error {
|
|
280
|
+
detail?: string;
|
|
281
|
+
constructor(message: string, detail?: string);
|
|
282
|
+
toString(): string;
|
|
283
|
+
}
|
|
284
|
+
type Payload = FormData | any;
|
|
285
|
+
declare class APIBase {
|
|
286
|
+
httpEndpoint: string;
|
|
287
|
+
on401?: (() => void) | undefined;
|
|
288
|
+
onError?: ((error: ClientError) => void) | undefined;
|
|
289
|
+
constructor(httpEndpoint: string, on401?: (() => void) | undefined, onError?: ((error: ClientError) => void) | undefined);
|
|
290
|
+
buildEndpoint(path: string): string;
|
|
291
|
+
checkToken(token: string): string;
|
|
292
|
+
fetch(method: string, path: string, token?: string, data?: Payload, signal?: AbortSignal): Promise<Response>;
|
|
293
|
+
get(endpoint: string, token?: string): Promise<Response>;
|
|
294
|
+
post(endpoint: string, data: Payload, token?: string, signal?: AbortSignal): Promise<Response>;
|
|
295
|
+
put(endpoint: string, data: Payload, token?: string): Promise<Response>;
|
|
296
|
+
patch(endpoint: string, data: Payload, token?: string): Promise<Response>;
|
|
297
|
+
delete(endpoint: string, data: Payload, token?: string): Promise<Response>;
|
|
298
|
+
}
|
|
299
|
+
declare class ChainlitAPI extends APIBase {
|
|
300
|
+
headerAuth(): Promise<any>;
|
|
301
|
+
passwordAuth(data: FormData): Promise<any>;
|
|
302
|
+
getCompletion(prompt: IPrompt, userEnv: {} | undefined, controller: AbortController, accessToken?: string, tokenCb?: (done: boolean, token: string) => void): Promise<ReadableStream<any>>;
|
|
303
|
+
setHumanFeedback(messageId: string, feedback: number, feedbackComment?: string, accessToken?: string): Promise<void>;
|
|
304
|
+
getConversations(pagination: IPagination, filter: IConversationsFilters, accessToken?: string): Promise<{
|
|
305
|
+
pageInfo: IPageInfo;
|
|
306
|
+
data: IConversation[];
|
|
307
|
+
}>;
|
|
308
|
+
deleteConversation(conversationId: string, accessToken?: string): Promise<any>;
|
|
309
|
+
getLogoEndpoint(theme: string): string;
|
|
310
|
+
getOAuthEndpoint(provider: string): string;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
interface ISession {
|
|
314
|
+
socket: Socket;
|
|
315
|
+
error?: boolean;
|
|
316
|
+
}
|
|
317
|
+
declare const conversationIdToResumeState: recoil.RecoilState<string | undefined>;
|
|
318
|
+
declare const chatProfileState: recoil.RecoilState<string | undefined>;
|
|
319
|
+
declare const sessionIdState: recoil.RecoilState<string>;
|
|
320
|
+
declare const sessionState: recoil.RecoilState<ISession | undefined>;
|
|
321
|
+
declare const actionState: recoil.RecoilState<IAction[]>;
|
|
322
|
+
declare const messagesState: recoil.RecoilState<IMessage[]>;
|
|
323
|
+
declare const tokenCountState: recoil.RecoilState<number>;
|
|
324
|
+
declare const loadingState: recoil.RecoilState<boolean>;
|
|
325
|
+
declare const askUserState: recoil.RecoilState<IAsk | undefined>;
|
|
326
|
+
declare const chatSettingsInputsState: recoil.RecoilState<any>;
|
|
327
|
+
declare const chatSettingsDefaultValueSelector: recoil.RecoilValueReadOnly<any>;
|
|
328
|
+
declare const chatSettingsValueState: recoil.RecoilState<any>;
|
|
329
|
+
declare const elementState: recoil.RecoilState<IMessageElement[]>;
|
|
330
|
+
declare const avatarState: recoil.RecoilState<IAvatarElement[]>;
|
|
331
|
+
declare const tasklistState: recoil.RecoilState<ITasklistElement[]>;
|
|
332
|
+
declare const firstUserMessageState: recoil.RecoilState<IMessage | undefined>;
|
|
333
|
+
declare const accessTokenState: recoil.RecoilState<string | undefined>;
|
|
334
|
+
declare const roleState: recoil.RecoilState<Role>;
|
|
335
|
+
declare const userState: recoil.RecoilState<IAppUser | null>;
|
|
336
|
+
declare const conversationsHistoryState: recoil.RecoilState<ConversationsHistory | undefined>;
|
|
337
|
+
|
|
338
|
+
declare const nestMessages: (messages: IMessage[]) => IMessage[];
|
|
339
|
+
declare const isLastMessage: (messages: IMessage[], index: number) => boolean;
|
|
340
|
+
declare const addMessage: (messages: IMessage[], message: IMessage) => IMessage[];
|
|
341
|
+
declare const addMessageToParent: (messages: IMessage[], parentId: string, newMessage: IMessage) => IMessage[];
|
|
342
|
+
declare const hasMessageById: (messages: IMessage[], messageId: string) => boolean;
|
|
343
|
+
declare const updateMessageById: (messages: IMessage[], messageId: string, updatedMessage: IMessage) => IMessage[];
|
|
344
|
+
declare const deleteMessageById: (messages: IMessage[], messageId: string) => IMessage[];
|
|
345
|
+
declare const updateMessageContentById: (messages: IMessage[], messageId: number | string, updatedContent: string, isSequence: boolean) => IMessage[];
|
|
346
|
+
|
|
347
|
+
export { APIBase, ActionSpec, AppUserProvider, ChainlitAPI, ClientError, ConversationsHistory, ElementType, FileSpec, IAction, IAppUser, IAsk, IAudioElement, IAvatarElement, IConversation, IConversationsFilters, IElement, IElementSize, IFileElement, IFileResponse, IFunction, IImageElement, ILLMSettings, IMessage, IMessageContent, IMessageElement, IMessageUpdate, IPageInfo, IPagination, IPdfElement, IPlotlyElement, IPrompt, IPromptMessage, ISession, ITasklistElement, ITextElement, IToken, ITool, IVideoElement, MessageHistory, PromptMessageRole, Role, accessTokenState, actionState, addMessage, addMessageToParent, askUserState, avatarState, chatProfileState, chatSettingsDefaultValueSelector, chatSettingsInputsState, chatSettingsValueState, conversationIdToResumeState, conversationsHistoryState, deleteMessageById, elementState, fetcher, firstUserMessageState, hasMessageById, isLastMessage, loadingState, messagesState, nestMessages, roleState, sessionIdState, sessionState, tasklistState, tokenCountState, updateMessageById, updateMessageContentById, useApi, useAuth, useChatData, useChatInteract, useChatMessages, useChatSession, userState };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import * as recoil from 'recoil';
|
|
2
|
+
import * as lodash from 'lodash';
|
|
3
|
+
import { Socket } from 'socket.io-client';
|
|
4
|
+
export { Socket } from 'socket.io-client';
|
|
5
|
+
import * as swr__internal from 'swr/_internal';
|
|
6
|
+
import { SWRConfiguration } from 'swr';
|
|
7
|
+
|
|
8
|
+
interface IAction {
|
|
9
|
+
description?: string;
|
|
10
|
+
forId: string;
|
|
11
|
+
id: string;
|
|
12
|
+
label?: string;
|
|
13
|
+
name: string;
|
|
14
|
+
onClick: () => void;
|
|
15
|
+
value: string;
|
|
16
|
+
collapsed: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type IElement = IImageElement | ITextElement | IPdfElement | IAvatarElement | ITasklistElement | IAudioElement | IVideoElement | IFileElement | IPlotlyElement;
|
|
20
|
+
type IMessageElement = IImageElement | ITextElement | IPdfElement | IAudioElement | IVideoElement | IFileElement | IPlotlyElement;
|
|
21
|
+
type ElementType = IElement['type'];
|
|
22
|
+
type IElementSize = 'small' | 'medium' | 'large';
|
|
23
|
+
interface TElement<T> {
|
|
24
|
+
id: string;
|
|
25
|
+
type: T;
|
|
26
|
+
conversationId?: string;
|
|
27
|
+
forIds?: string[];
|
|
28
|
+
url?: string;
|
|
29
|
+
}
|
|
30
|
+
interface TMessageElement<T> extends TElement<T> {
|
|
31
|
+
name: string;
|
|
32
|
+
display: 'inline' | 'side' | 'page';
|
|
33
|
+
}
|
|
34
|
+
interface IImageElement extends TMessageElement<'image'> {
|
|
35
|
+
content?: ArrayBuffer;
|
|
36
|
+
size?: IElementSize;
|
|
37
|
+
}
|
|
38
|
+
interface IAvatarElement extends TElement<'avatar'> {
|
|
39
|
+
name: string;
|
|
40
|
+
content?: ArrayBuffer;
|
|
41
|
+
}
|
|
42
|
+
interface ITextElement extends TMessageElement<'text'> {
|
|
43
|
+
content?: string;
|
|
44
|
+
language?: string;
|
|
45
|
+
}
|
|
46
|
+
interface IPdfElement extends TMessageElement<'pdf'> {
|
|
47
|
+
content?: string;
|
|
48
|
+
}
|
|
49
|
+
interface IAudioElement extends TMessageElement<'audio'> {
|
|
50
|
+
content?: ArrayBuffer;
|
|
51
|
+
}
|
|
52
|
+
interface IVideoElement extends TMessageElement<'video'> {
|
|
53
|
+
content?: ArrayBuffer;
|
|
54
|
+
size?: IElementSize;
|
|
55
|
+
}
|
|
56
|
+
interface IFileElement extends TMessageElement<'file'> {
|
|
57
|
+
type: 'file';
|
|
58
|
+
mime?: string;
|
|
59
|
+
content?: ArrayBuffer;
|
|
60
|
+
}
|
|
61
|
+
interface IPlotlyElement extends TMessageElement<'plotly'> {
|
|
62
|
+
content?: string;
|
|
63
|
+
}
|
|
64
|
+
interface ITasklistElement extends TElement<'tasklist'> {
|
|
65
|
+
content?: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
interface IBaseTemplate {
|
|
69
|
+
template?: string;
|
|
70
|
+
formatted?: string;
|
|
71
|
+
template_format: string;
|
|
72
|
+
}
|
|
73
|
+
type PromptMessageRole = 'system' | 'assistant' | 'user' | 'function';
|
|
74
|
+
type ILLMSettings = Record<string, string | string[] | number | boolean>;
|
|
75
|
+
interface IPromptMessage extends IBaseTemplate {
|
|
76
|
+
role: PromptMessageRole;
|
|
77
|
+
name?: string;
|
|
78
|
+
}
|
|
79
|
+
interface IFunction {
|
|
80
|
+
name: string;
|
|
81
|
+
description: string;
|
|
82
|
+
parameters: {
|
|
83
|
+
required: string[];
|
|
84
|
+
properties: Record<string, {
|
|
85
|
+
title: string;
|
|
86
|
+
type: string;
|
|
87
|
+
}>;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
interface ITool {
|
|
91
|
+
type: string;
|
|
92
|
+
function: IFunction;
|
|
93
|
+
}
|
|
94
|
+
interface IPrompt extends IBaseTemplate {
|
|
95
|
+
provider: string;
|
|
96
|
+
id?: string;
|
|
97
|
+
inputs?: Record<string, string>;
|
|
98
|
+
completion?: string;
|
|
99
|
+
settings?: ILLMSettings;
|
|
100
|
+
functions?: IFunction[];
|
|
101
|
+
messages?: IPromptMessage[];
|
|
102
|
+
}
|
|
103
|
+
interface IMessage {
|
|
104
|
+
author: string;
|
|
105
|
+
authorIsUser?: boolean;
|
|
106
|
+
content?: string;
|
|
107
|
+
createdAt: number | string;
|
|
108
|
+
disableHumanFeedback?: boolean;
|
|
109
|
+
elements?: IFileElement[];
|
|
110
|
+
humanFeedback?: number;
|
|
111
|
+
humanFeedbackComment?: string;
|
|
112
|
+
id: string;
|
|
113
|
+
indent?: number;
|
|
114
|
+
isError?: boolean;
|
|
115
|
+
language?: string;
|
|
116
|
+
parentId?: string;
|
|
117
|
+
prompt?: IPrompt;
|
|
118
|
+
streaming?: boolean;
|
|
119
|
+
waitForAnswer?: boolean;
|
|
120
|
+
subMessages?: IMessage[];
|
|
121
|
+
}
|
|
122
|
+
interface IMessageContent {
|
|
123
|
+
elements: IMessageElement[];
|
|
124
|
+
message: IMessage;
|
|
125
|
+
preserveSize?: boolean;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
interface FileSpec {
|
|
129
|
+
accept?: string[] | Record<string, string[]>;
|
|
130
|
+
max_size_mb?: number;
|
|
131
|
+
max_files?: number;
|
|
132
|
+
}
|
|
133
|
+
interface ActionSpec {
|
|
134
|
+
keys?: string[];
|
|
135
|
+
}
|
|
136
|
+
interface IFileResponse {
|
|
137
|
+
name: string;
|
|
138
|
+
path?: string;
|
|
139
|
+
size: number;
|
|
140
|
+
type: string;
|
|
141
|
+
content: ArrayBuffer;
|
|
142
|
+
}
|
|
143
|
+
interface IAsk {
|
|
144
|
+
callback: (payload: IMessage | IFileResponse[] | IAction) => void;
|
|
145
|
+
spec: {
|
|
146
|
+
type: 'text' | 'file' | 'action';
|
|
147
|
+
timeout: number;
|
|
148
|
+
} & FileSpec & ActionSpec;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
type Role = 'USER' | 'ADMIN' | 'OWNER' | 'ANONYMOUS';
|
|
152
|
+
type AppUserProvider = 'credentials' | 'header' | 'github' | 'google' | 'azure-ad';
|
|
153
|
+
interface IAppUser {
|
|
154
|
+
id: string;
|
|
155
|
+
username: string;
|
|
156
|
+
role: Role;
|
|
157
|
+
tags?: string[];
|
|
158
|
+
image?: string;
|
|
159
|
+
provider?: AppUserProvider;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
interface IConversation {
|
|
163
|
+
id: string;
|
|
164
|
+
createdAt: number | string;
|
|
165
|
+
appUser?: IAppUser;
|
|
166
|
+
metadata?: Record<string, any>;
|
|
167
|
+
messages: IMessage[];
|
|
168
|
+
elements: IElement[];
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
type MessageHistory = {
|
|
172
|
+
content: string;
|
|
173
|
+
createdAt: number;
|
|
174
|
+
};
|
|
175
|
+
type ConversationsHistory = {
|
|
176
|
+
conversations?: IConversation[];
|
|
177
|
+
currentConversationId?: string;
|
|
178
|
+
groupedConversations?: {
|
|
179
|
+
[key: string]: IConversation[];
|
|
180
|
+
};
|
|
181
|
+
pageInfo?: IPageInfo;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
interface IMessageUpdate extends IMessage {
|
|
185
|
+
newId?: string;
|
|
186
|
+
}
|
|
187
|
+
interface IToken {
|
|
188
|
+
id: number | string;
|
|
189
|
+
token: string;
|
|
190
|
+
isSequence: boolean;
|
|
191
|
+
}
|
|
192
|
+
declare const useChatData: () => {
|
|
193
|
+
actions: IAction[];
|
|
194
|
+
askUser: IAsk | undefined;
|
|
195
|
+
avatars: IAvatarElement[];
|
|
196
|
+
chatSettingsDefaultValue: any;
|
|
197
|
+
chatSettingsInputs: any;
|
|
198
|
+
chatSettingsValue: any;
|
|
199
|
+
connected: boolean | undefined;
|
|
200
|
+
disabled: boolean;
|
|
201
|
+
elements: IMessageElement[];
|
|
202
|
+
error: boolean | undefined;
|
|
203
|
+
loading: boolean;
|
|
204
|
+
tasklists: ITasklistElement[];
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
declare const useChatInteract: () => {
|
|
208
|
+
callAction: (action: IAction) => void;
|
|
209
|
+
clear: () => void;
|
|
210
|
+
replyMessage: (message: IMessage) => void;
|
|
211
|
+
sendMessage: (message: IMessage, files?: IFileElement[]) => void;
|
|
212
|
+
stopTask: () => void;
|
|
213
|
+
setIdToResume: recoil.SetterOrUpdater<string | undefined>;
|
|
214
|
+
updateChatSettings: (values: object) => void;
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
declare const useChatMessages: () => {
|
|
218
|
+
messages: IMessage[];
|
|
219
|
+
firstUserMessage: IMessage | undefined;
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
declare const useChatSession: () => {
|
|
223
|
+
connect: lodash.DebouncedFunc<({ wsEndpoint, userEnv, accessToken }: {
|
|
224
|
+
wsEndpoint: string;
|
|
225
|
+
userEnv: Record<string, string>;
|
|
226
|
+
accessToken?: string | undefined;
|
|
227
|
+
}) => void>;
|
|
228
|
+
disconnect: () => void;
|
|
229
|
+
chatProfile: string | undefined;
|
|
230
|
+
setChatProfile: recoil.SetterOrUpdater<string | undefined>;
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
declare const useAuth: (apiClient: ChainlitAPI) => {
|
|
234
|
+
data: {
|
|
235
|
+
requireLogin: boolean;
|
|
236
|
+
passwordAuth: boolean;
|
|
237
|
+
headerAuth: boolean;
|
|
238
|
+
oauthProviders: string[];
|
|
239
|
+
};
|
|
240
|
+
user: null;
|
|
241
|
+
role: string;
|
|
242
|
+
isReady: boolean;
|
|
243
|
+
isAuthenticated: boolean;
|
|
244
|
+
accessToken: string;
|
|
245
|
+
logout: () => void;
|
|
246
|
+
setAccessToken: () => void;
|
|
247
|
+
} | {
|
|
248
|
+
data: {
|
|
249
|
+
requireLogin: boolean;
|
|
250
|
+
passwordAuth: boolean;
|
|
251
|
+
headerAuth: boolean;
|
|
252
|
+
oauthProviders: string[];
|
|
253
|
+
} | undefined;
|
|
254
|
+
user: IAppUser | null;
|
|
255
|
+
role: Role | undefined;
|
|
256
|
+
isAuthenticated: boolean;
|
|
257
|
+
isReady: boolean;
|
|
258
|
+
accessToken: string | undefined;
|
|
259
|
+
logout: () => void;
|
|
260
|
+
setAccessToken: (token: string | null | undefined) => void;
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
declare const fetcher: (client: ChainlitAPI, endpoint: string, token?: string) => Promise<any>;
|
|
264
|
+
declare function useApi<T>(client: ChainlitAPI, path: string | null, options?: SWRConfiguration): swr__internal.SWRResponse<T, Error, Partial<swr__internal.PublicConfiguration<T, Error, swr__internal.BareFetcher<T>>> | undefined>;
|
|
265
|
+
|
|
266
|
+
interface IConversationsFilters {
|
|
267
|
+
authorEmail?: string;
|
|
268
|
+
search?: string;
|
|
269
|
+
feedback?: number;
|
|
270
|
+
}
|
|
271
|
+
interface IPageInfo {
|
|
272
|
+
hasNextPage: boolean;
|
|
273
|
+
endCursor?: string;
|
|
274
|
+
}
|
|
275
|
+
interface IPagination {
|
|
276
|
+
first: number;
|
|
277
|
+
cursor?: string | number;
|
|
278
|
+
}
|
|
279
|
+
declare class ClientError extends Error {
|
|
280
|
+
detail?: string;
|
|
281
|
+
constructor(message: string, detail?: string);
|
|
282
|
+
toString(): string;
|
|
283
|
+
}
|
|
284
|
+
type Payload = FormData | any;
|
|
285
|
+
declare class APIBase {
|
|
286
|
+
httpEndpoint: string;
|
|
287
|
+
on401?: (() => void) | undefined;
|
|
288
|
+
onError?: ((error: ClientError) => void) | undefined;
|
|
289
|
+
constructor(httpEndpoint: string, on401?: (() => void) | undefined, onError?: ((error: ClientError) => void) | undefined);
|
|
290
|
+
buildEndpoint(path: string): string;
|
|
291
|
+
checkToken(token: string): string;
|
|
292
|
+
fetch(method: string, path: string, token?: string, data?: Payload, signal?: AbortSignal): Promise<Response>;
|
|
293
|
+
get(endpoint: string, token?: string): Promise<Response>;
|
|
294
|
+
post(endpoint: string, data: Payload, token?: string, signal?: AbortSignal): Promise<Response>;
|
|
295
|
+
put(endpoint: string, data: Payload, token?: string): Promise<Response>;
|
|
296
|
+
patch(endpoint: string, data: Payload, token?: string): Promise<Response>;
|
|
297
|
+
delete(endpoint: string, data: Payload, token?: string): Promise<Response>;
|
|
298
|
+
}
|
|
299
|
+
declare class ChainlitAPI extends APIBase {
|
|
300
|
+
headerAuth(): Promise<any>;
|
|
301
|
+
passwordAuth(data: FormData): Promise<any>;
|
|
302
|
+
getCompletion(prompt: IPrompt, userEnv: {} | undefined, controller: AbortController, accessToken?: string, tokenCb?: (done: boolean, token: string) => void): Promise<ReadableStream<any>>;
|
|
303
|
+
setHumanFeedback(messageId: string, feedback: number, feedbackComment?: string, accessToken?: string): Promise<void>;
|
|
304
|
+
getConversations(pagination: IPagination, filter: IConversationsFilters, accessToken?: string): Promise<{
|
|
305
|
+
pageInfo: IPageInfo;
|
|
306
|
+
data: IConversation[];
|
|
307
|
+
}>;
|
|
308
|
+
deleteConversation(conversationId: string, accessToken?: string): Promise<any>;
|
|
309
|
+
getLogoEndpoint(theme: string): string;
|
|
310
|
+
getOAuthEndpoint(provider: string): string;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
interface ISession {
|
|
314
|
+
socket: Socket;
|
|
315
|
+
error?: boolean;
|
|
316
|
+
}
|
|
317
|
+
declare const conversationIdToResumeState: recoil.RecoilState<string | undefined>;
|
|
318
|
+
declare const chatProfileState: recoil.RecoilState<string | undefined>;
|
|
319
|
+
declare const sessionIdState: recoil.RecoilState<string>;
|
|
320
|
+
declare const sessionState: recoil.RecoilState<ISession | undefined>;
|
|
321
|
+
declare const actionState: recoil.RecoilState<IAction[]>;
|
|
322
|
+
declare const messagesState: recoil.RecoilState<IMessage[]>;
|
|
323
|
+
declare const tokenCountState: recoil.RecoilState<number>;
|
|
324
|
+
declare const loadingState: recoil.RecoilState<boolean>;
|
|
325
|
+
declare const askUserState: recoil.RecoilState<IAsk | undefined>;
|
|
326
|
+
declare const chatSettingsInputsState: recoil.RecoilState<any>;
|
|
327
|
+
declare const chatSettingsDefaultValueSelector: recoil.RecoilValueReadOnly<any>;
|
|
328
|
+
declare const chatSettingsValueState: recoil.RecoilState<any>;
|
|
329
|
+
declare const elementState: recoil.RecoilState<IMessageElement[]>;
|
|
330
|
+
declare const avatarState: recoil.RecoilState<IAvatarElement[]>;
|
|
331
|
+
declare const tasklistState: recoil.RecoilState<ITasklistElement[]>;
|
|
332
|
+
declare const firstUserMessageState: recoil.RecoilState<IMessage | undefined>;
|
|
333
|
+
declare const accessTokenState: recoil.RecoilState<string | undefined>;
|
|
334
|
+
declare const roleState: recoil.RecoilState<Role>;
|
|
335
|
+
declare const userState: recoil.RecoilState<IAppUser | null>;
|
|
336
|
+
declare const conversationsHistoryState: recoil.RecoilState<ConversationsHistory | undefined>;
|
|
337
|
+
|
|
338
|
+
declare const nestMessages: (messages: IMessage[]) => IMessage[];
|
|
339
|
+
declare const isLastMessage: (messages: IMessage[], index: number) => boolean;
|
|
340
|
+
declare const addMessage: (messages: IMessage[], message: IMessage) => IMessage[];
|
|
341
|
+
declare const addMessageToParent: (messages: IMessage[], parentId: string, newMessage: IMessage) => IMessage[];
|
|
342
|
+
declare const hasMessageById: (messages: IMessage[], messageId: string) => boolean;
|
|
343
|
+
declare const updateMessageById: (messages: IMessage[], messageId: string, updatedMessage: IMessage) => IMessage[];
|
|
344
|
+
declare const deleteMessageById: (messages: IMessage[], messageId: string) => IMessage[];
|
|
345
|
+
declare const updateMessageContentById: (messages: IMessage[], messageId: number | string, updatedContent: string, isSequence: boolean) => IMessage[];
|
|
346
|
+
|
|
347
|
+
export { APIBase, ActionSpec, AppUserProvider, ChainlitAPI, ClientError, ConversationsHistory, ElementType, FileSpec, IAction, IAppUser, IAsk, IAudioElement, IAvatarElement, IConversation, IConversationsFilters, IElement, IElementSize, IFileElement, IFileResponse, IFunction, IImageElement, ILLMSettings, IMessage, IMessageContent, IMessageElement, IMessageUpdate, IPageInfo, IPagination, IPdfElement, IPlotlyElement, IPrompt, IPromptMessage, ISession, ITasklistElement, ITextElement, IToken, ITool, IVideoElement, MessageHistory, PromptMessageRole, Role, accessTokenState, actionState, addMessage, addMessageToParent, askUserState, avatarState, chatProfileState, chatSettingsDefaultValueSelector, chatSettingsInputsState, chatSettingsValueState, conversationIdToResumeState, conversationsHistoryState, deleteMessageById, elementState, fetcher, firstUserMessageState, hasMessageById, isLastMessage, loadingState, messagesState, nestMessages, roleState, sessionIdState, sessionState, tasklistState, tokenCountState, updateMessageById, updateMessageContentById, useApi, useAuth, useChatData, useChatInteract, useChatMessages, useChatSession, userState };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";function e(e,t){if(t==null||t>e.length)t=e.length;for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function t(e){if(Array.isArray(e))return e}function n(t){if(Array.isArray(t))return e(t)}function r(e){if(e===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return e}function o(e,t,n,r,o,a,u){try{var i=e[a](u);var s=i.value}catch(e){n(e);return}if(i.done){t(s)}else{Promise.resolve(s).then(r,o)}}function a(e){return function(){var t=this,n=arguments;return new Promise(function(r,a){var u=e.apply(t,n);function i(e){o(u,r,a,i,s,"next",e)}function s(e){o(u,r,a,i,s,"throw",e)}i(undefined)})}}function u(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function i(e,t,n){if(P()){i=Reflect.construct}else{i=function e(e,t,n){var r=[null];r.push.apply(r,t);var o=Function.bind.apply(e,r);var a=new o;if(n)O(a,n.prototype);return a}}return i.apply(null,arguments)}function s(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||false;r.configurable=true;if("value"in r)r.writable=true;Object.defineProperty(e,r.key,r)}}function c(e,t,n){if(t)s(e.prototype,t);if(n)s(e,n);return e}function l(e,t,n){if(t in e){Object.defineProperty(e,t,{value:n,enumerable:true,configurable:true,writable:true})}else{e[t]=n}return e}function f(e){f=Object.setPrototypeOf?Object.getPrototypeOf:function e(e){return e.__proto__||Object.getPrototypeOf(e)};return f(e)}function d(e,t){if(typeof t!=="function"&&t!==null){throw new TypeError("Super expression must either be null or a function")}e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:true,configurable:true}});if(t)O(e,t)}function v(e,t){if(t!=null&&typeof Symbol!=="undefined"&&t[Symbol.hasInstance]){return!!t[Symbol.hasInstance](e)}else{return e instanceof t}}function p(e){return Function.toString.call(e).indexOf("[native code]")!==-1}function h(e){if(typeof Symbol!=="undefined"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function y(e,t){var n=e==null?null:typeof Symbol!=="undefined"&&e[Symbol.iterator]||e["@@iterator"];if(n==null)return;var r=[];var o=true;var a=false;var u,i;try{for(n=n.call(e);!(o=(u=n.next()).done);o=true){r.push(u.value);if(t&&r.length===t)break}}catch(e){a=true;i=e}finally{try{if(!o&&n["return"]!=null)n["return"]()}finally{if(a)throw i}}return r}function g(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function b(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function S(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};var r=Object.keys(n);if(typeof Object.getOwnPropertySymbols==="function"){r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))}r.forEach(function(t){l(e,t,n[t])})}return e}function m(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);if(t){r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})}n.push.apply(n,r)}return n}function k(e,t){t=t!=null?t:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(e,Object.getOwnPropertyDescriptors(t))}else{m(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function w(e,t){if(e==null)return{};var n=R(e,t);var r,o;if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o<a.length;o++){r=a[o];if(t.indexOf(r)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(e,r))continue;n[r]=e[r]}}return n}function R(e,t){if(e==null)return{};var n={};var r=Object.keys(e);var o,a;for(a=0;a<r.length;a++){o=r[a];if(t.indexOf(o)>=0)continue;n[o]=e[o]}return n}function x(e,t){if(t&&(j(t)==="object"||typeof t==="function")){return t}return r(e)}function O(e,t){O=Object.setPrototypeOf||function e(e,t){e.__proto__=t;return e};return O(e,t)}function M(e,n){return t(e)||y(e,n)||I(e,n)||g()}function C(e){return n(e)||h(e)||I(e)||b()}function j(e){"@swc/helpers - typeof";return e&&typeof Symbol!=="undefined"&&e.constructor===Symbol?"symbol":typeof e}function I(t,n){if(!t)return;if(typeof t==="string")return e(t,n);var r=Object.prototype.toString.call(t).slice(8,-1);if(r==="Object"&&t.constructor)r=t.constructor.name;if(r==="Map"||r==="Set")return Array.from(r);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return e(t,n)}function E(e){var t=typeof Map==="function"?new Map:undefined;E=function e(e){if(e===null||!p(e))return e;if(typeof e!=="function"){throw new TypeError("Super expression must either be null or a function")}if(typeof t!=="undefined"){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return i(e,arguments,f(this).constructor)}n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:false,writable:true,configurable:true}});return O(n,e)};return E(e)}function P(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));return true}catch(e){return false}}function _(e){var t=P();return function n(){var n=f(e),r;if(t){var o=f(this).constructor;r=Reflect.construct(n,arguments,o)}else{r=n.apply(this,arguments)}return x(this,r)}}function A(e,t){var n,r,o,a,u={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]};return(a={next:i(0),"throw":i(1),"return":i(2)},typeof Symbol==="function"&&(a[Symbol.iterator]=function(){return this}),a);function i(e){return function(t){return s([e,t])}}function s(a){if(n)throw new TypeError("Generator is already executing.");while(u)try{if(n=1,r&&(o=a[0]&2?r["return"]:a[0]?r["throw"]||((o=r["return"])&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;if(r=0,o)a=[a[0]&2,o.value];switch(a[0]){case 0:case 1:o=a;break;case 4:u.label++;return{value:a[1],done:false};case 5:u.label++;r=a[1];a=[0];continue;case 7:a=u.ops.pop();u.trys.pop();continue;default:if(!(o=u.trys,o=o.length>0&&o[o.length-1])&&(a[0]===6||a[0]===2)){u=0;continue}if(a[0]===3&&(!o||a[1]>o[0]&&a[1]<o[3])){u.label=a[1];break}if(a[0]===6&&u.label<o[1]){u.label=o[1];o=a;break}if(o&&u.label<o[2]){u.label=o[2];u.ops.push(a);break}if(o[2])u.ops.pop();u.trys.pop();continue}a=t.call(e,u)}catch(e){a=[6,e];r=0}finally{n=o=0}if(a[0]&5)throw a[1];return{value:a[0]?a[1]:void 0,done:true}}}var T=require("recoil");var D=require("lodash/isEqual");var V=require("uuid");var q=require("react");var U=require("lodash/debounce");var B=require("socket.io-client");var L=require("jwt-decode");var F=require("swr");function H(e){return e&&e.__esModule?e:{default:e}}var N=/*#__PURE__*/H(D);var X=/*#__PURE__*/H(U);var z=/*#__PURE__*/H(B);var G=/*#__PURE__*/H(L);var J=/*#__PURE__*/H(F);var W=function(e){var t={},n=new Date,r=new Date;r.setDate(n.getDate()-1);var o=new Date;o.setDate(n.getDate()-7);var a=new Date;return a.setDate(n.getDate()-30),e.forEach(function(e){var u=new Date(e.createdAt),i=u.toDateString()===n.toDateString(),s=u.toDateString()===r.toDateString(),c=u>=o,l=u>=a,f;i?f="Today":s?f="Yesterday":c?f="Previous 7 days":l?f="Previous 30 days":f=u.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),t[f]||(t[f]=[]),t[f].push(e)}),t};var Y=T.atom({key:"ConversationIdToResume",default:void 0}),$=T.atom({key:"ChatProfile",default:void 0}),K=T.atom({key:"SessionId",default:V.v4()}),Q=T.selector({key:"SessionIdSelector",get:function(e){var t=e.get;return t(K)},set:function(e,t){var n=e.set;return n(K,v(t,T.DefaultValue)?V.v4():t)}}),Z=T.atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),ee=T.atom({key:"Actions",default:[]}),et=T.atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),en=T.atom({key:"TokenCount",default:0}),er=T.atom({key:"Loading",default:!1}),eo=T.atom({key:"AskUser",default:void 0}),ea=T.atom({key:"ChatSettings",default:[]}),eu=T.selector({key:"ChatSettingsValue/Default",get:function(e){var t=e.get;return t(ea).reduce(function(e,t){return e[t.id]=t.initial,e},{})}}),ei=T.atom({key:"ChatSettingsValue",default:eu}),es=T.atom({key:"DisplayElements",default:[]}),ec=T.atom({key:"AvatarElements",default:[]}),el=T.atom({key:"TasklistElements",default:[]}),ef=T.atom({key:"FirstUserMessage",default:void 0}),ed=T.atom({key:"AccessToken",default:void 0}),ev=T.atom({key:"Role",default:void 0}),ep=T.atom({key:"User",default:null}),eh=T.atom({key:"ConversationsHistory",default:{conversations:void 0,currentConversationId:void 0,groupedConversations:void 0,pageInfo:void 0},effects:[function(e){var t=e.setSelf,n=e.onSet;n(function(e,n){var r=e===null||e===void 0?void 0:e.groupedConversations;(e===null||e===void 0?void 0:e.conversations)&&!N.default(e.conversations,n===null||n===void 0?void 0:n.groupedConversations)&&(r=W(e.conversations)),t(k(S({},e),{groupedConversations:r}))})}]});var ey=function(){var e=T.useRecoilValue(er),t=T.useRecoilValue(es),n=T.useRecoilValue(ec),r=T.useRecoilValue(el),o=T.useRecoilValue(ee),a=T.useRecoilValue(Z),u=T.useRecoilValue(eo),i=T.useRecoilValue(ea),s=T.useRecoilValue(ei),c=T.useRecoilValue(eu),l=(a===null||a===void 0?void 0:a.socket.connected)&&!(a===null||a===void 0?void 0:a.error),f=!l||e||(u===null||u===void 0?void 0:u.spec.type)==="file"||(u===null||u===void 0?void 0:u.spec.type)==="action";return{actions:o,askUser:u,avatars:n,chatSettingsDefaultValue:c,chatSettingsInputs:i,chatSettingsValue:s,connected:l,disabled:f,elements:t,error:a===null||a===void 0?void 0:a.error,loading:e,tasklists:r}};var eg=function(e){var t=[];var n=true,r=false,o=undefined;try{for(var a=e[Symbol.iterator](),u;!(n=(u=a.next()).done);n=true){var i=u.value;t=eS(t,i)}}catch(e){r=true;o=e}finally{try{if(!n&&a.return!=null){a.return()}}finally{if(r){throw o}}}return t},eb=function(e,t){if(e.length-1===t)return!0;for(var n=t+1;n<e.length;n++)if(!e[n].streaming)return!1;return!0},eS=function(e,t){return ew(e,t.id)?eR(e,t.id,t):t.parentId?ek(e,t.parentId,t):t.indent&&t.indent>0?em(e,t.indent,t):C(e).concat([t])},em=function(e,t,n){var r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;var o=C(e);if(o.length===0)return C(o).concat([n]);{var a=o.length-1,u=o[a];return u.subMessages=u.subMessages||[],r+1===t?(u.subMessages=C(u.subMessages).concat([n]),o[a]=S({},u),o):(u.subMessages=em(u.subMessages,t,n,r+1),o[a]=S({},u),o)}},ek=function(e,t,n){var r=C(e);for(var o=0;o<r.length;o++){var a=r[o];N.default(a.id,t)?(a.subMessages=a.subMessages?C(a.subMessages).concat([n]):[n],r[o]=S({},a)):ew(r,t)&&a.subMessages&&(a.subMessages=ek(a.subMessages,t,n),r[o]=S({},a))}return r},ew=function(e,t){var n=true,r=false,o=undefined;try{for(var a=e[Symbol.iterator](),u;!(n=(u=a.next()).done);n=true){var i=u.value;if(N.default(i.id,t))return!0;if(i.subMessages&&i.subMessages.length>0&&ew(i.subMessages,t))return!0}}catch(e){r=true;o=e}finally{try{if(!n&&a.return!=null){a.return()}}finally{if(r){throw o}}}return!1},eR=function(e,t,n){var r=C(e);for(var o=0;o<r.length;o++){var a=r[o];N.default(a.id,t)?r[o]=S({subMessages:a.subMessages},n):ew(r,t)&&a.subMessages&&(a.subMessages=eR(a.subMessages,t,n),r[o]=S({},a))}return r},ex=function(e,t){var n=C(e);for(var r=0;r<n.length;r++){var o=n[r];o.id===t?n=C(n.slice(0,r)).concat(C(n.slice(r+1))):ew(n,t)&&o.subMessages&&(o.subMessages=ex(o.subMessages,t),n[r]=S({},o))}return n},eO=function(e,t,n,r){var o=C(e);for(var a=0;a<o.length;a++){var u=o[a];N.default(u.id,t)?(r?u.content=n:u.content+=n,o[a]=S({},u)):u.subMessages&&(u.subMessages=eO(u.subMessages,t,n,r),o[a]=S({},u))}return o};var eM=function(){var e=T.useRecoilValue(Z),t=T.useRecoilValue(eo),n=T.useResetRecoilState(ea),r=T.useResetRecoilState(Q),o=T.useResetRecoilState(ei),a=T.useSetRecoilState(ef),u=T.useSetRecoilState(er),i=T.useSetRecoilState(et),s=T.useSetRecoilState(es),c=T.useSetRecoilState(ec),l=T.useSetRecoilState(el),f=T.useSetRecoilState(ee),d=T.useSetRecoilState(en),v=T.useSetRecoilState(Y),p=q.useCallback(function(){e===null||e===void 0?void 0:e.socket.emit("clear_session"),e===null||e===void 0?void 0:e.socket.disconnect(),v(void 0),r(),a(void 0),i([]),s([]),c([]),l([]),f([]),d(0),n(),o()},[e]),h=q.useCallback(function(t,n){i(function(e){return eS(e,t)}),e===null||e===void 0?void 0:e.socket.emit("ui_message",{message:t,files:n})},[e]),y=q.useCallback(function(e){t&&(i(function(t){return eS(t,e)}),t.callback(e))},[t,e]),g=q.useCallback(function(t){e===null||e===void 0?void 0:e.socket.emit("chat_settings_change",t)},[e]),b=q.useCallback(function(){u(!1),e===null||e===void 0?void 0:e.socket.emit("stop")},[e]);return{callAction:q.useCallback(function(t){e===null||e===void 0?void 0:e.socket.emit("action_call",t)},[e]),clear:p,replyMessage:y,sendMessage:h,stopTask:b,setIdToResume:v,updateChatSettings:g}};var eC=function(){var e=T.useRecoilValue(et),t=T.useRecoilValue(ef);return{messages:e,firstUserMessage:t}};var ej=function(){var e=T.useRecoilValue(Q),t=M(T.useRecoilState(Z),2),n=t[0],r=t[1],o=T.useResetRecoilState(ei),a=T.useSetRecoilState(ef),u=T.useSetRecoilState(er),i=T.useSetRecoilState(et),s=T.useSetRecoilState(eo),c=T.useSetRecoilState(es),l=T.useSetRecoilState(ec),f=T.useSetRecoilState(el),d=T.useSetRecoilState(ee),v=T.useSetRecoilState(ea),p=T.useSetRecoilState(en),h=M(T.useRecoilState($),2),y=h[0],g=h[1],b=T.useRecoilValue(Y),m=q.useCallback(function(t){var n=t.wsEndpoint,h=t.userEnv,m=t.accessToken;var w=z.default(n,{path:"/ws/socket.io",extraHeaders:{Authorization:m||"","X-Chainlit-Session-Id":e,"X-Chainlit-Conversation-Id":b||"","user-env":JSON.stringify(h),"X-Chainlit-Chat-Profile":y||""}});r(function(e){var t,n;return e===null||e===void 0?void 0:(t=e.socket)===null||t===void 0?void 0:t.removeAllListeners(),e===null||e===void 0?void 0:(n=e.socket)===null||n===void 0?void 0:n.close(),{socket:w}}),w.on("connect",function(){w.emit("connection_successful"),r(function(e){return k(S({},e),{error:!1})})}),w.on("connect_error",function(e){r(function(e){return k(S({},e),{error:!0})})}),w.on("task_start",function(){u(!0)}),w.on("task_end",function(){u(!1)}),w.on("reload",function(){w.emit("clear_session"),window.location.reload()}),w.on("resume_conversation",function(e){var t,n;var r=[];var o=true,a=false,u=undefined;try{for(var s=e.messages[Symbol.iterator](),d;!(o=(d=s.next()).done);o=true){var v=d.value;r=eS(r,v)}}catch(e){a=true;u=e}finally{try{if(!o&&s.return!=null){s.return()}}finally{if(a){throw u}}}((t=e.metadata)===null||t===void 0?void 0:t.chat_profile)&&g((n=e.metadata)===null||n===void 0?void 0:n.chat_profile),i(r),l(e.elements.filter(function(e){return e.type==="avatar"})),f(e.elements.filter(function(e){return e.type==="tasklist"})),c(e.elements.filter(function(e){return["avatar","tasklist"].indexOf(e.type)===-1}))}),w.on("new_message",function(e){i(function(t){return eS(t,e)})}),w.on("init_conversation",function(e){a(e)}),w.on("update_message",function(e){i(function(t){return eR(t,e.id,e)})}),w.on("delete_message",function(e){i(function(t){return ex(t,e.id)})}),w.on("stream_start",function(e){i(function(t){return eS(t,e)})}),w.on("stream_token",function(e){var t=e.id,n=e.token,r=e.isSequence;i(function(e){return eO(e,t,n,r)})}),w.on("ask",function(e,t){var n=e.msg,r=e.spec;s({spec:r,callback:t}),i(function(e){return eS(e,n)}),u(!1)}),w.on("ask_timeout",function(){s(void 0),u(!1)}),w.on("clear_ask",function(){s(void 0)}),w.on("chat_settings",function(e){v(e),o()}),w.on("element",function(e){e.type==="avatar"?l(function(t){return C(t).concat([e])}):e.type==="tasklist"?f(function(t){return C(t).concat([e])}):c(function(t){return C(t).concat([e])})}),w.on("update_element",function(e){c(function(t){var n=t.findIndex(function(t){return t.id===e.id});if(n===-1)return t;var r=k(S({},t[n]),{forIds:e.forIds});return C(t.slice(0,n)).concat([r],C(t.slice(n+1)))})}),w.on("remove_element",function(e){c(function(t){return t.filter(function(t){return t.id!==e.id})}),f(function(t){return t.filter(function(t){return t.id!==e.id})}),l(function(t){return t.filter(function(t){return t.id!==e.id})})}),w.on("action",function(e){d(function(t){return C(t).concat([e])})}),w.on("remove_action",function(e){d(function(t){var n=t.findIndex(function(t){return t.id===e.id});return n===-1?t:C(t.slice(0,n)).concat(C(t.slice(n+1)))})}),w.on("token_usage",function(e){p(function(t){return t+e})})},[r,e,y]),w=q.useCallback(X.default(m,200),[m]),R=q.useCallback(function(){(n===null||n===void 0?void 0:n.socket)&&(n.socket.removeAllListeners(),n.socket.close())},[n]);return{connect:w,disconnect:R,chatProfile:y,setChatProfile:g}};var eI="token";function eE(){try{return localStorage.getItem(eI)}catch(e){return}}function eP(e){try{return localStorage.setItem(eI,e)}catch(e){return}}function e_(){try{return localStorage.removeItem(eI)}catch(e){return}}var eA=function(){var e=a(function(e,t,n){var r;return A(this,function(o){switch(o.label){case 0:return[4,e.get(t,n)];case 1:return[2,(r=o.sent())===null||r===void 0?void 0:r.json()]}})});return function t(t,n,r){return e.apply(this,arguments)}}();function eT(e,t,n){var r=T.useRecoilValue(ed);return J.default(t?[t,r]:null,function(t){var n=M(t,2),r=n[0],o=n[1];return eA(e,r,o)},n)}var eD=function(e){var t=eT(e,"/auth/config"),n=t.data,r=t.isLoading,o=M(T.useRecoilState(ed),2),a=o[0],u=o[1],i=T.useSetRecoilState(eh),s=M(T.useRecoilState(ep),2),c=s[0],l=s[1],f=!!(!r&&n),d=function(){l(null),e_(),u(""),i(void 0)},v=function(e){if(!e){d();return}try{var t=G.default(e),n=t.exp,r=w(t,["exp"]);eP(e),u("Bearer ".concat(e)),l(r)}catch(e){console.error("Invalid token, clearing token from local storage","error:",e),d()}};q.useEffect(function(){if(!c&&eE()){v(eE());return}},[]);var p=!!a;return n&&!n.requireLogin?{data:n,user:null,role:"ANONYMOUS",isReady:f,isAuthenticated:!0,accessToken:"",logout:function(){},setAccessToken:function(){}}:{data:n,user:c,role:c===null||c===void 0?void 0:c.role,isAuthenticated:p,isReady:f,accessToken:a,logout:d,setAccessToken:v}};var eV=/*#__PURE__*/function(e){d(n,e);var t=_(n);function n(e,r){u(this,n);var o;o=t.call(this,e);o.detail=r;return o}c(n,[{key:"toString",value:function e(){return this.detail?"".concat(this.message,": ").concat(this.detail):this.message}}]);return n}(E(Error)),eq=/*#__PURE__*/function(){function e(t,n,r){u(this,e);this.httpEndpoint=t;this.on401=n;this.onError=r}c(e,[{key:"buildEndpoint",value:function e(e){return this.httpEndpoint.endsWith("/")?"".concat(this.httpEndpoint.slice(0,-1)).concat(e):"".concat(this.httpEndpoint).concat(e)}},{key:"checkToken",value:function e(e){var t="Bearer ";return e.startsWith(t)?e:t+e}},{key:"fetch",value:function e(e,t,n,r,o){var u=this;return a(function(){var a,i,s,c,l;return A(this,function(f){switch(f.label){case 0:f.trys.push([0,4,,5]);a={};n&&(a.Authorization=u.checkToken(n));v(r,FormData)?i=r:(a["Content-Type"]="application/json",i=r?JSON.stringify(r):null);return[4,fetch(u.buildEndpoint(t),{method:e,headers:a,signal:o,body:i})];case 1:s=f.sent();if(!!s.ok)return[3,3];return[4,s.json()];case 2:c=f.sent();throw s.status===401&&u.on401&&(e_(),u.on401()),new eV(s.statusText,c.detail);case 3:return[2,s];case 4:l=f.sent();throw v(l,eV)&&u.onError&&u.onError(l),console.error(l),l;case 5:return[2]}})})()}},{key:"get",value:function e(e,t){var n=this;return a(function(){return A(this,function(r){switch(r.label){case 0:return[4,n.fetch("GET",e,t)];case 1:return[2,r.sent()]}})})()}},{key:"post",value:function e(e,t,n,r){var o=this;return a(function(){return A(this,function(a){switch(a.label){case 0:return[4,o.fetch("POST",e,n,t,r)];case 1:return[2,a.sent()]}})})()}},{key:"put",value:function e(e,t,n){var r=this;return a(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.fetch("PUT",e,n,t)];case 1:return[2,o.sent()]}})})()}},{key:"patch",value:function e(e,t,n){var r=this;return a(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.fetch("PATCH",e,n,t)];case 1:return[2,o.sent()]}})})()}},{key:"delete",value:function e(e,t,n){var r=this;return a(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.fetch("DELETE",e,n,t)];case 1:return[2,o.sent()]}})})()}}]);return e}(),eU=/*#__PURE__*/function(e){d(n,e);var t=_(n);function n(){u(this,n);return t.apply(this,arguments)}c(n,[{key:"headerAuth",value:function e(){var e=this;return a(function(){return A(this,function(t){switch(t.label){case 0:return[4,e.post("/auth/header",{})];case 1:return[2,t.sent().json()]}})})()}},{key:"passwordAuth",value:function e(e){var t=this;return a(function(){return A(this,function(n){switch(n.label){case 0:return[4,t.post("/login",e)];case 1:return[2,n.sent().json()]}})})()}},{key:"getCompletion",value:function e(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=arguments.length>3?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0;var u=this;return a(function(){var a,i,s;return A(this,function(c){switch(c.label){case 0:return[4,u.post("/completion",{prompt:e,userEnv:t},r,n.signal)];case 1:s=(i=c.sent())===null||i===void 0?void 0:(a=i.body)===null||a===void 0?void 0:a.getReader();return[2,new ReadableStream({start:function e(e){function t(){s.read().then(function(n){var r=n.done,a=n.value;if(r){e.close(),o&&o(r,"");return}var u=new TextDecoder("utf-8").decode(a);o&&o(r,u),e.enqueue(a),t()}).catch(function(t){e.close(),o&&o(!0,""),console.error(t)})}t()}})]}})})()}},{key:"setHumanFeedback",value:function e(e,t,n,r){var o=this;return a(function(){return A(this,function(a){switch(a.label){case 0:return[4,o.put("/message/feedback",{messageId:e,feedback:t,feedbackComment:n},r)];case 1:a.sent();return[2]}})})()}},{key:"getConversations",value:function e(e,t,n){var r=this;return a(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.post("/project/conversations",{pagination:e,filter:t},n)];case 1:return[2,o.sent().json()]}})})()}},{key:"deleteConversation",value:function e(e,t){var n=this;return a(function(){return A(this,function(r){switch(r.label){case 0:return[4,n.delete("/project/conversation",{conversationId:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"getLogoEndpoint",value:function e(e){return this.buildEndpoint("/logo?theme=".concat(e))}},{key:"getOAuthEndpoint",value:function e(e){return this.buildEndpoint("/auth/oauth/".concat(e))}}]);return n}(eq);Object.defineProperty(exports,"Socket",{enumerable:true,get:function e(){return B.Socket}});exports.APIBase=eq;exports.ChainlitAPI=eU;exports.ClientError=eV;exports.accessTokenState=ed;exports.actionState=ee;exports.addMessage=eS;exports.addMessageToParent=ek;exports.askUserState=eo;exports.avatarState=ec;exports.chatProfileState=$;exports.chatSettingsDefaultValueSelector=eu;exports.chatSettingsInputsState=ea;exports.chatSettingsValueState=ei;exports.conversationIdToResumeState=Y;exports.conversationsHistoryState=eh;exports.deleteMessageById=ex;exports.elementState=es;exports.fetcher=eA;exports.firstUserMessageState=ef;exports.hasMessageById=ew;exports.isLastMessage=eb;exports.loadingState=er;exports.messagesState=et;exports.nestMessages=eg;exports.roleState=ev;exports.sessionIdState=Q;exports.sessionState=Z;exports.tasklistState=el;exports.tokenCountState=en;exports.updateMessageById=eR;exports.updateMessageContentById=eO;exports.useApi=eT;exports.useAuth=eD;exports.useChatData=ey;exports.useChatInteract=eM;exports.useChatMessages=eC;exports.useChatSession=ej;exports.userState=ep;//# sourceMappingURL=out.js.map
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/useChatData.ts","../src/state.ts","../src/utils/group.ts","../src/useChatInteract.ts","../src/utils/message.ts","../src/useChatMessages.ts","../src/useChatSession.ts","../src/utils/token.ts","../src/api/hooks/auth.ts","../src/api/hooks/api.ts","../src/api/index.tsx","../src/index.ts"],"names":["useRecoilValue","isEqual","DefaultValue","atom","selector","uuidv4","groupByDate","data","groupedData","today","yesterday","sevenDaysAgo","thirtyDaysAgo","item","createdAt","isToday","isYesterday","isLast7Days","isLast30Days","category","conversationIdToResumeState","chatProfileState","sessionIdAtom","sessionIdState","get","set","newValue","sessionState","actionState","messagesState","tokenCountState","loadingState","askUserState","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","avatarState","tasklistState","firstUserMessageState","accessTokenState","roleState","userState","conversationsHistoryState","setSelf","onSet","oldValue","groupedConversations","useChatData","loading","elements","avatars","tasklists","actions","session","askUser","chatSettingsInputs","chatSettingsValue","chatSettingsDefaultValue","connected","disabled","useCallback","useResetRecoilState","useSetRecoilState","nestMessages","messages","nestedMessages","message","addMessage","isLastMessage","index","i","hasMessageById","updateMessageById","addMessageToParent","addIndentMessage","indent","newMessage","currentIndentation","nextMessages","msg","parentId","messageId","updatedMessage","deleteMessageById","updateMessageContentById","updatedContent","isSequence","useChatInteract","resetChatSettings","resetSessionId","resetChatSettingsValue","setFirstUserMessage","setLoading","setMessages","setElements","setAvatars","setTasklists","setActions","setTokenCount","setIdToResume","clear","sendMessage","files","oldMessages","replyMessage","updateChatSettings","values","stopTask","action","useChatMessages","firstUserMessage","debounce","useRecoilState","io","useChatSession","sessionId","setSession","setAskUser","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","wsEndpoint","userEnv","accessToken","socket","old","s","_","conversation","e","id","token","spec","callback","inputs","element","update","newElement","remove","a","count","connect","disconnect","tokenKey","getToken","setToken","removeToken","jwt_decode","useEffect","useSWR","fetcher","client","endpoint","useApi","path","options","url","useAuth","apiClient","isLoading","setAccessToken","setConversationsHistory","user","setUser","isReady","logout","saveAndSetToken","exp","AppUser","isAuthenticated","ClientError","detail","APIBase","httpEndpoint","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","prompt","controller","tokenCb","reader","push","done","value","string","err","feedback","feedbackComment","pagination","filter","conversationId","theme","provider","Socket"],"mappings":"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","sourcesContent":["import { useRecoilValue } from 'recoil';\nimport { IMessage } from 'src/types';\n\nimport {\n actionState,\n askUserState,\n avatarState,\n chatSettingsDefaultValueSelector,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n loadingState,\n sessionState,\n tasklistState\n} from './state';\n\nexport interface IMessageUpdate extends IMessage {\n newId?: string;\n}\n\nexport interface IToken {\n id: number | string;\n token: string;\n isSequence: boolean;\n}\n\nconst useChatData = () => {\n const loading = useRecoilValue(loadingState);\n const elements = useRecoilValue(elementState);\n const avatars = useRecoilValue(avatarState);\n const tasklists = useRecoilValue(tasklistState);\n const actions = useRecoilValue(actionState);\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n const chatSettingsInputs = useRecoilValue(chatSettingsInputsState);\n const chatSettingsValue = useRecoilValue(chatSettingsValueState);\n const chatSettingsDefaultValue = useRecoilValue(\n chatSettingsDefaultValueSelector\n );\n\n const connected = session?.socket.connected && !session?.error;\n const disabled =\n !connected ||\n loading ||\n askUser?.spec.type === 'file' ||\n askUser?.spec.type === 'action';\n\n return {\n actions,\n askUser,\n avatars,\n chatSettingsDefaultValue,\n chatSettingsInputs,\n chatSettingsValue,\n connected,\n disabled,\n elements,\n error: session?.error,\n loading,\n tasklists\n };\n};\n\nexport { useChatData };\n","import isEqual from 'lodash/isEqual';\nimport { DefaultValue, atom, selector } from 'recoil';\nimport { Socket } from 'socket.io-client';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n ConversationsHistory,\n IAction,\n IAppUser,\n IAsk,\n IAvatarElement,\n IMessage,\n IMessageElement,\n ITasklistElement,\n Role\n} from './types';\nimport { groupByDate } from './utils/group';\n\nexport interface ISession {\n socket: Socket;\n error?: boolean;\n}\n\nexport const conversationIdToResumeState = atom<string | undefined>({\n key: 'ConversationIdToResume',\n default: undefined\n});\n\nexport const chatProfileState = atom<string | undefined>({\n key: 'ChatProfile',\n default: undefined\n});\n\nconst sessionIdAtom = atom<string>({\n key: 'SessionId',\n default: uuidv4()\n});\n\nexport const sessionIdState = selector({\n key: 'SessionIdSelector',\n get: ({ get }) => get(sessionIdAtom),\n set: ({ set }, newValue) =>\n set(sessionIdAtom, newValue instanceof DefaultValue ? uuidv4() : newValue)\n});\n\nexport const sessionState = atom<ISession | undefined>({\n key: 'Session',\n dangerouslyAllowMutability: true,\n default: undefined\n});\n\nexport const actionState = atom<IAction[]>({\n key: 'Actions',\n default: []\n});\n\nexport const messagesState = atom<IMessage[]>({\n key: 'Messages',\n dangerouslyAllowMutability: true,\n default: []\n});\n\nexport const tokenCountState = atom<number>({\n key: 'TokenCount',\n default: 0\n});\n\nexport const loadingState = atom<boolean>({\n key: 'Loading',\n default: false\n});\n\nexport const askUserState = atom<IAsk | undefined>({\n key: 'AskUser',\n default: undefined\n});\n\nexport const chatSettingsInputsState = atom<any>({\n key: 'ChatSettings',\n default: []\n});\n\nexport const chatSettingsDefaultValueSelector = selector({\n key: 'ChatSettingsValue/Default',\n get: ({ get }) => {\n const chatSettings = get(chatSettingsInputsState);\n return chatSettings.reduce(\n (form: { [key: string]: any }, input: any) => (\n (form[input.id] = input.initial), form\n ),\n {}\n );\n }\n});\n\nexport const chatSettingsValueState = atom({\n key: 'ChatSettingsValue',\n default: chatSettingsDefaultValueSelector\n});\n\nexport const elementState = atom<IMessageElement[]>({\n key: 'DisplayElements',\n default: []\n});\n\nexport const avatarState = atom<IAvatarElement[]>({\n key: 'AvatarElements',\n default: []\n});\n\nexport const tasklistState = atom<ITasklistElement[]>({\n key: 'TasklistElements',\n default: []\n});\n\nexport const firstUserMessageState = atom<IMessage | undefined>({\n key: 'FirstUserMessage',\n default: undefined\n});\n\nexport const accessTokenState = atom<string | undefined>({\n key: 'AccessToken',\n default: undefined\n});\n\nexport const roleState = atom<Role>({\n key: 'Role',\n default: undefined\n});\n\nexport const userState = atom<IAppUser | null>({\n key: 'User',\n default: null\n});\n\nexport const conversationsHistoryState = atom<ConversationsHistory | undefined>(\n {\n key: 'ConversationsHistory',\n default: {\n conversations: undefined,\n currentConversationId: undefined,\n groupedConversations: undefined,\n pageInfo: undefined\n },\n effects: [\n ({ setSelf, onSet }: { setSelf: any; onSet: any }) => {\n onSet(\n (\n newValue: ConversationsHistory | undefined,\n oldValue: ConversationsHistory | undefined\n ) => {\n let groupedConversations = newValue?.groupedConversations;\n\n if (\n newValue?.conversations &&\n !isEqual(newValue.conversations, oldValue?.groupedConversations)\n ) {\n groupedConversations = groupByDate(newValue.conversations);\n }\n\n setSelf({\n ...newValue,\n groupedConversations\n });\n }\n );\n }\n ]\n }\n);\n","import { IConversation } from 'src/types';\n\nexport const groupByDate = (data: IConversation[]) => {\n const groupedData: { [key: string]: IConversation[] } = {};\n\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n const sevenDaysAgo = new Date();\n sevenDaysAgo.setDate(today.getDate() - 7);\n const thirtyDaysAgo = new Date();\n thirtyDaysAgo.setDate(today.getDate() - 30);\n\n data.forEach((item) => {\n const createdAt = new Date(item.createdAt);\n const isToday = createdAt.toDateString() === today.toDateString();\n const isYesterday = createdAt.toDateString() === yesterday.toDateString();\n const isLast7Days = createdAt >= sevenDaysAgo;\n const isLast30Days = createdAt >= thirtyDaysAgo;\n\n let category: string;\n\n if (isToday) {\n category = 'Today';\n } else if (isYesterday) {\n category = 'Yesterday';\n } else if (isLast7Days) {\n category = 'Previous 7 days';\n } else if (isLast30Days) {\n category = 'Previous 30 days';\n } else {\n const monthYear = createdAt.toLocaleString('default', {\n month: 'long',\n year: 'numeric'\n });\n\n category = monthYear.split(' ').slice(0, 1).join(' ');\n }\n\n if (!groupedData[category]) {\n groupedData[category] = [];\n }\n\n groupedData[category].push(item);\n });\n\n return groupedData;\n};\n","import { useCallback } from 'react';\nimport { useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil';\nimport {\n actionState,\n askUserState,\n avatarState,\n chatSettingsInputsState,\n chatSettingsValueState,\n conversationIdToResumeState,\n elementState,\n firstUserMessageState,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n tasklistState,\n tokenCountState\n} from 'src/state';\nimport { IAction, IFileElement, IMessage } from 'src/types';\nimport { addMessage } from 'src/utils/message';\n\nconst useChatInteract = () => {\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n\n const resetChatSettings = useResetRecoilState(chatSettingsInputsState);\n const resetSessionId = useResetRecoilState(sessionIdState);\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n\n const setFirstUserMessage = useSetRecoilState(firstUserMessageState);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const setIdToResume = useSetRecoilState(conversationIdToResumeState);\n\n const clear = useCallback(() => {\n session?.socket.emit('clear_session');\n session?.socket.disconnect();\n setIdToResume(undefined);\n resetSessionId();\n setFirstUserMessage(undefined);\n setMessages([]);\n setElements([]);\n setAvatars([]);\n setTasklists([]);\n setActions([]);\n setTokenCount(0);\n resetChatSettings();\n resetChatSettingsValue();\n }, [session]);\n\n const sendMessage = useCallback(\n (message: IMessage, files?: IFileElement[]) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n\n session?.socket.emit('ui_message', { message, files });\n },\n [session]\n );\n\n const replyMessage = useCallback(\n (message: IMessage) => {\n if (askUser) {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n askUser.callback(message);\n }\n },\n [askUser, session]\n );\n\n const updateChatSettings = useCallback(\n (values: object) => {\n session?.socket.emit('chat_settings_change', values);\n },\n [session]\n );\n\n const stopTask = useCallback(() => {\n setLoading(false);\n session?.socket.emit('stop');\n }, [session]);\n\n const callAction = useCallback(\n (action: IAction) => {\n session?.socket.emit('action_call', action);\n },\n [session]\n );\n\n return {\n callAction,\n clear,\n replyMessage,\n sendMessage,\n stopTask,\n setIdToResume,\n updateChatSettings\n };\n};\n\nexport { useChatInteract };\n","import isEqual from 'lodash/isEqual';\nimport { IMessage } from 'src/types';\n\nconst nestMessages = (messages: IMessage[]): IMessage[] => {\n let nestedMessages: IMessage[] = [];\n\n for (const message of messages) {\n nestedMessages = addMessage(nestedMessages, message);\n }\n\n return nestedMessages;\n};\n\nconst isLastMessage = (messages: IMessage[], index: number) => {\n if (messages.length - 1 === index) {\n return true;\n }\n\n for (let i = index + 1; i < messages.length; i++) {\n if (messages[i].streaming) {\n continue;\n } else {\n return false;\n }\n }\n\n return true;\n};\n\n// Nested messages utils\n\nconst addMessage = (messages: IMessage[], message: IMessage): IMessage[] => {\n if (hasMessageById(messages, message.id)) {\n return updateMessageById(messages, message.id, message);\n } else if (message.parentId) {\n return addMessageToParent(messages, message.parentId, message);\n } else if (message.indent && message.indent > 0) {\n return addIndentMessage(messages, message.indent, message);\n } else {\n return [...messages, message];\n }\n};\n\nconst addIndentMessage = (\n messages: IMessage[],\n indent: number,\n newMessage: IMessage,\n currentIndentation: number = 0\n): IMessage[] => {\n const nextMessages = [...messages];\n\n if (nextMessages.length === 0) {\n return [...nextMessages, newMessage];\n } else {\n const index = nextMessages.length - 1;\n const msg = nextMessages[index];\n msg.subMessages = msg.subMessages || [];\n\n if (currentIndentation + 1 === indent) {\n msg.subMessages = [...msg.subMessages, newMessage];\n nextMessages[index] = { ...msg };\n\n return nextMessages;\n } else {\n msg.subMessages = addIndentMessage(\n msg.subMessages,\n indent,\n newMessage,\n currentIndentation + 1\n );\n\n nextMessages[index] = { ...msg };\n return nextMessages;\n }\n }\n};\n\nconst addMessageToParent = (\n messages: IMessage[],\n parentId: string,\n newMessage: IMessage\n): IMessage[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, parentId)) {\n msg.subMessages = msg.subMessages\n ? [...msg.subMessages, newMessage]\n : [newMessage];\n nextMessages[index] = { ...msg };\n } else if (hasMessageById(nextMessages, parentId) && msg.subMessages) {\n msg.subMessages = addMessageToParent(\n msg.subMessages,\n parentId,\n newMessage\n );\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst hasMessageById = (messages: IMessage[], messageId: string) => {\n for (const message of messages) {\n if (isEqual(message.id, messageId)) {\n return true;\n } else if (message.subMessages && message.subMessages.length > 0) {\n if (hasMessageById(message.subMessages, messageId)) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst updateMessageById = (\n messages: IMessage[],\n messageId: string,\n updatedMessage: IMessage\n): IMessage[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, messageId)) {\n nextMessages[index] = { subMessages: msg.subMessages, ...updatedMessage };\n } else if (hasMessageById(nextMessages, messageId) && msg.subMessages) {\n msg.subMessages = updateMessageById(\n msg.subMessages,\n messageId,\n updatedMessage\n );\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst deleteMessageById = (messages: IMessage[], messageId: string) => {\n let nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (msg.id === messageId) {\n nextMessages = [\n ...nextMessages.slice(0, index),\n ...nextMessages.slice(index + 1)\n ];\n } else if (hasMessageById(nextMessages, messageId) && msg.subMessages) {\n msg.subMessages = deleteMessageById(msg.subMessages, messageId);\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst updateMessageContentById = (\n messages: IMessage[],\n messageId: number | string,\n updatedContent: string,\n isSequence: boolean\n): IMessage[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, messageId)) {\n if (isSequence) {\n msg.content = updatedContent;\n } else {\n msg.content += updatedContent;\n }\n\n nextMessages[index] = { ...msg };\n } else if (msg.subMessages) {\n msg.subMessages = updateMessageContentById(\n msg.subMessages,\n messageId,\n updatedContent,\n isSequence\n );\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nexport {\n addMessageToParent,\n addMessage,\n deleteMessageById,\n hasMessageById,\n isLastMessage,\n nestMessages,\n updateMessageById,\n updateMessageContentById\n};\n","import { useRecoilValue } from 'recoil';\n\nimport { firstUserMessageState, messagesState } from './state';\n\nconst useChatMessages = () => {\n const messages = useRecoilValue(messagesState);\n const firstUserMessage = useRecoilValue(firstUserMessageState);\n\n return {\n messages,\n firstUserMessage\n };\n};\n\nexport { useChatMessages };\n","import debounce from 'lodash/debounce';\nimport { useCallback } from 'react';\nimport {\n useRecoilState,\n useRecoilValue,\n useResetRecoilState,\n useSetRecoilState\n} from 'recoil';\nimport io from 'socket.io-client';\nimport {\n actionState,\n askUserState,\n avatarState,\n chatProfileState,\n chatSettingsInputsState,\n chatSettingsValueState,\n conversationIdToResumeState,\n elementState,\n firstUserMessageState,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n tasklistState,\n tokenCountState\n} from 'src/state';\nimport {\n IAction,\n IAvatarElement,\n IConversation,\n IElement,\n IMessage,\n IMessageElement,\n ITasklistElement\n} from 'src/types';\nimport {\n addMessage,\n deleteMessageById,\n updateMessageById,\n updateMessageContentById\n} from 'src/utils/message';\n\nimport type { IMessageUpdate, IToken } from './useChatData';\n\nconst useChatSession = () => {\n const sessionId = useRecoilValue(sessionIdState);\n\n const [session, setSession] = useRecoilState(sessionState);\n\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n const setFirstUserMessage = useSetRecoilState(firstUserMessageState);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setAskUser = useSetRecoilState(askUserState);\n const setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setChatSettingsInputs = useSetRecoilState(chatSettingsInputsState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const [chatProfile, setChatProfile] = useRecoilState(chatProfileState);\n const idToResume = useRecoilValue(conversationIdToResumeState);\n\n const _connect = useCallback(\n ({\n wsEndpoint,\n userEnv,\n accessToken\n }: {\n wsEndpoint: string;\n userEnv: Record<string, string>;\n accessToken?: string;\n }) => {\n const socket = io(wsEndpoint, {\n path: '/ws/socket.io',\n extraHeaders: {\n Authorization: accessToken || '',\n 'X-Chainlit-Session-Id': sessionId,\n 'X-Chainlit-Conversation-Id': idToResume || '',\n 'user-env': JSON.stringify(userEnv),\n 'X-Chainlit-Chat-Profile': chatProfile || ''\n }\n });\n setSession((old) => {\n old?.socket?.removeAllListeners();\n old?.socket?.close();\n return {\n socket\n };\n });\n\n socket.on('connect', () => {\n socket.emit('connection_successful');\n setSession((s) => ({ ...s!, error: false }));\n });\n\n socket.on('connect_error', (_) => {\n setSession((s) => ({ ...s!, error: true }));\n });\n\n socket.on('task_start', () => {\n setLoading(true);\n });\n\n socket.on('task_end', () => {\n setLoading(false);\n });\n\n socket.on('reload', () => {\n socket.emit('clear_session');\n window.location.reload();\n });\n\n socket.on('resume_conversation', (conversation: IConversation) => {\n let messages: IMessage[] = [];\n for (const message of conversation.messages) {\n messages = addMessage(messages, message);\n }\n if (conversation.metadata?.chat_profile) {\n setChatProfile(conversation.metadata?.chat_profile);\n }\n setMessages(messages);\n setAvatars(\n (conversation.elements as IAvatarElement[]).filter(\n (e) => e.type === 'avatar'\n )\n );\n setTasklists(\n (conversation.elements as ITasklistElement[]).filter(\n (e) => e.type === 'tasklist'\n )\n );\n setElements(\n (conversation.elements as IMessageElement[]).filter(\n (e) => ['avatar', 'tasklist'].indexOf(e.type) === -1\n )\n );\n });\n\n socket.on('new_message', (message: IMessage) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n });\n\n socket.on('init_conversation', (message: IMessage) => {\n setFirstUserMessage(message);\n });\n\n socket.on('update_message', (message: IMessageUpdate) => {\n setMessages((oldMessages) =>\n updateMessageById(oldMessages, message.id, message)\n );\n });\n\n socket.on('delete_message', (message: IMessage) => {\n setMessages((oldMessages) =>\n deleteMessageById(oldMessages, message.id)\n );\n });\n\n socket.on('stream_start', (message: IMessage) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n });\n\n socket.on('stream_token', ({ id, token, isSequence }: IToken) => {\n setMessages((oldMessages) =>\n updateMessageContentById(oldMessages, id, token, isSequence)\n );\n });\n\n socket.on('ask', ({ msg, spec }, callback) => {\n setAskUser({ spec, callback });\n setMessages((oldMessages) => addMessage(oldMessages, msg));\n\n setLoading(false);\n });\n\n socket.on('ask_timeout', () => {\n setAskUser(undefined);\n setLoading(false);\n });\n\n socket.on('clear_ask', () => {\n setAskUser(undefined);\n });\n\n socket.on('chat_settings', (inputs: any) => {\n setChatSettingsInputs(inputs);\n resetChatSettingsValue();\n });\n\n socket.on('element', (element: IElement) => {\n if (element.type === 'avatar') {\n setAvatars((old) => [...old, element]);\n } else if (element.type === 'tasklist') {\n setTasklists((old) => [...old, element]);\n } else {\n setElements((old) => [...old, element]);\n }\n });\n\n socket.on(\n 'update_element',\n (update: { id: string; forIds: string[] }) => {\n setElements((old) => {\n const index = old.findIndex((e) => e.id === update.id);\n if (index === -1) return old;\n const element = old[index];\n const newElement = { ...element, forIds: update.forIds };\n return [\n ...old.slice(0, index),\n newElement,\n ...old.slice(index + 1)\n ];\n });\n }\n );\n\n socket.on('remove_element', (remove: { id: string }) => {\n setElements((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n setTasklists((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n setAvatars((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n });\n\n socket.on('action', (action: IAction) => {\n setActions((old) => [...old, action]);\n });\n\n socket.on('remove_action', (action: IAction) => {\n setActions((old) => {\n const index = old.findIndex((a) => a.id === action.id);\n if (index === -1) return old;\n return [...old.slice(0, index), ...old.slice(index + 1)];\n });\n });\n\n socket.on('token_usage', (count: number) => {\n setTokenCount((old) => old + count);\n });\n },\n [setSession, sessionId, chatProfile]\n );\n\n const connect = useCallback(debounce(_connect, 200), [_connect]);\n\n const disconnect = useCallback(() => {\n if (session?.socket) {\n session.socket.removeAllListeners();\n session.socket.close();\n }\n }, [session]);\n\n return { connect, disconnect, chatProfile, setChatProfile };\n};\n\nexport { useChatSession };\n","const tokenKey = 'token';\n\nexport function getToken() {\n try {\n return localStorage.getItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n\nexport function setToken(token: string) {\n try {\n return localStorage.setItem(tokenKey, token);\n } catch (e) {\n return;\n }\n}\n\nexport function removeToken() {\n try {\n return localStorage.removeItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n","import jwt_decode from 'jwt-decode';\nimport { useEffect } from 'react';\nimport { useRecoilState, useSetRecoilState } from 'recoil';\nimport {\n accessTokenState,\n conversationsHistoryState,\n userState\n} from 'src/state';\nimport { IAppUser } from 'src/types';\nimport { getToken, removeToken, setToken } from 'src/utils/token';\n\nimport { ChainlitAPI } from '..';\nimport { useApi } from './api';\n\nexport const useAuth = (apiClient: ChainlitAPI) => {\n const { data, isLoading } = useApi<{\n requireLogin: boolean;\n passwordAuth: boolean;\n headerAuth: boolean;\n oauthProviders: string[];\n }>(apiClient, '/auth/config');\n const [accessToken, setAccessToken] = useRecoilState(accessTokenState);\n const setConversationsHistory = useSetRecoilState(conversationsHistoryState);\n const [user, setUser] = useRecoilState(userState);\n\n const isReady = !!(!isLoading && data);\n\n const logout = () => {\n setUser(null);\n removeToken();\n setAccessToken('');\n setConversationsHistory(undefined);\n };\n\n const saveAndSetToken = (token: string | null | undefined) => {\n if (!token) {\n logout();\n return;\n }\n try {\n const { exp, ...AppUser } = jwt_decode(token) as any;\n setToken(token);\n setAccessToken(`Bearer ${token}`);\n setUser(AppUser as IAppUser);\n } catch (e) {\n console.error(\n 'Invalid token, clearing token from local storage',\n 'error:',\n e\n );\n logout();\n }\n };\n\n useEffect(() => {\n if (!user && getToken()) {\n // Initialize the token from local storage\n saveAndSetToken(getToken());\n return;\n }\n }, []);\n\n const isAuthenticated = !!accessToken;\n\n if (data && !data.requireLogin) {\n return {\n data,\n user: null,\n role: 'ANONYMOUS',\n isReady,\n isAuthenticated: true,\n accessToken: '',\n logout: () => {},\n setAccessToken: () => {}\n };\n }\n\n return {\n data,\n user: user,\n role: user?.role,\n isAuthenticated,\n isReady,\n accessToken: accessToken,\n logout: logout,\n setAccessToken: saveAndSetToken\n };\n};\n","import { useRecoilValue } from 'recoil';\nimport { ChainlitAPI } from 'src/api';\nimport { accessTokenState } from 'src/state';\nimport useSWR, { SWRConfiguration } from 'swr';\n\nconst fetcher = async (\n client: ChainlitAPI,\n endpoint: string,\n token?: string\n) => {\n const res = await client.get(endpoint, token);\n\n return res?.json();\n};\n\nfunction useApi<T>(\n client: ChainlitAPI,\n path: string | null,\n options?: SWRConfiguration\n) {\n const accessToken = useRecoilValue(accessTokenState);\n\n return useSWR<T, Error>(\n path ? [path, accessToken] : null,\n ([url, token]: [url: string, token: string]) => fetcher(client, url, token),\n options\n );\n}\n\nexport { useApi, fetcher };\n","import { IConversation, IPrompt } from 'src/types';\nimport { removeToken } from 'src/utils/token';\n\nexport * from './hooks/auth';\nexport * from './hooks/api';\n\nexport interface IConversationsFilters {\n authorEmail?: string;\n search?: string;\n feedback?: number;\n}\n\nexport interface IPageInfo {\n hasNextPage: boolean;\n endCursor?: string;\n}\n\nexport interface IPagination {\n first: number;\n cursor?: string | number;\n}\n\nexport class ClientError extends Error {\n detail?: string;\n\n constructor(message: string, detail?: string) {\n super(message);\n this.detail = detail;\n }\n\n toString() {\n if (this.detail) {\n return `${this.message}: ${this.detail}`;\n } else {\n return this.message;\n }\n }\n}\n\ntype Payload = FormData | any;\n\nexport class APIBase {\n constructor(\n public httpEndpoint: string,\n public on401?: () => void,\n public onError?: (error: ClientError) => void\n ) {}\n\n buildEndpoint(path: string) {\n if (this.httpEndpoint.endsWith('/')) {\n // remove trailing slash on httpEndpoint\n return `${this.httpEndpoint.slice(0, -1)}${path}`;\n } else {\n return `${this.httpEndpoint}${path}`;\n }\n }\n\n checkToken(token: string) {\n const prefix = 'Bearer ';\n if (token.startsWith(prefix)) {\n return token;\n } else {\n return prefix + token;\n }\n }\n\n async fetch(\n method: string,\n path: string,\n token?: string,\n data?: Payload,\n signal?: AbortSignal\n ): Promise<Response> {\n try {\n const headers: { Authorization?: string; 'Content-Type'?: string } = {};\n if (token) headers['Authorization'] = this.checkToken(token); // Assuming token is a bearer token\n\n let body;\n\n if (data instanceof FormData) {\n body = data;\n } else {\n headers['Content-Type'] = 'application/json';\n body = data ? JSON.stringify(data) : null;\n }\n\n const res = await fetch(this.buildEndpoint(path), {\n method,\n headers,\n signal,\n body\n });\n\n if (!res.ok) {\n const body = await res.json();\n if (res.status === 401 && this.on401) {\n removeToken();\n this.on401();\n }\n throw new ClientError(res.statusText, body.detail);\n }\n\n return res;\n } catch (error: any) {\n if (error instanceof ClientError && this.onError) {\n this.onError(error);\n }\n console.error(error);\n throw error;\n }\n }\n\n async get(endpoint: string, token?: string) {\n return await this.fetch('GET', endpoint, token);\n }\n\n async post(\n endpoint: string,\n data: Payload,\n token?: string,\n signal?: AbortSignal\n ) {\n return await this.fetch('POST', endpoint, token, data, signal);\n }\n\n async put(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PUT', endpoint, token, data);\n }\n\n async patch(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PATCH', endpoint, token, data);\n }\n\n async delete(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('DELETE', endpoint, token, data);\n }\n}\n\nexport class ChainlitAPI extends APIBase {\n async headerAuth() {\n const res = await this.post(`/auth/header`, {});\n return res.json();\n }\n\n async passwordAuth(data: FormData) {\n const res = await this.post(`/login`, data);\n return res.json();\n }\n\n async getCompletion(\n prompt: IPrompt,\n userEnv = {},\n controller: AbortController,\n accessToken?: string,\n tokenCb?: (done: boolean, token: string) => void\n ) {\n const response = await this.post(\n `/completion`,\n { prompt, userEnv },\n accessToken,\n controller.signal\n );\n\n const reader = response?.body?.getReader();\n\n const stream = new ReadableStream({\n start(controller) {\n function push() {\n reader!\n .read()\n .then(({ done, value }) => {\n if (done) {\n controller.close();\n tokenCb && tokenCb(done, '');\n return;\n }\n const string = new TextDecoder('utf-8').decode(value);\n tokenCb && tokenCb(done, string);\n controller.enqueue(value);\n push();\n })\n .catch((err) => {\n controller.close();\n tokenCb && tokenCb(true, '');\n console.error(err);\n });\n }\n push();\n }\n });\n\n return stream;\n }\n\n async setHumanFeedback(\n messageId: string,\n feedback: number,\n feedbackComment?: string,\n accessToken?: string\n ) {\n await this.put(\n `/message/feedback`,\n { messageId, feedback, feedbackComment },\n accessToken\n );\n }\n\n async getConversations(\n pagination: IPagination,\n filter: IConversationsFilters,\n accessToken?: string\n ): Promise<{\n pageInfo: IPageInfo;\n data: IConversation[];\n }> {\n const res = await this.post(\n `/project/conversations`,\n { pagination, filter },\n accessToken\n );\n\n return res.json();\n }\n\n async deleteConversation(conversationId: string, accessToken?: string) {\n const res = await this.delete(\n `/project/conversation`,\n { conversationId },\n accessToken\n );\n\n return res.json();\n }\n\n getLogoEndpoint(theme: string) {\n return this.buildEndpoint(`/logo?theme=${theme}`);\n }\n\n getOAuthEndpoint(provider: string) {\n return this.buildEndpoint(`/auth/oauth/${provider}`);\n }\n}\n","export * from './useChatData';\nexport * from './useChatInteract';\nexport * from './useChatMessages';\nexport * from './useChatSession';\nexport * from './api';\nexport * from './types';\nexport * from './state';\nexport * from './utils/message';\n\nexport { Socket } from 'socket.io-client';\n"]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { atom, selector, DefaultValue, useRecoilValue, useResetRecoilState, useSetRecoilState, useRecoilState } from 'recoil';
|
|
2
|
+
import Y from 'lodash/isEqual';
|
|
3
|
+
import { v4 } from 'uuid';
|
|
4
|
+
import { useCallback, useEffect } from 'react';
|
|
5
|
+
import De from 'lodash/debounce';
|
|
6
|
+
import Re from 'socket.io-client';
|
|
7
|
+
export { Socket } from 'socket.io-client';
|
|
8
|
+
import Le from 'jwt-decode';
|
|
9
|
+
import Ue from 'swr';
|
|
10
|
+
|
|
11
|
+
var ce=s=>{let e={},t=new Date,n=new Date;n.setDate(t.getDate()-1);let o=new Date;o.setDate(t.getDate()-7);let r=new Date;return r.setDate(t.getDate()-30),s.forEach(a=>{let g=new Date(a.createdAt),d=g.toDateString()===t.toDateString(),p=g.toDateString()===n.toDateString(),h=g>=o,S=g>=r,f;d?f="Today":p?f="Yesterday":h?f="Previous 7 days":S?f="Previous 30 days":f=g.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),e[f]||(e[f]=[]),e[f].push(a);}),e};var O=atom({key:"ConversationIdToResume",default:void 0}),de=atom({key:"ChatProfile",default:void 0}),ue=atom({key:"SessionId",default:v4()}),q=selector({key:"SessionIdSelector",get:({get:s})=>s(ue),set:({set:s},e)=>s(ue,e instanceof DefaultValue?v4():e)}),T=atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),E=atom({key:"Actions",default:[]}),D=atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),N=atom({key:"TokenCount",default:0}),P=atom({key:"Loading",default:!1}),R=atom({key:"AskUser",default:void 0}),A=atom({key:"ChatSettings",default:[]}),Z=selector({key:"ChatSettingsValue/Default",get:({get:s})=>s(A).reduce((t,n)=>(t[n.id]=n.initial,t),{})}),_=atom({key:"ChatSettingsValue",default:Z}),U=atom({key:"DisplayElements",default:[]}),w=atom({key:"AvatarElements",default:[]}),L=atom({key:"TasklistElements",default:[]}),V=atom({key:"FirstUserMessage",default:void 0}),W=atom({key:"AccessToken",default:void 0}),qe=atom({key:"Role",default:void 0}),fe=atom({key:"User",default:null}),pe=atom({key:"ConversationsHistory",default:{conversations:void 0,currentConversationId:void 0,groupedConversations:void 0,pageInfo:void 0},effects:[({setSelf:s,onSet:e})=>{e((t,n)=>{let o=t?.groupedConversations;t?.conversations&&!Y(t.conversations,n?.groupedConversations)&&(o=ce(t.conversations)),s({...t,groupedConversations:o});});}]});var ze=()=>{let s=useRecoilValue(P),e=useRecoilValue(U),t=useRecoilValue(w),n=useRecoilValue(L),o=useRecoilValue(E),r=useRecoilValue(T),a=useRecoilValue(R),g=useRecoilValue(A),d=useRecoilValue(_),p=useRecoilValue(Z),h=r?.socket.connected&&!r?.error,S=!h||s||a?.spec.type==="file"||a?.spec.type==="action";return {actions:o,askUser:a,avatars:t,chatSettingsDefaultValue:p,chatSettingsInputs:g,chatSettingsValue:d,connected:h,disabled:S,elements:e,error:r?.error,loading:s,tasklists:n}};var Ge=s=>{let e=[];for(let t of s)e=x(e,t);return e},Ke=(s,e)=>{if(s.length-1===e)return !0;for(let t=e+1;t<s.length;t++)if(!s[t].streaming)return !1;return !0},x=(s,e)=>H(s,e.id)?z(s,e.id,e):e.parentId?he(s,e.parentId,e):e.indent&&e.indent>0?me(s,e.indent,e):[...s,e],me=(s,e,t,n=0)=>{let o=[...s];if(o.length===0)return [...o,t];{let r=o.length-1,a=o[r];return a.subMessages=a.subMessages||[],n+1===e?(a.subMessages=[...a.subMessages,t],o[r]={...a},o):(a.subMessages=me(a.subMessages,e,t,n+1),o[r]={...a},o)}},he=(s,e,t)=>{let n=[...s];for(let o=0;o<n.length;o++){let r=n[o];Y(r.id,e)?(r.subMessages=r.subMessages?[...r.subMessages,t]:[t],n[o]={...r}):H(n,e)&&r.subMessages&&(r.subMessages=he(r.subMessages,e,t),n[o]={...r});}return n},H=(s,e)=>{for(let t of s){if(Y(t.id,e))return !0;if(t.subMessages&&t.subMessages.length>0&&H(t.subMessages,e))return !0}return !1},z=(s,e,t)=>{let n=[...s];for(let o=0;o<n.length;o++){let r=n[o];Y(r.id,e)?n[o]={subMessages:r.subMessages,...t}:H(n,e)&&r.subMessages&&(r.subMessages=z(r.subMessages,e,t),n[o]={...r});}return n},ee=(s,e)=>{let t=[...s];for(let n=0;n<t.length;n++){let o=t[n];o.id===e?t=[...t.slice(0,n),...t.slice(n+1)]:H(t,e)&&o.subMessages&&(o.subMessages=ee(o.subMessages,e),t[n]={...o});}return t},te=(s,e,t,n)=>{let o=[...s];for(let r=0;r<o.length;r++){let a=o[r];Y(a.id,e)?(n?a.content=t:a.content+=t,o[r]={...a}):a.subMessages&&(a.subMessages=te(a.subMessages,e,t,n),o[r]={...a});}return o};var nt=()=>{let s=useRecoilValue(T),e=useRecoilValue(R),t=useResetRecoilState(A),n=useResetRecoilState(q),o=useResetRecoilState(_),r=useSetRecoilState(V),a=useSetRecoilState(P),g=useSetRecoilState(D),d=useSetRecoilState(U),p=useSetRecoilState(w),h=useSetRecoilState(L),S=useSetRecoilState(E),f=useSetRecoilState(N),y=useSetRecoilState(O),v=useCallback(()=>{s?.socket.emit("clear_session"),s?.socket.disconnect(),y(void 0),n(),r(void 0),g([]),d([]),p([]),h([]),S([]),f(0),t(),o();},[s]),B=useCallback((I,F)=>{g(Q=>x(Q,I)),s?.socket.emit("ui_message",{message:I,files:F});},[s]),G=useCallback(I=>{e&&(g(F=>x(F,I)),e.callback(I));},[e,s]),$=useCallback(I=>{s?.socket.emit("chat_settings_change",I);},[s]),K=useCallback(()=>{a(!1),s?.socket.emit("stop");},[s]);return {callAction:useCallback(I=>{s?.socket.emit("action_call",I);},[s]),clear:v,replyMessage:G,sendMessage:B,stopTask:K,setIdToResume:y,updateChatSettings:$}};var it=()=>{let s=useRecoilValue(D),e=useRecoilValue(V);return {messages:s,firstUserMessage:e}};var mt=()=>{let s=useRecoilValue(q),[e,t]=useRecoilState(T),n=useResetRecoilState(_),o=useSetRecoilState(V),r=useSetRecoilState(P),a=useSetRecoilState(D),g=useSetRecoilState(R),d=useSetRecoilState(U),p=useSetRecoilState(w),h=useSetRecoilState(L),S=useSetRecoilState(E),f=useSetRecoilState(A),y=useSetRecoilState(N),[v,B]=useRecoilState(de),G=useRecoilValue(O),$=useCallback(({wsEndpoint:I,userEnv:F,accessToken:Q})=>{let l=Re(I,{path:"/ws/socket.io",extraHeaders:{Authorization:Q||"","X-Chainlit-Session-Id":s,"X-Chainlit-Conversation-Id":G||"","user-env":JSON.stringify(F),"X-Chainlit-Chat-Profile":v||""}});t(i=>(i?.socket?.removeAllListeners(),i?.socket?.close(),{socket:l})),l.on("connect",()=>{l.emit("connection_successful"),t(i=>({...i,error:!1}));}),l.on("connect_error",i=>{t(c=>({...c,error:!0}));}),l.on("task_start",()=>{r(!0);}),l.on("task_end",()=>{r(!1);}),l.on("reload",()=>{l.emit("clear_session"),window.location.reload();}),l.on("resume_conversation",i=>{let c=[];for(let u of i.messages)c=x(c,u);i.metadata?.chat_profile&&B(i.metadata?.chat_profile),a(c),p(i.elements.filter(u=>u.type==="avatar")),h(i.elements.filter(u=>u.type==="tasklist")),d(i.elements.filter(u=>["avatar","tasklist"].indexOf(u.type)===-1));}),l.on("new_message",i=>{a(c=>x(c,i));}),l.on("init_conversation",i=>{o(i);}),l.on("update_message",i=>{a(c=>z(c,i.id,i));}),l.on("delete_message",i=>{a(c=>ee(c,i.id));}),l.on("stream_start",i=>{a(c=>x(c,i));}),l.on("stream_token",({id:i,token:c,isSequence:u})=>{a(C=>te(C,i,c,u));}),l.on("ask",({msg:i,spec:c},u)=>{g({spec:c,callback:u}),a(C=>x(C,i)),r(!1);}),l.on("ask_timeout",()=>{g(void 0),r(!1);}),l.on("clear_ask",()=>{g(void 0);}),l.on("chat_settings",i=>{f(i),n();}),l.on("element",i=>{i.type==="avatar"?p(c=>[...c,i]):i.type==="tasklist"?h(c=>[...c,i]):d(c=>[...c,i]);}),l.on("update_element",i=>{d(c=>{let u=c.findIndex(Ce=>Ce.id===i.id);if(u===-1)return c;let Ae={...c[u],forIds:i.forIds};return [...c.slice(0,u),Ae,...c.slice(u+1)]});}),l.on("remove_element",i=>{d(c=>c.filter(u=>u.id!==i.id)),h(c=>c.filter(u=>u.id!==i.id)),p(c=>c.filter(u=>u.id!==i.id));}),l.on("action",i=>{S(c=>[...c,i]);}),l.on("remove_action",i=>{S(c=>{let u=c.findIndex(C=>C.id===i.id);return u===-1?c:[...c.slice(0,u),...c.slice(u+1)]});}),l.on("token_usage",i=>{y(c=>c+i);});},[t,s,v]),K=useCallback(De($,200),[$]),ie=useCallback(()=>{e?.socket&&(e.socket.removeAllListeners(),e.socket.close());},[e]);return {connect:K,disconnect:ie,chatProfile:v,setChatProfile:B}};var oe="token";function re(){try{return localStorage.getItem(oe)}catch{return}}function Me(s){try{return localStorage.setItem(oe,s)}catch{return}}function X(){try{return localStorage.removeItem(oe)}catch{return}}var we=async(s,e,t)=>(await s.get(e,t))?.json();function xe(s,e,t){let n=useRecoilValue(W);return Ue(e?[e,n]:null,([o,r])=>we(s,o,r),t)}var Dt=s=>{let{data:e,isLoading:t}=xe(s,"/auth/config"),[n,o]=useRecoilState(W),r=useSetRecoilState(pe),[a,g]=useRecoilState(fe),d=!!(!t&&e),p=()=>{g(null),X(),o(""),r(void 0);},h=f=>{if(!f){p();return}try{let{exp:y,...v}=Le(f);Me(f),o(`Bearer ${f}`),g(v);}catch(y){console.error("Invalid token, clearing token from local storage","error:",y),p();}};useEffect(()=>{if(!a&&re()){h(re());return}},[]);let S=!!n;return e&&!e.requireLogin?{data:e,user:null,role:"ANONYMOUS",isReady:d,isAuthenticated:!0,accessToken:"",logout:()=>{},setAccessToken:()=>{}}:{data:e,user:a,role:a?.role,isAuthenticated:S,isReady:d,accessToken:n,logout:p,setAccessToken:h}};var J=class extends Error{constructor(t,n){super(t);this.detail=n;}toString(){return this.detail?`${this.message}: ${this.detail}`:this.message}},ae=class{constructor(e,t,n){this.httpEndpoint=e;this.on401=t;this.onError=n;}buildEndpoint(e){return this.httpEndpoint.endsWith("/")?`${this.httpEndpoint.slice(0,-1)}${e}`:`${this.httpEndpoint}${e}`}checkToken(e){let t="Bearer ";return e.startsWith(t)?e:t+e}async fetch(e,t,n,o,r){try{let a={};n&&(a.Authorization=this.checkToken(n));let g;o instanceof FormData?g=o:(a["Content-Type"]="application/json",g=o?JSON.stringify(o):null);let d=await fetch(this.buildEndpoint(t),{method:e,headers:a,signal:r,body:g});if(!d.ok){let p=await d.json();throw d.status===401&&this.on401&&(X(),this.on401()),new J(d.statusText,p.detail)}return d}catch(a){throw a instanceof J&&this.onError&&this.onError(a),console.error(a),a}}async get(e,t){return await this.fetch("GET",e,t)}async post(e,t,n,o){return await this.fetch("POST",e,n,t,o)}async put(e,t,n){return await this.fetch("PUT",e,n,t)}async patch(e,t,n){return await this.fetch("PATCH",e,n,t)}async delete(e,t,n){return await this.fetch("DELETE",e,n,t)}},ve=class extends ae{async headerAuth(){return (await this.post("/auth/header",{})).json()}async passwordAuth(e){return (await this.post("/login",e)).json()}async getCompletion(e,t={},n,o,r){let g=(await this.post("/completion",{prompt:e,userEnv:t},o,n.signal))?.body?.getReader();return new ReadableStream({start(p){function h(){g.read().then(({done:S,value:f})=>{if(S){p.close(),r&&r(S,"");return}let y=new TextDecoder("utf-8").decode(f);r&&r(S,y),p.enqueue(f),h();}).catch(S=>{p.close(),r&&r(!0,""),console.error(S);});}h();}})}async setHumanFeedback(e,t,n,o){await this.put("/message/feedback",{messageId:e,feedback:t,feedbackComment:n},o);}async getConversations(e,t,n){return (await this.post("/project/conversations",{pagination:e,filter:t},n)).json()}async deleteConversation(e,t){return (await this.delete("/project/conversation",{conversationId:e},t)).json()}getLogoEndpoint(e){return this.buildEndpoint(`/logo?theme=${e}`)}getOAuthEndpoint(e){return this.buildEndpoint(`/auth/oauth/${e}`)}};
|
|
12
|
+
|
|
13
|
+
export { ae as APIBase, ve as ChainlitAPI, J as ClientError, W as accessTokenState, E as actionState, x as addMessage, he as addMessageToParent, R as askUserState, w as avatarState, de as chatProfileState, Z as chatSettingsDefaultValueSelector, A as chatSettingsInputsState, _ as chatSettingsValueState, O as conversationIdToResumeState, pe as conversationsHistoryState, ee as deleteMessageById, U as elementState, we as fetcher, V as firstUserMessageState, H as hasMessageById, Ke as isLastMessage, P as loadingState, D as messagesState, Ge as nestMessages, qe as roleState, q as sessionIdState, T as sessionState, L as tasklistState, N as tokenCountState, z as updateMessageById, te as updateMessageContentById, xe as useApi, Dt as useAuth, ze as useChatData, nt as useChatInteract, it as useChatMessages, mt as useChatSession, fe as userState };
|
|
14
|
+
//# sourceMappingURL=out.js.map
|
|
15
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/useChatData.ts","../src/state.ts","../src/utils/group.ts","../src/useChatInteract.ts","../src/utils/message.ts","../src/useChatMessages.ts","../src/useChatSession.ts","../src/utils/token.ts","../src/api/hooks/auth.ts","../src/api/hooks/api.ts","../src/api/index.tsx","../src/index.ts"],"names":["useRecoilValue","isEqual","DefaultValue","atom","selector","uuidv4","groupByDate","data","groupedData","today","yesterday","sevenDaysAgo","thirtyDaysAgo","item","createdAt","isToday","isYesterday","isLast7Days","isLast30Days","category","conversationIdToResumeState","chatProfileState","sessionIdAtom","sessionIdState","get","set","newValue","sessionState","actionState","messagesState","tokenCountState","loadingState","askUserState","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","avatarState","tasklistState","firstUserMessageState","accessTokenState","roleState","userState","conversationsHistoryState","setSelf","onSet","oldValue","groupedConversations","useChatData","loading","elements","avatars","tasklists","actions","session","askUser","chatSettingsInputs","chatSettingsValue","chatSettingsDefaultValue","connected","disabled","useCallback","useResetRecoilState","useSetRecoilState","nestMessages","messages","nestedMessages","message","addMessage","isLastMessage","index","i","hasMessageById","updateMessageById","addMessageToParent","addIndentMessage","indent","newMessage","currentIndentation","nextMessages","msg","parentId","messageId","updatedMessage","deleteMessageById","updateMessageContentById","updatedContent","isSequence","useChatInteract","resetChatSettings","resetSessionId","resetChatSettingsValue","setFirstUserMessage","setLoading","setMessages","setElements","setAvatars","setTasklists","setActions","setTokenCount","setIdToResume","clear","sendMessage","files","oldMessages","replyMessage","updateChatSettings","values","stopTask","action","useChatMessages","firstUserMessage","debounce","useRecoilState","io","useChatSession","sessionId","setSession","setAskUser","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","wsEndpoint","userEnv","accessToken","socket","old","s","_","conversation","e","id","token","spec","callback","inputs","element","update","newElement","remove","a","count","connect","disconnect","tokenKey","getToken","setToken","removeToken","jwt_decode","useEffect","useSWR","fetcher","client","endpoint","useApi","path","options","url","useAuth","apiClient","isLoading","setAccessToken","setConversationsHistory","user","setUser","isReady","logout","saveAndSetToken","exp","AppUser","isAuthenticated","ClientError","detail","APIBase","httpEndpoint","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","prompt","controller","tokenCb","reader","push","done","value","string","err","feedback","feedbackComment","pagination","filter","conversationId","theme","provider","Socket"],"mappings":"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","sourcesContent":["import { useRecoilValue } from 'recoil';\nimport { IMessage } from 'src/types';\n\nimport {\n actionState,\n askUserState,\n avatarState,\n chatSettingsDefaultValueSelector,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n loadingState,\n sessionState,\n tasklistState\n} from './state';\n\nexport interface IMessageUpdate extends IMessage {\n newId?: string;\n}\n\nexport interface IToken {\n id: number | string;\n token: string;\n isSequence: boolean;\n}\n\nconst useChatData = () => {\n const loading = useRecoilValue(loadingState);\n const elements = useRecoilValue(elementState);\n const avatars = useRecoilValue(avatarState);\n const tasklists = useRecoilValue(tasklistState);\n const actions = useRecoilValue(actionState);\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n const chatSettingsInputs = useRecoilValue(chatSettingsInputsState);\n const chatSettingsValue = useRecoilValue(chatSettingsValueState);\n const chatSettingsDefaultValue = useRecoilValue(\n chatSettingsDefaultValueSelector\n );\n\n const connected = session?.socket.connected && !session?.error;\n const disabled =\n !connected ||\n loading ||\n askUser?.spec.type === 'file' ||\n askUser?.spec.type === 'action';\n\n return {\n actions,\n askUser,\n avatars,\n chatSettingsDefaultValue,\n chatSettingsInputs,\n chatSettingsValue,\n connected,\n disabled,\n elements,\n error: session?.error,\n loading,\n tasklists\n };\n};\n\nexport { useChatData };\n","import isEqual from 'lodash/isEqual';\nimport { DefaultValue, atom, selector } from 'recoil';\nimport { Socket } from 'socket.io-client';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n ConversationsHistory,\n IAction,\n IAppUser,\n IAsk,\n IAvatarElement,\n IMessage,\n IMessageElement,\n ITasklistElement,\n Role\n} from './types';\nimport { groupByDate } from './utils/group';\n\nexport interface ISession {\n socket: Socket;\n error?: boolean;\n}\n\nexport const conversationIdToResumeState = atom<string | undefined>({\n key: 'ConversationIdToResume',\n default: undefined\n});\n\nexport const chatProfileState = atom<string | undefined>({\n key: 'ChatProfile',\n default: undefined\n});\n\nconst sessionIdAtom = atom<string>({\n key: 'SessionId',\n default: uuidv4()\n});\n\nexport const sessionIdState = selector({\n key: 'SessionIdSelector',\n get: ({ get }) => get(sessionIdAtom),\n set: ({ set }, newValue) =>\n set(sessionIdAtom, newValue instanceof DefaultValue ? uuidv4() : newValue)\n});\n\nexport const sessionState = atom<ISession | undefined>({\n key: 'Session',\n dangerouslyAllowMutability: true,\n default: undefined\n});\n\nexport const actionState = atom<IAction[]>({\n key: 'Actions',\n default: []\n});\n\nexport const messagesState = atom<IMessage[]>({\n key: 'Messages',\n dangerouslyAllowMutability: true,\n default: []\n});\n\nexport const tokenCountState = atom<number>({\n key: 'TokenCount',\n default: 0\n});\n\nexport const loadingState = atom<boolean>({\n key: 'Loading',\n default: false\n});\n\nexport const askUserState = atom<IAsk | undefined>({\n key: 'AskUser',\n default: undefined\n});\n\nexport const chatSettingsInputsState = atom<any>({\n key: 'ChatSettings',\n default: []\n});\n\nexport const chatSettingsDefaultValueSelector = selector({\n key: 'ChatSettingsValue/Default',\n get: ({ get }) => {\n const chatSettings = get(chatSettingsInputsState);\n return chatSettings.reduce(\n (form: { [key: string]: any }, input: any) => (\n (form[input.id] = input.initial), form\n ),\n {}\n );\n }\n});\n\nexport const chatSettingsValueState = atom({\n key: 'ChatSettingsValue',\n default: chatSettingsDefaultValueSelector\n});\n\nexport const elementState = atom<IMessageElement[]>({\n key: 'DisplayElements',\n default: []\n});\n\nexport const avatarState = atom<IAvatarElement[]>({\n key: 'AvatarElements',\n default: []\n});\n\nexport const tasklistState = atom<ITasklistElement[]>({\n key: 'TasklistElements',\n default: []\n});\n\nexport const firstUserMessageState = atom<IMessage | undefined>({\n key: 'FirstUserMessage',\n default: undefined\n});\n\nexport const accessTokenState = atom<string | undefined>({\n key: 'AccessToken',\n default: undefined\n});\n\nexport const roleState = atom<Role>({\n key: 'Role',\n default: undefined\n});\n\nexport const userState = atom<IAppUser | null>({\n key: 'User',\n default: null\n});\n\nexport const conversationsHistoryState = atom<ConversationsHistory | undefined>(\n {\n key: 'ConversationsHistory',\n default: {\n conversations: undefined,\n currentConversationId: undefined,\n groupedConversations: undefined,\n pageInfo: undefined\n },\n effects: [\n ({ setSelf, onSet }: { setSelf: any; onSet: any }) => {\n onSet(\n (\n newValue: ConversationsHistory | undefined,\n oldValue: ConversationsHistory | undefined\n ) => {\n let groupedConversations = newValue?.groupedConversations;\n\n if (\n newValue?.conversations &&\n !isEqual(newValue.conversations, oldValue?.groupedConversations)\n ) {\n groupedConversations = groupByDate(newValue.conversations);\n }\n\n setSelf({\n ...newValue,\n groupedConversations\n });\n }\n );\n }\n ]\n }\n);\n","import { IConversation } from 'src/types';\n\nexport const groupByDate = (data: IConversation[]) => {\n const groupedData: { [key: string]: IConversation[] } = {};\n\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n const sevenDaysAgo = new Date();\n sevenDaysAgo.setDate(today.getDate() - 7);\n const thirtyDaysAgo = new Date();\n thirtyDaysAgo.setDate(today.getDate() - 30);\n\n data.forEach((item) => {\n const createdAt = new Date(item.createdAt);\n const isToday = createdAt.toDateString() === today.toDateString();\n const isYesterday = createdAt.toDateString() === yesterday.toDateString();\n const isLast7Days = createdAt >= sevenDaysAgo;\n const isLast30Days = createdAt >= thirtyDaysAgo;\n\n let category: string;\n\n if (isToday) {\n category = 'Today';\n } else if (isYesterday) {\n category = 'Yesterday';\n } else if (isLast7Days) {\n category = 'Previous 7 days';\n } else if (isLast30Days) {\n category = 'Previous 30 days';\n } else {\n const monthYear = createdAt.toLocaleString('default', {\n month: 'long',\n year: 'numeric'\n });\n\n category = monthYear.split(' ').slice(0, 1).join(' ');\n }\n\n if (!groupedData[category]) {\n groupedData[category] = [];\n }\n\n groupedData[category].push(item);\n });\n\n return groupedData;\n};\n","import { useCallback } from 'react';\nimport { useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil';\nimport {\n actionState,\n askUserState,\n avatarState,\n chatSettingsInputsState,\n chatSettingsValueState,\n conversationIdToResumeState,\n elementState,\n firstUserMessageState,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n tasklistState,\n tokenCountState\n} from 'src/state';\nimport { IAction, IFileElement, IMessage } from 'src/types';\nimport { addMessage } from 'src/utils/message';\n\nconst useChatInteract = () => {\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n\n const resetChatSettings = useResetRecoilState(chatSettingsInputsState);\n const resetSessionId = useResetRecoilState(sessionIdState);\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n\n const setFirstUserMessage = useSetRecoilState(firstUserMessageState);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const setIdToResume = useSetRecoilState(conversationIdToResumeState);\n\n const clear = useCallback(() => {\n session?.socket.emit('clear_session');\n session?.socket.disconnect();\n setIdToResume(undefined);\n resetSessionId();\n setFirstUserMessage(undefined);\n setMessages([]);\n setElements([]);\n setAvatars([]);\n setTasklists([]);\n setActions([]);\n setTokenCount(0);\n resetChatSettings();\n resetChatSettingsValue();\n }, [session]);\n\n const sendMessage = useCallback(\n (message: IMessage, files?: IFileElement[]) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n\n session?.socket.emit('ui_message', { message, files });\n },\n [session]\n );\n\n const replyMessage = useCallback(\n (message: IMessage) => {\n if (askUser) {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n askUser.callback(message);\n }\n },\n [askUser, session]\n );\n\n const updateChatSettings = useCallback(\n (values: object) => {\n session?.socket.emit('chat_settings_change', values);\n },\n [session]\n );\n\n const stopTask = useCallback(() => {\n setLoading(false);\n session?.socket.emit('stop');\n }, [session]);\n\n const callAction = useCallback(\n (action: IAction) => {\n session?.socket.emit('action_call', action);\n },\n [session]\n );\n\n return {\n callAction,\n clear,\n replyMessage,\n sendMessage,\n stopTask,\n setIdToResume,\n updateChatSettings\n };\n};\n\nexport { useChatInteract };\n","import isEqual from 'lodash/isEqual';\nimport { IMessage } from 'src/types';\n\nconst nestMessages = (messages: IMessage[]): IMessage[] => {\n let nestedMessages: IMessage[] = [];\n\n for (const message of messages) {\n nestedMessages = addMessage(nestedMessages, message);\n }\n\n return nestedMessages;\n};\n\nconst isLastMessage = (messages: IMessage[], index: number) => {\n if (messages.length - 1 === index) {\n return true;\n }\n\n for (let i = index + 1; i < messages.length; i++) {\n if (messages[i].streaming) {\n continue;\n } else {\n return false;\n }\n }\n\n return true;\n};\n\n// Nested messages utils\n\nconst addMessage = (messages: IMessage[], message: IMessage): IMessage[] => {\n if (hasMessageById(messages, message.id)) {\n return updateMessageById(messages, message.id, message);\n } else if (message.parentId) {\n return addMessageToParent(messages, message.parentId, message);\n } else if (message.indent && message.indent > 0) {\n return addIndentMessage(messages, message.indent, message);\n } else {\n return [...messages, message];\n }\n};\n\nconst addIndentMessage = (\n messages: IMessage[],\n indent: number,\n newMessage: IMessage,\n currentIndentation: number = 0\n): IMessage[] => {\n const nextMessages = [...messages];\n\n if (nextMessages.length === 0) {\n return [...nextMessages, newMessage];\n } else {\n const index = nextMessages.length - 1;\n const msg = nextMessages[index];\n msg.subMessages = msg.subMessages || [];\n\n if (currentIndentation + 1 === indent) {\n msg.subMessages = [...msg.subMessages, newMessage];\n nextMessages[index] = { ...msg };\n\n return nextMessages;\n } else {\n msg.subMessages = addIndentMessage(\n msg.subMessages,\n indent,\n newMessage,\n currentIndentation + 1\n );\n\n nextMessages[index] = { ...msg };\n return nextMessages;\n }\n }\n};\n\nconst addMessageToParent = (\n messages: IMessage[],\n parentId: string,\n newMessage: IMessage\n): IMessage[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, parentId)) {\n msg.subMessages = msg.subMessages\n ? [...msg.subMessages, newMessage]\n : [newMessage];\n nextMessages[index] = { ...msg };\n } else if (hasMessageById(nextMessages, parentId) && msg.subMessages) {\n msg.subMessages = addMessageToParent(\n msg.subMessages,\n parentId,\n newMessage\n );\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst hasMessageById = (messages: IMessage[], messageId: string) => {\n for (const message of messages) {\n if (isEqual(message.id, messageId)) {\n return true;\n } else if (message.subMessages && message.subMessages.length > 0) {\n if (hasMessageById(message.subMessages, messageId)) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst updateMessageById = (\n messages: IMessage[],\n messageId: string,\n updatedMessage: IMessage\n): IMessage[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, messageId)) {\n nextMessages[index] = { subMessages: msg.subMessages, ...updatedMessage };\n } else if (hasMessageById(nextMessages, messageId) && msg.subMessages) {\n msg.subMessages = updateMessageById(\n msg.subMessages,\n messageId,\n updatedMessage\n );\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst deleteMessageById = (messages: IMessage[], messageId: string) => {\n let nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (msg.id === messageId) {\n nextMessages = [\n ...nextMessages.slice(0, index),\n ...nextMessages.slice(index + 1)\n ];\n } else if (hasMessageById(nextMessages, messageId) && msg.subMessages) {\n msg.subMessages = deleteMessageById(msg.subMessages, messageId);\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst updateMessageContentById = (\n messages: IMessage[],\n messageId: number | string,\n updatedContent: string,\n isSequence: boolean\n): IMessage[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, messageId)) {\n if (isSequence) {\n msg.content = updatedContent;\n } else {\n msg.content += updatedContent;\n }\n\n nextMessages[index] = { ...msg };\n } else if (msg.subMessages) {\n msg.subMessages = updateMessageContentById(\n msg.subMessages,\n messageId,\n updatedContent,\n isSequence\n );\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nexport {\n addMessageToParent,\n addMessage,\n deleteMessageById,\n hasMessageById,\n isLastMessage,\n nestMessages,\n updateMessageById,\n updateMessageContentById\n};\n","import { useRecoilValue } from 'recoil';\n\nimport { firstUserMessageState, messagesState } from './state';\n\nconst useChatMessages = () => {\n const messages = useRecoilValue(messagesState);\n const firstUserMessage = useRecoilValue(firstUserMessageState);\n\n return {\n messages,\n firstUserMessage\n };\n};\n\nexport { useChatMessages };\n","import debounce from 'lodash/debounce';\nimport { useCallback } from 'react';\nimport {\n useRecoilState,\n useRecoilValue,\n useResetRecoilState,\n useSetRecoilState\n} from 'recoil';\nimport io from 'socket.io-client';\nimport {\n actionState,\n askUserState,\n avatarState,\n chatProfileState,\n chatSettingsInputsState,\n chatSettingsValueState,\n conversationIdToResumeState,\n elementState,\n firstUserMessageState,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n tasklistState,\n tokenCountState\n} from 'src/state';\nimport {\n IAction,\n IAvatarElement,\n IConversation,\n IElement,\n IMessage,\n IMessageElement,\n ITasklistElement\n} from 'src/types';\nimport {\n addMessage,\n deleteMessageById,\n updateMessageById,\n updateMessageContentById\n} from 'src/utils/message';\n\nimport type { IMessageUpdate, IToken } from './useChatData';\n\nconst useChatSession = () => {\n const sessionId = useRecoilValue(sessionIdState);\n\n const [session, setSession] = useRecoilState(sessionState);\n\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n const setFirstUserMessage = useSetRecoilState(firstUserMessageState);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setAskUser = useSetRecoilState(askUserState);\n const setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setChatSettingsInputs = useSetRecoilState(chatSettingsInputsState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const [chatProfile, setChatProfile] = useRecoilState(chatProfileState);\n const idToResume = useRecoilValue(conversationIdToResumeState);\n\n const _connect = useCallback(\n ({\n wsEndpoint,\n userEnv,\n accessToken\n }: {\n wsEndpoint: string;\n userEnv: Record<string, string>;\n accessToken?: string;\n }) => {\n const socket = io(wsEndpoint, {\n path: '/ws/socket.io',\n extraHeaders: {\n Authorization: accessToken || '',\n 'X-Chainlit-Session-Id': sessionId,\n 'X-Chainlit-Conversation-Id': idToResume || '',\n 'user-env': JSON.stringify(userEnv),\n 'X-Chainlit-Chat-Profile': chatProfile || ''\n }\n });\n setSession((old) => {\n old?.socket?.removeAllListeners();\n old?.socket?.close();\n return {\n socket\n };\n });\n\n socket.on('connect', () => {\n socket.emit('connection_successful');\n setSession((s) => ({ ...s!, error: false }));\n });\n\n socket.on('connect_error', (_) => {\n setSession((s) => ({ ...s!, error: true }));\n });\n\n socket.on('task_start', () => {\n setLoading(true);\n });\n\n socket.on('task_end', () => {\n setLoading(false);\n });\n\n socket.on('reload', () => {\n socket.emit('clear_session');\n window.location.reload();\n });\n\n socket.on('resume_conversation', (conversation: IConversation) => {\n let messages: IMessage[] = [];\n for (const message of conversation.messages) {\n messages = addMessage(messages, message);\n }\n if (conversation.metadata?.chat_profile) {\n setChatProfile(conversation.metadata?.chat_profile);\n }\n setMessages(messages);\n setAvatars(\n (conversation.elements as IAvatarElement[]).filter(\n (e) => e.type === 'avatar'\n )\n );\n setTasklists(\n (conversation.elements as ITasklistElement[]).filter(\n (e) => e.type === 'tasklist'\n )\n );\n setElements(\n (conversation.elements as IMessageElement[]).filter(\n (e) => ['avatar', 'tasklist'].indexOf(e.type) === -1\n )\n );\n });\n\n socket.on('new_message', (message: IMessage) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n });\n\n socket.on('init_conversation', (message: IMessage) => {\n setFirstUserMessage(message);\n });\n\n socket.on('update_message', (message: IMessageUpdate) => {\n setMessages((oldMessages) =>\n updateMessageById(oldMessages, message.id, message)\n );\n });\n\n socket.on('delete_message', (message: IMessage) => {\n setMessages((oldMessages) =>\n deleteMessageById(oldMessages, message.id)\n );\n });\n\n socket.on('stream_start', (message: IMessage) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n });\n\n socket.on('stream_token', ({ id, token, isSequence }: IToken) => {\n setMessages((oldMessages) =>\n updateMessageContentById(oldMessages, id, token, isSequence)\n );\n });\n\n socket.on('ask', ({ msg, spec }, callback) => {\n setAskUser({ spec, callback });\n setMessages((oldMessages) => addMessage(oldMessages, msg));\n\n setLoading(false);\n });\n\n socket.on('ask_timeout', () => {\n setAskUser(undefined);\n setLoading(false);\n });\n\n socket.on('clear_ask', () => {\n setAskUser(undefined);\n });\n\n socket.on('chat_settings', (inputs: any) => {\n setChatSettingsInputs(inputs);\n resetChatSettingsValue();\n });\n\n socket.on('element', (element: IElement) => {\n if (element.type === 'avatar') {\n setAvatars((old) => [...old, element]);\n } else if (element.type === 'tasklist') {\n setTasklists((old) => [...old, element]);\n } else {\n setElements((old) => [...old, element]);\n }\n });\n\n socket.on(\n 'update_element',\n (update: { id: string; forIds: string[] }) => {\n setElements((old) => {\n const index = old.findIndex((e) => e.id === update.id);\n if (index === -1) return old;\n const element = old[index];\n const newElement = { ...element, forIds: update.forIds };\n return [\n ...old.slice(0, index),\n newElement,\n ...old.slice(index + 1)\n ];\n });\n }\n );\n\n socket.on('remove_element', (remove: { id: string }) => {\n setElements((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n setTasklists((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n setAvatars((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n });\n\n socket.on('action', (action: IAction) => {\n setActions((old) => [...old, action]);\n });\n\n socket.on('remove_action', (action: IAction) => {\n setActions((old) => {\n const index = old.findIndex((a) => a.id === action.id);\n if (index === -1) return old;\n return [...old.slice(0, index), ...old.slice(index + 1)];\n });\n });\n\n socket.on('token_usage', (count: number) => {\n setTokenCount((old) => old + count);\n });\n },\n [setSession, sessionId, chatProfile]\n );\n\n const connect = useCallback(debounce(_connect, 200), [_connect]);\n\n const disconnect = useCallback(() => {\n if (session?.socket) {\n session.socket.removeAllListeners();\n session.socket.close();\n }\n }, [session]);\n\n return { connect, disconnect, chatProfile, setChatProfile };\n};\n\nexport { useChatSession };\n","const tokenKey = 'token';\n\nexport function getToken() {\n try {\n return localStorage.getItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n\nexport function setToken(token: string) {\n try {\n return localStorage.setItem(tokenKey, token);\n } catch (e) {\n return;\n }\n}\n\nexport function removeToken() {\n try {\n return localStorage.removeItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n","import jwt_decode from 'jwt-decode';\nimport { useEffect } from 'react';\nimport { useRecoilState, useSetRecoilState } from 'recoil';\nimport {\n accessTokenState,\n conversationsHistoryState,\n userState\n} from 'src/state';\nimport { IAppUser } from 'src/types';\nimport { getToken, removeToken, setToken } from 'src/utils/token';\n\nimport { ChainlitAPI } from '..';\nimport { useApi } from './api';\n\nexport const useAuth = (apiClient: ChainlitAPI) => {\n const { data, isLoading } = useApi<{\n requireLogin: boolean;\n passwordAuth: boolean;\n headerAuth: boolean;\n oauthProviders: string[];\n }>(apiClient, '/auth/config');\n const [accessToken, setAccessToken] = useRecoilState(accessTokenState);\n const setConversationsHistory = useSetRecoilState(conversationsHistoryState);\n const [user, setUser] = useRecoilState(userState);\n\n const isReady = !!(!isLoading && data);\n\n const logout = () => {\n setUser(null);\n removeToken();\n setAccessToken('');\n setConversationsHistory(undefined);\n };\n\n const saveAndSetToken = (token: string | null | undefined) => {\n if (!token) {\n logout();\n return;\n }\n try {\n const { exp, ...AppUser } = jwt_decode(token) as any;\n setToken(token);\n setAccessToken(`Bearer ${token}`);\n setUser(AppUser as IAppUser);\n } catch (e) {\n console.error(\n 'Invalid token, clearing token from local storage',\n 'error:',\n e\n );\n logout();\n }\n };\n\n useEffect(() => {\n if (!user && getToken()) {\n // Initialize the token from local storage\n saveAndSetToken(getToken());\n return;\n }\n }, []);\n\n const isAuthenticated = !!accessToken;\n\n if (data && !data.requireLogin) {\n return {\n data,\n user: null,\n role: 'ANONYMOUS',\n isReady,\n isAuthenticated: true,\n accessToken: '',\n logout: () => {},\n setAccessToken: () => {}\n };\n }\n\n return {\n data,\n user: user,\n role: user?.role,\n isAuthenticated,\n isReady,\n accessToken: accessToken,\n logout: logout,\n setAccessToken: saveAndSetToken\n };\n};\n","import { useRecoilValue } from 'recoil';\nimport { ChainlitAPI } from 'src/api';\nimport { accessTokenState } from 'src/state';\nimport useSWR, { SWRConfiguration } from 'swr';\n\nconst fetcher = async (\n client: ChainlitAPI,\n endpoint: string,\n token?: string\n) => {\n const res = await client.get(endpoint, token);\n\n return res?.json();\n};\n\nfunction useApi<T>(\n client: ChainlitAPI,\n path: string | null,\n options?: SWRConfiguration\n) {\n const accessToken = useRecoilValue(accessTokenState);\n\n return useSWR<T, Error>(\n path ? [path, accessToken] : null,\n ([url, token]: [url: string, token: string]) => fetcher(client, url, token),\n options\n );\n}\n\nexport { useApi, fetcher };\n","import { IConversation, IPrompt } from 'src/types';\nimport { removeToken } from 'src/utils/token';\n\nexport * from './hooks/auth';\nexport * from './hooks/api';\n\nexport interface IConversationsFilters {\n authorEmail?: string;\n search?: string;\n feedback?: number;\n}\n\nexport interface IPageInfo {\n hasNextPage: boolean;\n endCursor?: string;\n}\n\nexport interface IPagination {\n first: number;\n cursor?: string | number;\n}\n\nexport class ClientError extends Error {\n detail?: string;\n\n constructor(message: string, detail?: string) {\n super(message);\n this.detail = detail;\n }\n\n toString() {\n if (this.detail) {\n return `${this.message}: ${this.detail}`;\n } else {\n return this.message;\n }\n }\n}\n\ntype Payload = FormData | any;\n\nexport class APIBase {\n constructor(\n public httpEndpoint: string,\n public on401?: () => void,\n public onError?: (error: ClientError) => void\n ) {}\n\n buildEndpoint(path: string) {\n if (this.httpEndpoint.endsWith('/')) {\n // remove trailing slash on httpEndpoint\n return `${this.httpEndpoint.slice(0, -1)}${path}`;\n } else {\n return `${this.httpEndpoint}${path}`;\n }\n }\n\n checkToken(token: string) {\n const prefix = 'Bearer ';\n if (token.startsWith(prefix)) {\n return token;\n } else {\n return prefix + token;\n }\n }\n\n async fetch(\n method: string,\n path: string,\n token?: string,\n data?: Payload,\n signal?: AbortSignal\n ): Promise<Response> {\n try {\n const headers: { Authorization?: string; 'Content-Type'?: string } = {};\n if (token) headers['Authorization'] = this.checkToken(token); // Assuming token is a bearer token\n\n let body;\n\n if (data instanceof FormData) {\n body = data;\n } else {\n headers['Content-Type'] = 'application/json';\n body = data ? JSON.stringify(data) : null;\n }\n\n const res = await fetch(this.buildEndpoint(path), {\n method,\n headers,\n signal,\n body\n });\n\n if (!res.ok) {\n const body = await res.json();\n if (res.status === 401 && this.on401) {\n removeToken();\n this.on401();\n }\n throw new ClientError(res.statusText, body.detail);\n }\n\n return res;\n } catch (error: any) {\n if (error instanceof ClientError && this.onError) {\n this.onError(error);\n }\n console.error(error);\n throw error;\n }\n }\n\n async get(endpoint: string, token?: string) {\n return await this.fetch('GET', endpoint, token);\n }\n\n async post(\n endpoint: string,\n data: Payload,\n token?: string,\n signal?: AbortSignal\n ) {\n return await this.fetch('POST', endpoint, token, data, signal);\n }\n\n async put(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PUT', endpoint, token, data);\n }\n\n async patch(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PATCH', endpoint, token, data);\n }\n\n async delete(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('DELETE', endpoint, token, data);\n }\n}\n\nexport class ChainlitAPI extends APIBase {\n async headerAuth() {\n const res = await this.post(`/auth/header`, {});\n return res.json();\n }\n\n async passwordAuth(data: FormData) {\n const res = await this.post(`/login`, data);\n return res.json();\n }\n\n async getCompletion(\n prompt: IPrompt,\n userEnv = {},\n controller: AbortController,\n accessToken?: string,\n tokenCb?: (done: boolean, token: string) => void\n ) {\n const response = await this.post(\n `/completion`,\n { prompt, userEnv },\n accessToken,\n controller.signal\n );\n\n const reader = response?.body?.getReader();\n\n const stream = new ReadableStream({\n start(controller) {\n function push() {\n reader!\n .read()\n .then(({ done, value }) => {\n if (done) {\n controller.close();\n tokenCb && tokenCb(done, '');\n return;\n }\n const string = new TextDecoder('utf-8').decode(value);\n tokenCb && tokenCb(done, string);\n controller.enqueue(value);\n push();\n })\n .catch((err) => {\n controller.close();\n tokenCb && tokenCb(true, '');\n console.error(err);\n });\n }\n push();\n }\n });\n\n return stream;\n }\n\n async setHumanFeedback(\n messageId: string,\n feedback: number,\n feedbackComment?: string,\n accessToken?: string\n ) {\n await this.put(\n `/message/feedback`,\n { messageId, feedback, feedbackComment },\n accessToken\n );\n }\n\n async getConversations(\n pagination: IPagination,\n filter: IConversationsFilters,\n accessToken?: string\n ): Promise<{\n pageInfo: IPageInfo;\n data: IConversation[];\n }> {\n const res = await this.post(\n `/project/conversations`,\n { pagination, filter },\n accessToken\n );\n\n return res.json();\n }\n\n async deleteConversation(conversationId: string, accessToken?: string) {\n const res = await this.delete(\n `/project/conversation`,\n { conversationId },\n accessToken\n );\n\n return res.json();\n }\n\n getLogoEndpoint(theme: string) {\n return this.buildEndpoint(`/logo?theme=${theme}`);\n }\n\n getOAuthEndpoint(provider: string) {\n return this.buildEndpoint(`/auth/oauth/${provider}`);\n }\n}\n","export * from './useChatData';\nexport * from './useChatInteract';\nexport * from './useChatMessages';\nexport * from './useChatSession';\nexport * from './api';\nexport * from './types';\nexport * from './state';\nexport * from './utils/message';\n\nexport { Socket } from 'socket.io-client';\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@chainlit/react-client",
|
|
3
|
+
"description": "Websocket client to connect to your chainlit app.",
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"build": "tsup src/index.ts --clean --format esm,cjs --dts --external react --external recoil --minify --sourcemap --treeshake",
|
|
7
|
+
"dev": "tsup src/index.ts --clean --format esm,cjs --dts --external react --external recoil --minify --sourcemap --treeshake",
|
|
8
|
+
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
|
9
|
+
"format": "prettier **/*.{ts,tsx} --write --loglevel error",
|
|
10
|
+
"test": "echo no tests yet",
|
|
11
|
+
"prepublish": "pnpm run build"
|
|
12
|
+
},
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "https://github.com/Chainlit/"
|
|
16
|
+
},
|
|
17
|
+
"private": false,
|
|
18
|
+
"keywords": [
|
|
19
|
+
"llm",
|
|
20
|
+
"ai",
|
|
21
|
+
"chain of thought"
|
|
22
|
+
],
|
|
23
|
+
"author": "Chainlit",
|
|
24
|
+
"license": "Apache-2.0",
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"README.md"
|
|
28
|
+
],
|
|
29
|
+
"main": "dist/index.js",
|
|
30
|
+
"module": "dist/index.mjs",
|
|
31
|
+
"types": "dist/index.d.ts",
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@swc/core": "^1.3.86",
|
|
34
|
+
"@testing-library/jest-dom": "^5.17.0",
|
|
35
|
+
"@testing-library/react": "^14.0.0",
|
|
36
|
+
"@types/uuid": "^9.0.3",
|
|
37
|
+
"@vitejs/plugin-react": "^4.0.4",
|
|
38
|
+
"@vitejs/plugin-react-swc": "^3.3.2",
|
|
39
|
+
"@types/lodash": "^4.14.199",
|
|
40
|
+
"jsdom": "^22.1.0",
|
|
41
|
+
"tslib": "^2.6.2",
|
|
42
|
+
"tsup": "^7.2.0",
|
|
43
|
+
"typescript": "^5.2.2",
|
|
44
|
+
"vite": "^4.4.9",
|
|
45
|
+
"vite-tsconfig-paths": "^4.2.0",
|
|
46
|
+
"vitest": "^0.34.4"
|
|
47
|
+
},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"@types/react": "^18.2.0",
|
|
50
|
+
"react": "^18.2.0",
|
|
51
|
+
"react-dom": "^18.2.0",
|
|
52
|
+
"recoil": "^0.7.7"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"socket.io-client": "^4.7.2",
|
|
56
|
+
"jwt-decode": "^3.1.2",
|
|
57
|
+
"swr": "^2.2.2",
|
|
58
|
+
"lodash": "^4.17.21",
|
|
59
|
+
"uuid": "^9.0.0"
|
|
60
|
+
}
|
|
61
|
+
}
|