import { AnyObject } from '../_util/type';
import { ArtRequestParams } from '../artRequest';
import { ArtStreamOptions, SSEOutput } from '../artStream';
import { ArtAgent } from '../useArtAgent';
export type SimpleType = string | number | boolean | object;
export type MessageStatus = 'local' | 'loading' | 'success' | 'error';
type RequestPlaceholderFn<Message extends SimpleType> = (message: Message, info: {
    messages: Message[];
}) => Message;
type RequestFallbackFn<Message extends SimpleType> = (message: Message, info: {
    error: Error;
    messages: Message[];
}) => Message | Promise<Message>;
type TransformMessageFn<Message, Output> = (info: {
    originMessage?: Message;
    chunk: Output;
    chunks: Output[];
    status: MessageStatus;
}) => Message;
type RequestParams<Message> = Omit<ArtRequestParams, 'message'> & {
    message: Message;
} & AnyObject;
export interface ArtChatConfig<AgentMessage extends SimpleType = string, BubbleMessage extends SimpleType = AgentMessage, Input = AgentMessage, Output = AgentMessage> {
    agent?: ArtAgent<AgentMessage, Input, Output>;
    defaultMessages?: DefaultMessageInfo<AgentMessage>[];
    /** Convert agent message to bubble usage message type */
    parser?: (message: AgentMessage) => BubbleMessage | BubbleMessage[];
    requestPlaceholder?: AgentMessage | RequestPlaceholderFn<AgentMessage>;
    requestFallback?: AgentMessage | RequestFallbackFn<AgentMessage>;
    transformMessage?: TransformMessageFn<AgentMessage, Output>;
    transformStream?: ArtStreamOptions<AgentMessage>['transformStream'];
    resolveAbortController?: (abortController: AbortController) => void;
}
export interface MessageInfo<Message extends SimpleType> {
    id: number | string;
    message: Message;
    status: MessageStatus;
}
export type DefaultMessageInfo<Message extends SimpleType> = Pick<MessageInfo<Message>, 'message'> & Partial<Omit<MessageInfo<Message>, 'message'>>;
export interface RequestResultObject<Message> {
    message: Message | Message[];
    status: MessageStatus;
}
export type RequestResult<Message extends SimpleType> = Message | Message[] | RequestResultObject<Message> | RequestResultObject<Message>[];
export type StandardRequestResult<Message extends SimpleType> = Omit<RequestResultObject<Message>, 'message' | 'status'> & {
    message: Message;
    status?: MessageStatus;
};
export default function useArtChat<AgentMessage extends SimpleType = string, ParsedMessage extends SimpleType = AgentMessage, Input = RequestParams<AgentMessage>, Output = SSEOutput>(config: ArtChatConfig<AgentMessage, ParsedMessage, Input, Output>): {
    readonly onRequest: (value: SimpleType | RequestParams<AgentMessage> | Input) => void;
    readonly messages: import('vue').Ref<MessageInfo<AgentMessage>[], MessageInfo<AgentMessage>[]>;
    readonly parsedMessages: import('vue').ComputedRef<MessageInfo<ParsedMessage>[]>;
    readonly setMessages: (updater: (pre: MessageInfo<AgentMessage>[]) => MessageInfo<AgentMessage>[]) => void;
};
export {};
