teodor-new-chat-ui 1.4.6 → 1.5.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/dist/api/api-client.d.ts +37 -0
- package/dist/components/chat/ChatApp.d.ts +2 -1
- package/dist/components/chat/ChatInterface.d.ts +2 -1
- package/dist/components/chat/ChatProvider.d.ts +41 -65
- package/dist/components/chat/MessageComponent.d.ts +7 -5
- package/dist/components/chat/MessageReducer.d.ts +38 -0
- package/dist/components/chat/ThreadManager.d.ts +9 -4
- package/dist/components/common/MarkdownContent.d.ts +6 -0
- package/dist/components/ui/resizable.d.ts +1 -1
- package/dist/components/ui/sheet.d.ts +1 -1
- package/dist/config/env.d.ts +4 -0
- package/dist/hooks/use-chat.d.ts +28 -0
- package/dist/index.esm.js +3883 -4077
- package/dist/index.umd.js +30 -33
- package/dist/lib/index.d.ts +18 -11
- package/dist/types/api.d.ts +105 -145
- package/package.json +3 -1
- package/dist/components/chat/ResponsiveChatContainer.d.ts +0 -11
- package/dist/components/chat/index.d.ts +0 -17
- package/dist/hooks/useApiClient.d.ts +0 -71
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API client hook for aiNav backend
|
|
3
|
+
* Handles all HTTP requests with proper error handling and type safety
|
|
4
|
+
*/
|
|
5
|
+
import { CheckpointList, HistoryPayload, MessagesPayload, StatePayload, ThreadInfo, ThreadSummary } from "../types/api";
|
|
6
|
+
export declare class ChatApi {
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
constructor(baseUrl?: string);
|
|
9
|
+
private _get;
|
|
10
|
+
private _post;
|
|
11
|
+
private _put;
|
|
12
|
+
private _delete;
|
|
13
|
+
listThreads(): Promise<ThreadSummary[]>;
|
|
14
|
+
createThread(title?: string): Promise<ThreadInfo>;
|
|
15
|
+
updateThread(threadId: string, title: string): Promise<ThreadInfo>;
|
|
16
|
+
deleteThread(threadId: string): Promise<{
|
|
17
|
+
ok: boolean;
|
|
18
|
+
threadId: string;
|
|
19
|
+
}>;
|
|
20
|
+
threadInfo(threadId: string): Promise<ThreadInfo>;
|
|
21
|
+
listCheckpoints(threadId: string): Promise<CheckpointList>;
|
|
22
|
+
getMessages(params: {
|
|
23
|
+
threadId: string;
|
|
24
|
+
checkpointId?: string;
|
|
25
|
+
checkpointNs?: string;
|
|
26
|
+
}): Promise<MessagesPayload>;
|
|
27
|
+
getState(params: {
|
|
28
|
+
threadId: string;
|
|
29
|
+
checkpointId?: string;
|
|
30
|
+
checkpointNs?: string;
|
|
31
|
+
}): Promise<StatePayload>;
|
|
32
|
+
getStateHistory(params: {
|
|
33
|
+
threadId: string;
|
|
34
|
+
checkpointId?: string;
|
|
35
|
+
checkpointNs?: string;
|
|
36
|
+
}): Promise<HistoryPayload>;
|
|
37
|
+
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { ChatProviderProps } from './ChatProvider';
|
|
6
6
|
export interface ChatAppProps extends Omit<ChatProviderProps, 'children'> {
|
|
7
7
|
layout?: 'sidebar' | 'fullscreen' | 'tabs';
|
|
8
|
+
layoutSize?: 'phone' | 'tablet' | 'desktop' | 'half-screen';
|
|
8
9
|
showThreads?: boolean;
|
|
9
10
|
className?: string;
|
|
10
11
|
customStyles?: {
|
|
@@ -13,7 +14,7 @@ export interface ChatAppProps extends Omit<ChatProviderProps, 'children'> {
|
|
|
13
14
|
chatArea?: string;
|
|
14
15
|
};
|
|
15
16
|
}
|
|
16
|
-
export declare function ChatApp({ layout, showThreads, className, customStyles, ...providerProps }: ChatAppProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export declare function ChatApp({ layout, layoutSize, showThreads, className, customStyles, ...providerProps }: ChatAppProps): import("react/jsx-runtime").JSX.Element;
|
|
17
18
|
export interface SimpleChatProps {
|
|
18
19
|
apiConfig: ChatProviderProps['apiConfig'];
|
|
19
20
|
className?: string;
|
|
@@ -7,6 +7,7 @@ export interface ChatInterfaceProps {
|
|
|
7
7
|
placeholder?: string;
|
|
8
8
|
autoFocus?: boolean;
|
|
9
9
|
maxHeight?: string;
|
|
10
|
+
streamingDebounceMs?: number;
|
|
10
11
|
enableFileUpload?: boolean;
|
|
11
12
|
enableMessageEditing?: boolean;
|
|
12
13
|
customStyles?: {
|
|
@@ -18,4 +19,4 @@ export interface ChatInterfaceProps {
|
|
|
18
19
|
onMessageSent?: (message: string) => void;
|
|
19
20
|
onError?: (error: string) => void;
|
|
20
21
|
}
|
|
21
|
-
export declare function ChatInterface({ className, placeholder, autoFocus, maxHeight, enableFileUpload, enableMessageEditing, customStyles, onMessageSent, onError }: ChatInterfaceProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export declare function ChatInterface({ className, placeholder, autoFocus, maxHeight, streamingDebounceMs, enableFileUpload, enableMessageEditing, customStyles, onMessageSent, onError, }: ChatInterfaceProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,78 +1,54 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* ChatProvider.tsx — lean provider that composes:
|
|
3
|
+
* - ChatApi (REST)
|
|
4
|
+
* - useChatStream (POST + SSE)
|
|
5
|
+
* - useMessagesReducer (client-side message assembly)
|
|
6
|
+
*
|
|
7
|
+
* Why keep a provider if we have hooks?
|
|
8
|
+
* - Centralize baseUrl/auth & one ChatApi instance
|
|
9
|
+
* - Keep current thread + messages when navigating pages
|
|
10
|
+
* - Share a single stream connection + reducer across components
|
|
4
11
|
*/
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
|
|
12
|
+
import React from "react";
|
|
13
|
+
import { ChatMessage, ThreadSummary, CheckpointList, ApiConfig } from "@/types/api";
|
|
14
|
+
import { ChatApi } from "@/api/api-client";
|
|
15
|
+
export interface SendOptions {
|
|
16
|
+
checkpointId?: string;
|
|
17
|
+
checkpointNs?: string;
|
|
18
|
+
nodeFilter?: string;
|
|
19
|
+
config?: Record<string, unknown>;
|
|
20
|
+
payloadExtras?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
export interface ChatContextValue {
|
|
23
|
+
baseUrl: string;
|
|
24
|
+
token: string | null;
|
|
25
|
+
setToken: (t: string | null) => void;
|
|
26
|
+
api: ChatApi;
|
|
27
|
+
threads: ThreadSummary[];
|
|
8
28
|
currentThreadId: string | null;
|
|
9
|
-
|
|
10
|
-
messages:
|
|
11
|
-
|
|
12
|
-
isLoadingHistory: boolean;
|
|
29
|
+
setCurrentThreadId: (id: string | null) => void;
|
|
30
|
+
messages: ChatMessage[];
|
|
31
|
+
isStreaming: boolean;
|
|
13
32
|
error: string | null;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
loadThread: (threadId: string) => Promise<void>;
|
|
17
|
-
deleteThread: (threadId: string) => Promise<void>;
|
|
18
|
-
updateThreadTitle: (threadId: string, title: string) => Promise<void>;
|
|
19
|
-
sendMessage: (content: string, options?: {
|
|
20
|
-
saveToStorage?: boolean;
|
|
21
|
-
resumeCheckpointId?: string;
|
|
22
|
-
resumeNamespace?: string;
|
|
23
|
-
}) => Promise<void>;
|
|
24
|
-
editMessage: (messageId: string, newContent: string) => Promise<void>;
|
|
25
|
-
editMessageFromCheckpoint: (messageId: string, newContent: string, checkpointId: string) => Promise<void>;
|
|
26
|
-
regenerateFromMessage: (messageIndex: number) => Promise<void>;
|
|
27
|
-
stopStream: () => void;
|
|
28
|
-
clearError: () => void;
|
|
33
|
+
lastCheckpointId: string | null;
|
|
34
|
+
streamingAssistantId: string | null;
|
|
29
35
|
refreshThreads: () => Promise<void>;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
message_count: number;
|
|
36
|
-
last_message_preview?: string;
|
|
37
|
-
checkpoint_type: string;
|
|
38
|
-
active_agent?: string;
|
|
39
|
-
metadata?: any;
|
|
40
|
-
}>;
|
|
41
|
-
currentCheckpointId: string | null;
|
|
42
|
-
getPreCheckpointForMessage: (messageIndex: number) => Promise<string | null>;
|
|
43
|
-
fetchCheckpointHistory: (threadId: string) => Promise<void>;
|
|
36
|
+
createThread: (title?: string) => Promise<string>;
|
|
37
|
+
deleteThread: (threadId: string) => Promise<void>;
|
|
38
|
+
renameThread: (threadId: string, title: string) => Promise<void>;
|
|
39
|
+
loadThread: (threadId: string, checkpointId?: string, checkpointNs?: string) => Promise<void>;
|
|
40
|
+
listCheckpoints: (threadId: string) => Promise<CheckpointList>;
|
|
44
41
|
navigateToCheckpoint: (checkpointId: string) => Promise<void>;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
checkpoint_ns?: string;
|
|
49
|
-
message_count: number;
|
|
50
|
-
last_message_preview?: string;
|
|
51
|
-
ts?: number;
|
|
52
|
-
isCurrent?: boolean;
|
|
53
|
-
}>;
|
|
54
|
-
getTemporalNavigation: (messageIndex?: number) => {
|
|
55
|
-
canGoBack: boolean;
|
|
56
|
-
canGoForward: boolean;
|
|
57
|
-
currentIndex: number;
|
|
58
|
-
totalBranches: number;
|
|
59
|
-
};
|
|
60
|
-
navigateToPreviousBranch: (messageIndex?: number) => Promise<void>;
|
|
61
|
-
navigateToNextBranch: (messageIndex?: number) => Promise<void>;
|
|
42
|
+
returnToLatest: () => Promise<void>;
|
|
43
|
+
send: (text: string, opts?: SendOptions) => Promise<void>;
|
|
44
|
+
stop: () => void;
|
|
62
45
|
}
|
|
63
46
|
export interface ChatProviderProps {
|
|
64
|
-
children: ReactNode;
|
|
47
|
+
children: React.ReactNode;
|
|
65
48
|
apiConfig?: ApiConfig;
|
|
66
|
-
baseUrl?: string;
|
|
67
|
-
authToken?: string;
|
|
68
|
-
getAuthToken?: () => string | null | Promise<string | null>;
|
|
69
|
-
getAuthHeaders?: () => Record<string, string> | Promise<Record<string, string>>;
|
|
70
|
-
initialSettings?: Partial<ChatSettings>;
|
|
71
49
|
onError?: (error: string) => void;
|
|
72
50
|
onThreadChange?: (threadId: string | null) => void;
|
|
73
|
-
|
|
74
|
-
initialThreadId?: string;
|
|
51
|
+
initialThreadId?: string | null;
|
|
75
52
|
}
|
|
76
|
-
export declare function ChatProvider({ children, apiConfig,
|
|
53
|
+
export declare function ChatProvider({ children, apiConfig, onError, onThreadChange, initialThreadId, }: ChatProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
77
54
|
export declare function useChat(): ChatContextValue;
|
|
78
|
-
export {};
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Message Component - With truncatable tool messages and responsive design
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import type { ChatMessage } from "@/types/api";
|
|
5
5
|
export interface MessageComponentProps {
|
|
6
|
-
message:
|
|
6
|
+
message: ChatMessage;
|
|
7
7
|
messageIndex: number;
|
|
8
|
+
isStreamingMessage?: boolean;
|
|
9
|
+
streamingDebounceMs?: number;
|
|
8
10
|
isEditing?: boolean;
|
|
9
11
|
showActions?: boolean;
|
|
10
12
|
showTimestamp?: boolean;
|
|
11
13
|
showAgentName?: boolean;
|
|
12
|
-
layoutSize?:
|
|
14
|
+
layoutSize?: "phone" | "tablet" | "desktop" | "half-screen";
|
|
13
15
|
truncateToolMessages?: boolean;
|
|
14
16
|
toolMessagePreviewLength?: number;
|
|
15
17
|
customStyles?: {
|
|
@@ -26,7 +28,7 @@ export interface MessageComponentProps {
|
|
|
26
28
|
ts?: number;
|
|
27
29
|
isCurrent?: boolean;
|
|
28
30
|
}>;
|
|
29
|
-
currentCheckpointId?: string;
|
|
31
|
+
currentCheckpointId?: string | null;
|
|
30
32
|
onSwitchToCheckpoint?: (checkpointId: string, checkpointNs?: string) => void;
|
|
31
33
|
onReturnToMainThread?: () => void;
|
|
32
34
|
temporalNavigation?: {
|
|
@@ -43,4 +45,4 @@ export interface MessageComponentProps {
|
|
|
43
45
|
onCancelEdit?: () => void;
|
|
44
46
|
onCopy?: (content: string) => void;
|
|
45
47
|
}
|
|
46
|
-
export declare function MessageComponent({ message, messageIndex, isEditing, showActions, showTimestamp, showAgentName, layoutSize, truncateToolMessages, toolMessagePreviewLength, customStyles, checkpointBranches, currentCheckpointId, onSwitchToCheckpoint, onReturnToMainThread, temporalNavigation, onNavigateToPreviousBranch, onNavigateToNextBranch, onEdit, onRegenerate, onEditFromCheckpoint, onCancelEdit, onCopy }: MessageComponentProps): import("react/jsx-runtime").JSX.Element;
|
|
48
|
+
export declare function MessageComponent({ message, messageIndex, isStreamingMessage, streamingDebounceMs, isEditing, showActions, showTimestamp, showAgentName, layoutSize, truncateToolMessages, toolMessagePreviewLength, customStyles, checkpointBranches, currentCheckpointId, onSwitchToCheckpoint, onReturnToMainThread, temporalNavigation, onNavigateToPreviousBranch, onNavigateToNextBranch, onEdit, onRegenerate, onEditFromCheckpoint, onCancelEdit, onCopy, }: MessageComponentProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ChatMessage, StreamEvent } from "@/types/api";
|
|
2
|
+
export interface MessagesState {
|
|
3
|
+
messages: ChatMessage[];
|
|
4
|
+
assemblingId: string | null;
|
|
5
|
+
lastCheckpointId: string | null;
|
|
6
|
+
toolIndex: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
export type MessagesAction = {
|
|
9
|
+
type: "reset";
|
|
10
|
+
payload?: {
|
|
11
|
+
messages?: ChatMessage[];
|
|
12
|
+
};
|
|
13
|
+
} | {
|
|
14
|
+
type: "seed";
|
|
15
|
+
payload: {
|
|
16
|
+
messages: ChatMessage[];
|
|
17
|
+
};
|
|
18
|
+
} | {
|
|
19
|
+
type: "user_message";
|
|
20
|
+
payload: {
|
|
21
|
+
message: ChatMessage;
|
|
22
|
+
};
|
|
23
|
+
} | {
|
|
24
|
+
type: "event";
|
|
25
|
+
payload: {
|
|
26
|
+
ev: StreamEvent;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export declare const initialMessagesState: MessagesState;
|
|
30
|
+
export declare function messagesReducer(state: MessagesState, action: MessagesAction): MessagesState;
|
|
31
|
+
export declare function useMessagesReducer(initial?: ChatMessage[]): {
|
|
32
|
+
readonly reset: (messages?: ChatMessage[]) => void;
|
|
33
|
+
readonly seed: (messages: ChatMessage[]) => void;
|
|
34
|
+
readonly pushUser: (message: ChatMessage) => void;
|
|
35
|
+
readonly onEvent: (ev: StreamEvent) => void;
|
|
36
|
+
readonly state: MessagesState;
|
|
37
|
+
readonly dispatch: import("react").Dispatch<MessagesAction>;
|
|
38
|
+
};
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* messagesReducer.ts — example reducer + hook that consumes StreamEvent and builds ChatMessage[]
|
|
3
|
+
* ThreadManager.tsx — refactor to use the new api.ts (ChatApi) directly
|
|
4
|
+
*
|
|
5
|
+
* Adjust import paths ("@/api") to wherever you placed api.ts.
|
|
4
6
|
*/
|
|
7
|
+
import { ChatApi } from "@/api/api-client";
|
|
5
8
|
export interface ThreadManagerProps {
|
|
6
9
|
className?: string;
|
|
7
10
|
showCreateButton?: boolean;
|
|
@@ -15,9 +18,11 @@ export interface ThreadManagerProps {
|
|
|
15
18
|
activeThread?: string;
|
|
16
19
|
createButton?: string;
|
|
17
20
|
};
|
|
21
|
+
currentThreadId?: string | null;
|
|
22
|
+
navigateToThread?: (threadId: string) => void;
|
|
23
|
+
api?: ChatApi;
|
|
18
24
|
onThreadSelect?: (threadId: string) => void;
|
|
19
25
|
onThreadCreate?: (threadId: string) => void;
|
|
20
26
|
onThreadDelete?: (threadId: string) => void;
|
|
21
|
-
navigateToThread?: (threadId: string) => void;
|
|
22
27
|
}
|
|
23
|
-
export declare function ThreadManager({ className, showCreateButton, showDeleteButton, showEditTitle, maxHeight, customStyles, onThreadSelect, onThreadCreate, onThreadDelete,
|
|
28
|
+
export declare function ThreadManager({ className, showCreateButton, showDeleteButton, showEditTitle, maxHeight, customStyles, currentThreadId, navigateToThread, api: apiProp, onThreadSelect, onThreadCreate, onThreadDelete, }: ThreadManagerProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as ResizablePrimitive from "react-resizable-panels";
|
|
2
2
|
declare const ResizablePanelGroup: ({ className, ...props }: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
-
declare const ResizablePanel: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLButtonElement | HTMLElement |
|
|
3
|
+
declare const ResizablePanel: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLButtonElement | HTMLElement | HTMLTextAreaElement | HTMLDivElement | HTMLParagraphElement | HTMLUListElement | HTMLOListElement | HTMLLIElement | HTMLQuoteElement | HTMLTableElement | HTMLTableCellElement | HTMLPreElement | HTMLDListElement | HTMLSpanElement | HTMLImageElement | HTMLInputElement | HTMLSelectElement | HTMLOptionElement | HTMLOptGroupElement | HTMLObjectElement | HTMLMapElement | HTMLTitleElement | HTMLDataElement | HTMLLinkElement | HTMLFormElement | HTMLSlotElement | HTMLStyleElement | HTMLDialogElement | HTMLAnchorElement | HTMLAreaElement | HTMLAudioElement | HTMLBaseElement | HTMLBodyElement | HTMLBRElement | HTMLCanvasElement | HTMLTableColElement | HTMLDataListElement | HTMLModElement | HTMLDetailsElement | HTMLEmbedElement | HTMLFieldSetElement | HTMLHeadingElement | HTMLHeadElement | HTMLHRElement | HTMLHtmlElement | HTMLIFrameElement | HTMLLabelElement | HTMLLegendElement | HTMLMetaElement | HTMLMeterElement | HTMLOutputElement | HTMLProgressElement | HTMLScriptElement | HTMLSourceElement | HTMLTemplateElement | HTMLTableSectionElement | HTMLTimeElement | HTMLTableRowElement | HTMLTrackElement | HTMLVideoElement | HTMLTableCaptionElement | HTMLMenuElement | HTMLPictureElement>, "id" | "onResize"> & {
|
|
4
4
|
className?: string | undefined;
|
|
5
5
|
collapsedSize?: number | undefined;
|
|
6
6
|
collapsible?: boolean | undefined;
|
|
@@ -7,7 +7,7 @@ declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogC
|
|
|
7
7
|
declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
|
|
8
8
|
declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
9
9
|
declare const sheetVariants: (props?: {
|
|
10
|
-
side?: "
|
|
10
|
+
side?: "bottom" | "top" | "right" | "left";
|
|
11
11
|
} & import("class-variance-authority/dist/types").ClassProp) => string;
|
|
12
12
|
interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
|
|
13
13
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ChatRequest, StreamEvent } from "@/types/api";
|
|
2
|
+
export type UseChatStreamOptions = {
|
|
3
|
+
/** Base URL for the API, e.g. "/api/v1" or "https://host/api/v1" */
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
/** Path for the streaming endpoint relative to baseUrl (default: "/stream") */
|
|
6
|
+
streamPath?: string;
|
|
7
|
+
/** Bearer token for Authorization header */
|
|
8
|
+
token?: string;
|
|
9
|
+
/** Extra headers to include with every request */
|
|
10
|
+
headers?: Record<string, string>;
|
|
11
|
+
/** Auto-append assistant message to local state as it streams */
|
|
12
|
+
autoAppendAssistant?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type UseChatStream = {
|
|
15
|
+
isStreaming: boolean;
|
|
16
|
+
error: string | null;
|
|
17
|
+
lastCheckpointId: string | null;
|
|
18
|
+
assistantText: string;
|
|
19
|
+
stream: (req: ChatRequest, onEvent?: (ev: StreamEvent) => void, options?: {
|
|
20
|
+
onError?: (message: string) => void;
|
|
21
|
+
}) => {
|
|
22
|
+
close: () => void;
|
|
23
|
+
};
|
|
24
|
+
stop: () => void;
|
|
25
|
+
clear: () => void;
|
|
26
|
+
setToken: (t: string | null) => void;
|
|
27
|
+
};
|
|
28
|
+
export declare function useChatStream(opts?: UseChatStreamOptions): UseChatStream;
|