@ant-design-x-vue/x-sdk 0.0.0-stage → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -2
- package/dist/index.d.ts +518 -0
- package/dist/index.js +4 -0
- package/dist/index.mjs +775 -0
- package/package.json +63 -4
package/README.md
CHANGED
|
@@ -1,3 +1,38 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @ant-design-x-vue/x-sdk
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
SDK toolkit for ant-design-x-vue, providing utilities for AI-powered applications.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **useXChat** - Vue composable for managing chat messages
|
|
8
|
+
- **useXConversations** - Vue composable for managing conversations
|
|
9
|
+
- **XRequest** - HTTP request utility with streaming support
|
|
10
|
+
- **XStream** - SSE (Server-Sent Events) stream parser
|
|
11
|
+
- **XMcpClient** - Model Context Protocol client
|
|
12
|
+
- **Chat Providers** - Pre-built providers for OpenAI, DeepSeek, etc.
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pnpm add @ant-design-x-vue/x-sdk
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { useXChat, useXConversations, XRequest, XStream } from '@ant-design-x-vue/x-sdk';
|
|
24
|
+
|
|
25
|
+
// Use chat composable
|
|
26
|
+
const { messages, addMessage } = useXChat();
|
|
27
|
+
|
|
28
|
+
// Use conversations composable
|
|
29
|
+
const { conversations, activeId, addConversation } = useXConversations();
|
|
30
|
+
|
|
31
|
+
// Use XRequest for API calls
|
|
32
|
+
const request = XRequest({ baseURL: 'https://api.example.com' });
|
|
33
|
+
const data = await request.request('/endpoint');
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## License
|
|
37
|
+
|
|
38
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
import { ComputedRef } from 'vue';
|
|
2
|
+
import { ShallowRef } from 'vue';
|
|
3
|
+
|
|
4
|
+
export declare abstract class AbstractChatProvider<ChatMessage, Input, Output> {
|
|
5
|
+
private _request;
|
|
6
|
+
private _getMessagesFn;
|
|
7
|
+
private _originalCallbacks?;
|
|
8
|
+
get request(): AbstractXRequestClass<Input, Output>;
|
|
9
|
+
constructor(config: ChatProviderConfig<Input, Output>);
|
|
10
|
+
abstract transformParams(requestParams: Partial<Input>, options: XRequestOptions<Input, Output>): Input;
|
|
11
|
+
abstract transformLocalMessage(requestParams: Partial<Input>): ChatMessage | ChatMessage[];
|
|
12
|
+
abstract transformMessage(info: TransformMessage<ChatMessage, Output>): ChatMessage;
|
|
13
|
+
getMessages(): ChatMessage[];
|
|
14
|
+
injectGetMessages(getMessages: () => ChatMessage[]): void;
|
|
15
|
+
injectRequest({ onUpdate, onSuccess, onError, }: {
|
|
16
|
+
onUpdate: (data: Output, responseHeaders: Headers) => void;
|
|
17
|
+
onSuccess: (data: Output[], responseHeaders: Headers) => void;
|
|
18
|
+
onError: (error: any) => void;
|
|
19
|
+
}): void;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export declare abstract class AbstractXRequestClass<Input, Output> {
|
|
23
|
+
baseURL: string;
|
|
24
|
+
options: XRequestOptions<Input, Output>;
|
|
25
|
+
constructor(baseURL: string, options?: XRequestOptions<Input, Output>);
|
|
26
|
+
abstract get asyncHandler(): Promise<any>;
|
|
27
|
+
abstract get isTimeout(): boolean;
|
|
28
|
+
abstract get isStreamTimeout(): boolean;
|
|
29
|
+
abstract get isRequesting(): boolean;
|
|
30
|
+
abstract get manual(): boolean;
|
|
31
|
+
abstract run(params?: Input): void;
|
|
32
|
+
abstract abort(): void;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
declare type AnyObject = Record<PropertyKey, any>;
|
|
36
|
+
|
|
37
|
+
export declare class ChatMessagesStore<T extends {
|
|
38
|
+
id: number | string;
|
|
39
|
+
}> {
|
|
40
|
+
private messages;
|
|
41
|
+
private listeners;
|
|
42
|
+
private conversationKey;
|
|
43
|
+
private emitListeners;
|
|
44
|
+
constructor(defaultMessages: T[], conversationKey?: ConversationKey);
|
|
45
|
+
setMessages: (messages: T[] | ((ori: T[]) => T[])) => boolean;
|
|
46
|
+
getMessages: () => T[];
|
|
47
|
+
getMessage: (id: string | number) => T | undefined;
|
|
48
|
+
addMessage: (message: T) => boolean;
|
|
49
|
+
setMessage: (id: string | number, message: Partial<T> | ((message: T) => Partial<T>)) => boolean;
|
|
50
|
+
removeMessage: (id: string) => boolean;
|
|
51
|
+
getSnapshot: () => T[];
|
|
52
|
+
subscribe: (callback: () => void) => () => void;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export declare const chatMessagesStoreHelper: {
|
|
56
|
+
_chatMessagesStores: Map<string | number, ChatMessagesStore<any>>;
|
|
57
|
+
get: (conversationKey: ConversationKey) => ChatMessagesStore<any> | undefined;
|
|
58
|
+
set: (key: ConversationKey, store: ChatMessagesStore<any>) => void;
|
|
59
|
+
delete: (key: ConversationKey) => void;
|
|
60
|
+
getMessages: (conversationKey: ConversationKey) => any[] | undefined;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export declare interface ChatProviderConfig<Input, Output> extends AnyObject {
|
|
64
|
+
request: AbstractXRequestClass<Input, Output> | (() => AbstractXRequestClass<Input, Output>);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export declare interface ConversationData extends AnyObject {
|
|
68
|
+
key: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
declare type ConversationKey = string | number;
|
|
72
|
+
|
|
73
|
+
export declare class ConversationStore {
|
|
74
|
+
private conversations;
|
|
75
|
+
private listeners;
|
|
76
|
+
private storeKey;
|
|
77
|
+
private activeConversationKey;
|
|
78
|
+
constructor(defaultConversations: ConversationData[], defaultActiveConversationKey: string);
|
|
79
|
+
private emitListeners;
|
|
80
|
+
setActiveConversationKey: (key: string) => boolean;
|
|
81
|
+
setConversations: (list: ConversationData[]) => boolean;
|
|
82
|
+
getConversation: (key: ConversationData["key"]) => ConversationData | undefined;
|
|
83
|
+
addConversation: (conversation: ConversationData, placement?: "prepend" | "append") => boolean;
|
|
84
|
+
setConversation: (key: ConversationData["key"], conversation: ConversationData) => boolean;
|
|
85
|
+
removeConversation: (key: ConversationData["key"]) => boolean;
|
|
86
|
+
getMessages: (key: ConversationData["key"]) => any[] | undefined;
|
|
87
|
+
getSnapshot: () => ConversationData[];
|
|
88
|
+
getActiveConversationKey: () => string;
|
|
89
|
+
subscribe: (callback: () => void) => () => void;
|
|
90
|
+
destroy: () => void;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Global registry so that `useXChat` can reach back into conversation state
|
|
95
|
+
* (e.g. to read previous messages for a given conversation key).
|
|
96
|
+
*/
|
|
97
|
+
export declare const conversationStoreHelper: {
|
|
98
|
+
_allConversationStores: Map<string, ConversationStore>;
|
|
99
|
+
set(key: string, store: ConversationStore): void;
|
|
100
|
+
delete(key: string): void;
|
|
101
|
+
getConversation(conversationKey: string): ConversationData | undefined;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export declare function createOpenAIChatProvider<ChatMessage extends XModelMessage = XModelMessage, Input extends XModelParams = XModelParams>(config: OpenAIPresetConfig): OpenAIChatProvider<ChatMessage, Input, Partial<Record<SSEFields, any>>>;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* DeepSeek Chat Provider
|
|
108
|
+
*/
|
|
109
|
+
export declare class DeepSeekChatProvider<ChatMessage extends XModelMessage = XModelMessage, Input extends XModelParams = XModelParams, Output extends Partial<Record<SSEFields, any>> = Partial<Record<SSEFields, any>>> extends AbstractChatProvider<ChatMessage, Input, Output> {
|
|
110
|
+
transformParams(requestParams: Partial<Input>, options: XRequestOptions<Input, Output>): Input;
|
|
111
|
+
transformLocalMessage(requestParams: Partial<Input>): ChatMessage[];
|
|
112
|
+
transformMessage(info: TransformMessage<ChatMessage, Output>): ChatMessage;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export declare class DefaultChatProvider<ChatMessage, Input, Output> extends AbstractChatProvider<ChatMessage, Input, Output> {
|
|
116
|
+
transformParams(requestParams: ChatMessage & Partial<Input>, options: XRequestOptions<Input, Output>): Input;
|
|
117
|
+
transformLocalMessage(requestParams: Partial<Input>): ChatMessage;
|
|
118
|
+
transformMessage(info: TransformMessage<ChatMessage, Output>): ChatMessage;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export declare type DefaultMessageInfo<Message extends SimpleType> = Pick<MessageInfo<Message>, 'message'> & Partial<Omit<MessageInfo<Message>, 'message'>>;
|
|
122
|
+
|
|
123
|
+
declare type Getter<T> = () => T;
|
|
124
|
+
|
|
125
|
+
export declare interface JSONOutPut extends Partial<Record<SSEFields, any>> {
|
|
126
|
+
success: boolean;
|
|
127
|
+
message?: string;
|
|
128
|
+
name?: string;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export declare interface MessageInfo<Message extends SimpleType> {
|
|
132
|
+
id: number | string;
|
|
133
|
+
message: Message;
|
|
134
|
+
status: MessageStatus;
|
|
135
|
+
extraInfo?: AnyObject;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export declare type MessageStatus = 'local' | 'loading' | 'updating' | 'success' | 'error' | 'abort';
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* LLM OpenAI Compatible Chat Provider
|
|
142
|
+
*/
|
|
143
|
+
export declare class OpenAIChatProvider<ChatMessage extends XModelMessage = XModelMessage, Input extends XModelParams = XModelParams, Output extends Partial<Record<SSEFields, any>> = Partial<Record<SSEFields, any>>> extends AbstractChatProvider<ChatMessage, Input, Output> {
|
|
144
|
+
transformParams(requestParams: Partial<Input>, options: XRequestOptions<Input, Output>): Input;
|
|
145
|
+
transformLocalMessage(requestParams: Partial<Input>): ChatMessage[];
|
|
146
|
+
transformMessage(info: TransformMessage<ChatMessage, Output>): ChatMessage;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* 1.x `useXAgent({ baseURL, model, dangerouslyApiKey | key })` preset.
|
|
151
|
+
* 2.0 sends that through `OpenAIChatProvider` and a manual `XRequest`.
|
|
152
|
+
*/
|
|
153
|
+
export declare interface OpenAIPresetConfig {
|
|
154
|
+
/** Chat Completions URL, for example `https://api.openai.com/v1/chat/completions`. */
|
|
155
|
+
baseURL: string;
|
|
156
|
+
model?: string;
|
|
157
|
+
/**
|
|
158
|
+
* Client-side credential. Prefer a backend proxy.
|
|
159
|
+
* A raw token is sent as `Bearer <token>`. Values that already start with
|
|
160
|
+
* `Bearer `, `Basic `, or `Tbox-` are sent unchanged.
|
|
161
|
+
*/
|
|
162
|
+
dangerouslyApiKey?: string;
|
|
163
|
+
/** Alias of `dangerouslyApiKey`, kept from the 1.x preset config. */
|
|
164
|
+
key?: string;
|
|
165
|
+
/**
|
|
166
|
+
* Optional fetch implementation. Docs and tests pass a mock.
|
|
167
|
+
* Production calls use the platform `fetch`.
|
|
168
|
+
*/
|
|
169
|
+
fetch?: (baseURL: Parameters<typeof fetch>[0], options: {
|
|
170
|
+
body?: BodyInit | null;
|
|
171
|
+
}) => Promise<Response>;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
declare type RequestFallbackFn<Input, MessageInfoT, Message> = (requestParams: Partial<Input>, info: {
|
|
175
|
+
error: Error;
|
|
176
|
+
messages: Message[];
|
|
177
|
+
messageInfo: MessageInfoT;
|
|
178
|
+
}) => Message | Promise<Message>;
|
|
179
|
+
|
|
180
|
+
export declare type RequestParams<Message> = {
|
|
181
|
+
[Key: PropertyKey]: Message;
|
|
182
|
+
} & AnyObject;
|
|
183
|
+
|
|
184
|
+
declare type RequestPlaceholderFn<Input, Message> = (requestParams: Partial<Input>, info: {
|
|
185
|
+
messages: Message[];
|
|
186
|
+
}) => Message;
|
|
187
|
+
|
|
188
|
+
export declare function resolvePresetApiKey(config: {
|
|
189
|
+
dangerouslyApiKey?: string;
|
|
190
|
+
key?: string;
|
|
191
|
+
}): string | undefined;
|
|
192
|
+
|
|
193
|
+
export declare function setXRequestGlobalOptions<Input, Output>(options: XRequestGlobalOptions<Input, Output>): void;
|
|
194
|
+
|
|
195
|
+
export declare type SimpleType = string | number | boolean | object;
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* @link https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#fields
|
|
199
|
+
*/
|
|
200
|
+
export declare type SSEFields = 'data' | 'event' | 'id' | 'retry';
|
|
201
|
+
|
|
202
|
+
export declare type SSEOutput = Partial<Record<SSEFields, any>>;
|
|
203
|
+
|
|
204
|
+
export declare interface TransformMessage<ChatMessage, Output> {
|
|
205
|
+
originMessage?: ChatMessage;
|
|
206
|
+
chunk: Output;
|
|
207
|
+
chunks: Output[];
|
|
208
|
+
status: MessageStatus;
|
|
209
|
+
responseHeaders: Headers;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Vue composable for chat store. Accepts conversationKey as a reactive ref.
|
|
214
|
+
*/
|
|
215
|
+
export declare function useChatStore<T extends {
|
|
216
|
+
id: number | string;
|
|
217
|
+
}>(defaultValue: T[] | Getter<T[]>, conversationKey?: ConversationKey | ShallowRef<ConversationKey | undefined>): UseChatStoreReturn<T>;
|
|
218
|
+
|
|
219
|
+
declare interface UseChatStoreReturn<T extends {
|
|
220
|
+
id: number | string;
|
|
221
|
+
}> {
|
|
222
|
+
messages: ShallowRef<T[]>;
|
|
223
|
+
addMessage: ChatMessagesStore<T>['addMessage'];
|
|
224
|
+
removeMessage: ChatMessagesStore<T>['removeMessage'];
|
|
225
|
+
setMessage: ChatMessagesStore<T>['setMessage'];
|
|
226
|
+
getMessage: ChatMessagesStore<T>['getMessage'];
|
|
227
|
+
setMessages: ChatMessagesStore<T>['setMessages'];
|
|
228
|
+
getMessages: ChatMessagesStore<T>['getMessages'];
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export declare function useXChat<ChatMessage extends SimpleType = string, ParsedMessage extends SimpleType = ChatMessage, Input = RequestParams<ChatMessage>, Output = SSEOutput>(config: XChatConfig<ChatMessage, ParsedMessage, Input, Output>): {
|
|
232
|
+
readonly onRequest: (requestParams: Partial<Input>, opts?: {
|
|
233
|
+
extraInfo: AnyObject;
|
|
234
|
+
}) => void;
|
|
235
|
+
readonly messages: ShallowRef<MessageInfo<ChatMessage>[]>;
|
|
236
|
+
readonly parsedMessages: ComputedRef<MessageInfo<ParsedMessage>[]>;
|
|
237
|
+
readonly setMessages: (messages: MessageInfo<ChatMessage>[] | ((ori: MessageInfo<ChatMessage>[]) => MessageInfo<ChatMessage>[])) => boolean;
|
|
238
|
+
readonly setMessage: (id: string | number, message: Partial<MessageInfo<ChatMessage>> | ((message: MessageInfo<ChatMessage>) => Partial<MessageInfo<ChatMessage>>)) => boolean;
|
|
239
|
+
readonly abort: () => void;
|
|
240
|
+
readonly isRequesting: ComputedRef<boolean>;
|
|
241
|
+
readonly onReload: (id: string | number, requestParams: Partial<Input>, opts?: {
|
|
242
|
+
extraInfo: AnyObject;
|
|
243
|
+
}) => void;
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Vue port of React's `useXConversations` – exposes reactive `conversations`
|
|
248
|
+
* and `activeConversationKey` refs plus the store mutations. The underlying
|
|
249
|
+
* `ConversationStore` is shared across hooks through `conversationStoreHelper`
|
|
250
|
+
* so `useXChat` can resolve history by conversation key.
|
|
251
|
+
*/
|
|
252
|
+
export declare function useXConversations(config?: XConversationConfig): UseXConversationsReturn;
|
|
253
|
+
|
|
254
|
+
export declare interface UseXConversationsReturn {
|
|
255
|
+
conversations: ShallowRef<ConversationData[]>;
|
|
256
|
+
activeConversationKey: ShallowRef<string>;
|
|
257
|
+
setActiveConversationKey: (key: string) => boolean;
|
|
258
|
+
addConversation: (conversation: ConversationData, placement?: 'prepend' | 'append') => boolean;
|
|
259
|
+
removeConversation: (key: ConversationData['key']) => boolean;
|
|
260
|
+
setConversation: (key: ConversationData['key'], conversation: ConversationData) => boolean;
|
|
261
|
+
getConversation: (key: ConversationData['key']) => ConversationData | undefined;
|
|
262
|
+
setConversations: (list: ConversationData[]) => boolean;
|
|
263
|
+
getMessages: (key: ConversationData['key']) => unknown;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export declare const version: "2.0.0";
|
|
267
|
+
|
|
268
|
+
export declare interface XChatConfig<ChatMessage extends SimpleType = string, BubbleMessage extends SimpleType = ChatMessage, Input = ChatMessage, Output = ChatMessage> {
|
|
269
|
+
provider?: AbstractChatProvider<ChatMessage, Input, Output>;
|
|
270
|
+
conversationKey?: ConversationData['key'] | ShallowRef<ConversationData['key'] | undefined>;
|
|
271
|
+
defaultMessages?: DefaultMessageInfo<ChatMessage>[];
|
|
272
|
+
/** Convert agent message to bubble usage message type */
|
|
273
|
+
parser?: (message: ChatMessage) => BubbleMessage | BubbleMessage[];
|
|
274
|
+
requestPlaceholder?: ChatMessage | RequestPlaceholderFn<Input, ChatMessage>;
|
|
275
|
+
requestFallback?: ChatMessage | RequestFallbackFn<Input, MessageInfo<ChatMessage>, ChatMessage>;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export declare interface XConversationConfig {
|
|
279
|
+
defaultConversations?: ConversationData[];
|
|
280
|
+
defaultActiveConversationKey?: string;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
export declare interface XFetchMiddlewares<Input, Output> {
|
|
284
|
+
onRequest?: (baseURL: Parameters<typeof fetch>[0], options: XRequestOptions<Input, Output>) => Promise<[Parameters<typeof fetch>[0], XRequestOptions<Input, Output>]>;
|
|
285
|
+
onResponse?: (response: Response) => Promise<Response>;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
export declare function XMCPClient(baseURL: string, options?: XMCPClientOptions): XMCPClientClass;
|
|
289
|
+
|
|
290
|
+
export declare const XMcpClient: typeof XMCPClient;
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* MCP (Model Context Protocol) client that talks to a server exposing an
|
|
294
|
+
* MCP-compatible HTTP endpoint, built on top of `XRequest` so that it reuses
|
|
295
|
+
* the shared middleware, timeouts and abort semantics.
|
|
296
|
+
*/
|
|
297
|
+
export declare class XMCPClientClass {
|
|
298
|
+
readonly baseURL: string;
|
|
299
|
+
private options;
|
|
300
|
+
constructor(baseURL: string, options?: XMCPClientOptions);
|
|
301
|
+
/**
|
|
302
|
+
* Fetch the list of tools published by the MCP server.
|
|
303
|
+
*/
|
|
304
|
+
tools(): Promise<XMCPTool[]>;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export declare type XMCPClientOptions = Pick<XRequestOptions, 'params' | 'headers' | 'timeout' | 'fetch'>;
|
|
308
|
+
|
|
309
|
+
export declare type XMcpClientOptions = XMCPClientOptions;
|
|
310
|
+
|
|
311
|
+
export declare interface XMCPTool {
|
|
312
|
+
name: string;
|
|
313
|
+
description?: string;
|
|
314
|
+
inputSchema: {
|
|
315
|
+
type: 'object';
|
|
316
|
+
properties: AnyObject;
|
|
317
|
+
};
|
|
318
|
+
annotations?: {
|
|
319
|
+
title?: string;
|
|
320
|
+
readOnlyHint?: boolean;
|
|
321
|
+
destructiveHint?: boolean;
|
|
322
|
+
idempotentHint?: boolean;
|
|
323
|
+
openWorldHint?: boolean;
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
export declare interface XModelMessage extends AnyObject {
|
|
328
|
+
role: string;
|
|
329
|
+
content: string | {
|
|
330
|
+
text: string;
|
|
331
|
+
type: string;
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
export declare interface XModelParams extends AnyObject {
|
|
336
|
+
model?: string;
|
|
337
|
+
messages?: XModelMessage[];
|
|
338
|
+
frequency_penalty?: number;
|
|
339
|
+
logit_bias?: AnyObject;
|
|
340
|
+
logprobs?: boolean;
|
|
341
|
+
max_completion_tokens?: number;
|
|
342
|
+
metadata?: AnyObject;
|
|
343
|
+
modalities?: string[];
|
|
344
|
+
n?: number;
|
|
345
|
+
parallel_tool_calls?: boolean;
|
|
346
|
+
prediction?: {
|
|
347
|
+
content: string;
|
|
348
|
+
type: string;
|
|
349
|
+
};
|
|
350
|
+
presence_penalty?: number;
|
|
351
|
+
reasoning_effort?: string;
|
|
352
|
+
response_format?: 'text' | {
|
|
353
|
+
type: 'json_object';
|
|
354
|
+
} | {
|
|
355
|
+
type: 'json_schema';
|
|
356
|
+
json_schema: {
|
|
357
|
+
name: string;
|
|
358
|
+
description?: string;
|
|
359
|
+
schema?: AnyObject;
|
|
360
|
+
strict?: boolean;
|
|
361
|
+
};
|
|
362
|
+
};
|
|
363
|
+
seed?: number;
|
|
364
|
+
service_tier?: string;
|
|
365
|
+
stop?: string | string[];
|
|
366
|
+
store?: boolean;
|
|
367
|
+
stream?: boolean;
|
|
368
|
+
stream_options?: {
|
|
369
|
+
include_usage?: boolean;
|
|
370
|
+
};
|
|
371
|
+
temperature?: number;
|
|
372
|
+
tool_choice?: string | {
|
|
373
|
+
type: 'function';
|
|
374
|
+
function: {
|
|
375
|
+
name: string;
|
|
376
|
+
};
|
|
377
|
+
};
|
|
378
|
+
top_logprobs?: number;
|
|
379
|
+
top_p?: number;
|
|
380
|
+
user?: string;
|
|
381
|
+
web_search_options?: {
|
|
382
|
+
search_context_size?: string;
|
|
383
|
+
user_location?: {
|
|
384
|
+
type: 'approximate';
|
|
385
|
+
approximate?: {
|
|
386
|
+
city?: string;
|
|
387
|
+
country?: string;
|
|
388
|
+
region?: string;
|
|
389
|
+
timezone?: string;
|
|
390
|
+
};
|
|
391
|
+
};
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
export declare interface XModelResponse {
|
|
396
|
+
choices: {
|
|
397
|
+
index: number;
|
|
398
|
+
message: {
|
|
399
|
+
role: string;
|
|
400
|
+
content: string | null;
|
|
401
|
+
reasoning_content: string | null;
|
|
402
|
+
refusal: string | null;
|
|
403
|
+
annotations: {
|
|
404
|
+
type: 'url_citation';
|
|
405
|
+
end_index: number;
|
|
406
|
+
start_index: number;
|
|
407
|
+
url: string;
|
|
408
|
+
title: string;
|
|
409
|
+
}[];
|
|
410
|
+
};
|
|
411
|
+
logprobs: AnyObject | null;
|
|
412
|
+
finish_reason: 'stop' | 'length' | 'content_filter' | 'tool_calls' | string;
|
|
413
|
+
}[];
|
|
414
|
+
created: number;
|
|
415
|
+
id: string;
|
|
416
|
+
model: string;
|
|
417
|
+
object: 'chat.completion' | 'chat.completion.chunk';
|
|
418
|
+
service_tier: string | null;
|
|
419
|
+
system_fingerprint: string | null;
|
|
420
|
+
usage: {
|
|
421
|
+
completion_tokens: number;
|
|
422
|
+
prompt_tokens: number;
|
|
423
|
+
total_tokens: number;
|
|
424
|
+
completion_tokens_details: {
|
|
425
|
+
reasoning_tokens: number;
|
|
426
|
+
audio_tokens: number;
|
|
427
|
+
accepted_prediction_tokens: number;
|
|
428
|
+
rejected_prediction_tokens: number;
|
|
429
|
+
};
|
|
430
|
+
prompt_tokens_details: {
|
|
431
|
+
cached_tokens: number;
|
|
432
|
+
audio_tokens: number;
|
|
433
|
+
};
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export declare type XReadableStream<R = SSEOutput> = ReadableStream<R> & AsyncGenerator<R>;
|
|
438
|
+
|
|
439
|
+
export declare function XRequest<Input = AnyObject, Output = SSEOutput>(baseURL: string, options?: XRequestOptions<Input, Output>): AbstractXRequestClass<Input, Output>;
|
|
440
|
+
|
|
441
|
+
export declare interface XRequestCallbacks<Output> {
|
|
442
|
+
/**
|
|
443
|
+
* @description Callback when the request is successful
|
|
444
|
+
*/
|
|
445
|
+
onSuccess: (chunks: Output[], responseHeaders: Headers) => void;
|
|
446
|
+
/**
|
|
447
|
+
* @description Callback when the request fails
|
|
448
|
+
*/
|
|
449
|
+
onError: (error: Error) => void;
|
|
450
|
+
/**
|
|
451
|
+
* @description Callback when the request is updated (per chunk)
|
|
452
|
+
*/
|
|
453
|
+
onUpdate?: (chunk: Output, responseHeaders: Headers) => void;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
export declare class XRequestClass<Input = AnyObject, Output = SSEOutput> extends AbstractXRequestClass<Input, Output> {
|
|
457
|
+
private _asyncHandler;
|
|
458
|
+
private timeoutHandler;
|
|
459
|
+
private _isTimeout;
|
|
460
|
+
private streamTimeoutHandler;
|
|
461
|
+
private _isStreamTimeout;
|
|
462
|
+
private abortController;
|
|
463
|
+
private _isRequesting;
|
|
464
|
+
private _manual;
|
|
465
|
+
get asyncHandler(): Promise<any>;
|
|
466
|
+
get isTimeout(): boolean;
|
|
467
|
+
private set isTimeout(value);
|
|
468
|
+
get isStreamTimeout(): boolean;
|
|
469
|
+
private set isStreamTimeout(value);
|
|
470
|
+
get isRequesting(): boolean;
|
|
471
|
+
get manual(): boolean;
|
|
472
|
+
constructor(baseURL: string, options?: XRequestOptions<Input, Output>);
|
|
473
|
+
run(params?: Input): void;
|
|
474
|
+
abort(): void;
|
|
475
|
+
private init;
|
|
476
|
+
private startRequest;
|
|
477
|
+
private finishRequest;
|
|
478
|
+
private customResponseHandler;
|
|
479
|
+
private sseResponseHandler;
|
|
480
|
+
private processStream;
|
|
481
|
+
private jsonResponseHandler;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
export declare type XRequestFunction<Input = AnyObject, Output = SSEOutput> = (baseURL: string, options?: XRequestOptions<Input, Output>) => XRequestClass<Input, Output>;
|
|
485
|
+
|
|
486
|
+
export declare type XRequestGlobalOptions<Input, Output> = Pick<XRequestOptions<Input, Output>, 'headers' | 'timeout' | 'streamTimeout' | 'middlewares' | 'fetch' | 'transformStream' | 'manual'>;
|
|
487
|
+
|
|
488
|
+
export declare interface XRequestOptions<Input = AnyObject, Output = SSEOutput> extends RequestInit {
|
|
489
|
+
callbacks?: XRequestCallbacks<Output>;
|
|
490
|
+
params?: Input;
|
|
491
|
+
headers?: Record<string, string>;
|
|
492
|
+
timeout?: number;
|
|
493
|
+
streamTimeout?: number;
|
|
494
|
+
fetch?: (baseURL: Parameters<typeof fetch>[0], options: XRequestOptions<Input, Output>) => Promise<Response>;
|
|
495
|
+
middlewares?: XFetchMiddlewares<Input, Output>;
|
|
496
|
+
transformStream?: XStreamOptions<Output>['transformStream'] | ((baseURL: string, responseHeaders: Headers) => XStreamOptions<Output>['transformStream']);
|
|
497
|
+
manual?: boolean;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* @description Transform Uint8Array binary stream to {@link SSEOutput} by default.
|
|
502
|
+
* Only supports utf-8 encoding for now.
|
|
503
|
+
*/
|
|
504
|
+
export declare function XStream<Output = SSEOutput>(options: XStreamOptions<Output>): XReadableStream<Output>;
|
|
505
|
+
|
|
506
|
+
export declare interface XStreamOptions<Output> {
|
|
507
|
+
/**
|
|
508
|
+
* @description Readable stream of binary data
|
|
509
|
+
*/
|
|
510
|
+
readableStream: ReadableStream<Uint8Array>;
|
|
511
|
+
/**
|
|
512
|
+
* @description Support customizable transformStream to transform streams
|
|
513
|
+
* @default sseTransformStream
|
|
514
|
+
*/
|
|
515
|
+
transformStream?: TransformStream<string, Output>;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
export { }
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";var ae=Object.defineProperty;var ue=(r,e,t)=>e in r?ae(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var a=(r,e,t)=>ue(r,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const T=require("vue"),b={_chatMessagesStores:new Map,get:r=>b._chatMessagesStores.get(r),set:(r,e)=>{b._chatMessagesStores.set(r,e)},delete:r=>{b._chatMessagesStores.delete(r)},getMessages:r=>{const e=b._chatMessagesStores.get(r);return e==null?void 0:e.getMessages()}};class J{constructor(e,t){a(this,"messages",[]);a(this,"listeners",[]);a(this,"conversationKey");a(this,"setMessages",e=>{let t;return typeof e=="function"?t=e(this.messages):t=e,this.messages=[...t],this.emitListeners(),!0});a(this,"getMessages",()=>this.messages);a(this,"getMessage",e=>this.messages.find(t=>t.id===e));a(this,"addMessage",e=>this.getMessage(e.id)?!1:(this.setMessages([...this.messages,e]),!0));a(this,"setMessage",(e,t)=>{const s=this.getMessage(e);if(s){const n=typeof t=="function"?t(s):t;return Object.assign(s,n),this.setMessages([...this.messages]),!0}return!1});a(this,"removeMessage",e=>{const t=this.messages.findIndex(s=>s.id===e);return t!==-1?(this.messages.splice(t,1),this.setMessages([...this.messages]),!0):!1});a(this,"getSnapshot",()=>this.messages);a(this,"subscribe",e=>(this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}));this.setMessages(e),t!=null&&(this.conversationKey=t,b.set(this.conversationKey,this))}emitListeners(){this.listeners.forEach(e=>{e()})}}function z(r,e){const t=e&&typeof e=="object"&&"value"in e?e:T.shallowRef(e),s=u=>{if(u!==void 0&&b.get(u))return b.get(u);const g=typeof r=="function"?r():r;return new J(g||[],u)},n=T.shallowRef(s(t.value)),o=T.shallowRef(n.value.getMessages());let i=null;const f=()=>{i&&i(),o.value=n.value.getMessages(),i=n.value.subscribe(()=>{o.value=[...n.value.getMessages()]})};return f(),T.watch(()=>t.value,()=>{n.value=s(t.value),f()}),{messages:o,addMessage:u=>n.value.addMessage(u),removeMessage:u=>n.value.removeMessage(u),setMessage:(u,g)=>n.value.setMessage(u,g),getMessage:u=>n.value.getMessage(u),setMessages:u=>n.value.setMessages(u),getMessages:()=>n.value.getMessages()}}function le(r){return Array.isArray(r)?r:[r]}const P=new Map;function fe(r){const{defaultMessages:e,requestFallback:t,requestPlaceholder:s,parser:n,provider:o,conversationKey:i}=r,f=T.ref(0),u=T.shallowRef(void 0),g=T.ref(!1),l=i&&typeof i=="object"&&"value"in i?i:T.shallowRef(i),{messages:m,setMessages:v,getMessages:h,setMessage:A}=z(()=>(e||[]).map((d,c)=>({id:`default_${c}`,status:"local",...d})),l),E=(d,c,R)=>{const _={id:`msg_${f.value}`,message:d,status:c};return R&&(_.extraInfo=R),f.value+=1,_},S=T.computed(()=>{const d=[];return m.value.forEach(c=>{const R=n?n(c.message):c.message,_=le(R);_.forEach((x,j)=>{let K=c.id;_.length>1&&(K=`${K}_${j}`),d.push({id:K,message:x,status:c.status})})}),d}),C=d=>d.filter(c=>c.status!=="loading").map(c=>c.message);o&&(o.injectGetMessages(()=>C(h())),u.value=o.request);const se=()=>C(h()),N=(d,c)=>{if(!o)return;const{updatingId:R,reload:_}=c||{};let x=null;const j=o.transformLocalMessage(d),K=(Array.isArray(j)?j:[j]).map(M=>E(M,"local",c==null?void 0:c.extraInfo));_?(x=R,v(M=>{const p=[...M];if(s){let y;typeof s=="function"?y=s(d,{messages:C(p)}):y=s,p.forEach(w=>{w.id===R&&(w.status="loading",w.message=y,c!=null&&c.extraInfo&&(w.extraInfo=c.extraInfo))})}return p})):v(M=>{let p=[...M,...K];if(s){let y;typeof s=="function"?y=s(d,{messages:C(p)}):y=s;const w=E(y,"loading");x=w.id,p=[...p,w]}return p});let I=null;const B=(M,p,y,w)=>{let q=h().find(O=>O.id===I);if(q)v(O=>O.map(H=>{if(H.id===I){const U=o.transformMessage({originMessage:H.message,chunk:p,chunks:y,status:M,responseHeaders:w});return{...H,message:U,status:M}}return H}));else if(_&&R)q=h().find(O=>O.id===R),q&&(q.status=M,q.message=o.transformMessage({chunk:p,status:M,chunks:y,responseHeaders:w}),v(O=>[...O]),I=q.id);else{const O=o.transformMessage({chunk:p,status:M,chunks:y,responseHeaders:w}),H=E(O,M);v(U=>[...U.filter(ie=>ie.id!==x),H]),I=H.id,q=H}return q};o.injectRequest({onUpdate:(M,p)=>{B("updating",M,[],p)},onSuccess:(M,p)=>{g.value=!1,l.value!==void 0&&l.value!==null&&P.delete(l.value),B("success",void 0,M,p)},onError:async M=>{if(g.value=!1,l.value!==void 0&&l.value!==null&&P.delete(l.value),t){let p;if(typeof t=="function"){const y=se(),w=h().find(q=>q.id===x||q.id===I);p=await t(d,{error:M,messageInfo:w,messages:y})}else p=t;v(y=>[...y.filter(w=>w.id!==x&&w.id!==I),E(p,M.name==="AbortError"?"abort":"error")])}else v(p=>p.map(y=>y.id===x||y.id===I?{...y,status:M.name==="AbortError"?"abort":"error"}:y))}}),g.value=!0,l.value!==void 0&&l.value!==null&&P.set(l.value,!0),o.request.run(o.transformParams(d,o.request.options))},re=(d,c)=>{if(!o)throw new Error("provider is required");N(d,c)},ne=(d,c,R)=>{if(!o)throw new Error("provider is required");if(!d||!h().find(_=>_.id===d))throw new Error(`message [${d}] is not found`);N(c,{updatingId:d,reload:!0,extraInfo:R==null?void 0:R.extraInfo})},oe=T.computed(()=>{const d=l.value;return d!=null?P.get(d)||!1:g.value});return{onRequest:re,messages:m,parsedMessages:S,setMessages:v,setMessage:A,abort:()=>{var d;if(!o)throw new Error("provider is required");(d=u.value)==null||d.abort()},isRequesting:oe,onReload:ne}}class L{constructor(e){a(this,"_request");a(this,"_getMessagesFn");a(this,"_originalCallbacks");var s;const t=typeof e.request=="function"?e.request():e.request;if(!t.manual)throw new Error("request must be manual");this._request=t,this._originalCallbacks=(s=this._request.options)==null?void 0:s.callbacks}get request(){return this._request}getMessages(){return this==null?void 0:this._getMessagesFn()}injectGetMessages(e){this._getMessagesFn=e}injectRequest({onUpdate:e,onSuccess:t,onError:s}){var f,u,g;const n=(f=this._originalCallbacks)==null?void 0:f.onUpdate,o=(u=this._originalCallbacks)==null?void 0:u.onSuccess,i=(g=this._originalCallbacks)==null?void 0:g.onError;this._request.options.callbacks={onUpdate:(l,m)=>{e(l,m),n&&n(l,m)},onSuccess:(l,m)=>{t(l,m),o&&o(l,m)},onError:l=>{s(l),i&&i(l)}}}}class he extends L{transformParams(e,t){return{...(t==null?void 0:t.params)||{},...e,messages:this.getMessages()}}transformLocalMessage(e){return(e==null?void 0:e.messages)||[]}transformMessage(e){var v,h,A,E;const{originMessage:t,chunk:s,chunks:n,responseHeaders:o}=e;let i="",f="",u="assistant";try{let S;(v=o.get("content-type"))!=null&&v.includes("text/event-stream")?s&&((h=s.data)==null?void 0:h.trim())!=="[DONE]"&&(S=JSON.parse(s.data)):S=s||n[0],S&&((A=S==null?void 0:S.choices)==null||A.forEach(C=>{C!=null&&C.delta?(f=C.delta.reasoning_content||"",i+=C.delta.content||"",u=C.delta.role):C!=null&&C.message&&(f=C.message.reasoning_content||"",i+=C.message.content||"",u=C.message.role)}))}catch(S){console.error("transformMessage error",S)}let g="";const l=t;let m=typeof(l==null?void 0:l.content)=="string"?l==null?void 0:l.content:((E=l==null?void 0:l.content)==null?void 0:E.text)||"";return!m&&f?g=`<think>${f}`:m.includes("<think>")&&!m.includes("</think>")&&i?(m=m.replace("<think>",'<think status="done">'),g=`${m}</think>${i}`):g=`${m||""}${f}${i}`,{content:g,role:u||"assistant"}}}class ge extends L{transformParams(e,t){if(typeof e!="object")throw new Error("requestParams must be an object");return{...(t==null?void 0:t.params)||{},...e||{}}}transformLocalMessage(e){return e}transformMessage(e){const{chunk:t,chunks:s,originMessage:n}=e;if(t)return t;if(Array.isArray(s)){const o=(s==null?void 0:s.length)>0?s==null?void 0:s[(s==null?void 0:s.length)-1]:void 0;return n||o}return s}}class W extends L{transformParams(e,t){return{...(t==null?void 0:t.params)||{},...e,messages:this.getMessages()}}transformLocalMessage(e){return(e==null?void 0:e.messages)||[]}transformMessage(e){var g,l,m;const{originMessage:t,chunk:s,chunks:n,responseHeaders:o}=e;let i="",f="assistant";try{let v;(g=o.get("content-type"))!=null&&g.includes("text/event-stream")?s&&((l=s.data)==null?void 0:l.trim())!=="[DONE]"&&(v=JSON.parse(s.data)):v=s||n[0],v&&((m=v==null?void 0:v.choices)==null||m.forEach(h=>{h!=null&&h.delta?(i+=h.delta.content||"",f=h.delta.role||"assistant"):h!=null&&h.message&&(i+=h.message.content||"",f=h.message.role||"assistant")}))}catch(v){console.error("transformMessage error",v)}return{content:`${(t==null?void 0:t.content)||""}${i||""}`,role:f}}}const de=`
|
|
2
|
+
|
|
3
|
+
`,me=`
|
|
4
|
+
`,G=":",$=r=>(r??"").trim()!=="";function ce(){let r="";return new TransformStream({transform(e,t){r+=e;const s=r.split(de);s.slice(0,-1).forEach(n=>{$(n)&&t.enqueue(n)}),r=s[s.length-1]},flush(e){$(r)&&e.enqueue(r)}})}function ve(){return new TransformStream({transform(r,e){const s=r.split(me).reduce((n,o)=>{const i=o.indexOf(G);if(i===-1)throw new Error(`The key-value separator "${G}" is not found in the sse line chunk!`);const f=o.slice(0,i);if(!$(f))return n;const u=o.slice(i+1);return{...n,[f]:u}},{});Object.keys(s).length!==0&&e.enqueue(s)}})}function D(r){const{readableStream:e,transformStream:t}=r;if(!(e instanceof ReadableStream))throw new Error("The options.readableStream must be an instance of ReadableStream.");const s=new TextDecoderStream,n=t?e.pipeThrough(s).pipeThrough(t):e.pipeThrough(s).pipeThrough(ce()).pipeThrough(ve());return n[Symbol.asyncIterator]=async function*(){const o=this.getReader();for(;;){const{done:i,value:f}=await o.read();if(i)break;f&&(yield f)}},n}const pe=async(r,e)=>{const{fetch:t=globalThis.fetch,middlewares:s={},...n}=e;if(typeof t!="function")throw new Error("The options.fetch must be a typeof fetch function!");let o=[r,n];typeof s.onRequest=="function"&&(o=await s.onRequest(...o));let i=await t(...o);if(typeof s.onResponse=="function"){const f=await s.onResponse(i);if(!(f instanceof Response))throw new Error("The options.onResponse must return a Response instance!");i=f}if(!i.ok)throw new Error(`Fetch failed with status ${i.status}`);if(!i.body)throw new Error("The response body is empty.");return i},Q={manual:!1,headers:{"Content-Type":"application/json"}};function Me(r){Object.assign(Q,r)}class V{constructor(e,t){a(this,"baseURL");a(this,"options");if(!e||typeof e!="string")throw new Error("The baseURL is not valid!");this.baseURL=e,this.options=t||{}}}class Y extends V{constructor(t,s){super(t,s);a(this,"_asyncHandler");a(this,"timeoutHandler",0);a(this,"_isTimeout",!1);a(this,"streamTimeoutHandler",0);a(this,"_isStreamTimeout",!1);a(this,"abortController");a(this,"_isRequesting",!1);a(this,"_manual",!1);a(this,"customResponseHandler",async(t,s,n,o)=>{const i=D({readableStream:t.body,transformStream:n});await this.processStream(i,t,s,o)});a(this,"sseResponseHandler",async(t,s,n)=>{const o=D({readableStream:t.body});await this.processStream(o,t,s,n)});a(this,"jsonResponseHandler",async(t,s)=>{var o,i,f;const n=await t.json();if((n==null?void 0:n.success)===!1){const u=n,g=new Error(u.message||"System error");g.name=u.name||"SystemError",(o=s==null?void 0:s.onError)==null||o.call(s,g)}else(i=s==null?void 0:s.onUpdate)==null||i.call(s,n,t.headers),this.finishRequest(),(f=s==null?void 0:s.onSuccess)==null||f.call(s,[n],t.headers)});this._manual=(s==null?void 0:s.manual)||!1,this.manual||this.init()}get asyncHandler(){return this._asyncHandler}get isTimeout(){return this._isTimeout}set isTimeout(t){this._isTimeout=t}get isStreamTimeout(){return this._isStreamTimeout}set isStreamTimeout(t){this._isStreamTimeout=t}get isRequesting(){return this._isRequesting}get manual(){return this._manual}run(t){this.manual?this.init(t):console.warn("The request is not manual, so it cannot be run!")}abort(){var t;clearTimeout(this.timeoutHandler),clearTimeout(this.streamTimeoutHandler),(t=this.abortController)==null||t.abort()}init(t){this.abortController=new AbortController;const{callbacks:s,params:n,headers:o={},transformStream:i,fetch:f,timeout:u,streamTimeout:g,middlewares:l,...m}=this.options,v={...m,method:m.method||"POST",body:m.body??JSON.stringify({...n,...t||{}}),params:{...n,...t},headers:Object.assign({},Q.headers||{},o),signal:this.abortController.signal,middlewares:l};u&&u>0&&(this.timeoutHandler=setTimeout(()=>{var h;this.isTimeout=!0,this.finishRequest(),(h=s==null?void 0:s.onError)==null||h.call(s,new Error("TimeoutError"))},u)),this.startRequest(),this._asyncHandler=pe(this.baseURL,{fetch:f,...v}).then(async h=>{if(clearTimeout(this.timeoutHandler),this.isTimeout)return;if(i){let S=i;typeof i=="function"&&(S=i(this.baseURL,h.headers)),await this.customResponseHandler(h,s,S,g);return}const A=h.headers.get("content-type")||"";switch(A.split(";")[0].trim()){case"text/event-stream":await this.sseResponseHandler(h,s,g);break;case"application/json":await this.jsonResponseHandler(h,s);break;default:throw new Error(`The response content-type: ${A} is not support!`)}}).catch(h=>{var E;clearTimeout(this.timeoutHandler),this.finishRequest();const A=h instanceof Error||typeof DOMException<"u"&&h instanceof DOMException?h:new Error("Unknown error!");(E=s==null?void 0:s.onError)==null||E.call(s,A)})}startRequest(){this._isRequesting=!0}finishRequest(){this._isRequesting=!1}async processStream(t,s,n,o){var g,l;const i=[],f=t[Symbol.asyncIterator]();let u;do if(o&&(this.streamTimeoutHandler=setTimeout(()=>{var m;this.isStreamTimeout=!0,this.finishRequest(),(m=n==null?void 0:n.onError)==null||m.call(n,new Error("StreamTimeoutError"))},o)),u=await f.next(),u.value!==void 0&&(i.push(u.value),(g=n==null?void 0:n.onUpdate)==null||g.call(n,u.value,s.headers)),clearTimeout(this.streamTimeoutHandler),this.isStreamTimeout)break;while(!u.done);if(o&&(clearTimeout(this.streamTimeoutHandler),this.isStreamTimeout)){this.finishRequest();return}this.finishRequest(),(l=n==null?void 0:n.onSuccess)==null||l.call(n,i,s.headers)}}function F(r,e){return new Y(r,e)}function Z(r){const e=r.dangerouslyApiKey||r.key;if(e)return/^(Bearer |Basic |Tbox-)/.test(e)?e:`Bearer ${e}`}function ye(r){const e=Z(r);return new W({request:F(r.baseURL,{manual:!0,params:{...r.model?{model:r.model}:{},stream:!0},headers:e?{Authorization:e}:{},...r.fetch?{fetch:r.fetch}:{}})})}const X={_allConversationStores:new Map,set(r,e){X._allConversationStores.set(r,e)},delete(r){X._allConversationStores.delete(r)},getConversation(r){for(const e of Array.from(X._allConversationStores.values())){const t=e.getConversation(r);if(t)return t}}};class k{constructor(e,t){a(this,"conversations",[]);a(this,"listeners",[]);a(this,"storeKey");a(this,"activeConversationKey");a(this,"setActiveConversationKey",e=>(this.activeConversationKey=e,this.emitListeners(),!0));a(this,"setConversations",e=>(this.conversations=[...e],this.emitListeners(),!0));a(this,"getConversation",e=>this.conversations.find(t=>t.key===e));a(this,"addConversation",(e,t)=>this.getConversation(e.key)?!1:(this.setConversations(t==="prepend"?[e,...this.conversations]:[...this.conversations,e]),!0));a(this,"setConversation",(e,t)=>{const s=this.getConversation(e);return s?(Object.assign(s,t),this.setConversations([...this.conversations]),!0):!1});a(this,"removeConversation",e=>{const t=this.conversations.findIndex(s=>s.key===e);return t!==-1?(this.conversations.splice(t,1),this.setConversations([...this.conversations]),!0):!1});a(this,"getMessages",e=>b.getMessages(e));a(this,"getSnapshot",()=>this.conversations);a(this,"getActiveConversationKey",()=>this.activeConversationKey);a(this,"subscribe",e=>(this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}));a(this,"destroy",()=>{X.delete(this.storeKey)});this.conversations=[...e],this.storeKey=Math.random().toString(),X.set(this.storeKey,this),this.activeConversationKey=t}emitListeners(){for(const e of this.listeners)e()}}function Ce(r={}){const e=new k(r.defaultConversations||[],r.defaultActiveConversationKey||""),t=T.shallowRef(e.getSnapshot()),s=T.shallowRef(e.getActiveConversationKey()),n=e.subscribe(()=>{t.value=[...e.getSnapshot()],s.value=e.getActiveConversationKey()});return T.onBeforeUnmount(()=>{n(),e.destroy()}),{conversations:t,activeConversationKey:s,setActiveConversationKey:e.setActiveConversationKey,addConversation:e.addConversation,removeConversation:e.removeConversation,setConversation:e.setConversation,getConversation:e.getConversation,setConversations:e.setConversations,getMessages:e.getMessages}}class ee{constructor(e,t){a(this,"baseURL");a(this,"options");if(!e||typeof e!="string")throw new Error("The baseURL is not valid!");this.baseURL=e,this.options=t}async tools(){return new Promise((e,t)=>{F(this.baseURL,{...this.options||{},callbacks:{onSuccess(s){e((s==null?void 0:s[0])||[])},onError(s){t(s)}}})})}}function te(r,e){return new ee(r,e)}const we=te,Se="2.0.0";exports.AbstractChatProvider=L;exports.AbstractXRequestClass=V;exports.ChatMessagesStore=J;exports.ConversationStore=k;exports.DeepSeekChatProvider=he;exports.DefaultChatProvider=ge;exports.OpenAIChatProvider=W;exports.XMCPClient=te;exports.XMCPClientClass=ee;exports.XMcpClient=we;exports.XRequest=F;exports.XRequestClass=Y;exports.XStream=D;exports.chatMessagesStoreHelper=b;exports.conversationStoreHelper=X;exports.createOpenAIChatProvider=ye;exports.resolvePresetApiKey=Z;exports.setXRequestGlobalOptions=Me;exports.useChatStore=z;exports.useXChat=fe;exports.useXConversations=Ce;exports.version=Se;
|