File size: 2,960 Bytes
a8aec61 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
import { useCallback } from 'react'
import { toast } from 'sonner'
import { usePlaygroundStore } from '../store'
import { ComboboxAgent, type PlaygroundChatMessage } from '@/types/playground'
import {
getPlaygroundAgentsAPI,
getPlaygroundStatusAPI
} from '@/api/playground'
import { useQueryState } from 'nuqs'
const useChatActions = () => {
const { chatInputRef } = usePlaygroundStore()
const selectedEndpoint = usePlaygroundStore((state) => state.selectedEndpoint)
const [, setSessionId] = useQueryState('session')
const setMessages = usePlaygroundStore((state) => state.setMessages)
const setIsEndpointActive = usePlaygroundStore(
(state) => state.setIsEndpointActive
)
const setIsEndpointLoading = usePlaygroundStore(
(state) => state.setIsEndpointLoading
)
const setAgents = usePlaygroundStore((state) => state.setAgents)
const setSelectedModel = usePlaygroundStore((state) => state.setSelectedModel)
const [agentId, setAgentId] = useQueryState('agent')
const getStatus = useCallback(async () => {
try {
const status = await getPlaygroundStatusAPI(selectedEndpoint)
return status
} catch {
return 503
}
}, [selectedEndpoint])
const getAgents = useCallback(async () => {
try {
const agents = await getPlaygroundAgentsAPI(selectedEndpoint)
return agents
} catch {
toast.error('Error fetching agents')
return []
}
}, [selectedEndpoint])
const clearChat = useCallback(() => {
setMessages([])
setSessionId(null)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
const focusChatInput = useCallback(() => {
setTimeout(() => {
requestAnimationFrame(() => chatInputRef?.current?.focus())
}, 0)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
const addMessage = useCallback(
(message: PlaygroundChatMessage) => {
setMessages((prevMessages) => [...prevMessages, message])
},
[setMessages]
)
const initializePlayground = useCallback(async () => {
setIsEndpointLoading(true)
try {
const status = await getStatus()
let agents: ComboboxAgent[] = []
if (status === 200) {
setIsEndpointActive(true)
agents = await getAgents()
if (agents.length > 0 && !agentId) {
const firstAgent = agents[0]
setAgentId(firstAgent.value)
setSelectedModel(firstAgent.model.provider || '')
}
} else {
setIsEndpointActive(false)
}
setAgents(agents)
return agents
} catch {
setIsEndpointLoading(false)
} finally {
setIsEndpointLoading(false)
}
}, [
getStatus,
getAgents,
setIsEndpointActive,
setIsEndpointLoading,
setAgents,
setAgentId,
setSelectedModel,
agentId
])
return {
clearChat,
addMessage,
getAgents,
focusChatInput,
initializePlayground
}
}
export default useChatActions
|