2.10.0
中文
Skip to content

useXChat ​

Manages the messages within a single conversation. A provider must be passed. Without a provider, onRequest and abort throw provider is required.

ts
const {
  onRequest,
  onReload,
  abort,
  messages,
  parsedMessages,
  setMessages,
  setMessage,
  removeMessage,
  isRequesting,
  isDefaultMessagesRequesting,
  queueRequest,
} = useXChat({
  provider,
  conversationKey: activeConversationKey,
  requestPlaceholder: { role: 'assistant', content: '' },
  requestFallback: { role: 'assistant', content: 'failed' },
});

Model integration ​

Model integration

createOpenAIChatProvider + local SSE mock: input, streaming bubbles, cancel.

Reasoning model integration ​

Reasoning model integration

DeepSeekChatProvider parses reasoning_content with Think + XMarkdown (still a local mock).

History messages ​

History messages

Prefill user/assistant history with defaultMessages, then continue.

System prompt ​

System prompt: None
System prompt

Use role: 'developer' as a system prompt; edit it on the page.

Custom request ​

Custom request

DefaultChatProvider plus a custom fetch that returns JSON mock data.

API ​

useXChat ​

ts
type useXChat<
  ChatMessage extends SimpleType = string,
  ParsedMessage extends SimpleType = ChatMessage,
  Input = RequestParams<ChatMessage>,
  Output = SSEOutput,
> = (config: XChatConfig<ChatMessage, ParsedMessage, Input, Output>) => {
  onRequest: (requestParams: Partial<Input>, opts?: { extraInfo: AnyObject }) => void;
  onReload: (
    id: string | number,
    requestParams: Partial<Input>,
    opts?: { extraInfo: AnyObject },
  ) => void;
  abort: () => void;
  messages: Ref<MessageInfo<ChatMessage>[]>;
  parsedMessages: ComputedRef<MessageInfo<ParsedMessage>[]>;
  setMessages: (...args: Parameters<UseChatStoreReturn['setMessages']>) => void;
  setMessage: (...args: Parameters<UseChatStoreReturn['setMessage']>) => void;
  removeMessage: (id: string | number) => boolean;
  isRequesting: ComputedRef<boolean>;
  isDefaultMessagesRequesting: Ref<boolean>;
  queueRequest: (
    conversationKey: string | symbol,
    requestParams: Partial<Input>,
    opts?: { extraInfo: AnyObject },
  ) => void;
};

XChatConfig ​

PropDescriptionTypeDefaultVersion
providerData provider, converts data and requests of different structures into a format that can be consumed by useXChat. Built-in DefaultChatProvider, OpenAIChatProvider, or you can inherit AbstractChatProvider to implement it yourself. See Chat ProviderAbstractChatProvider<ChatMessage, Input, Output>--
conversationKeyConversation key; can be aligned with activeConversationKey of useXConversations to make each conversation independent messageConversationData['key'] | ShallowRef<ConversationData['key'] | undefined>--
defaultMessagesDisplay messages by default; support arrays, synchronous functions or asynchronous functions returning Promise (used to pull remote history)DefaultMessageInfo<ChatMessage>[] | ((info: { conversationKey?: string }) => DefaultMessageInfo<ChatMessage>[] | Promise<DefaultMessageInfo<ChatMessage>[]>)--
parserConvert ChatMessage to ParsedMessage; if not set, consume ChatMessage directly. Support one-to-many(message: ChatMessage) => ParsedMessage | ParsedMessage[]--
requestFallbackA cryptic message when the request fails; if not provided, the cryptic message will not be displayedChatMessage | ((requestParams: Partial<Input>, info: { error: Error; messages: ChatMessage[]; messageInfo: MessageInfo<ChatMessage> }) => ChatMessage | Promise<ChatMessage>)--
requestPlaceholderThe placeholder message in the request; if not provided, the placeholder will not be displayedChatMessage | ((requestParams: Partial<Input>, info: { messages: ChatMessage[] }) => ChatMessage)--

Return ​

PropDescriptionTypeDefaultVersion
abortCancel request() => void--
isRequestingWhether requesting (computed)ComputedRef<boolean>--
isDefaultMessagesRequestingWhether the default message list is in the request (asynchronous defaultMessages)Ref<boolean>false-
messagesCurrently managed message listRef<MessageInfo<ChatMessage>[]>--
parsedMessagesList converted by parserComputedRef<MessageInfo<ParsedMessage>[]>--
onReloadReplay by message id, send a request to the backend and update the message with the returned data(id: string | number, requestParams: Partial<Input>, opts?: { extraInfo: AnyObject }) => void--
onRequestAppend messages and trigger requests(requestParams: Partial<Input>, opts?: { extraInfo: AnyObject }) => void--
setMessagesDirectly modify the message list without triggering a request(messages | updater) => void--
setMessageDirectly modify a single message without triggering a request(id, info | updater) => void--
removeMessageDelete a single message without triggering a request(id: string | number) => boolean--
queueRequestAdd the request to the queue and wait for the current session defaultMessages to be initialized before sending(conversationKey: string | symbol, requestParams: Partial<Input>, opts?: { extraInfo: AnyObject }) => void--

MessageInfo ​

ts
interface MessageInfo<ChatMessage> {
  id: number | string;
  message: ChatMessage;
  status: MessageStatus;
  extraInfo?: AnyObject;
}

MessageStatus ​

ts
type MessageStatus = 'local' | 'loading' | 'updating' | 'success' | 'error' | 'abort';

useXChat({ agent }) in 1.x is now called useLegacyXChat, and the documentation is in useXChat Data Management.