Skip to content

useChat ​

Reactive, streaming multi-turn chat.

ts
import { useChat } from 'vue-llm'

const {
  messages, input, status, error, isLoading,
  sendMessage, handleSubmit, regenerate, stop, setMessages, addToolResult, clearError, isRestored,
} = useChat({ provider: ai, model: 'gpt-4o' })

Sending messages ​

ts
await sendMessage('Hello!')                       // explicit text
await sendMessage()                               // uses input.value and clears it
await sendMessage({ text: 'What is this?', files }) // with attachments
handleSubmit(event)                               // form submit helper

Status ​

status is 'ready' | 'submitted' | 'streaming' | 'error'. isLoading is true while submitted or streaming. On failure error holds the Error and status becomes 'error'; call clearError() to reset.

vue
<p v-if="status === 'submitted'">Thinking…</p>
<p v-if="error">{{ error.message }} <button @click="regenerate">Retry</button></p>

Rendering parts ​

vue
<template v-for="(part, i) in msg.parts" :key="i">
  <p v-if="part.type === 'text'">{{ part.text }}</p>
  <details v-else-if="part.type === 'reasoning'"><summary>Reasoning</summary>{{ part.text }}</details>
  <img v-else-if="part.type === 'file' && part.mediaType.startsWith('image/')" :src="part.url">
  <code v-else-if="part.type === 'tool-call'">{{ part.toolName }} → {{ part.state }}</code>
</template>

Options ​

OptionTypeDescription
providerLLMProviderProvider instance (required)
modelstringModel ID (required)
idstringChat ID — also the storage key
systemMaybeRefOrGetter<string>System prompt, re-read on every request
initialMessagesUIMessage[]Starting history
bodyMaybeRef<Record<string, unknown>>Extra provider options merged per request
providerOptionsRecord<string, unknown>Static provider options (e.g. maxTokens)
toolsToolDefinition[]Available tools
onToolCall(call) => unknownExecutes tool calls
maxToolRoundtripsnumberMax tool rounds per message (default 5)
storageChatStoragePersist and restore messages
onFinish(message, { finishReason, usage }) => voidCalled after each response
onError(error) => voidStream and storage errors

Returns ​

PropertyTypeDescription
messagesRef<UIMessage[]>Chat history
inputRef<string>Bind with v-model
statusRef<ChatStatus>Request status
errorRef<Error | undefined>Last error
isLoadingRef<boolean>Request in flight
isRestoredRef<boolean>false while async storage loads
sendMessage(input?) => Promise<void>Send text and/or files
handleSubmit(event?) => voidSends input.value
regenerate() => Promise<void>Drop the last assistant message and re-run
stop() => voidAbort the current stream
setMessages(msgs | fn) => voidReplace history ([] clears storage)
addToolResult({ toolCallId, result }) => voidSupply a tool result manually
clearError() => voidReset error state

Released under the MIT License.