@unif/react-native-chat-sdk 0.6.1 → 1.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/lib/commonjs/hooks/ChatProvider.js +26 -8
- package/lib/commonjs/hooks/ChatProvider.js.map +1 -1
- package/lib/commonjs/hooks/useXChat.js +76 -32
- package/lib/commonjs/hooks/useXChat.js.map +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/providers/AbstractChatProvider.js +8 -4
- package/lib/commonjs/providers/AbstractChatProvider.js.map +1 -1
- package/lib/commonjs/providers/DeepSeekChatProvider.js +7 -4
- package/lib/commonjs/providers/DeepSeekChatProvider.js.map +1 -1
- package/lib/commonjs/providers/OpenAIChatProvider.js +6 -1
- package/lib/commonjs/providers/OpenAIChatProvider.js.map +1 -1
- package/lib/commonjs/stores/chatStore.js +83 -70
- package/lib/commonjs/stores/chatStore.js.map +1 -1
- package/lib/module/hooks/ChatProvider.js +26 -8
- package/lib/module/hooks/ChatProvider.js.map +1 -1
- package/lib/module/hooks/useXChat.js +77 -33
- package/lib/module/hooks/useXChat.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/providers/AbstractChatProvider.js +8 -4
- package/lib/module/providers/AbstractChatProvider.js.map +1 -1
- package/lib/module/providers/DeepSeekChatProvider.js +7 -4
- package/lib/module/providers/DeepSeekChatProvider.js.map +1 -1
- package/lib/module/providers/OpenAIChatProvider.js +6 -1
- package/lib/module/providers/OpenAIChatProvider.js.map +1 -1
- package/lib/module/stores/chatStore.js +83 -68
- package/lib/module/stores/chatStore.js.map +1 -1
- package/lib/typescript/commonjs/hooks/ChatProvider.d.ts +10 -3
- package/lib/typescript/commonjs/hooks/ChatProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/hooks/useXChat.d.ts +10 -4
- package/lib/typescript/commonjs/hooks/useXChat.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +2 -1
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/providers/AbstractChatProvider.d.ts +6 -6
- package/lib/typescript/commonjs/providers/AbstractChatProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/providers/DeepSeekChatProvider.d.ts +3 -2
- package/lib/typescript/commonjs/providers/DeepSeekChatProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/providers/OpenAIChatProvider.d.ts +3 -2
- package/lib/typescript/commonjs/providers/OpenAIChatProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/stores/chatStore.d.ts +24 -14
- package/lib/typescript/commonjs/stores/chatStore.d.ts.map +1 -1
- package/lib/typescript/commonjs/types/provider.d.ts +14 -1
- package/lib/typescript/commonjs/types/provider.d.ts.map +1 -1
- package/lib/typescript/module/hooks/ChatProvider.d.ts +10 -3
- package/lib/typescript/module/hooks/ChatProvider.d.ts.map +1 -1
- package/lib/typescript/module/hooks/useXChat.d.ts +10 -4
- package/lib/typescript/module/hooks/useXChat.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +2 -1
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/providers/AbstractChatProvider.d.ts +6 -6
- package/lib/typescript/module/providers/AbstractChatProvider.d.ts.map +1 -1
- package/lib/typescript/module/providers/DeepSeekChatProvider.d.ts +3 -2
- package/lib/typescript/module/providers/DeepSeekChatProvider.d.ts.map +1 -1
- package/lib/typescript/module/providers/OpenAIChatProvider.d.ts +3 -2
- package/lib/typescript/module/providers/OpenAIChatProvider.d.ts.map +1 -1
- package/lib/typescript/module/stores/chatStore.d.ts +24 -14
- package/lib/typescript/module/stores/chatStore.d.ts.map +1 -1
- package/lib/typescript/module/types/provider.d.ts +14 -1
- package/lib/typescript/module/types/provider.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/hooks/ChatProvider.tsx +34 -17
- package/src/hooks/useXChat.ts +111 -65
- package/src/index.ts +3 -0
- package/src/providers/AbstractChatProvider.ts +17 -9
- package/src/providers/DeepSeekChatProvider.ts +5 -6
- package/src/providers/OpenAIChatProvider.ts +10 -2
- package/src/stores/chatStore.ts +53 -41
- package/src/types/provider.ts +19 -1
|
@@ -11,8 +11,9 @@ import type { ChatMessage } from '../types/message';
|
|
|
11
11
|
import type { RequestParams, SSEOutput } from '../types/provider';
|
|
12
12
|
import type { SuggestionItem } from '../types/sse';
|
|
13
13
|
import type { ChatStorage } from '../stores/storage';
|
|
14
|
+
import type { StoreMessage } from '../stores/chatStore';
|
|
14
15
|
import type { AbstractChatProvider } from '../providers/AbstractChatProvider';
|
|
15
|
-
export interface ChatProviderProps<Message = ChatMessage, Input = RequestParams<Message>, Output = SSEOutput> {
|
|
16
|
+
export interface ChatProviderProps<Message extends StoreMessage = ChatMessage, Input = RequestParams<Message>, Output = SSEOutput> {
|
|
16
17
|
provider: AbstractChatProvider<Message, Input, Output>;
|
|
17
18
|
storage?: ChatStorage;
|
|
18
19
|
models?: ModelInfo[];
|
|
@@ -24,9 +25,10 @@ export interface ChatProviderProps<Message = ChatMessage, Input = RequestParams<
|
|
|
24
25
|
}) => Message;
|
|
25
26
|
children: React.ReactNode;
|
|
26
27
|
}
|
|
28
|
+
/** Context 值类型 — 合并 useXChat + useXConversations + useXModel */
|
|
27
29
|
interface ChatContextValue<Message = ChatMessage> {
|
|
28
30
|
messages: MessageInfo<Message>[];
|
|
29
|
-
|
|
31
|
+
isRequesting: boolean;
|
|
30
32
|
suggestions: SuggestionItem[];
|
|
31
33
|
error: string | null;
|
|
32
34
|
onRequest: (input: unknown) => void;
|
|
@@ -52,7 +54,12 @@ interface ChatContextValue<Message = ChatMessage> {
|
|
|
52
54
|
models: ModelInfo[];
|
|
53
55
|
setSelectedModel: (id: string) => void;
|
|
54
56
|
}
|
|
55
|
-
export declare function ChatProvider<Message = ChatMessage, Input = RequestParams<Message>, Output = SSEOutput>(props: ChatProviderProps<Message, Input, Output>): import("react/jsx-runtime").JSX.Element;
|
|
57
|
+
export declare function ChatProvider<Message extends StoreMessage = ChatMessage, Input = RequestParams<Message>, Output = SSEOutput>(props: ChatProviderProps<Message, Input, Output>): import("react/jsx-runtime").JSX.Element;
|
|
58
|
+
/**
|
|
59
|
+
* 消费 ChatProvider 注入的聊天上下文
|
|
60
|
+
*
|
|
61
|
+
* @template Message - 消息类型,默认 ChatMessage
|
|
62
|
+
*/
|
|
56
63
|
export declare function useChatContext<Message = ChatMessage>(): ChatContextValue<Message>;
|
|
57
64
|
export {};
|
|
58
65
|
//# sourceMappingURL=ChatProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatProvider.d.ts","sourceRoot":"","sources":["../../../../src/hooks/ChatProvider.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAA6C,MAAM,OAAO,CAAC;AAIlE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ChatProvider.d.ts","sourceRoot":"","sources":["../../../../src/hooks/ChatProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* useXChat — 聊天操作
|
|
2
|
+
* useXChat — 聊天操作 Hook
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 支持 isRequesting / parser 消息展开 / defaultMessages 初始消息
|
|
5
5
|
*/
|
|
6
|
+
import type { StoreMessage } from '../stores/chatStore';
|
|
6
7
|
import type { AbstractChatProvider } from '../providers/AbstractChatProvider';
|
|
7
8
|
import type { ChatMessage, MessageStatus } from '../types/message';
|
|
8
9
|
import type { RequestParams, SSEOutput } from '../types/provider';
|
|
@@ -16,6 +17,10 @@ export interface MessageInfo<Message = ChatMessage> {
|
|
|
16
17
|
export interface UseXChatConfig<Message = ChatMessage, Input = RequestParams<Message>, Output = SSEOutput> {
|
|
17
18
|
conversationKey: string;
|
|
18
19
|
provider: AbstractChatProvider<Message, Input, Output>;
|
|
20
|
+
/** 将单条消息解析为多条展示消息 */
|
|
21
|
+
parser?: (message: Message) => Message[];
|
|
22
|
+
/** 初始消息(同步数组或异步 Promise) */
|
|
23
|
+
defaultMessages?: Message[] | (() => Promise<Message[]>);
|
|
19
24
|
requestPlaceholder?: (input: Input) => Message;
|
|
20
25
|
requestFallback?: (input: Input, info: {
|
|
21
26
|
error: Error;
|
|
@@ -24,7 +29,8 @@ export interface UseXChatConfig<Message = ChatMessage, Input = RequestParams<Mes
|
|
|
24
29
|
}
|
|
25
30
|
export interface UseXChatReturn<Message = ChatMessage, Input = RequestParams<Message>> {
|
|
26
31
|
messages: MessageInfo<Message>[];
|
|
27
|
-
|
|
32
|
+
/** 是否正在请求 */
|
|
33
|
+
isRequesting: boolean;
|
|
28
34
|
suggestions: SuggestionItem[];
|
|
29
35
|
error: string | null;
|
|
30
36
|
onRequest: (input: Input) => void;
|
|
@@ -35,5 +41,5 @@ export interface UseXChatReturn<Message = ChatMessage, Input = RequestParams<Mes
|
|
|
35
41
|
setMessage: (id: string, partial: Partial<MessageInfo<Message>> | ((msg: MessageInfo<Message>) => Partial<MessageInfo<Message>>)) => void;
|
|
36
42
|
removeMessage: (id: string) => void;
|
|
37
43
|
}
|
|
38
|
-
export declare function useXChat<Message = ChatMessage, Input = RequestParams<Message>, Output = SSEOutput>(config: UseXChatConfig<Message, Input, Output>): UseXChatReturn<Message, Input>;
|
|
44
|
+
export declare function useXChat<Message extends StoreMessage = ChatMessage, Input = RequestParams<Message>, Output = SSEOutput>(config: UseXChatConfig<Message, Input, Output>): UseXChatReturn<Message, Input>;
|
|
39
45
|
//# sourceMappingURL=useXChat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useXChat.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useXChat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"useXChat.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useXChat.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export type { ChatMessage, MessageRole, MessageType, MessageStatus, } from './types/message';
|
|
6
6
|
export type { SSEEventType, SSEEnvelopeBase, SSETextEvent, SSECardDataEvent, SSESuggestionEvent, SSEErrorEvent, SSEDoneEvent, SSEEnvelope, SuggestionItem, } from './types/sse';
|
|
7
|
-
export type { RequestParams, SSEOutput, ProviderCallbacks, } from './types/provider';
|
|
7
|
+
export type { RequestParams, SSEOutput, ProviderCallbacks, TransformMessageInfo, TransformParamsOptions, } from './types/provider';
|
|
8
8
|
export { XStream } from './tools/XStream';
|
|
9
9
|
export type { XStreamConfig, XStreamCallbacks } from './tools/XStream';
|
|
10
10
|
export { XRequest } from './tools/XRequest';
|
|
@@ -16,6 +16,7 @@ export type { OpenAIChatProviderConfig } from './providers/OpenAIChatProvider';
|
|
|
16
16
|
export { DeepSeekChatProvider } from './providers/DeepSeekChatProvider';
|
|
17
17
|
export type { DeepSeekChatProviderConfig } from './providers/DeepSeekChatProvider';
|
|
18
18
|
export type { ChatStorage } from './stores/storage';
|
|
19
|
+
export type { StoreMessage, ChatStoreApi } from './stores/chatStore';
|
|
19
20
|
export { getOrCreateChatStore, deleteChatStore, getChatStoreMessages, } from './stores/chatStore';
|
|
20
21
|
export { useXChat } from './hooks/useXChat';
|
|
21
22
|
export type { UseXChatConfig, UseXChatReturn, MessageInfo, } from './hooks/useXChat';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,aAAa,EACb,SAAS,EACT,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,GACf,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1E,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,YAAY,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,YAAY,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAGnF,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,YAAY,EACV,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EACV,wBAAwB,EACxB,cAAc,GACf,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* AbstractChatProvider — Provider 抽象基类
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 定义 transformMessage / transformParams / transformLocalMessage 抽象方法
|
|
5
5
|
*/
|
|
6
6
|
import type { XRequest } from '../tools/XRequest';
|
|
7
7
|
import type { ChatMessage } from '../types/message';
|
|
8
|
-
import type { RequestParams, SSEOutput, ProviderCallbacks } from '../types/provider';
|
|
8
|
+
import type { RequestParams, SSEOutput, ProviderCallbacks, TransformMessageInfo, TransformParamsOptions } from '../types/provider';
|
|
9
9
|
export declare abstract class AbstractChatProvider<Message = ChatMessage, Input = RequestParams<Message>, Output = SSEOutput> {
|
|
10
10
|
protected request: XRequest;
|
|
11
11
|
constructor(config: {
|
|
@@ -13,9 +13,9 @@ export declare abstract class AbstractChatProvider<Message = ChatMessage, Input
|
|
|
13
13
|
});
|
|
14
14
|
/**
|
|
15
15
|
* 转换请求参数
|
|
16
|
-
*
|
|
16
|
+
* 新签名:接收 options 参数(含 messages 等上下文)
|
|
17
17
|
*/
|
|
18
|
-
abstract transformParams(input: Input): Record<string, unknown>;
|
|
18
|
+
abstract transformParams(input: Input, options?: TransformParamsOptions<Message>): Record<string, unknown>;
|
|
19
19
|
/**
|
|
20
20
|
* 转换本地消息
|
|
21
21
|
* 将请求参数转换为用户发送的本地 ChatMessage(用于消息列表渲染)
|
|
@@ -23,9 +23,9 @@ export declare abstract class AbstractChatProvider<Message = ChatMessage, Input
|
|
|
23
23
|
abstract transformLocalMessage(input: Input): Message;
|
|
24
24
|
/**
|
|
25
25
|
* 转换响应消息
|
|
26
|
-
*
|
|
26
|
+
* 新签名:接收 info 对象(含 output + current)
|
|
27
27
|
*/
|
|
28
|
-
abstract transformMessage(
|
|
28
|
+
abstract transformMessage(info: TransformMessageInfo<Message, Output>): Message;
|
|
29
29
|
/**
|
|
30
30
|
* 发起请求(内部调用 XRequest)
|
|
31
31
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractChatProvider.d.ts","sourceRoot":"","sources":["../../../../src/providers/AbstractChatProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,iBAAiB,
|
|
1
|
+
{"version":3,"file":"AbstractChatProvider.d.ts","sourceRoot":"","sources":["../../../../src/providers/AbstractChatProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAE3B,8BAAsB,oBAAoB,CACxC,OAAO,GAAG,WAAW,EACrB,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,EAC9B,MAAM,GAAG,SAAS;IAElB,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC;gBAEhB,MAAM,EAAE;QAAE,OAAO,EAAE,QAAQ,CAAA;KAAE;IAIzC;;;OAGG;IACH,QAAQ,CAAC,eAAe,CACtB,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,sBAAsB,CAAC,OAAO,CAAC,GACxC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAErD;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CACvB,IAAI,EAAE,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,GAC1C,OAAO;IAEV;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,IAAI;IA0BtE;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { OpenAIChatProvider } from './OpenAIChatProvider';
|
|
8
8
|
import type { ChatMessage } from '../types/message';
|
|
9
|
-
import type { SSEOutput } from '../types/provider';
|
|
9
|
+
import type { SSEOutput, TransformMessageInfo } from '../types/provider';
|
|
10
10
|
export interface DeepSeekChatProviderConfig {
|
|
11
11
|
apiKey?: string;
|
|
12
12
|
model?: string;
|
|
@@ -17,7 +17,8 @@ export declare class DeepSeekChatProvider extends OpenAIChatProvider {
|
|
|
17
17
|
constructor(config: DeepSeekChatProviderConfig);
|
|
18
18
|
/**
|
|
19
19
|
* 覆写 transformMessage,处理 DeepSeek reasoning_content
|
|
20
|
+
* 新签名:info.output + info.current
|
|
20
21
|
*/
|
|
21
|
-
transformMessage(
|
|
22
|
+
transformMessage(info: TransformMessageInfo<ChatMessage, SSEOutput>): ChatMessage;
|
|
22
23
|
}
|
|
23
24
|
//# sourceMappingURL=DeepSeekChatProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeepSeekChatProvider.d.ts","sourceRoot":"","sources":["../../../../src/providers/DeepSeekChatProvider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"DeepSeekChatProvider.d.ts","sourceRoot":"","sources":["../../../../src/providers/DeepSeekChatProvider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzE,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,oBAAqB,SAAQ,kBAAkB;gBAC9C,MAAM,EAAE,0BAA0B;IAS9C;;;OAGG;IACM,gBAAgB,CACvB,IAAI,EAAE,oBAAoB,CAAC,WAAW,EAAE,SAAS,CAAC,GACjD,WAAW;CAkEf"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { AbstractChatProvider } from './AbstractChatProvider';
|
|
7
7
|
import type { ChatMessage } from '../types/message';
|
|
8
|
-
import type { RequestParams, SSEOutput } from '../types/provider';
|
|
8
|
+
import type { RequestParams, SSEOutput, TransformMessageInfo } from '../types/provider';
|
|
9
9
|
export interface OpenAIChatProviderConfig {
|
|
10
10
|
baseURL: string;
|
|
11
11
|
apiKey?: string;
|
|
@@ -26,8 +26,9 @@ export declare class OpenAIChatProvider extends AbstractChatProvider<ChatMessage
|
|
|
26
26
|
transformLocalMessage(input: RequestParams<ChatMessage>): ChatMessage;
|
|
27
27
|
/**
|
|
28
28
|
* 将 SSE delta 转为 ChatMessage(累积 content)
|
|
29
|
+
* 新签名:info.output + info.current
|
|
29
30
|
*/
|
|
30
|
-
transformMessage(
|
|
31
|
+
transformMessage(info: TransformMessageInfo<ChatMessage, SSEOutput>): ChatMessage;
|
|
31
32
|
private createEmptyAssistant;
|
|
32
33
|
}
|
|
33
34
|
//# sourceMappingURL=OpenAIChatProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIChatProvider.d.ts","sourceRoot":"","sources":["../../../../src/providers/OpenAIChatProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"OpenAIChatProvider.d.ts","sourceRoot":"","sources":["../../../../src/providers/OpenAIChatProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EACV,aAAa,EACb,SAAS,EACT,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD,qBAAa,kBAAmB,SAAQ,oBAAoB,CAC1D,WAAW,EACX,aAAa,CAAC,WAAW,CAAC,EAC1B,SAAS,CACV;IACC,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,wBAAwB;IAiB5C;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAkB3E;;OAEG;IACH,qBAAqB,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,WAAW;IAYrE;;;OAGG;IACH,gBAAgB,CACd,IAAI,EAAE,oBAAoB,CAAC,WAAW,EAAE,SAAS,CAAC,GACjD,WAAW;IAkCd,OAAO,CAAC,oBAAoB;CAW7B"}
|
|
@@ -1,30 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Chat 消息状态管理(Zustand)
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* 泛型 store,通过 useXChat hook 封装后对外暴露。
|
|
5
|
+
* M 约束:必须包含 id 字段用于查找/去重。
|
|
4
6
|
*/
|
|
5
|
-
import type { ChatMessage } from '../types/message';
|
|
6
7
|
import type { SuggestionItem } from '../types/sse';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
/** store 中消息的最小约束:必须有 id 用于查找/去重 */
|
|
9
|
+
export interface StoreMessage {
|
|
10
|
+
id: string;
|
|
11
|
+
}
|
|
12
|
+
interface ChatState<M extends StoreMessage> {
|
|
13
|
+
messages: M[];
|
|
10
14
|
suggestions: SuggestionItem[];
|
|
11
15
|
isRequesting: boolean;
|
|
12
16
|
error: string | null;
|
|
13
|
-
addMessage: (message:
|
|
14
|
-
updateMessage: (id: string, updater: (msg:
|
|
15
|
-
upsertMessage: (message:
|
|
16
|
-
setMessages: (messages:
|
|
17
|
-
setMessage: (id: string, partial: Partial<
|
|
17
|
+
addMessage: (message: M) => void;
|
|
18
|
+
updateMessage: (id: string, updater: (msg: M) => M) => void;
|
|
19
|
+
upsertMessage: (message: M) => void;
|
|
20
|
+
setMessages: (messages: M[] | ((prev: M[]) => M[])) => void;
|
|
21
|
+
setMessage: (id: string, partial: Partial<M> | ((msg: M) => Partial<M>)) => void;
|
|
18
22
|
removeMessage: (id: string) => void;
|
|
19
23
|
setSuggestions: (items: SuggestionItem[]) => void;
|
|
20
24
|
setRequesting: (v: boolean) => void;
|
|
21
25
|
setError: (error: string | null) => void;
|
|
22
26
|
resetChat: () => void;
|
|
23
|
-
loadSession: (messages:
|
|
27
|
+
loadSession: (messages: M[]) => void;
|
|
24
28
|
}
|
|
25
|
-
|
|
29
|
+
/** 创建一个泛型 chat store 实例 */
|
|
30
|
+
export declare function createChatStore<M extends StoreMessage>(): import("zustand").UseBoundStore<import("zustand").StoreApi<ChatState<M>>>;
|
|
31
|
+
/** store 实例类型 */
|
|
32
|
+
export type ChatStoreApi<M extends StoreMessage> = ReturnType<typeof createChatStore<M>>;
|
|
33
|
+
/** 获取或创建指定会话的 store */
|
|
34
|
+
export declare function getOrCreateChatStore<M extends StoreMessage>(key: string): ChatStoreApi<M>;
|
|
35
|
+
/** 删除指定会话的 store */
|
|
26
36
|
export declare function deleteChatStore(key: string): void;
|
|
27
|
-
|
|
28
|
-
export declare
|
|
37
|
+
/** 读取指定会话的消息列表 */
|
|
38
|
+
export declare function getChatStoreMessages<M extends StoreMessage>(key: string): M[] | undefined;
|
|
29
39
|
export {};
|
|
30
40
|
//# sourceMappingURL=chatStore.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatStore.d.ts","sourceRoot":"","sources":["../../../../src/stores/chatStore.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"chatStore.d.ts","sourceRoot":"","sources":["../../../../src/stores/chatStore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,oCAAoC;AACpC,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,SAAS,CAAC,CAAC,SAAS,YAAY;IACxC,QAAQ,EAAE,CAAC,EAAE,CAAC;IACd,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAErB,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;IACjC,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;IAC5D,aAAa,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;IACpC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5D,UAAU,EAAE,CACV,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAC3C,IAAI,CAAC;IACV,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,cAAc,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IAClD,aAAa,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;CACtC;AAED,2BAA2B;AAC3B,wBAAgB,eAAe,CAAC,CAAC,SAAS,YAAY,+EAyErD;AAED,iBAAiB;AACjB,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,YAAY,IAAI,UAAU,CAC3D,OAAO,eAAe,CAAC,CAAC,CAAC,CAC1B,CAAC;AAMF,uBAAuB;AACvB,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,YAAY,EACzD,GAAG,EAAE,MAAM,GACV,YAAY,CAAC,CAAC,CAAC,CAOjB;AAED,oBAAoB;AACpB,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,QAE1C;AAED,kBAAkB;AAClB,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,YAAY,EACzD,GAAG,EAAE,MAAM,GACV,CAAC,EAAE,GAAG,SAAS,CAEjB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Provider 协议类型
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
|
+
* 定义 ChatProvider 与 useXChat 之间的数据契约
|
|
4
5
|
*/
|
|
5
6
|
import type { ChatMessage } from './message';
|
|
6
7
|
import type { SuggestionItem } from './sse';
|
|
@@ -20,4 +21,16 @@ export interface ProviderCallbacks<Message = ChatMessage> {
|
|
|
20
21
|
onError: (error: Error) => void;
|
|
21
22
|
onSuggestion?: (items: SuggestionItem[]) => void;
|
|
22
23
|
}
|
|
24
|
+
/** TransformMessage 接收 info 对象而非位置参数 */
|
|
25
|
+
export interface TransformMessageInfo<Message = ChatMessage, Output = SSEOutput> {
|
|
26
|
+
/** 当前 SSE 输出块 */
|
|
27
|
+
output: Output;
|
|
28
|
+
/** 已累积的消息(首块时为 undefined) */
|
|
29
|
+
current?: Message;
|
|
30
|
+
}
|
|
31
|
+
/** TransformParams 选项 */
|
|
32
|
+
export interface TransformParamsOptions<Message = ChatMessage> {
|
|
33
|
+
/** 会话中的全部消息 */
|
|
34
|
+
messages?: Message[];
|
|
35
|
+
}
|
|
23
36
|
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../src/types/provider.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../src/types/provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,WAAW;IAC5C,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB,CAAC,OAAO,GAAG,WAAW;IACtD,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACrC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;CAClD;AAED,wCAAwC;AACxC,MAAM,WAAW,oBAAoB,CACnC,OAAO,GAAG,WAAW,EACrB,MAAM,GAAG,SAAS;IAElB,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,yBAAyB;AACzB,MAAM,WAAW,sBAAsB,CAAC,OAAO,GAAG,WAAW;IAC3D,eAAe;IACf,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB"}
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@ import React, { createContext, useContext, useMemo } from 'react';
|
|
|
8
8
|
import { useXChat } from './useXChat';
|
|
9
9
|
import { useXConversations } from './useXConversations';
|
|
10
10
|
import { useXModel } from './useXModel';
|
|
11
|
-
import type { UseXChatConfig, MessageInfo } from './useXChat';
|
|
11
|
+
import type { UseXChatConfig, UseXChatReturn, MessageInfo } from './useXChat';
|
|
12
12
|
import type {
|
|
13
13
|
UseXConversationsOptions,
|
|
14
14
|
SessionSummary,
|
|
@@ -18,10 +18,11 @@ import type { ChatMessage } from '../types/message';
|
|
|
18
18
|
import type { RequestParams, SSEOutput } from '../types/provider';
|
|
19
19
|
import type { SuggestionItem } from '../types/sse';
|
|
20
20
|
import type { ChatStorage } from '../stores/storage';
|
|
21
|
+
import type { StoreMessage } from '../stores/chatStore';
|
|
21
22
|
import type { AbstractChatProvider } from '../providers/AbstractChatProvider';
|
|
22
23
|
|
|
23
24
|
export interface ChatProviderProps<
|
|
24
|
-
Message = ChatMessage,
|
|
25
|
+
Message extends StoreMessage = ChatMessage,
|
|
25
26
|
Input = RequestParams<Message>,
|
|
26
27
|
Output = SSEOutput,
|
|
27
28
|
> {
|
|
@@ -35,10 +36,11 @@ export interface ChatProviderProps<
|
|
|
35
36
|
children: React.ReactNode;
|
|
36
37
|
}
|
|
37
38
|
|
|
39
|
+
/** Context 值类型 — 合并 useXChat + useXConversations + useXModel */
|
|
38
40
|
interface ChatContextValue<Message = ChatMessage> {
|
|
39
41
|
// useXChat
|
|
40
42
|
messages: MessageInfo<Message>[];
|
|
41
|
-
|
|
43
|
+
isRequesting: boolean;
|
|
42
44
|
suggestions: SuggestionItem[];
|
|
43
45
|
error: string | null;
|
|
44
46
|
onRequest: (input: unknown) => void;
|
|
@@ -82,23 +84,31 @@ interface ChatContextValue<Message = ChatMessage> {
|
|
|
82
84
|
setSelectedModel: (id: string) => void;
|
|
83
85
|
}
|
|
84
86
|
|
|
85
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Context 使用 unknown 作为 Message 泛型的默认值,
|
|
89
|
+
* 在 ChatProvider 和 useChatContext 中通过泛型参数指定具体类型。
|
|
90
|
+
*/
|
|
91
|
+
const ChatContext = createContext<ChatContextValue<unknown> | null>(null);
|
|
92
|
+
|
|
93
|
+
/** 内存存储实现,用于未传入 storage 时的默认行为 */
|
|
94
|
+
class MemoryStorage implements ChatStorage {
|
|
95
|
+
private data = new Map<string, string>();
|
|
86
96
|
|
|
87
|
-
const memoryStorage: ChatStorage = {
|
|
88
|
-
_data: new Map<string, string>(),
|
|
89
97
|
async getItem(key: string) {
|
|
90
|
-
return
|
|
91
|
-
}
|
|
98
|
+
return this.data.get(key) ?? null;
|
|
99
|
+
}
|
|
92
100
|
async setItem(key: string, value: string) {
|
|
93
|
-
|
|
94
|
-
}
|
|
101
|
+
this.data.set(key, value);
|
|
102
|
+
}
|
|
95
103
|
async removeItem(key: string) {
|
|
96
|
-
|
|
97
|
-
}
|
|
98
|
-
}
|
|
104
|
+
this.data.delete(key);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const memoryStorage = new MemoryStorage();
|
|
99
109
|
|
|
100
110
|
export function ChatProvider<
|
|
101
|
-
Message = ChatMessage,
|
|
111
|
+
Message extends StoreMessage = ChatMessage,
|
|
102
112
|
Input = RequestParams<Message>,
|
|
103
113
|
Output = SSEOutput,
|
|
104
114
|
>(props: ChatProviderProps<Message, Input, Output>) {
|
|
@@ -136,10 +146,11 @@ export function ChatProvider<
|
|
|
136
146
|
]
|
|
137
147
|
);
|
|
138
148
|
|
|
139
|
-
const chat = useXChat(chatConfig);
|
|
149
|
+
const chat: UseXChatReturn<Message, Input> = useXChat(chatConfig);
|
|
140
150
|
|
|
141
151
|
const model = useXModel({ models, defaultModel });
|
|
142
152
|
|
|
153
|
+
// 合并三个 hook 的返回值
|
|
143
154
|
const value = useMemo(
|
|
144
155
|
() => ({
|
|
145
156
|
...chat,
|
|
@@ -150,12 +161,17 @@ export function ChatProvider<
|
|
|
150
161
|
);
|
|
151
162
|
|
|
152
163
|
return (
|
|
153
|
-
<ChatContext.Provider value={value as unknown
|
|
164
|
+
<ChatContext.Provider value={value as ChatContextValue<unknown>}>
|
|
154
165
|
{children}
|
|
155
166
|
</ChatContext.Provider>
|
|
156
167
|
);
|
|
157
168
|
}
|
|
158
169
|
|
|
170
|
+
/**
|
|
171
|
+
* 消费 ChatProvider 注入的聊天上下文
|
|
172
|
+
*
|
|
173
|
+
* @template Message - 消息类型,默认 ChatMessage
|
|
174
|
+
*/
|
|
159
175
|
export function useChatContext<
|
|
160
176
|
Message = ChatMessage,
|
|
161
177
|
>(): ChatContextValue<Message> {
|
|
@@ -163,5 +179,6 @@ export function useChatContext<
|
|
|
163
179
|
if (!ctx) {
|
|
164
180
|
throw new Error('useChatContext must be used within a ChatProvider');
|
|
165
181
|
}
|
|
166
|
-
|
|
182
|
+
// Context 存储 unknown,读取时通过泛型窄化为具体类型
|
|
183
|
+
return ctx as ChatContextValue<Message>;
|
|
167
184
|
}
|