import { Index, Show, createEffect, createSignal, onCleanup, onMount } from 'solid-js'
import { useThrottleFn } from 'solidjs-use'
import { generateSignature } from '@/utils/auth'
import IconClear from './icons/Clear'
import MessageItem from './MessageItem'
import SystemRoleSettings from './SystemRoleSettings'
import ErrorMessageItem from './ErrorMessageItem'
import type { ChatMessage, ErrorMessage } from '@/types'
const [controller, setController] = createSignal<AbortController>(null)
const requestWithLatestMessage = async() => {
setCurrentAssistantMessage('')
const storagePassword = localStorage.getItem('pass')
const controller = new AbortController()
setController(controller)
const requestMessageList = messageList().slice(-maxHistoryMessages)
if (currentSystemRoleSettings()) {
requestMessageList.unshift({
content: currentSystemRoleSettings(),
const timestamp = Date.now()
const response = await fetch('/api/generate', {
messages: requestMessageList,
sign: await generateSignature({
m: requestMessageList?.[requestMessageList.length - 1]?.content || '',
temperature: temperature(),
signal: controller.signal,
const error = await response.json()
console.error(error.error)
setCurrentError(error.error)
throw new Error('Request failed')
const data = response.body
throw new Error('No data')
const reader = data.getReader()
const decoder = new TextDecoder('utf-8')
const { value, done: readerDone } = await reader.read()
const char = decoder.decode(value)
if (char === '\n' && currentAssistantMessage().endsWith('\n'))
setCurrentAssistantMessage(currentAssistantMessage() + char)
isStick() && instantToBottom()
isStick() && instantToBottom()
const stopStreamFetch = () => {