| import { useState } from 'react'; | |
| import type { ProviderInfo } from '~/types/model'; | |
| import { createScopedLogger } from '~/utils/logger'; | |
| const logger = createScopedLogger('usePromptEnhancement'); | |
| export function usePromptEnhancer() { | |
| const [enhancingPrompt, setEnhancingPrompt] = useState(false); | |
| const [promptEnhanced, setPromptEnhanced] = useState(false); | |
| const resetEnhancer = () => { | |
| setEnhancingPrompt(false); | |
| setPromptEnhanced(false); | |
| }; | |
| const enhancePrompt = async ( | |
| input: string, | |
| setInput: (value: string) => void, | |
| model: string, | |
| provider: ProviderInfo, | |
| apiKeys?: Record<string, string>, | |
| ) => { | |
| setEnhancingPrompt(true); | |
| setPromptEnhanced(false); | |
| const requestBody: any = { | |
| message: input, | |
| model, | |
| provider, | |
| }; | |
| if (apiKeys) { | |
| requestBody.apiKeys = apiKeys; | |
| } | |
| const response = await fetch('/api/enhancer', { | |
| method: 'POST', | |
| body: JSON.stringify(requestBody), | |
| }); | |
| const reader = response.body?.getReader(); | |
| const originalInput = input; | |
| if (reader) { | |
| const decoder = new TextDecoder(); | |
| let _input = ''; | |
| let _error; | |
| try { | |
| setInput(''); | |
| while (true) { | |
| const { value, done } = await reader.read(); | |
| if (done) { | |
| break; | |
| } | |
| _input += decoder.decode(value); | |
| logger.trace('Set input', _input); | |
| setInput(_input); | |
| } | |
| } catch (error) { | |
| _error = error; | |
| setInput(originalInput); | |
| } finally { | |
| if (_error) { | |
| logger.error(_error); | |
| } | |
| setEnhancingPrompt(false); | |
| setPromptEnhanced(true); | |
| setTimeout(() => { | |
| setInput(_input); | |
| }); | |
| } | |
| } | |
| }; | |
| return { enhancingPrompt, promptEnhanced, enhancePrompt, resetEnhancer }; | |
| } | |